@beworke/pixel-bemony 0.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/README.md +176 -0
- package/RELEASE_CANDIDATE.md +37 -0
- package/dist/browser/index.cjs.js +2598 -0
- package/dist/browser/index.cjs.js.map +1 -0
- package/dist/browser/index.d.mts +184 -0
- package/dist/browser/index.d.ts +184 -0
- package/dist/browser/index.esm.js +2557 -0
- package/dist/browser/index.esm.js.map +1 -0
- package/dist/browser/pixel-bemony.global.js +9848 -0
- package/dist/browser/pixel-bemony.global.js.map +1 -0
- package/dist/createBemonyPixel-BGRD66p-.d.mts +474 -0
- package/dist/createBemonyPixel-BGRD66p-.d.ts +474 -0
- package/dist/index.cjs.js +2154 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.mts +320 -0
- package/dist/index.d.ts +320 -0
- package/dist/index.esm.js +2081 -0
- package/dist/index.esm.js.map +1 -0
- package/docs/BACKEND_PURCHASE_AND_REDIRECTS.md +125 -0
- package/docs/BROWSER_EVENT_ENRICHMENT.md +116 -0
- package/docs/SCENARIOS.md +92 -0
- package/docs/SECURITY_LIMITATIONS.md +45 -0
- package/docs/TEST_MATRIX.md +39 -0
- package/docs/TROUBLESHOOTING.md +81 -0
- package/examples/README.md +73 -0
- package/examples/browser-bootstrap.html +47 -0
- package/examples/checkout-price-code.html +37 -0
- package/examples/funnel/donsell/downsell_1.html +130 -0
- package/examples/funnel/donsell/downsell_2.html +130 -0
- package/examples/funnel/donsell/downsell_3.html +130 -0
- package/examples/funnel/offer-page.html +105 -0
- package/examples/funnel/upsell/upsell_1.html +130 -0
- package/examples/funnel/upsell/upsell_2.html +130 -0
- package/examples/funnel/upsell/upsell_3.html +139 -0
- package/examples/offer-page-price-code.html +22 -0
- package/examples/one-click-price-code.html +38 -0
- package/examples/security/checkout-sim.css +408 -0
- package/examples/security/checkout-sim.js +414 -0
- package/examples/security/one-click/pri_downsell_1.html +85 -0
- package/examples/security/one-click/pri_downsell_1a.html +85 -0
- package/examples/security/one-click/pri_downsell_1b.html +78 -0
- package/examples/security/one-click/pri_downsell_2.html +78 -0
- package/examples/security/one-click/pri_downsell_2a.html +78 -0
- package/examples/security/one-click/pri_downsell_2b.html +78 -0
- package/examples/security/one-click/pri_downsell_3.html +78 -0
- package/examples/security/one-click/pri_downsell_3a.html +78 -0
- package/examples/security/one-click/pri_downsell_3b.html +78 -0
- package/examples/security/one-click/pri_upsell_1.html +78 -0
- package/examples/security/one-click/pri_upsell_1a.html +78 -0
- package/examples/security/one-click/pri_upsell_1b.html +78 -0
- package/examples/security/one-click/pri_upsell_2.html +78 -0
- package/examples/security/one-click/pri_upsell_2a.html +78 -0
- package/examples/security/one-click/pri_upsell_2b.html +78 -0
- package/examples/security/one-click/pri_upsell_3.html +78 -0
- package/examples/security/one-click/pri_upsell_3a.html +78 -0
- package/examples/security/one-click/pri_upsell_3b.html +78 -0
- package/examples/security/one-click/pri_upsell_3c.html +78 -0
- package/examples/security/pri1766322.html +333 -0
- package/examples/security/pri5529930.html +333 -0
- package/examples/security/pri6670988.html +334 -0
- package/examples/security/thank-you.html +65 -0
- package/examples/sim/funnel-flow.js +258 -0
- package/examples/sim/one-click-sim.js +167 -0
- package/examples/upsell-price-code.html +41 -0
- package/examples/url-context-navigation.html +96 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/browser/global.ts","../../../pixel/src/diagnostics/sanitize.ts","../../../pixel/src/diagnostics/RuntimeHealthEvaluator.ts","../../../pixel/src/diagnostics/SnapshotBuilder.ts","../../../pixel/src/diagnostics/DebugSnapshotService.ts","../../../pixel/src/diagnostics/RuntimeDiagnosticsModule.ts","../../../pixel/src/modules/behavior/runtime/BehaviorSignalBus.ts","../../../pixel/src/modules/behavior/runtime/ManagedScheduler.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementEmissionPolicy.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementLevelResolver.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementScoreCalculator.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementSignalAccumulator.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementSummaryBuilder.ts","../../../pixel/src/modules/behavior/engines/engagement/EngagementEngine.ts","../../../pixel/src/modules/behavior/engines/HeartbeatPolicy.ts","../../../pixel/src/modules/behavior/engines/HeartbeatSnapshotBuilder.ts","../../../pixel/src/modules/behavior/engines/HeartbeatEngine.ts","../../../pixel/src/modules/behavior/resolveEngagementConfig.ts","../../../pixel/src/modules/behavior/resolveHeartbeatConfig.ts","../../../pixel/src/modules/behavior/resolveRuntimeIntelligenceConfig.ts","../../../pixel/src/modules/behavior/contracts/rateLimit.ts","../../../pixel/src/modules/behavior/runtime/intelligence/BehaviorRateLimiter.ts","../../../pixel/src/modules/behavior/contracts/buffer.ts","../../../pixel/src/modules/behavior/runtime/intelligence/BehaviorBuffer.ts","../../../pixel/src/modules/behavior/runtime/intelligence/BehaviorStateMachine.ts","../../../pixel/src/modules/behavior/runtime/intelligence/SessionSummaryAccumulator.ts","../../../pixel/src/modules/behavior/runtime/intelligence/BehaviorRuntimeCoordinator.ts","../../../pixel/src/modules/behavior/trackers/BehaviorTrackerBase.ts","../../../pixel/src/modules/behavior/trackers/ScrollTracker.ts","../../../pixel/src/modules/behavior/trackers/utils/element.ts","../../../pixel/src/modules/behavior/trackers/ClickTracker.ts","../../../pixel/src/modules/behavior/trackers/VisibilityTracker.ts","../../../pixel/src/modules/behavior/trackers/IdleTracker.ts","../../../pixel/src/modules/behavior/trackers/ExitIntentTracker.ts","../../../pixel/src/modules/behavior/viewport/describeViewportElement.ts","../../../pixel/src/modules/behavior/viewport/normalizeViewportConfig.ts","../../../pixel/src/modules/behavior/viewport/ViewportStateStore.ts","../../../pixel/src/modules/behavior/viewport/ViewportTargetRegistry.ts","../../../pixel/src/modules/behavior/viewport/ViewportObserverFactory.ts","../../../pixel/src/modules/behavior/trackers/ViewportTracker.ts","../../../pixel/src/modules/behavior/behavior.module.ts","../../../pixel/src/modules/conversion/auto/BaseAutoTracker.ts","../../../pixel/src/modules/conversion/auto/build-auto-source-origin.ts","../../../pixel/src/modules/conversion/commerce/extractor-utils.ts","../../../pixel/src/modules/conversion/commerce/CustomerExtractor.ts","../../../pixel/src/modules/conversion/commerce/ProductExtractor.ts","../../../pixel/src/modules/conversion/commerce/FormConditionEvaluator.ts","../../../pixel/src/services/commerce/ProductCatalog.ts","../../../pixel/src/services/commerce/CommerceState.ts","../../../pixel/src/services/commerce/OrderCalculator.ts","../../../pixel/src/config/shared/commerce.ts","../../../pixel/src/services/commerce/CommerceResolver.ts","../../../pixel/src/services/commerce/CommerceService.ts","../../../pixel/src/modules/conversion/detectors/TextSelectorResolver.ts","../../../pixel/src/modules/conversion/detectors/SelectorResolver.ts","../../../pixel/src/modules/conversion/detectors/configured/ConfiguredFormDetector.ts","../../../pixel/src/modules/conversion/auto/link/LinkAutoEventMapper.ts","../../../pixel/src/modules/conversion/auto/link/LinkTargetMatcher.ts","../../../pixel/src/modules/conversion/auto/link/LinkValueResolver.ts","../../../pixel/src/modules/conversion/auto/link/normalizeLinkAutoSource.ts","../../../pixel/src/modules/conversion/detectors/configured/ConfiguredLinkDetector.ts","../../../pixel/src/modules/conversion/detectors/configured/ConfiguredSelectorDetector.ts","../../../pixel/src/modules/conversion/detectors/card/card-field-detection.ts","../../../pixel/src/modules/conversion/detectors/card/CardDetector.ts","../../../pixel/src/modules/conversion/detectors/checkout/CheckoutDetector.ts","../../../pixel/src/modules/conversion/detectors/lifecycle/LifecycleAutoDetector.ts","../../../pixel/src/modules/conversion/detectors/selector/selector-utils.ts","../../../pixel/src/modules/conversion/detectors/selector/SelectorDetector.ts","../../../pixel/src/modules/conversion/detectors/text/TextDetector.ts","../../../pixel/src/modules/conversion/detectors/url/HistoryNavigationPatch.ts","../../../pixel/src/modules/conversion/detectors/url/UrlDetector.ts","../../../pixel/src/modules/conversion/auto/AutoTrackerFactory.ts","../../../pixel/src/modules/conversion/dedupe/ConversionDeduper.ts","../../../pixel/src/modules/conversion/dedupe/AddToCartDedupe.ts","../../../pixel/src/modules/conversion/dedupe/dedupe-key.ts","../../../pixel/src/modules/conversion/tracks/BaseTracker.ts","../../../pixel/src/modules/conversion/tracks/AddPaymentInfoTracker.ts","../../../pixel/src/modules/conversion/tracks/AddToCartTracker.ts","../../../pixel/src/modules/conversion/tracks/InitiateCheckoutTracker.ts","../../../pixel/src/modules/conversion/tracks/LeadTracker.ts","../../../pixel/src/modules/conversion/tracks/PurchaseTracker.ts","../../../pixel/src/modules/conversion/tracks/RemoveFromCartTracker.ts","../../../pixel/src/modules/conversion/tracks/SearchTracker.ts","../../../pixel/src/modules/conversion/tracks/ViewContentTracker.ts","../../../pixel/src/modules/conversion/tracks/TrackerFactory.ts","../../../pixel/src/modules/conversion/conversion.engine.ts","../../../pixel/src/modules/conversion/conversion.module.ts","../../../pixel/src/modules/core/engines/fingerprint/FingerprintEngine.ts","../../../pixel/src/modules/core/engines/pageview/NavigationObserver.ts","../../../pixel/src/modules/core/engines/pageview/PageViewDeduper.ts","../../../pixel/src/modules/core/engines/pageview/PageViewEngine.ts","../../../pixel/src/modules/core/engines/session/SessionEngine.ts","../../../pixel/src/modules/core/engines/url-context/UrlContextEngine.ts","../../../pixel/src/modules/core/engines/visitor/VisitorEngine.ts","../../../pixel/src/modules/core/core.module.ts","../../../pixel/src/integration/DestinationRegistry.ts","../../../pixel/src/integration/DestinationMetrics.ts","../../../pixel/src/integration/DestinationLogger.ts","../../../pixel/src/integration/DestinationErrorHandler.ts","../../../pixel/src/integration/DestinationExecutor.ts","../../../pixel/src/integration/DestinationDispatcher.ts","../../../pixel/src/integration/DestinationPipeline.ts","../../../pixel/src/integration/DestinationSubscriber.ts","../../../pixel/src/integration/adapters/BaseDestinationAdapter.ts","../../../pixel/src/integration/adapters/ConsoleDestination.ts","../../../pixel/src/integration/adapters/MemoryDestination.ts","../../../pixel/src/integration/adapters/MockDestination.ts","../../../pixel/src/integration/browser/ExternalPageViewDeduper.ts","../../../pixel/src/integration/browser/ScriptLoader.ts","../../../pixel/src/integration/adapters/browser/meta/types.ts","../../../pixel/src/integration/adapters/browser/meta/MetaScriptLoader.ts","../../../pixel/src/integration/adapters/browser/meta/MetaBrowserDestination.ts","../../../pixel/src/integration/adapters/browser/google/types.ts","../../../pixel/src/integration/adapters/browser/google/GoogleScriptLoader.ts","../../../pixel/src/integration/adapters/browser/google/GoogleBrowserDestination.ts","../../../pixel/src/integration/adapters/browser/tiktok/types.ts","../../../pixel/src/integration/adapters/browser/tiktok/TikTokScriptLoader.ts","../../../pixel/src/integration/adapters/browser/tiktok/TikTokBrowserDestination.ts","../../../pixel/src/integration/IntegrationEngine.ts","../../../pixel/src/modules/integrations/integrations.module.ts","../../../pixel/src/modules/privacy/privacy.module.ts","../../../pixel/src/transport/subscriber/DispatcherSubscriber.ts","../../../pixel/src/transport/batch/BatchManager.ts","../../../pixel/src/transport/compression/IdentityCompressionStrategy.ts","../../../pixel/src/transport/compression/index.ts","../../../pixel/src/transport/coordination/CoordinationManager.ts","../../../pixel/src/transport/dead-letter/DeadLetterManager.ts","../../../pixel/src/transport/delivery/TransportDelivery.ts","../../../pixel/src/transport/flush/FlushManager.ts","../../../pixel/src/transport/network/OfflineDetector.ts","../../../pixel/src/transport/ordering/OrderingManager.ts","../../../pixel/src/transport/pipeline/stages/EnqueueStage.ts","../../../pixel/src/transport/pipeline/stages/NormalizeStage.ts","../../../pixel/src/transport/pipeline/stages/ValidateStage.ts","../../../pixel/src/transport/pipeline/TransportPipeline.ts","../../../pixel/src/transport/queue/PersistentQueue.ts","../../../pixel/src/transport/queue/MemoryQueue.ts","../../../pixel/src/transport/queue/storage/MemoryQueueStorage.ts","../../../pixel/src/transport/queue/storage/LocalStorageQueueStorage.ts","../../../pixel/src/transport/queue/storage/IndexedDBQueueStorage.ts","../../../pixel/src/transport/queue/storage/StorageFactory.ts","../../../pixel/src/transport/replay/ReplayManager.ts","../../../pixel/src/transport/resilience/BackpressureManager.ts","../../../pixel/src/transport/resilience/CircuitBreaker.ts","../../../pixel/src/transport/resilience/CircuitBreakerSender.ts","../../../pixel/src/transport/retry/types.ts","../../../pixel/src/transport/retry/RetryEngine.ts","../../../pixel/src/transport/sender/EventPayloadBuilder.ts","../../../pixel/src/transport/network/fetchWithTimeout.ts","../../../pixel/src/transport/sender/HttpSender.ts","../../../pixel/src/transport/sender/MockSender.ts","../../../pixel/src/transport/sender/TimedSender.ts","../../../pixel/src/transport/transport.engine.ts","../../../pixel/src/transport/transport.module.ts","../../../pixel/src/runtime/ModuleRegistry.ts","../../../pixel/src/events/builder/BaseEventBuilder.ts","../../../pixel/src/logger/ConsolePixelLogger.ts","../../../pixel/src/services/attribution/types.ts","../../../pixel/src/services/attribution/ClickIdParser.ts","../../../pixel/src/services/attribution/CookieCollector.ts","../../../pixel/src/services/attribution/AttributionCollector.ts","../../../pixel/src/services/attribution/AttributionStore.ts","../../../pixel/src/services/attribution/AttributionService.ts","../../../pixel/src/services/browser-metadata/BrowserMetadataService.ts","../../../pixel/src/services/dispatcher/DispatcherService.ts","../../../pixel/src/services/fingerprint/FingerprintService.ts","../../../pixel/src/services/storage/BrowserStorageAdapter.ts","../../../pixel/src/services/storage/MemoryStorageAdapter.ts","../../../pixel/src/services/storage/StorageService.ts","../../../pixel/src/services/storage/StorageFactory.ts","../../../pixel/src/services/session/session-id.ts","../../../pixel/src/services/session/SessionService.ts","../../../pixel/src/services/visitor/visitor-id.ts","../../../pixel/src/services/visitor/VisitorService.ts","../../../pixel/src/modules/core/url-context/constants.ts","../../../pixel/src/modules/core/url-context/utils.ts","../../../pixel/src/modules/core/url-context/QueryParamCollector.ts","../../../pixel/src/modules/core/url-context/ManagedParamResolver.ts","../../../pixel/src/modules/core/url-context/ForwardParamResolver.ts","../../../pixel/src/modules/core/url-context/LinkDecorator.ts","../../../pixel/src/modules/core/url-context/UrlContextStore.ts","../../../pixel/src/modules/core/url-context/resolve-config.ts","../../../pixel/src/modules/core/url-context/UrlContextService.ts","../../../pixel/src/modules/core/url-context/prepareJourneyUrlContext.ts","../../../pixel/src/runtime/PixelRuntime.ts","../../../pixel/src/pixel/Pixel.ts","../../../pixel/src/config/defaults/attribution.ts","../../../pixel/src/config/defaults/modules/behavior.ts","../../../pixel/src/config/defaults/modules/conversion.ts","../../../pixel/src/config/defaults/modules/core.ts","../../../pixel/src/config/defaults/modules/integrations.ts","../../../pixel/src/config/defaults/modules/privacy.ts","../../../pixel/src/config/defaults/modules/transport.ts","../../../pixel/src/config/defaults/pixel-default-config.ts","../../../pixel/src/services/dispatcher/DispatcherService.ts","../../../pixel/src/services/browser-metadata/BrowserMetadataService.ts","../../../pixel/src/services/fingerprint/FingerprintService.ts","../../../pixel/src/services/session/session-id.ts","../../../pixel/src/services/session/SessionService.ts","../../../pixel/src/services/storage/BrowserStorageAdapter.ts","../../../pixel/src/services/storage/MemoryStorageAdapter.ts","../../../pixel/src/services/storage/StorageService.ts","../../../pixel/src/services/storage/StorageFactory.ts","../../../pixel/src/services/visitor/visitor-id.ts","../../../pixel/src/services/visitor/VisitorService.ts","../../../pixel/src/services/attribution/types.ts","../../../pixel/src/services/attribution/ClickIdParser.ts","../../../pixel/src/services/attribution/CookieCollector.ts","../../../pixel/src/services/attribution/AttributionCollector.ts","../../../pixel/src/services/attribution/AttributionStore.ts","../../../pixel/src/services/attribution/AttributionService.ts","../../../pixel/src/services/commerce/ProductCatalog.ts","../../../pixel/src/services/commerce/CommerceState.ts","../../../pixel/src/services/commerce/OrderCalculator.ts","../../../pixel/src/config/shared/commerce.ts","../../../pixel/src/services/commerce/CommerceResolver.ts","../../../pixel/src/services/commerce/CommerceService.ts","../../src/domain/BemonyLeadInput.ts","../../src/domain/BemonyPaymentMethodInput.ts","../../src/domain/resolvePriceCode.ts","../../src/BemonyPixel.ts","../../src/domain/BemonyPageContext.ts","../../src/domain/resolveBemonyPageContext.ts","../../src/domain/validateBemonyPageContext.ts","../../src/platform/defaults.ts","../../src/navigation/BemonyLinkPolicy.ts","../../src/navigation/configureBemonyLinks.ts","../../src/platform/environments.ts","../../src/scenarios/checkout.ts","../../src/scenarios/one-click-checkout.ts","../../src/navigation/createBemonyOfferLinkSource.ts","../../src/scenarios/offer-page.ts","../../src/scenarios/thank-you.ts","../../src/scenarios/upsell-offer.ts","../../src/createBemonyPixelConfig.ts","../../src/createBemonyPixel.ts","../../src/browser/errors.ts","../../src/browser/events.ts","../../src/browser/bootstrap.ts","../../src/scenarios/types.ts","../../src/browser/resolveExecutingScript.ts","../../src/browser/resolveAutoInitConfig.ts","../../src/browser/autoInit.ts"],"sourcesContent":["/**\n * Entry IIFE / global browser.\n *\n * Global estável: `window.BemonyPixel` (namespace de API).\n * Side effect: atribui o namespace e inicia auto-init por padrão\n * (opt-out: `data-auto-init=\"false\"`).\n *\n * Não use este módulo no SSR. O entry principal (`@beworke/pixel-bemony`)\n * e `@beworke/pixel-bemony/browser` não têm este side effect.\n */\n\nimport { createBemonyPixel } from '../createBemonyPixel';\nimport { BemonyPixel } from '../BemonyPixel';\nimport {\n bootstrapBemonyPixel,\n destroyBootstrappedBemonyPixel,\n getBootstrappedBemonyPixel,\n getBootstrappedBemonyPixelPending,\n} from './bootstrap';\nimport { installBemonyPixelAutoInit } from './autoInit';\nimport { BemonyBootstrapError } from './errors';\nimport {\n isAutoInitEnabledFromAttr,\n resolveAutoInitConfig,\n} from './resolveAutoInitConfig';\nimport { resolveBemonyExecutingScript } from './resolveExecutingScript';\nimport {\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n} from '../platform/defaults';\n\nexport type BemonyPixelGlobalApi = {\n BemonyPixel: typeof BemonyPixel;\n createBemonyPixel: typeof createBemonyPixel;\n bootstrapBemonyPixel: typeof bootstrapBemonyPixel;\n installBemonyPixelAutoInit: typeof installBemonyPixelAutoInit;\n getBootstrappedBemonyPixel: typeof getBootstrappedBemonyPixel;\n destroyBootstrappedBemonyPixel: typeof destroyBootstrappedBemonyPixel;\n BemonyBootstrapError: typeof BemonyBootstrapError;\n /** Promise da primeira tentativa de auto-init do entry global. */\n ready: Promise<BemonyPixel | null>;\n /** Aguarda instância pronta (pending, existente ou auto-init). */\n whenReady: () => Promise<BemonyPixel>;\n /** Endpoint público padrão (infraestrutura, não credencial). */\n BEMONY_DEFAULT_API_ENDPOINT: typeof BEMONY_DEFAULT_API_ENDPOINT;\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS: typeof BEMONY_BROWSER_AUTO_INIT_DEFAULTS;\n};\n\nlet readyResolve!: (value: BemonyPixel | null) => void;\nlet readyReject!: (reason: unknown) => void;\n\nconst readyPromise: Promise<BemonyPixel | null> = new Promise(\n (resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n }\n);\n\nlet readySettled = false;\n\nfunction settleReadyOk(value: BemonyPixel | null): void {\n if (readySettled) return;\n readySettled = true;\n readyResolve(value);\n}\n\nfunction settleReadyError(error: unknown): void {\n if (readySettled) return;\n readySettled = true;\n readyReject(error);\n}\n\nasync function whenReadyImpl(): Promise<BemonyPixel> {\n const existing = getBootstrappedBemonyPixel();\n if (existing && existing.getState() === 'ready') {\n return existing;\n }\n\n const pending = getBootstrappedBemonyPixelPending();\n if (pending) {\n return pending;\n }\n\n if (!readySettled) {\n const fromReady = await readyPromise;\n if (fromReady) {\n return fromReady;\n }\n throw new BemonyBootstrapError(\n 'Auto-init desabilitado (data-auto-init=false) e nenhuma instância bootstrapada.',\n 'AUTO_INIT_DISABLED'\n );\n }\n\n const afterReady = getBootstrappedBemonyPixel();\n if (afterReady && afterReady.getState() === 'ready') {\n return afterReady;\n }\n\n const pendingAgain = getBootstrappedBemonyPixelPending();\n if (pendingAgain) {\n return pendingAgain;\n }\n\n throw new BemonyBootstrapError(\n 'Nenhuma instância BemonyPixel disponível. Auto-init desabilitado ou ainda não iniciado.',\n 'AUTO_INIT_DISABLED'\n );\n}\n\nexport const bemonyPixelGlobalApi: BemonyPixelGlobalApi = {\n BemonyPixel,\n createBemonyPixel,\n bootstrapBemonyPixel,\n installBemonyPixelAutoInit,\n getBootstrappedBemonyPixel,\n destroyBootstrappedBemonyPixel,\n BemonyBootstrapError,\n ready: readyPromise,\n whenReady: whenReadyImpl,\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n};\n\ndeclare global {\n interface Window {\n BemonyPixel?: BemonyPixelGlobalApi;\n }\n}\n\n/**\n * @returns `true` se este carregamento é o dono do namespace (deve auto-iniciar).\n */\nfunction assignGlobal(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n const previous = window.BemonyPixel;\n if (previous && previous !== bemonyPixelGlobalApi) {\n // Bundle carregado de novo: preserva Promise/API já em uso\n return false;\n }\n window.BemonyPixel = bemonyPixelGlobalApi;\n return true;\n}\n\nfunction startDefaultGlobalAutoInit(shouldAutoInit: boolean): void {\n if (!shouldAutoInit) {\n return;\n }\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n settleReadyOk(null);\n return;\n }\n\n // Já há instância/pending de um carregamento anterior do bundle\n const existing = getBootstrappedBemonyPixel();\n if (\n existing &&\n (existing.getState() === 'ready' || existing.getState() === 'initializing')\n ) {\n settleReadyOk(existing);\n return;\n }\n const pending = getBootstrappedBemonyPixelPending();\n if (pending) {\n void pending.then(settleReadyOk, settleReadyError);\n return;\n }\n\n let script: HTMLScriptElement | null = null;\n try {\n script = resolveBemonyExecutingScript();\n } catch (error: unknown) {\n // eslint-disable-next-line no-console\n console.error(\n '[bemony-pixel] auto-init:',\n error instanceof Error ? error.message : 'script resolution failed'\n );\n settleReadyError(error);\n return;\n }\n\n const autoInitAttr = script?.getAttribute('data-auto-init') ?? null;\n let enabled = true;\n try {\n // Sem script: ainda assim auto-init com defaults (sem opt-out possível)\n enabled = script\n ? isAutoInitEnabledFromAttr(\n script.hasAttribute('data-auto-init') ? autoInitAttr : null\n )\n : true;\n } catch (error: unknown) {\n // eslint-disable-next-line no-console\n console.error(\n '[bemony-pixel] auto-init:',\n error instanceof Error ? error.message : 'invalid data-auto-init'\n );\n settleReadyError(error);\n return;\n }\n\n if (!enabled) {\n settleReadyOk(null);\n return;\n }\n\n void installBemonyPixelAutoInit({ script })\n .then(result => {\n settleReadyOk(result?.pixel ?? null);\n })\n .catch((error: unknown) => {\n const message =\n error instanceof Error ? error.message : 'auto-init falhou';\n // eslint-disable-next-line no-console\n console.error('[bemony-pixel] auto-init:', message);\n settleReadyError(error);\n });\n}\n\nconst ownsGlobal = assignGlobal();\nstartDefaultGlobalAutoInit(ownsGlobal);\n\nexport {\n BemonyPixel,\n createBemonyPixel,\n bootstrapBemonyPixel,\n destroyBootstrappedBemonyPixel,\n getBootstrappedBemonyPixel,\n installBemonyPixelAutoInit,\n resolveAutoInitConfig,\n BemonyBootstrapError,\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n};\n\n/** Re-exports estáveis (também no objeto IIFE antes do footer restaurar a API). */\nexport const whenReady = whenReadyImpl;\nexport { readyPromise as ready };\n","const SECRET_EXACT =\n /^(password|pass|secret|token|access[_-]?token|refresh[_-]?token|authorization|auth|cookie|set[_-]?cookie|cvv|cvc|pan|card[_-]?number|security[_-]?code|private[_-]?key|client[_-]?secret|api[_-]?key)$/i;\n\n/** Chaves cujo valor deve ser mascarado (não redacted total). */\nconst MASK_EMAIL =\n /^(e[_-]?mail|user[_-]?email|customer[_-]?email|emailAddress)$/i;\nconst MASK_PHONE =\n /^(phone|telefone|mobile|cell|tel|user[_-]?phone|phoneNumber)$/i;\nconst MASK_NAME =\n /^(name|full[_-]?name|first[_-]?name|last[_-]?name|customer[_-]?name|display[_-]?name)$/i;\nconst REDACT_ADDRESS =\n /^(address|addr|street|billing[_-]?address|shipping[_-]?address)$/i;\n\n/** Tokens sensíveis embutidos em nomes compostos (userPassword, my_api_key). */\nconst SENSITIVE_EMBEDDED =\n /(password|passwd|secret|token|authorization|cookie|cvv|cvc|cardnumber|privatekey|apikey|clientsecret|accesstoken|refreshtoken)/i;\n\nconst MAX_STRING = 512;\nconst MAX_ARRAY = 100;\nconst MAX_DEPTH = 8;\n\nexport function maskEmail(value: string): string {\n const at = value.indexOf('@');\n if (at <= 1) return '***';\n return `${value[0]}***${value.slice(at)}`;\n}\n\nexport function maskPhone(value: string): string {\n const digits = value.replace(/\\D/g, '');\n if (digits.length < 4) return '***';\n return `***${digits.slice(-4)}`;\n}\n\nexport function maskName(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length <= 1) return '*';\n return `${trimmed[0]}***`;\n}\n\nfunction normalizeKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n}\n\nexport function isSensitiveKey(key: string): boolean {\n const raw = key.trim();\n if (!raw) return false;\n if (SECRET_EXACT.test(raw)) return true;\n if (MASK_EMAIL.test(raw) || MASK_PHONE.test(raw)) return true;\n if (MASK_NAME.test(raw) || REDACT_ADDRESS.test(raw)) return true;\n const compact = normalizeKey(raw);\n if (SENSITIVE_EMBEDDED.test(compact)) return true;\n return false;\n}\n\nfunction redactValueForKey(key: string, value: unknown): unknown {\n if (typeof value !== 'string') return '[Redacted]';\n if (MASK_EMAIL.test(key) || /email/i.test(key)) return maskEmail(value);\n if (MASK_PHONE.test(key) || /phone|telefone|tel/i.test(key)) {\n return maskPhone(value);\n }\n if (MASK_NAME.test(key)) return maskName(value);\n if (REDACT_ADDRESS.test(key)) return '[Redacted]';\n return '[Redacted]';\n}\n\nexport function safeClone<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n try {\n return JSON.parse(JSON.stringify(value)) as T;\n } catch {\n return value;\n }\n }\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n if (Object.isFrozen(value)) return value;\n\n if (value instanceof Map) {\n // Snapshot não deve expor Map mutável — congelar entrada já materializada\n for (const [, v] of value) {\n if (v && typeof v === 'object') deepFreeze(v);\n }\n return Object.freeze(value);\n }\n if (value instanceof Set) {\n for (const v of value) {\n if (v && typeof v === 'object') deepFreeze(v);\n }\n return Object.freeze(value);\n }\n\n for (const key of Reflect.ownKeys(value as object)) {\n const child = (value as Record<string | symbol, unknown>)[key];\n if (child && typeof child === 'object') {\n deepFreeze(child);\n }\n }\n return Object.freeze(value);\n}\n\nexport function truncateLargeValues(value: unknown, depth = 0): unknown {\n if (depth > MAX_DEPTH) return '[Truncated:max_depth]';\n if (typeof value === 'string') {\n return value.length > MAX_STRING\n ? `${value.slice(0, MAX_STRING)}…[truncated]`\n : value;\n }\n if (Array.isArray(value)) {\n const sliced = value\n .slice(0, MAX_ARRAY)\n .map(v => truncateLargeValues(v, depth + 1));\n if (value.length > MAX_ARRAY) {\n sliced.push(`[Truncated:${value.length - MAX_ARRAY}_more]`);\n }\n return sliced;\n }\n if (value instanceof Map) {\n const out: Record<string, unknown> = {};\n let i = 0;\n for (const [k, v] of value) {\n if (i++ >= MAX_ARRAY) {\n out.__truncated__ = true;\n break;\n }\n out[String(k)] = truncateLargeValues(v, depth + 1);\n }\n return out;\n }\n if (value instanceof Set) {\n return truncateLargeValues([...value], depth);\n }\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = truncateLargeValues(v, depth + 1);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Sanitização recursiva com proteção a ciclos.\n * Nunca lança; nunca loga o valor removido.\n */\nexport function recursiveSanitize(\n input: unknown,\n seen = new WeakSet<object>()\n): unknown {\n if (input === null || input === undefined) return input;\n if (\n typeof input === 'string' ||\n typeof input === 'number' ||\n typeof input === 'boolean'\n ) {\n return input;\n }\n if (typeof input === 'bigint') return String(input);\n if (typeof input === 'function' || typeof input === 'symbol') {\n return '[Unavailable]';\n }\n if (typeof input !== 'object') return String(input);\n\n if (seen.has(input as object)) return '[Circular]';\n seen.add(input as object);\n\n if (Array.isArray(input)) {\n return input.map(item => recursiveSanitize(item, seen));\n }\n\n if (input instanceof Map) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of input) {\n const key = String(k);\n out[key] = isSensitiveKey(key)\n ? redactValueForKey(key, v)\n : recursiveSanitize(v, seen);\n }\n return out;\n }\n\n if (input instanceof Set) {\n return [...input].map(item => recursiveSanitize(item, seen));\n }\n\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (isSensitiveKey(key)) {\n out[key] = redactValueForKey(key, value);\n continue;\n }\n out[key] = recursiveSanitize(value, seen);\n }\n return out;\n}\n\nexport function redactSensitiveKeys(\n input: Record<string, unknown>\n): Record<string, unknown> {\n return recursiveSanitize(input) as Record<string, unknown>;\n}\n\nexport function safeSerialize(input: unknown): string {\n try {\n const sanitized = truncateLargeValues(recursiveSanitize(input));\n return JSON.stringify(sanitized);\n } catch {\n return '{\"error\":\"[SerializeFailed]\"}';\n }\n}\n\n/** Clone + sanitize + freeze pipeline para snapshots. */\nexport function freezeSanitizedSnapshot<T extends object>(\n input: T\n): Readonly<T> {\n const cloned = safeClone(input);\n const sanitized = recursiveSanitize(cloned) as T;\n const truncated = truncateLargeValues(sanitized) as T;\n return deepFreeze(truncated);\n}\n","import type {\n DebugHealthStatus,\n RuntimeHealthSnapshot,\n SnapshotCollectContext,\n} from './types';\n\nexport function evaluateRuntimeHealth(\n ctx: SnapshotCollectContext\n): RuntimeHealthSnapshot {\n const checks: Array<{\n id: string;\n status: DebugHealthStatus;\n detail?: string;\n }> = [];\n const reasons: string[] = [];\n\n const push = (\n id: string,\n status: DebugHealthStatus,\n detail?: string\n ): void => {\n checks.push({ id, status, ...(detail ? { detail } : {}) });\n if (status === 'degraded' || status === 'unhealthy') {\n reasons.push(detail ? `${id}: ${detail}` : id);\n }\n };\n\n if (!ctx.runtimeInitialized) {\n push('runtime', 'unknown', 'Runtime not initialized');\n } else if (ctx.runtimeDestroyed) {\n push('runtime', 'unknown', 'Runtime destroyed');\n } else {\n push('runtime', 'healthy');\n }\n\n if (!ctx.transport.enabled) {\n push('transport', 'healthy', 'Transport disabled by config');\n } else if (!ctx.transport.state) {\n push('transport', 'unknown', 'Transport state unavailable');\n } else {\n const t = ctx.transport.state;\n if (t.circuitBreakerState === 'open') {\n push('circuitBreaker', 'unhealthy', 'Circuit breaker open');\n } else if (t.circuitBreakerState === 'half_open') {\n push('circuitBreaker', 'degraded', 'Circuit breaker half-open');\n } else {\n push('circuitBreaker', 'healthy');\n }\n\n if (t.online === false) {\n push('offline', 'degraded', 'Client offline');\n } else if (t.online === true) {\n push('offline', 'healthy');\n } else {\n push('offline', 'unknown');\n }\n\n if (typeof t.dlqCount === 'number' && t.dlqCount > 0) {\n push('dlq', 'degraded', `DLQ has ${t.dlqCount} entries`);\n } else {\n push('dlq', 'healthy');\n }\n }\n\n if (ctx.integrations.enabled && ctx.integrations.active === false) {\n push('integrations', 'degraded', 'Integrations enabled but inactive');\n } else {\n push('integrations', 'healthy');\n }\n\n if (\n ctx.behaviorViewport?.enabled === true &&\n ctx.behaviorViewport.available === false\n ) {\n push(\n 'behaviorViewport',\n 'degraded',\n 'BEHAVIOR_VIEWPORT_UNAVAILABLE: IntersectionObserver not available'\n );\n }\n\n const engagement = ctx.behaviorEngagement;\n if (engagement?.enabled === true && engagement.running === true) {\n // Drift excessivo do scheduler ou falha isolada do calculator degradam\n // apenas o engine opcional, sem tornar o Pixel inteiro unhealthy.\n const driftBudget = engagement.evaluationIntervalMs;\n const drift = engagement.lastDriftMs;\n if (engagement.hasError) {\n push(\n 'behaviorEngagement',\n 'degraded',\n 'BEHAVIOR_ENGAGEMENT_CALC_ERROR: score calculation failed'\n );\n } else if (\n typeof drift === 'number' &&\n driftBudget > 0 &&\n drift > driftBudget\n ) {\n push(\n 'behaviorEngagement',\n 'degraded',\n `BEHAVIOR_ENGAGEMENT_DRIFT: scheduler drift ${drift}ms`\n );\n }\n }\n\n const rateLimit = ctx.behaviorRateLimit;\n if (rateLimit?.enabled === true) {\n const total = rateLimit.accepted + rateLimit.dropped;\n const dropRate = total > 0 ? rateLimit.dropped / total : 0;\n if (dropRate >= 0.5 && rateLimit.dropped > 0) {\n push(\n 'behaviorRateLimit',\n 'degraded',\n `BEHAVIOR_RATE_LIMIT_HIGH_DROP: ${rateLimit.dropped}/${total} dropped`\n );\n }\n }\n\n const buffer = ctx.behaviorBuffer;\n if (buffer?.enabled === true && buffer.maxSize > 0) {\n if (buffer.size >= buffer.maxSize) {\n push(\n 'behaviorBuffer',\n 'degraded',\n 'BEHAVIOR_BUFFER_FULL: buffer reached maxSize'\n );\n }\n }\n\n const stateMachine = ctx.behaviorStateMachine;\n if (\n stateMachine?.enabled === true &&\n stateMachine.invalidTransitionCount > 0\n ) {\n push(\n 'behaviorStateMachine',\n 'degraded',\n `BEHAVIOR_STATE_INVALID_TRANSITIONS: ${stateMachine.invalidTransitionCount}`\n );\n }\n\n let status: DebugHealthStatus = 'healthy';\n if (checks.some(c => c.status === 'unhealthy')) status = 'unhealthy';\n else if (checks.some(c => c.status === 'degraded')) status = 'degraded';\n else if (checks.every(c => c.status === 'unknown')) status = 'unknown';\n else if (\n checks.some(c => c.status === 'unknown') &&\n !ctx.runtimeInitialized\n ) {\n status = 'unknown';\n }\n\n return { status, checks, reasons };\n}\n","import { evaluateRuntimeHealth } from './RuntimeHealthEvaluator';\nimport { freezeSanitizedSnapshot } from './sanitize';\nimport type { PixelDebugSnapshot, SnapshotCollectContext } from './types';\n\nexport function buildDebugSnapshot(\n ctx: SnapshotCollectContext\n): Readonly<PixelDebugSnapshot> {\n const services = ctx.services;\n const transportState = ctx.transport.state;\n\n const snapshot: PixelDebugSnapshot = {\n sdkVersion: ctx.sdkVersion,\n capturedAt: Date.now(),\n runtime: {\n initialized: ctx.runtimeInitialized,\n destroyed: ctx.runtimeDestroyed,\n moduleCount: ctx.moduleRegistry.length,\n activeModuleCount: ctx.moduleRegistry.filter(m => m.initialized).length,\n moduleNames: ctx.moduleRegistry.map(m => m.name),\n activeModuleNames: ctx.moduleRegistry\n .filter(m => m.initialized)\n .map(m => m.name),\n },\n modules: ctx.moduleRegistry.map(m => ({\n id: m.name,\n configuredEnabled: m.configuredEnabled,\n initialized: m.initialized,\n })),\n core: {\n enabled: ctx.moduleRegistry.some(\n m => m.name === 'core' && m.configuredEnabled\n ),\n visitorId: services?.visitorId ?? null,\n sessionId: services?.sessionId ?? null,\n sessionExpired: services?.sessionExpired ?? null,\n fingerprint: services?.fingerprint ?? null,\n urlContextEnabled: services?.urlContextEnabled ?? false,\n },\n urlContext: services?.urlContextSnapshot\n ? {\n enabled: services.urlContextEnabled,\n available: true,\n managedKeys: Object.keys(services.urlContextSnapshot.managed),\n forwardedKeys: Object.keys(services.urlContextSnapshot.forwarded),\n source: { ...services.urlContextSnapshot.source },\n queryParamCount: services.urlContextSnapshot.queryParamCount,\n }\n : {\n enabled: false,\n available: false,\n managedKeys: [],\n forwardedKeys: [],\n source: {},\n queryParamCount: 0,\n },\n attribution: {\n enabled: services?.attributionEnabled ?? false,\n available: services?.attributionIdentifiers != null,\n identifierKeys: services?.attributionIdentifiers\n ? Object.keys(services.attributionIdentifiers)\n : [],\n identifiers: services?.attributionIdentifiers\n ? { ...services.attributionIdentifiers }\n : {},\n },\n commerce: {\n enabled: services?.commerceEnabled ?? false,\n available: services != null,\n mode: services?.commerceMode ?? null,\n currency: services?.commerceCurrency ?? null,\n catalogSize: services?.catalogSize ?? 0,\n itemCount: services?.itemCount ?? 0,\n cartValue: services?.cartValue ?? null,\n productIds: services?.productIds ?? [],\n },\n behavior: {\n enabled: ctx.behaviorEnabled,\n configuredTrackers: [...ctx.behaviorTrackers],\n configuredEngines: [...ctx.behaviorEngines],\n heartbeat: ctx.behaviorHeartbeat\n ? {\n enabled: ctx.behaviorHeartbeat.enabled,\n initialized: ctx.behaviorHeartbeat.initialized,\n running: ctx.behaviorHeartbeat.running,\n intervalMs: ctx.behaviorHeartbeat.intervalMs,\n hiddenIntervalMs: ctx.behaviorHeartbeat.hiddenIntervalMs,\n sequence: ctx.behaviorHeartbeat.sequence,\n emittedCount: ctx.behaviorHeartbeat.emittedCount,\n skippedCount: ctx.behaviorHeartbeat.skippedCount,\n lastEmittedAt: ctx.behaviorHeartbeat.lastEmittedAt,\n nextExpectedAt: ctx.behaviorHeartbeat.nextExpectedAt,\n lastDriftMs: ctx.behaviorHeartbeat.lastDriftMs,\n }\n : null,\n viewport: ctx.behaviorViewport\n ? {\n enabled: ctx.behaviorViewport.enabled,\n initialized: ctx.behaviorViewport.initialized,\n available: ctx.behaviorViewport.available,\n targetCount: ctx.behaviorViewport.targetCount,\n matchedElementCount: ctx.behaviorViewport.matchedElementCount,\n observedElementCount: ctx.behaviorViewport.observedElementCount,\n activeElementCount: ctx.behaviorViewport.activeElementCount,\n pendingElementCount: ctx.behaviorViewport.pendingElementCount,\n enterCount: ctx.behaviorViewport.enterCount,\n exitCount: ctx.behaviorViewport.exitCount,\n mutationObserverEnabled:\n ctx.behaviorViewport.mutationObserverEnabled,\n maxObservedElements: ctx.behaviorViewport.maxObservedElements,\n limitReached: ctx.behaviorViewport.limitReached,\n lastEventAt: ctx.behaviorViewport.lastEventAt,\n }\n : null,\n engagement: ctx.behaviorEngagement\n ? {\n enabled: ctx.behaviorEngagement.enabled,\n initialized: ctx.behaviorEngagement.initialized,\n running: ctx.behaviorEngagement.running,\n score: ctx.behaviorEngagement.score,\n previousScore: ctx.behaviorEngagement.previousScore,\n peakScore: ctx.behaviorEngagement.peakScore,\n averageScore: ctx.behaviorEngagement.averageScore,\n level: ctx.behaviorEngagement.level,\n evaluationCount: ctx.behaviorEngagement.evaluationCount,\n emittedUpdateCount: ctx.behaviorEngagement.emittedUpdateCount,\n emittedSummaryCount: ctx.behaviorEngagement.emittedSummaryCount,\n lastEvaluatedAt: ctx.behaviorEngagement.lastEvaluatedAt,\n lastEmittedAt: ctx.behaviorEngagement.lastEmittedAt,\n evaluationIntervalMs: ctx.behaviorEngagement.evaluationIntervalMs,\n lastDriftMs: ctx.behaviorEngagement.lastDriftMs,\n hasError: ctx.behaviorEngagement.hasError,\n signalCounts: { ...ctx.behaviorEngagement.signalCounts },\n }\n : null,\n rateLimit: ctx.behaviorRateLimit ? { ...ctx.behaviorRateLimit } : null,\n buffer: ctx.behaviorBuffer ? { ...ctx.behaviorBuffer } : null,\n stateMachine: ctx.behaviorStateMachine\n ? { ...ctx.behaviorStateMachine }\n : null,\n sessionSummary: ctx.behaviorSessionSummary\n ? { ...ctx.behaviorSessionSummary }\n : null,\n },\n conversion: {\n enabled: ctx.conversion.enabled,\n autoEnabled: ctx.conversion.autoEnabled,\n manualEnabledFlags: { ...ctx.conversion.manualEnabledFlags },\n detectorCount: ctx.conversion.detectorCount,\n activeDetectors: [...ctx.conversion.activeDetectors],\n dedupeKeyCount: ctx.conversion.dedupeKeyCount,\n },\n integrations: {\n enabled: ctx.integrations.enabled,\n available: true,\n active: ctx.integrations.active,\n destinationNames: [...ctx.integrations.destinationNames],\n metrics: ctx.integrations.metrics\n ? { ...ctx.integrations.metrics }\n : null,\n },\n transport: transportState\n ? {\n enabled: ctx.transport.enabled,\n available: true,\n online: transportState.online,\n senderMode: transportState.senderMode,\n queueSize: transportState.queueSize,\n sentCount: transportState.sentCount,\n ackCount: transportState.ackCount,\n inFlight: transportState.inFlight,\n retryPending: transportState.retryPending,\n circuitBreakerState: transportState.circuitBreakerState,\n dlqCount: transportState.dlqCount,\n isLeader: transportState.isLeader,\n persistenceEnabled: transportState.persistenceEnabled,\n }\n : {\n enabled: ctx.transport.enabled,\n available: false,\n online: 'unknown',\n senderMode: ctx.transport.enabled ? 'unavailable' : 'unknown',\n queueSize: 'unavailable',\n sentCount: 'unavailable',\n ackCount: 'unavailable',\n inFlight: 'unavailable',\n retryPending: 'unavailable',\n circuitBreakerState: 'unavailable',\n dlqCount: 'unavailable',\n isLeader: 'unavailable',\n persistenceEnabled: 'unavailable',\n },\n health: evaluateRuntimeHealth(ctx),\n warnings: buildWarnings(ctx),\n errors: [],\n config: ctx.configSafe,\n };\n\n return freezeSanitizedSnapshot(snapshot);\n}\n\nfunction buildWarnings(ctx: SnapshotCollectContext) {\n const warnings: Array<{\n code: string;\n message: string;\n source?: string;\n }> = [];\n if (!ctx.runtimeInitialized) {\n warnings.push({\n code: 'RUNTIME_NOT_INITIALIZED',\n message: 'Snapshot captured before init()',\n source: 'runtime',\n });\n }\n if (ctx.runtimeDestroyed) {\n warnings.push({\n code: 'RUNTIME_DESTROYED',\n message: 'Snapshot captured after destroy()',\n source: 'runtime',\n });\n }\n if (ctx.transport.enabled && !ctx.transport.state) {\n warnings.push({\n code: 'TRANSPORT_STATE_UNAVAILABLE',\n message: 'Transport enabled but debug state unavailable',\n source: 'transport',\n });\n }\n return warnings;\n}\n","import type { PixelConfig } from '@/config';\nimport type { BehaviorModule } from '@/modules/behavior/behavior.module';\nimport type { ConversionModule } from '@/modules/conversion/conversion.module';\nimport type { IntegrationsModule } from '@/modules/integrations/integrations.module';\nimport type { TransportModule } from '@/transport/transport.module';\nimport type { PixelRuntime } from '@/runtime/PixelRuntime';\n\nimport { buildDebugSnapshot } from './SnapshotBuilder';\nimport { redactSensitiveKeys } from './sanitize';\nimport type { PixelDebugSnapshot, SnapshotCollectContext } from './types';\n\nexport type DebugSnapshotDeps = {\n getSdkVersion: () => string;\n getRuntime: () => PixelRuntime;\n getTransportModule: () => TransportModule;\n getConversionModule: () => ConversionModule;\n getIntegrationsModule: () => IntegrationsModule;\n getBehaviorModule: () => BehaviorModule;\n getConfig: () => PixelConfig;\n getRegisteredModules: () => ReadonlyArray<{\n name: string;\n configuredEnabled: boolean;\n }>;\n};\n\n/**\n * Orquestra coleta read-only → build → sanitize → freeze.\n * Sem timers, sem listeners, sem mutação de Runtime.\n */\nexport class DebugSnapshotService {\n private readonly deps: DebugSnapshotDeps;\n\n private destroyed = false;\n\n constructor(deps: DebugSnapshotDeps) {\n this.deps = deps;\n }\n\n markDestroyed(): void {\n this.destroyed = true;\n }\n\n markAlive(): void {\n this.destroyed = false;\n }\n\n getSnapshot(): Readonly<PixelDebugSnapshot> {\n return buildDebugSnapshot(this.collect());\n }\n\n private collect(): SnapshotCollectContext {\n const runtime = this.deps.getRuntime();\n const config = this.deps.getConfig();\n const services = runtime.getDebugServices();\n const transportModule = this.deps.getTransportModule();\n const conversionModule = this.deps.getConversionModule();\n const integrationsModule = this.deps.getIntegrationsModule();\n const transportState = transportModule.getDebugState();\n const registered = this.deps.getRegisteredModules();\n const initializedNames = new Set(runtime.getInitializedModuleNames());\n\n const moduleRegistry = registered.map(m => ({\n name: m.name,\n configuredEnabled: m.configuredEnabled,\n initialized: initializedNames.has(m.name),\n }));\n\n let servicesBag: SnapshotCollectContext['services'] = null;\n if (services) {\n const urlSnap = services.urlContext.isEnabled()\n ? services.urlContext.getSnapshot()\n : null;\n const commerceSnap = services.commerce.state.getSnapshot();\n const catalogProducts = services.commerce.catalog.list();\n const items = commerceSnap.selectedItems ?? [];\n let cartValue: number | null = 0;\n for (const item of items) {\n const fromItem =\n typeof item.price === 'number' ? item.price : undefined;\n const fromCatalog = catalogProducts.find(\n p => p.id === item.productId\n )?.price;\n const price = fromItem ?? fromCatalog ?? 0;\n cartValue += price * (item.quantity ?? 1);\n }\n\n const attrSnap = services.attribution.getSnapshot();\n const identifiers: Record<string, string> = {};\n for (const [k, v] of Object.entries(attrSnap)) {\n if (typeof v === 'string' && v.length > 0) identifiers[k] = v;\n }\n\n const sessionTtl = config.modules.core.session.ttlMs;\n\n servicesBag = {\n visitorId: services.visitor.getVisitorId(),\n sessionId: services.session.getSessionId(),\n sessionExpired: services.session.isExpired(sessionTtl),\n fingerprint: services.fingerprint.getFingerprint(),\n urlContextEnabled: services.urlContext.isEnabled(),\n urlContextSnapshot: urlSnap\n ? {\n managed: { ...(urlSnap.urlContext.managed ?? {}) },\n forwarded: { ...(urlSnap.urlContext.forwarded ?? {}) },\n source: {\n ...((urlSnap.urlContext.source as Record<string, string>) ??\n {}),\n },\n queryParamCount: Object.keys(urlSnap.queryParams).length,\n }\n : null,\n attributionEnabled: config.attribution?.enabled !== false,\n attributionIdentifiers: identifiers,\n commerceEnabled: services.commerce.isEnabled(),\n commerceMode: config.commerce?.cart?.mode ?? null,\n commerceCurrency: config.commerce?.currency ?? null,\n catalogSize: catalogProducts.length,\n itemCount: commerceSnap.count,\n cartValue,\n productIds: items.map(i => i.productId).filter(Boolean),\n };\n }\n\n const trackers = config.modules.behavior.trackers;\n const heartbeatCfg = config.modules.behavior.heartbeat;\n const engagementCfg = config.modules.behavior.engagement;\n const viewportCfg = trackers?.viewport;\n const behaviorTrackers: string[] = [];\n if (trackers?.scroll?.enabled) behaviorTrackers.push('scroll');\n if (trackers?.click?.enabled) behaviorTrackers.push('click');\n if (trackers?.visibility?.enabled) behaviorTrackers.push('visibility');\n if (trackers?.idle?.enabled) behaviorTrackers.push('idle');\n if (trackers?.exitIntent?.enabled) behaviorTrackers.push('exitIntent');\n if (viewportCfg?.enabled === true) behaviorTrackers.push('viewport');\n\n const behaviorEngines: string[] = [];\n if (heartbeatCfg?.enabled === true) behaviorEngines.push('heartbeat');\n if (engagementCfg?.enabled === true) {\n behaviorEngines.push('engagement');\n }\n if (config.modules.behavior.rateLimit?.enabled === true) {\n behaviorEngines.push('rateLimit');\n }\n if (config.modules.behavior.buffer?.enabled === true) {\n behaviorEngines.push('buffer');\n }\n if (config.modules.behavior.stateMachine?.enabled === true) {\n behaviorEngines.push('stateMachine');\n }\n if (config.modules.behavior.sessionSummary?.enabled === true) {\n behaviorEngines.push('sessionSummary');\n }\n\n const behaviorModule = this.deps.getBehaviorModule();\n const heartbeatSnap = behaviorModule.getHeartbeatSnapshot() ?? null;\n const behaviorHeartbeat =\n heartbeatSnap ??\n (heartbeatCfg\n ? {\n enabled: heartbeatCfg.enabled === true,\n initialized: false,\n running: false,\n intervalMs: heartbeatCfg.intervalMs ?? 15_000,\n hiddenIntervalMs: heartbeatCfg.hiddenIntervalMs ?? 60_000,\n sequence: 0,\n emittedCount: 0,\n skippedCount: 0,\n lastEmittedAt: undefined as number | undefined,\n nextExpectedAt: undefined as number | undefined,\n lastDriftMs: undefined as number | undefined,\n }\n : null);\n\n const viewportSnap = behaviorModule.getViewportSnapshot() ?? null;\n const behaviorViewport =\n viewportSnap ??\n (viewportCfg\n ? {\n enabled: viewportCfg.enabled === true,\n initialized: false,\n available: false,\n targetCount: viewportCfg.targets?.length ?? 0,\n matchedElementCount: 0,\n observedElementCount: 0,\n activeElementCount: 0,\n pendingElementCount: 0,\n enterCount: 0,\n exitCount: 0,\n mutationObserverEnabled: false,\n maxObservedElements: viewportCfg.maxObservedElements ?? 500,\n limitReached: false,\n lastEventAt: undefined as number | undefined,\n }\n : null);\n\n const engagementSnap = behaviorModule.getEngagementSnapshot() ?? null;\n const behaviorEngagement =\n engagementSnap ??\n (engagementCfg\n ? {\n enabled: engagementCfg.enabled === true,\n initialized: false,\n running: false,\n score: 0,\n previousScore: 0,\n peakScore: 0,\n averageScore: 0,\n level: 'low' as const,\n evaluationCount: 0,\n emittedUpdateCount: 0,\n emittedSummaryCount: 0,\n lastEvaluatedAt: undefined as number | undefined,\n lastEmittedAt: undefined as number | undefined,\n evaluationIntervalMs: engagementCfg.evaluationIntervalMs ?? 5_000,\n lastDriftMs: undefined as number | undefined,\n hasError: false,\n signalCounts: {\n HEARTBEAT: 0,\n SCROLL: 0,\n CLICK: 0,\n RAGE_CLICK: 0,\n IDLE: 0,\n ACTIVITY: 0,\n VISIBLE: 0,\n HIDDEN: 0,\n VIEWPORT_ENTER: 0,\n VIEWPORT_EXIT: 0,\n },\n }\n : null);\n\n const rateLimitCfg = config.modules.behavior.rateLimit;\n const bufferCfg = config.modules.behavior.buffer;\n const stateMachineCfg = config.modules.behavior.stateMachine;\n const sessionSummaryCfg = config.modules.behavior.sessionSummary;\n\n const behaviorRateLimit =\n behaviorModule.getRateLimitSnapshot() ??\n (rateLimitCfg\n ? {\n enabled: rateLimitCfg.enabled === true,\n windowMs: rateLimitCfg.windowMs ?? 1_000,\n maxSignalsPerWindow: rateLimitCfg.maxSignalsPerWindow ?? 50,\n criticalBypass: rateLimitCfg.criticalBypass !== false,\n accepted: 0,\n dropped: 0,\n bypassed: 0,\n windowCount: 0,\n windowStartedAt: undefined as number | undefined,\n }\n : null);\n\n const behaviorBuffer =\n behaviorModule.getBufferSnapshot() ??\n (bufferCfg\n ? {\n enabled: bufferCfg.enabled === true,\n size: 0,\n maxSize: bufferCfg.maxSize ?? 200,\n flushSize: bufferCfg.flushSize ?? 50,\n maxAgeMs: bufferCfg.maxAgeMs ?? 30_000,\n dropStrategy: bufferCfg.dropStrategy ?? 'compress_similar',\n flushCount: 0,\n dropCount: 0,\n compressedCount: 0,\n lastFlushAt: undefined as number | undefined,\n lastFlushReason: undefined as\n | 'size'\n | 'age'\n | 'hidden'\n | 'destroy'\n | 'manual'\n | undefined,\n }\n : null);\n\n const behaviorStateMachine =\n behaviorModule.getStateMachineSnapshot() ??\n (stateMachineCfg\n ? {\n enabled: stateMachineCfg.enabled === true,\n state: 'NOT_INITIALIZED',\n previousState: undefined as string | undefined,\n generation: 0,\n changedAt: undefined as number | undefined,\n transitionCount: 0,\n invalidTransitionCount: 0,\n historySize: 0,\n }\n : null);\n\n const behaviorSessionSummary =\n behaviorModule.getSessionSummarySnapshot() ??\n (sessionSummaryCfg\n ? {\n enabled: sessionSummaryCfg.enabled === true,\n emitOnHidden: sessionSummaryCfg.emitOnHidden === true,\n emitOnDestroy: sessionSummaryCfg.emitOnDestroy !== false,\n minimumSessionMs: sessionSummaryCfg.minimumSessionMs ?? 0,\n emittedCount: 0,\n lastEmittedAt: undefined as number | undefined,\n startedAt: undefined as number | undefined,\n }\n : null);\n\n const manual = config.modules.conversion.manual;\n const manualEnabledFlags: Record<string, boolean> = {\n lead: manual.lead?.enabled === true,\n addToCart: manual.addToCart?.enabled === true,\n removeFromCart: manual.removeFromCart?.enabled === true,\n initiateCheckout: manual.initiateCheckout?.enabled === true,\n addPaymentInfo: manual.addPaymentInfo?.enabled === true,\n purchase: manual.purchase?.enabled === true,\n viewContent: manual.viewContent?.enabled === true,\n search: manual.search?.enabled === true,\n };\n\n const detectors = config.modules.conversion.auto?.detectors ?? {};\n const detectorCount = Object.values(detectors).filter(\n d => d && typeof d === 'object' && (d as { enabled?: boolean }).enabled\n ).length;\n\n const integrationState = integrationsModule.getDebugState();\n const delivery = transportState?.delivery;\n const advanced = transportState?.advanced;\n\n return {\n sdkVersion: this.deps.getSdkVersion(),\n runtimeInitialized: runtime.isInitialized(),\n runtimeDestroyed: this.destroyed,\n moduleRegistry,\n services: servicesBag,\n behaviorEnabled: config.modules.behavior.enabled === true,\n behaviorTrackers,\n behaviorEngines,\n behaviorHeartbeat,\n behaviorViewport,\n behaviorEngagement,\n behaviorRateLimit,\n behaviorBuffer,\n behaviorStateMachine,\n behaviorSessionSummary,\n conversion: {\n enabled: config.modules.conversion.enabled === true,\n autoEnabled: config.modules.conversion.auto?.enabled === true,\n manualEnabledFlags,\n detectorCount,\n activeDetectors: [...conversionModule.getDebugActiveDetectors()],\n dedupeKeyCount: conversionModule.getDebugDedupeKeys().length,\n },\n integrations: {\n enabled: config.modules.integrations.enabled === true,\n active: integrationState?.active === true,\n destinationNames: [...(integrationState?.destinationNames ?? [])],\n metrics: (integrationState?.metrics as Record<string, unknown>) ?? null,\n },\n transport: {\n enabled: config.modules.transport.enabled === true,\n state: transportState\n ? {\n online: delivery?.offline?.isOnline ?? 'unknown',\n senderMode: advanced?.senderMode ?? 'unknown',\n queueSize: transportState.queueSize,\n sentCount: transportState.sentCount,\n ackCount: delivery?.ackCount ?? 0,\n inFlight: delivery?.inFlight ?? false,\n retryPending: delivery?.retry?.pendingCount ?? 0,\n circuitBreakerState: String(\n advanced?.circuitBreaker?.state ?? 'unavailable'\n ),\n dlqCount: advanced?.deadLetter?.count ?? 0,\n isLeader: advanced?.coordination?.isLeader ?? true,\n persistenceEnabled:\n advanced?.storage?.persistenceEnabled ?? false,\n }\n : null,\n },\n configSafe: buildSafeConfig(config),\n };\n }\n}\n\nfunction buildSafeConfig(config: PixelConfig): Record<string, unknown> {\n const raw = {\n app: {\n environment: config.app.environment,\n debug: config.app.debug,\n },\n identity: {\n pixelId: config.identity.pixelId ? '[Present]' : '[Missing]',\n },\n modules: {\n core: { enabled: config.modules.core.enabled },\n behavior: { enabled: config.modules.behavior.enabled },\n conversion: {\n enabled: config.modules.conversion.enabled,\n auto: { enabled: config.modules.conversion.auto?.enabled },\n },\n transport: {\n enabled: config.modules.transport.enabled,\n sender: config.modules.transport.sender\n ? {\n type: (config.modules.transport.sender as { type?: string }).type,\n }\n : undefined,\n },\n integrations: { enabled: config.modules.integrations.enabled },\n privacy: { enabled: config.modules.privacy.enabled },\n },\n commerce: {\n enabled: config.commerce?.enabled,\n currency: config.commerce?.currency,\n cartMode: config.commerce?.cart?.mode,\n },\n attribution: { enabled: config.attribution?.enabled },\n };\n return redactSensitiveKeys(raw as Record<string, unknown>);\n}\n","import type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { DebugSnapshotService } from './DebugSnapshotService';\n\n/**\n * Módulo read-only de diagnóstico (Etapa 16).\n * Sem eventos, timers, listeners ou mutação de estado.\n * Sempre habilitado no Runtime (não depende de ModulesConfig).\n * init/destroy são idempotentes.\n */\nexport class RuntimeDiagnosticsModule implements PixelModule {\n readonly name = 'diagnostics' as const;\n\n private readonly snapshotService: DebugSnapshotService;\n\n private active = false;\n\n constructor(snapshotService: DebugSnapshotService) {\n this.snapshotService = snapshotService;\n }\n\n init(_context: PixelRuntimeContext): void {\n if (this.active) return;\n this.snapshotService.markAlive();\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n this.snapshotService.markDestroyed();\n this.active = false;\n }\n\n getSnapshotService(): DebugSnapshotService {\n return this.snapshotService;\n }\n}\n","import type {\n BehaviorSignal,\n BehaviorSignalBus as IBehaviorSignalBus,\n BehaviorSignalListener,\n BehaviorSignalType,\n} from '../contracts/signals';\n\n/**\n * Barramento interno do módulo Behavior.\n * Isola falhas de listeners; IDs gerados por instância (sem module-level state).\n */\nexport class BehaviorSignalBus implements IBehaviorSignalBus {\n private readonly listeners = new Map<\n BehaviorSignalType,\n Set<BehaviorSignalListener>\n >();\n\n private cleared = false;\n\n private signalSeq = 0;\n\n publish(signal: BehaviorSignal): void {\n if (this.cleared) return;\n\n const set = this.listeners.get(signal.type);\n if (!set || set.size === 0) return;\n\n for (const listener of [...set]) {\n try {\n listener(signal);\n } catch {\n // Isolation: falha de listener não derruba o bus.\n }\n }\n }\n\n subscribe(\n type: BehaviorSignalType,\n listener: BehaviorSignalListener\n ): () => void {\n if (this.cleared) {\n return () => undefined;\n }\n\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n\n return () => {\n const current = this.listeners.get(type);\n if (!current) return;\n current.delete(listener);\n if (current.size === 0) {\n this.listeners.delete(type);\n }\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.cleared = true;\n }\n\n /** Permite reuso após destroy do módulo (reinit). */\n reset(): void {\n this.listeners.clear();\n this.cleared = false;\n this.signalSeq = 0;\n }\n\n listenerCount(type?: BehaviorSignalType): number {\n if (type) {\n return this.listeners.get(type)?.size ?? 0;\n }\n let total = 0;\n for (const set of this.listeners.values()) {\n total += set.size;\n }\n return total;\n }\n\n /** Cria sinal com ID isolado por instância do bus. */\n createSignal(\n type: BehaviorSignalType,\n source: string,\n data?: BehaviorSignal['data']\n ): BehaviorSignal {\n this.signalSeq += 1;\n return {\n id: `bsig_${this.signalSeq}_${Date.now()}`,\n type,\n timestamp: Date.now(),\n source,\n ...(data ? { data } : {}),\n };\n }\n}\n","import type {\n ManagedScheduler as IManagedScheduler,\n SchedulerHandle,\n} from '../contracts/scheduler';\n\ntype PendingEntry = {\n readonly handle: SchedulerHandle;\n readonly expectedAt: number;\n readonly timer: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Timeout recursivo gerenciado (não setInterval solto).\n * SSR-safe: sem timers se setTimeout indisponível.\n */\nexport class ManagedScheduler implements IManagedScheduler {\n private nextId = 1;\n\n private readonly pending = new Map<number, PendingEntry>();\n\n private destroyed = false;\n\n private lastDrift: number | undefined;\n\n schedule(task: () => void, delayMs: number): SchedulerHandle {\n if (this.destroyed || typeof setTimeout === 'undefined') {\n return { id: -1 };\n }\n\n const id = this.nextId++;\n const handle: SchedulerHandle = { id };\n const safeDelay = Math.max(0, delayMs);\n const expectedAt = Date.now() + safeDelay;\n\n const timer = setTimeout(() => {\n this.pending.delete(id);\n this.lastDrift = Date.now() - expectedAt;\n if (this.destroyed) return;\n try {\n task();\n } catch {\n // Isolation: task throw não deixa handles órfãos.\n }\n }, safeDelay);\n\n this.pending.set(id, { handle, expectedAt, timer });\n return handle;\n }\n\n cancel(handle: SchedulerHandle): void {\n const entry = this.pending.get(handle.id);\n if (!entry) return;\n clearTimeout(entry.timer);\n this.pending.delete(handle.id);\n }\n\n cancelAll(): void {\n for (const entry of this.pending.values()) {\n clearTimeout(entry.timer);\n }\n this.pending.clear();\n }\n\n activeCount(): number {\n return this.pending.size;\n }\n\n lastDriftMs(): number | undefined {\n return this.lastDrift;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.cancelAll();\n this.destroyed = true;\n }\n\n /** Reativa após destroy (reinit do engine). */\n reset(): void {\n this.cancelAll();\n this.destroyed = false;\n this.lastDrift = undefined;\n }\n\n isDestroyed(): boolean {\n return this.destroyed;\n }\n}\n","import type {\n EngagementUpdateReason,\n NormalizedEngagementConfig,\n} from '../../contracts/engagement';\n\nexport type EngagementEmissionInput = {\n readonly reason: EngagementUpdateReason;\n readonly score: number;\n readonly previousScore: number;\n};\n\n/**\n * Decide se um ENGAGEMENT_UPDATE deve ser emitido.\n *\n * - `initial`: emissão inicial documentada (uma vez, controlada pelo engine).\n * - `manual_evaluation`: emissão explícita solicitada (sempre emite).\n * - `interval` / `signal_threshold`: só emite com `emitOnChange` e delta\n * suficiente (`abs(score - previousScore) >= minScoreDelta`).\n */\nexport class EngagementEmissionPolicy {\n private readonly config: NormalizedEngagementConfig;\n\n constructor(config: NormalizedEngagementConfig) {\n this.config = config;\n }\n\n shouldEmit(input: EngagementEmissionInput): boolean {\n if (input.reason === 'initial' || input.reason === 'manual_evaluation') {\n return true;\n }\n\n if (!this.config.emitOnChange) {\n return false;\n }\n\n const delta = Math.abs(input.score - input.previousScore);\n return delta >= this.config.minScoreDelta;\n }\n}\n","import type {\n EngagementLevel,\n EngagementThresholds,\n} from '../../contracts/engagement';\n\n/**\n * Resolve o nível a partir do score final, usando thresholds já normalizados\n * (`0 <= lowMax < mediumMax < 100`).\n *\n * low: 0..lowMax\n * medium: (lowMax+1)..mediumMax\n * high: (mediumMax+1)..100\n */\nexport class EngagementLevelResolver {\n private readonly thresholds: EngagementThresholds;\n\n constructor(thresholds: EngagementThresholds) {\n this.thresholds = thresholds;\n }\n\n resolve(score: number): EngagementLevel {\n if (score <= this.thresholds.lowMax) return 'low';\n if (score <= this.thresholds.mediumMax) return 'medium';\n return 'high';\n }\n}\n","import type {\n EngagementAccumulatorState,\n EngagementComponents,\n EngagementLevel,\n EngagementScoreBreakdown,\n NormalizedEngagementConfig,\n} from '../../contracts/engagement';\n\nimport { EngagementLevelResolver } from './EngagementLevelResolver';\n\n/**\n * Constantes de saturação para converter métricas absolutas em componentes\n * normalizados 0..1. Determinísticas e documentadas (sem IA, sem dados\n * externos, sem aleatoriedade).\n */\nexport const ENGAGEMENT_SATURATION = {\n /** Tempo ativo para saturar o componente activeTime (ms). */\n activeTimeMs: 60_000,\n /** Nº de cliques para saturar o componente click. */\n clicks: 10,\n /** Nº de entradas em viewport para saturar o componente viewport. */\n viewportEntries: 5,\n /** Nº de heartbeats para saturar o componente heartbeat. */\n heartbeats: 10,\n /** Nº de rage clicks para saturar a penalidade rageClick. */\n rageClicks: 3,\n} as const;\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value) || value < 0) return 0;\n if (value > 1) return 1;\n return value;\n}\n\nfunction ratio(part: number, total: number): number {\n if (total <= 0) return 0;\n return clamp01(part / total);\n}\n\n/**\n * Converte o estado acumulado em componentes 0..1, aplica pesos e penalidades,\n * e produz o breakdown completo (explicável) com clamp final 0..100.\n *\n * Mesma entrada → mesma saída.\n */\nexport class EngagementScoreCalculator {\n private readonly config: NormalizedEngagementConfig;\n\n private readonly levelResolver: EngagementLevelResolver;\n\n constructor(\n config: NormalizedEngagementConfig,\n levelResolver?: EngagementLevelResolver\n ) {\n this.config = config;\n this.levelResolver =\n levelResolver ?? new EngagementLevelResolver(config.thresholds);\n }\n\n computeComponents(state: EngagementAccumulatorState): EngagementComponents {\n const observedMs = state.visibleDurationMs + state.hiddenDurationMs;\n return {\n activeTime: clamp01(\n state.activeDurationMs / ENGAGEMENT_SATURATION.activeTimeMs\n ),\n scroll: clamp01(state.maxScrollPercent / 100),\n click: clamp01(state.clickCount / ENGAGEMENT_SATURATION.clicks),\n viewport: clamp01(\n state.viewportEntryCount / ENGAGEMENT_SATURATION.viewportEntries\n ),\n visibility: ratio(state.visibleDurationMs, observedMs),\n heartbeat: clamp01(\n state.heartbeatCount / ENGAGEMENT_SATURATION.heartbeats\n ),\n };\n }\n\n calculate(state: EngagementAccumulatorState): EngagementScoreBreakdown {\n const { weights, penalties } = this.config;\n const components = this.computeComponents(state);\n\n const positive =\n components.activeTime * weights.activeTime +\n components.scroll * weights.scroll +\n components.click * weights.click +\n components.viewport * weights.viewport +\n components.visibility * weights.visibility +\n components.heartbeat * weights.heartbeat;\n\n const totalDurationMs = state.activeDurationMs + state.idleDurationMs;\n const idlePenalty =\n penalties.idle * ratio(state.idleDurationMs, totalDurationMs);\n const rageClickPenalty =\n penalties.rageClick *\n clamp01(state.rageClickCount / ENGAGEMENT_SATURATION.rageClicks);\n\n const rawScore = (positive - idlePenalty - rageClickPenalty) * 100;\n const finalScore = Math.max(0, Math.min(100, Math.round(rawScore)));\n const level: EngagementLevel = this.levelResolver.resolve(finalScore);\n\n return {\n components,\n weights,\n penalties: {\n idle: idlePenalty,\n rageClick: rageClickPenalty,\n },\n rawScore,\n finalScore,\n level,\n };\n }\n}\n","import type { BehaviorSignal } from '../../contracts/signals';\nimport type {\n EngagementAccumulatorState,\n EngagementSignalCounts,\n} from '../../contracts/engagement';\n\nconst EMPTY_SIGNAL_COUNTS: EngagementSignalCounts = {\n HEARTBEAT: 0,\n SCROLL: 0,\n CLICK: 0,\n RAGE_CLICK: 0,\n IDLE: 0,\n ACTIVITY: 0,\n VISIBLE: 0,\n HIDDEN: 0,\n VIEWPORT_ENTER: 0,\n VIEWPORT_EXIT: 0,\n};\n\n/**\n * Acumula sinais internos por instância em estruturas limitadas.\n * Não guarda a lista de sinais; apenas contadores e durações derivadas de\n * transições de estado (activity/idle, visible/hidden, viewport).\n *\n * Durações são computadas por \"flush\": o tempo decorrido desde o último flush\n * é atribuído ao bucket correspondente ao estado atual. `flush(now)` deve ser\n * chamado antes de qualquer leitura de score/summary para consolidar o tempo.\n */\nexport class EngagementSignalAccumulator {\n private startedAt = 0;\n\n private lastFlushAt = 0;\n\n private lastSignalAt: number | undefined;\n\n private activeDurationMs = 0;\n\n private idleDurationMs = 0;\n\n private visibleDurationMs = 0;\n\n private hiddenDurationMs = 0;\n\n private viewportVisibleDurationMs = 0;\n\n private maxScrollPercent = 0;\n\n private clickCount = 0;\n\n private rageClickCount = 0;\n\n private viewportEntryCount = 0;\n\n private heartbeatCount = 0;\n\n private isIdle = false;\n\n private isVisible = true;\n\n private activeViewportCount = 0;\n\n private signalCounts: Record<keyof EngagementSignalCounts, number> = {\n ...EMPTY_SIGNAL_COUNTS,\n };\n\n reset(now: number): void {\n this.startedAt = now;\n this.lastFlushAt = now;\n this.lastSignalAt = undefined;\n this.activeDurationMs = 0;\n this.idleDurationMs = 0;\n this.visibleDurationMs = 0;\n this.hiddenDurationMs = 0;\n this.viewportVisibleDurationMs = 0;\n this.maxScrollPercent = 0;\n this.clickCount = 0;\n this.rageClickCount = 0;\n this.viewportEntryCount = 0;\n this.heartbeatCount = 0;\n this.isIdle = false;\n this.isVisible = true;\n this.activeViewportCount = 0;\n this.signalCounts = { ...EMPTY_SIGNAL_COUNTS };\n }\n\n /** Consolida o tempo decorrido desde o último flush nos buckets atuais. */\n flush(now: number): void {\n const elapsed = Math.max(0, now - this.lastFlushAt);\n if (elapsed > 0) {\n if (this.isIdle) {\n this.idleDurationMs += elapsed;\n } else {\n this.activeDurationMs += elapsed;\n }\n\n if (this.isVisible) {\n this.visibleDurationMs += elapsed;\n } else {\n this.hiddenDurationMs += elapsed;\n }\n\n if (this.activeViewportCount > 0) {\n this.viewportVisibleDurationMs += elapsed;\n }\n }\n this.lastFlushAt = now;\n }\n\n ingest(signal: BehaviorSignal): void {\n const now = signal.timestamp;\n this.flush(now);\n this.lastSignalAt = now;\n\n if (signal.type in this.signalCounts) {\n this.signalCounts[signal.type as keyof EngagementSignalCounts] += 1;\n }\n\n switch (signal.type) {\n case 'HEARTBEAT':\n this.heartbeatCount += 1;\n break;\n case 'CLICK':\n this.clickCount += 1;\n break;\n case 'RAGE_CLICK':\n this.rageClickCount += 1;\n break;\n case 'SCROLL': {\n const percent = signal.data?.maxScrollPercent;\n if (typeof percent === 'number' && Number.isFinite(percent)) {\n this.maxScrollPercent = Math.min(\n 100,\n Math.max(this.maxScrollPercent, percent)\n );\n }\n break;\n }\n case 'IDLE':\n this.isIdle = true;\n break;\n case 'ACTIVITY':\n this.isIdle = false;\n break;\n case 'VISIBLE':\n this.isVisible = true;\n break;\n case 'HIDDEN':\n this.isVisible = false;\n break;\n case 'VIEWPORT_ENTER':\n this.viewportEntryCount += 1;\n this.activeViewportCount += 1;\n break;\n case 'VIEWPORT_EXIT':\n if (this.activeViewportCount > 0) {\n this.activeViewportCount -= 1;\n }\n break;\n default:\n break;\n }\n }\n\n getState(): EngagementAccumulatorState {\n return {\n activeDurationMs: this.activeDurationMs,\n idleDurationMs: this.idleDurationMs,\n visibleDurationMs: this.visibleDurationMs,\n hiddenDurationMs: this.hiddenDurationMs,\n maxScrollPercent: this.maxScrollPercent,\n clickCount: this.clickCount,\n rageClickCount: this.rageClickCount,\n viewportEntryCount: this.viewportEntryCount,\n viewportVisibleDurationMs: this.viewportVisibleDurationMs,\n heartbeatCount: this.heartbeatCount,\n startedAt: this.startedAt,\n lastSignalAt: this.lastSignalAt,\n };\n }\n\n getSignalCounts(): EngagementSignalCounts {\n return { ...this.signalCounts };\n }\n}\n","import type {\n EngagementAccumulatorState,\n EngagementLevel,\n EngagementSummaryData,\n} from '../../contracts/engagement';\n\nexport type EngagementSummaryInput = {\n readonly state: EngagementAccumulatorState;\n readonly score: number;\n readonly peakScore: number;\n readonly averageScore: number;\n readonly level: EngagementLevel;\n readonly endedAt: number;\n};\n\n/**\n * Constrói o payload sanitizado do ENGAGEMENT_SUMMARY.\n * Sem PII, sem DOM, apenas contadores/durações serializáveis.\n */\nexport class EngagementSummaryBuilder {\n build(input: EngagementSummaryInput): EngagementSummaryData {\n const { state } = input;\n return {\n score: input.score,\n peakScore: input.peakScore,\n averageScore: input.averageScore,\n level: input.level,\n activeDurationMs: state.activeDurationMs,\n idleDurationMs: state.idleDurationMs,\n visibleDurationMs: state.visibleDurationMs,\n hiddenDurationMs: state.hiddenDurationMs,\n maxScrollPercent: state.maxScrollPercent,\n clickCount: state.clickCount,\n rageClickCount: state.rageClickCount,\n viewportEntryCount: state.viewportEntryCount,\n heartbeatCount: state.heartbeatCount,\n startedAt: state.startedAt,\n endedAt: input.endedAt,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type {\n EngagementLevel,\n EngagementScoreBreakdown,\n EngagementSnapshot,\n EngagementUpdateReason,\n NormalizedEngagementConfig,\n} from '../../contracts/engagement';\nimport type {\n ManagedScheduler as IManagedScheduler,\n SchedulerHandle,\n} from '../../contracts/scheduler';\nimport type {\n BehaviorSignalBus,\n BehaviorSignalType,\n} from '../../contracts/signals';\nimport { BehaviorSignalBus as SignalBusImpl } from '../../runtime/BehaviorSignalBus';\nimport { ManagedScheduler } from '../../runtime/ManagedScheduler';\n\nimport { EngagementEmissionPolicy } from './EngagementEmissionPolicy';\nimport { EngagementLevelResolver } from './EngagementLevelResolver';\nimport { EngagementScoreCalculator } from './EngagementScoreCalculator';\nimport { EngagementSignalAccumulator } from './EngagementSignalAccumulator';\nimport { EngagementSummaryBuilder } from './EngagementSummaryBuilder';\n\nconst CONSUMED_SIGNALS: readonly BehaviorSignalType[] = [\n 'HEARTBEAT',\n 'SCROLL',\n 'CLICK',\n 'RAGE_CLICK',\n 'IDLE',\n 'ACTIVITY',\n 'VISIBLE',\n 'HIDDEN',\n 'VIEWPORT_ENTER',\n 'VIEWPORT_EXIT',\n];\n\nexport type EngagementEngineOptions = {\n readonly config: NormalizedEngagementConfig;\n readonly signalBus?: BehaviorSignalBus;\n /** Injeção opcional de scheduler (default: ManagedScheduler próprio). */\n readonly scheduler?: IManagedScheduler;\n};\n\n/**\n * Engagement Runtime (Etapa 19).\n *\n * Consome sinais internos do BehaviorSignalBus e produz um score determinístico\n * 0..100 via avaliação periódica (ManagedScheduler). Emite ENGAGEMENT_UPDATE e\n * ENGAGEMENT_SUMMARY pelo Dispatcher. Não lê DOM, não importa trackers, não usa\n * setInterval, funciona como no-op seguro em SSR.\n */\nexport class EngagementEngine {\n readonly id = 'engagement';\n\n private readonly context: PixelRuntimeContext;\n\n private readonly config: NormalizedEngagementConfig;\n\n private readonly signalBus: BehaviorSignalBus;\n\n private readonly ownsBus: boolean;\n\n private readonly scheduler: IManagedScheduler;\n\n private readonly ownsScheduler: boolean;\n\n private readonly accumulator = new EngagementSignalAccumulator();\n\n private readonly calculator: EngagementScoreCalculator;\n\n private readonly emissionPolicy: EngagementEmissionPolicy;\n\n private readonly summaryBuilder = new EngagementSummaryBuilder();\n\n private initialized = false;\n\n private running = false;\n\n private destroyed = false;\n\n private hasError = false;\n\n private tickHandle: SchedulerHandle | null = null;\n\n private unsubscribers: Array<() => void> = [];\n\n private score = 0;\n\n private lastEmittedScore = 0;\n\n private peakScore = 0;\n\n private scoreSum = 0;\n\n private evaluationCount = 0;\n\n private emittedUpdateCount = 0;\n\n private emittedSummaryCount = 0;\n\n private level: EngagementLevel = 'low';\n\n private lastEvaluatedAt: number | undefined;\n\n private lastEmittedAt: number | undefined;\n\n constructor(context: PixelRuntimeContext, options: EngagementEngineOptions) {\n this.context = context;\n this.config = options.config;\n\n if (options.signalBus) {\n this.signalBus = options.signalBus;\n this.ownsBus = false;\n } else {\n this.signalBus = new SignalBusImpl();\n this.ownsBus = true;\n }\n\n if (options.scheduler) {\n this.scheduler = options.scheduler;\n this.ownsScheduler = false;\n } else {\n this.scheduler = new ManagedScheduler();\n this.ownsScheduler = true;\n }\n\n const levelResolver = new EngagementLevelResolver(this.config.thresholds);\n this.calculator = new EngagementScoreCalculator(this.config, levelResolver);\n this.emissionPolicy = new EngagementEmissionPolicy(this.config);\n }\n\n init(): void {\n if (this.initialized && !this.destroyed) {\n return;\n }\n\n const now = Date.now();\n this.destroyed = false;\n this.hasError = false;\n this.accumulator.reset(now);\n // Bus próprio é limpo (cleared) no destroy; reset() reabilita subscribe()\n // no reinit. Bus injetado pertence ao BehaviorModule e nunca é resetado aqui.\n if (this.ownsBus && this.signalBus instanceof SignalBusImpl) {\n this.signalBus.reset();\n }\n if (this.ownsScheduler && this.scheduler instanceof ManagedScheduler) {\n this.scheduler.reset();\n }\n this.score = 0;\n this.lastEmittedScore = 0;\n this.peakScore = 0;\n this.scoreSum = 0;\n this.evaluationCount = 0;\n this.emittedUpdateCount = 0;\n this.emittedSummaryCount = 0;\n this.level = 'low';\n this.lastEvaluatedAt = undefined;\n this.lastEmittedAt = undefined;\n this.tickHandle = null;\n\n this.bindSignals();\n\n this.initialized = true;\n this.running = true;\n\n // Emissão inicial documentada (baseline).\n this.evaluate('initial');\n this.scheduleNext();\n }\n\n destroy(): void {\n if (this.destroyed && !this.initialized) {\n return;\n }\n\n const wasInitialized = this.initialized;\n\n this.running = false;\n this.destroyed = true;\n this.cancelTick();\n\n if (wasInitialized && this.config.emitSummaryOnDestroy) {\n this.emitSummary();\n }\n\n this.unbindSignals();\n\n if (this.ownsScheduler) {\n this.scheduler.destroy();\n }\n if (this.ownsBus && this.signalBus instanceof SignalBusImpl) {\n this.signalBus.clear();\n }\n\n this.initialized = false;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n /** Avaliação manual (playground/testes). Não reprograma o intervalo. */\n evaluateNow(): EngagementScoreBreakdown | null {\n if (!this.running || this.destroyed) return null;\n return this.evaluate('manual_evaluation');\n }\n\n activeTimerCount(): number {\n return this.scheduler.activeCount();\n }\n\n /**\n * @internal Publica um sinal no bus do engine (playground/testes). Útil para\n * exercitar o caminho do bus próprio (não injetado) após reinit.\n */\n debugPublishSignal(\n type: BehaviorSignalType,\n data?: Parameters<BehaviorSignalBus['createSignal']>[2]\n ): void {\n this.signalBus.publish(this.signalBus.createSignal(type, 'debug', data));\n }\n\n getSnapshot(): EngagementSnapshot {\n return {\n enabled: this.config.enabled,\n initialized: this.initialized,\n running: this.running,\n score: this.score,\n previousScore: this.lastEmittedScore,\n peakScore: this.peakScore,\n averageScore:\n this.evaluationCount > 0\n ? Math.round(this.scoreSum / this.evaluationCount)\n : 0,\n level: this.level,\n evaluationCount: this.evaluationCount,\n emittedUpdateCount: this.emittedUpdateCount,\n emittedSummaryCount: this.emittedSummaryCount,\n lastEvaluatedAt: this.lastEvaluatedAt,\n lastEmittedAt: this.lastEmittedAt,\n evaluationIntervalMs: this.config.evaluationIntervalMs,\n lastDriftMs: this.scheduler.lastDriftMs(),\n hasError: this.hasError,\n signalCounts: this.accumulator.getSignalCounts(),\n };\n }\n\n private bindSignals(): void {\n this.unbindSignals();\n for (const type of CONSUMED_SIGNALS) {\n this.unsubscribers.push(\n this.signalBus.subscribe(type, signal => {\n if (this.destroyed || !this.running) return;\n this.accumulator.ingest(signal);\n })\n );\n }\n }\n\n private unbindSignals(): void {\n for (const unsub of this.unsubscribers) {\n try {\n unsub();\n } catch {\n // ignore\n }\n }\n this.unsubscribers = [];\n }\n\n private scheduleNext(): void {\n this.cancelTick();\n if (this.destroyed || !this.running) return;\n this.tickHandle = this.scheduler.schedule(\n () => this.tick(),\n this.config.evaluationIntervalMs\n );\n }\n\n private cancelTick(): void {\n if (this.tickHandle) {\n this.scheduler.cancel(this.tickHandle);\n this.tickHandle = null;\n }\n }\n\n private tick(): void {\n this.tickHandle = null;\n if (this.destroyed || !this.running) return;\n this.evaluate('interval');\n this.scheduleNext();\n }\n\n private evaluate(\n reason: EngagementUpdateReason\n ): EngagementScoreBreakdown | null {\n const now = Date.now();\n this.accumulator.flush(now);\n\n let breakdown: EngagementScoreBreakdown;\n try {\n breakdown = this.calculator.calculate(this.accumulator.getState());\n } catch {\n // Falha isolada do calculator não derruba o engine (health degraded).\n this.hasError = true;\n this.context.logger.warn(\n '[Pixel] Engagement score calculation failed (isolated)'\n );\n return null;\n }\n\n this.evaluationCount += 1;\n this.score = breakdown.finalScore;\n this.level = breakdown.level;\n this.scoreSum += breakdown.finalScore;\n if (breakdown.finalScore > this.peakScore) {\n this.peakScore = breakdown.finalScore;\n }\n this.lastEvaluatedAt = now;\n\n const shouldEmit = this.emissionPolicy.shouldEmit({\n reason,\n score: breakdown.finalScore,\n previousScore: this.lastEmittedScore,\n });\n\n if (shouldEmit) {\n this.emitUpdate(breakdown.finalScore, breakdown.level, reason, now);\n }\n\n return breakdown;\n }\n\n private emitUpdate(\n score: number,\n level: EngagementLevel,\n reason: EngagementUpdateReason,\n evaluatedAt: number\n ): void {\n const previousScore = this.lastEmittedScore;\n const delta = score - previousScore;\n\n try {\n const event = this.context.services.eventBuilder.build({\n type: 'ENGAGEMENT_UPDATE',\n category: 'ENGAGEMENT',\n score,\n previousScore,\n delta,\n level,\n evaluatedAt,\n reason,\n }) as PixelEvent;\n\n this.context.services.dispatcher.dispatch(event);\n this.lastEmittedScore = score;\n this.emittedUpdateCount += 1;\n this.lastEmittedAt = evaluatedAt;\n } catch {\n this.context.logger.warn(\n '[Pixel] Engagement update emit failed (listener isolated)'\n );\n }\n }\n\n private emitSummary(): void {\n if (this.emittedSummaryCount > 0) return;\n\n const now = Date.now();\n this.accumulator.flush(now);\n const state = this.accumulator.getState();\n const averageScore =\n this.evaluationCount > 0\n ? Math.round(this.scoreSum / this.evaluationCount)\n : 0;\n\n const summary = this.summaryBuilder.build({\n state,\n score: this.score,\n peakScore: this.peakScore,\n averageScore,\n level: this.level,\n endedAt: now,\n });\n\n try {\n const event = this.context.services.eventBuilder.build({\n type: 'ENGAGEMENT_SUMMARY',\n category: 'ENGAGEMENT',\n ...summary,\n }) as PixelEvent;\n\n this.context.services.dispatcher.dispatch(event);\n this.emittedSummaryCount += 1;\n } catch {\n // Emissão de summary no destroy é best-effort; marca como emitido para\n // garantir \"no máximo uma vez\" mesmo se o Dispatcher já estiver indisponível.\n this.emittedSummaryCount += 1;\n this.context.logger.warn(\n '[Pixel] Engagement summary emit failed (listener isolated)'\n );\n }\n }\n}\n","import type {\n HeartbeatActivityState,\n HeartbeatConfig,\n HeartbeatPolicyResult,\n} from '../contracts/heartbeat';\n\nexport class HeartbeatPolicy {\n constructor(private readonly config: HeartbeatConfig) {}\n\n canEmit(\n state: HeartbeatActivityState,\n options: { readonly running: boolean; readonly destroyed: boolean }\n ): HeartbeatPolicyResult {\n if (options.destroyed) {\n return { allow: false, reason: 'destroyed' };\n }\n if (!options.running) {\n return { allow: false, reason: 'not_running' };\n }\n\n const idle = state.idle === true;\n\n if (!this.config.emitWhenHidden && state.visible === false) {\n return { allow: false, reason: 'hidden' };\n }\n\n if (!this.config.emitWhenIdle && idle) {\n return { allow: false, reason: 'idle' };\n }\n\n return { allow: true, reason: 'ok' };\n }\n\n /**\n * Intervalo do próximo tick:\n * - visível (ou SSR/unknown): `intervalMs`\n * - escondido: `hiddenIntervalMs` (reavalia policy; emite só se emitWhenHidden)\n */\n resolveIntervalMs(state: HeartbeatActivityState): number {\n if (state.visible === false) {\n return this.config.hiddenIntervalMs;\n }\n return this.config.intervalMs;\n }\n}\n","import type {\n BehaviorHeartbeatData,\n HeartbeatActivityState,\n HeartbeatConfig,\n} from '../contracts/heartbeat';\n\nexport class HeartbeatSnapshotBuilder {\n constructor(private readonly config: HeartbeatConfig) {}\n\n build(\n state: HeartbeatActivityState,\n sequence: number,\n now: number = Date.now()\n ): BehaviorHeartbeatData {\n const idle = state.idle === true;\n const visible = state.visible !== false;\n const active = !idle && visible;\n\n const base: BehaviorHeartbeatData = {\n sequence,\n active,\n idle,\n visible,\n elapsedMs: Math.max(0, now - state.startedAt),\n };\n\n if (!this.config.includeSnapshot) {\n return base;\n }\n\n return {\n ...base,\n ...(state.lastActivityAt !== undefined\n ? { lastActivityAt: state.lastActivityAt }\n : {}),\n ...(state.idleSince !== undefined ? { idleSince: state.idleSince } : {}),\n ...(state.visibleSince !== undefined\n ? { visibleSince: state.visibleSince }\n : {}),\n ...(state.hiddenSince !== undefined\n ? { hiddenSince: state.hiddenSince }\n : {}),\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type {\n HeartbeatActivityState,\n HeartbeatConfig,\n HeartbeatMetrics,\n HeartbeatSnapshot,\n} from '../contracts/heartbeat';\nimport type { SchedulerHandle } from '../contracts/scheduler';\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { BehaviorSignalBus as SignalBusImpl } from '../runtime/BehaviorSignalBus';\nimport { ManagedScheduler } from '../runtime/ManagedScheduler';\n\nimport { HeartbeatPolicy } from './HeartbeatPolicy';\nimport { HeartbeatSnapshotBuilder } from './HeartbeatSnapshotBuilder';\n\nexport type HeartbeatEngineOptions = {\n readonly config: HeartbeatConfig;\n readonly signalBus?: BehaviorSignalBus;\n};\n\n/**\n * Heartbeat mede presença e publica BEHAVIOR_HEARTBEAT via Dispatcher.\n * Não chama Transport, Queue, Sender, Retry ou API.\n *\n * Sequence: reinicia em 0 a cada init (ciclo de vida fresco após destroy/reinit).\n */\nexport class HeartbeatEngine {\n readonly id = 'heartbeat';\n\n private readonly context: PixelRuntimeContext;\n\n private readonly config: HeartbeatConfig;\n\n private readonly signalBus: BehaviorSignalBus;\n\n private readonly ownsBus: boolean;\n\n private readonly scheduler = new ManagedScheduler();\n\n private readonly policy: HeartbeatPolicy;\n\n private readonly snapshotBuilder: HeartbeatSnapshotBuilder;\n\n private initialized = false;\n\n private running = false;\n\n private destroyed = false;\n\n private tickHandle: SchedulerHandle | null = null;\n\n private unsubscribers: Array<() => void> = [];\n\n private sequence = 0;\n\n private emittedCount = 0;\n\n private skippedCount = 0;\n\n private lastEmittedAt: number | undefined;\n\n private nextExpectedAt: number | undefined;\n\n private startedAt = 0;\n\n private activity: MutableActivity = {\n visible: undefined,\n idle: undefined,\n lastActivityAt: undefined,\n idleSince: undefined,\n visibleSince: undefined,\n hiddenSince: undefined,\n };\n\n constructor(context: PixelRuntimeContext, options: HeartbeatEngineOptions) {\n this.context = context;\n this.config = options.config;\n if (options.signalBus) {\n this.signalBus = options.signalBus;\n this.ownsBus = false;\n } else {\n this.signalBus = new SignalBusImpl();\n this.ownsBus = true;\n }\n this.policy = new HeartbeatPolicy(options.config);\n this.snapshotBuilder = new HeartbeatSnapshotBuilder(options.config);\n }\n\n init(): void {\n if (this.initialized && !this.destroyed) {\n return;\n }\n\n this.destroyed = false;\n this.scheduler.reset();\n this.sequence = 0;\n this.emittedCount = 0;\n this.skippedCount = 0;\n this.lastEmittedAt = undefined;\n this.nextExpectedAt = undefined;\n this.tickHandle = null;\n this.startedAt = Date.now();\n this.activity = {\n visible: undefined,\n idle: undefined,\n lastActivityAt: undefined,\n idleSince: undefined,\n visibleSince: undefined,\n hiddenSince: undefined,\n };\n\n this.seedEnvironmentState();\n this.bindSignals();\n\n this.initialized = true;\n this.running = true;\n\n if (this.config.fireImmediately) {\n this.tick();\n } else {\n this.scheduleNext(\n this.policy.resolveIntervalMs(this.readActivityState())\n );\n }\n }\n\n destroy(): void {\n if (this.destroyed && !this.initialized) {\n return;\n }\n\n this.running = false;\n this.destroyed = true;\n this.cancelTick();\n this.scheduler.destroy();\n this.unbindSignals();\n this.nextExpectedAt = undefined;\n\n if (this.ownsBus && this.signalBus instanceof SignalBusImpl) {\n this.signalBus.clear();\n }\n\n this.initialized = false;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getMetrics(): HeartbeatMetrics {\n return {\n sequence: this.sequence,\n emittedCount: this.emittedCount,\n skippedCount: this.skippedCount,\n lastEmittedAt: this.lastEmittedAt,\n nextExpectedAt: this.nextExpectedAt,\n lastDriftMs: this.scheduler.lastDriftMs(),\n };\n }\n\n getSnapshot(): HeartbeatSnapshot {\n return {\n enabled: this.config.enabled,\n initialized: this.initialized,\n running: this.running,\n intervalMs: this.config.intervalMs,\n hiddenIntervalMs: this.config.hiddenIntervalMs,\n sequence: this.sequence,\n emittedCount: this.emittedCount,\n skippedCount: this.skippedCount,\n lastEmittedAt: this.lastEmittedAt,\n nextExpectedAt: this.nextExpectedAt,\n lastDriftMs: this.scheduler.lastDriftMs(),\n };\n }\n\n /** Contagem de timers ativos no scheduler (testes / diagnostics). */\n activeTimerCount(): number {\n return this.scheduler.activeCount();\n }\n\n private seedEnvironmentState(): void {\n if (typeof document === 'undefined') return;\n\n const now = Date.now();\n const isVisible = document.visibilityState === 'visible';\n this.activity.visible = isVisible;\n if (isVisible) {\n this.activity.visibleSince = now;\n this.activity.hiddenSince = undefined;\n } else {\n this.activity.hiddenSince = now;\n this.activity.visibleSince = undefined;\n }\n }\n\n private bindSignals(): void {\n this.unbindSignals();\n\n this.unsubscribers.push(\n this.signalBus.subscribe('ACTIVITY', signal => {\n this.activity.lastActivityAt = signal.timestamp;\n this.activity.idle = false;\n this.activity.idleSince = undefined;\n })\n );\n\n this.unsubscribers.push(\n this.signalBus.subscribe('IDLE', signal => {\n this.activity.idle = true;\n this.activity.idleSince = signal.timestamp;\n const since = signal.data?.idleSince;\n if (typeof since === 'number') {\n this.activity.idleSince = since;\n }\n })\n );\n\n this.unsubscribers.push(\n this.signalBus.subscribe('VISIBLE', signal => {\n this.activity.visible = true;\n this.activity.visibleSince = signal.timestamp;\n this.activity.hiddenSince = undefined;\n this.rescheduleForVisibilityChange();\n })\n );\n\n this.unsubscribers.push(\n this.signalBus.subscribe('HIDDEN', signal => {\n this.activity.visible = false;\n this.activity.hiddenSince = signal.timestamp;\n this.rescheduleForVisibilityChange();\n })\n );\n\n if (typeof document !== 'undefined') {\n const onVisibility = (): void => {\n if (typeof document === 'undefined') return;\n const now = Date.now();\n if (document.visibilityState === 'visible') {\n this.activity.visible = true;\n this.activity.visibleSince = now;\n this.activity.hiddenSince = undefined;\n } else {\n this.activity.visible = false;\n this.activity.hiddenSince = now;\n }\n this.rescheduleForVisibilityChange();\n };\n document.addEventListener('visibilitychange', onVisibility);\n this.unsubscribers.push(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', onVisibility);\n }\n });\n }\n }\n\n /** Transição de visibilidade: reagenda com intervalMs ou hiddenIntervalMs. */\n private rescheduleForVisibilityChange(): void {\n if (!this.running || this.destroyed) return;\n this.scheduleNext(this.policy.resolveIntervalMs(this.readActivityState()));\n }\n\n private unbindSignals(): void {\n for (const unsub of this.unsubscribers) {\n try {\n unsub();\n } catch {\n // ignore\n }\n }\n this.unsubscribers = [];\n }\n\n private scheduleNext(delayMs: number): void {\n this.cancelTick();\n if (this.destroyed || !this.running) return;\n\n this.nextExpectedAt = Date.now() + delayMs;\n this.tickHandle = this.scheduler.schedule(() => this.tick(), delayMs);\n }\n\n private cancelTick(): void {\n if (this.tickHandle) {\n this.scheduler.cancel(this.tickHandle);\n this.tickHandle = null;\n }\n }\n\n private tick(): void {\n this.tickHandle = null;\n\n if (this.destroyed || !this.running) {\n return;\n }\n\n const state = this.readActivityState();\n const decision = this.policy.canEmit(state, {\n running: this.running,\n destroyed: this.destroyed,\n });\n\n if (!decision.allow) {\n this.skippedCount += 1;\n } else {\n this.emitHeartbeat(state);\n }\n\n this.scheduleNext(this.policy.resolveIntervalMs(state));\n }\n\n private readActivityState(): HeartbeatActivityState {\n return {\n startedAt: this.startedAt,\n visible: this.activity.visible,\n idle: this.activity.idle,\n lastActivityAt: this.activity.lastActivityAt,\n idleSince: this.activity.idleSince,\n visibleSince: this.activity.visibleSince,\n hiddenSince: this.activity.hiddenSince,\n };\n }\n\n private emitHeartbeat(state: HeartbeatActivityState): void {\n this.sequence += 1;\n const now = Date.now();\n const data = this.snapshotBuilder.build(state, this.sequence, now);\n\n try {\n const event = this.context.services.eventBuilder.build({\n type: 'BEHAVIOR_HEARTBEAT',\n category: 'ENGAGEMENT',\n ...data,\n }) as PixelEvent;\n\n this.context.services.dispatcher.dispatch(event);\n this.emittedCount += 1;\n this.lastEmittedAt = now;\n\n // Sinal interno para consumidores (ex.: Engagement Runtime).\n this.signalBus.publish(\n this.signalBus.createSignal('HEARTBEAT', 'HeartbeatEngine', {\n sequence: this.sequence,\n })\n );\n } catch {\n // Isolamento: falha de listener/builder não derruba o engine.\n this.skippedCount += 1;\n this.context.logger.warn(\n '[Pixel] Heartbeat emit failed (listener isolated)'\n );\n }\n }\n}\n\ntype MutableActivity = {\n visible: boolean | undefined;\n idle: boolean | undefined;\n lastActivityAt: number | undefined;\n idleSince: number | undefined;\n visibleSince: number | undefined;\n hiddenSince: number | undefined;\n};\n","/**\n * Normaliza `modules.behavior.engagement` (único contrato oficial).\n * Sem fallback legacy, sem aliases. Determinístico e defensivo.\n */\n\nimport type { BehaviorModuleConfig } from '@/config/types/modules/behavior';\n\nimport type {\n EngagementPenalties,\n EngagementThresholds,\n EngagementWeights,\n NormalizedEngagementConfig,\n} from './contracts/engagement';\n\n/** Intervalo mínimo seguro de avaliação (ms). */\nexport const ENGAGEMENT_MIN_INTERVAL_MS = 1_000;\n\nexport const DEFAULT_ENGAGEMENT_WEIGHTS: EngagementWeights = {\n activeTime: 0.25,\n scroll: 0.2,\n click: 0.15,\n viewport: 0.2,\n visibility: 0.1,\n heartbeat: 0.1,\n};\n\nexport const DEFAULT_ENGAGEMENT_PENALTIES: EngagementPenalties = {\n idle: 0.2,\n rageClick: 0.1,\n};\n\nexport const DEFAULT_ENGAGEMENT_THRESHOLDS: EngagementThresholds = {\n lowMax: 29,\n mediumMax: 69,\n};\n\nexport const DEFAULT_ENGAGEMENT_CONFIG: NormalizedEngagementConfig = {\n enabled: false,\n evaluationIntervalMs: 5_000,\n emitOnChange: true,\n minScoreDelta: 5,\n emitSummaryOnDestroy: true,\n weights: DEFAULT_ENGAGEMENT_WEIGHTS,\n penalties: DEFAULT_ENGAGEMENT_PENALTIES,\n thresholds: DEFAULT_ENGAGEMENT_THRESHOLDS,\n};\n\ntype PartialEngagement = Partial<{\n enabled: boolean;\n evaluationIntervalMs: number;\n emitOnChange: boolean;\n minScoreDelta: number;\n emitSummaryOnDestroy: boolean;\n weights: Partial<EngagementWeights>;\n penalties: Partial<EngagementPenalties>;\n thresholds: Partial<EngagementThresholds>;\n}>;\n\nconst WEIGHT_KEYS: ReadonlyArray<keyof EngagementWeights> = [\n 'activeTime',\n 'scroll',\n 'click',\n 'viewport',\n 'visibility',\n 'heartbeat',\n];\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction clamp01(value: number): number {\n if (value < 0) return 0;\n if (value > 1) return 1;\n return value;\n}\n\n/** Pesos positivos: clamp 0..1 e normaliza para somar 1 (fallback aos defaults). */\nexport function normalizeEngagementWeights(\n raw: Partial<EngagementWeights> | undefined\n): EngagementWeights {\n const clamped = {\n activeTime: clamp01(\n toFiniteNumber(raw?.activeTime, DEFAULT_ENGAGEMENT_WEIGHTS.activeTime)\n ),\n scroll: clamp01(\n toFiniteNumber(raw?.scroll, DEFAULT_ENGAGEMENT_WEIGHTS.scroll)\n ),\n click: clamp01(\n toFiniteNumber(raw?.click, DEFAULT_ENGAGEMENT_WEIGHTS.click)\n ),\n viewport: clamp01(\n toFiniteNumber(raw?.viewport, DEFAULT_ENGAGEMENT_WEIGHTS.viewport)\n ),\n visibility: clamp01(\n toFiniteNumber(raw?.visibility, DEFAULT_ENGAGEMENT_WEIGHTS.visibility)\n ),\n heartbeat: clamp01(\n toFiniteNumber(raw?.heartbeat, DEFAULT_ENGAGEMENT_WEIGHTS.heartbeat)\n ),\n };\n\n let sum = 0;\n for (const key of WEIGHT_KEYS) sum += clamped[key];\n\n if (sum <= 0) {\n return { ...DEFAULT_ENGAGEMENT_WEIGHTS };\n }\n\n return {\n activeTime: clamped.activeTime / sum,\n scroll: clamped.scroll / sum,\n click: clamped.click / sum,\n viewport: clamped.viewport / sum,\n visibility: clamped.visibility / sum,\n heartbeat: clamped.heartbeat / sum,\n };\n}\n\n/** Penalidades: clamp 0..1 individual. */\nexport function normalizeEngagementPenalties(\n raw: Partial<EngagementPenalties> | undefined\n): EngagementPenalties {\n return {\n idle: clamp01(toFiniteNumber(raw?.idle, DEFAULT_ENGAGEMENT_PENALTIES.idle)),\n rageClick: clamp01(\n toFiniteNumber(raw?.rageClick, DEFAULT_ENGAGEMENT_PENALTIES.rageClick)\n ),\n };\n}\n\n/**\n * Thresholds: inteiros com `0 <= lowMax < mediumMax < 100`.\n * Valores inválidos são normalizados para os defaults.\n */\nexport function normalizeEngagementThresholds(\n raw: Partial<EngagementThresholds> | undefined\n): EngagementThresholds {\n let lowMax = Math.round(\n toFiniteNumber(raw?.lowMax, DEFAULT_ENGAGEMENT_THRESHOLDS.lowMax)\n );\n let mediumMax = Math.round(\n toFiniteNumber(raw?.mediumMax, DEFAULT_ENGAGEMENT_THRESHOLDS.mediumMax)\n );\n\n const valid = lowMax >= 0 && lowMax < mediumMax && mediumMax < 100;\n\n if (!valid) {\n lowMax = DEFAULT_ENGAGEMENT_THRESHOLDS.lowMax;\n mediumMax = DEFAULT_ENGAGEMENT_THRESHOLDS.mediumMax;\n }\n\n return { lowMax, mediumMax };\n}\n\n/** Lê e normaliza exclusivamente `behavior.engagement`. */\nexport function resolveEngagementConfig(\n behavior: BehaviorModuleConfig\n): NormalizedEngagementConfig {\n return normalizeEngagementConfig(behavior.engagement);\n}\n\nexport function normalizeEngagementConfig(\n raw: PartialEngagement | undefined\n): NormalizedEngagementConfig {\n const enabled = raw?.enabled === true;\n\n let evaluationIntervalMs = Math.floor(\n toFiniteNumber(\n raw?.evaluationIntervalMs,\n DEFAULT_ENGAGEMENT_CONFIG.evaluationIntervalMs\n )\n );\n if (evaluationIntervalMs < ENGAGEMENT_MIN_INTERVAL_MS) {\n evaluationIntervalMs = ENGAGEMENT_MIN_INTERVAL_MS;\n }\n\n let minScoreDelta = Math.floor(\n toFiniteNumber(raw?.minScoreDelta, DEFAULT_ENGAGEMENT_CONFIG.minScoreDelta)\n );\n if (minScoreDelta < 0) minScoreDelta = 0;\n\n return {\n enabled,\n evaluationIntervalMs,\n emitOnChange: raw?.emitOnChange !== false,\n minScoreDelta,\n emitSummaryOnDestroy: raw?.emitSummaryOnDestroy !== false,\n weights: normalizeEngagementWeights(raw?.weights),\n penalties: normalizeEngagementPenalties(raw?.penalties),\n thresholds: normalizeEngagementThresholds(raw?.thresholds),\n };\n}\n","/**\n * Normaliza `modules.behavior.heartbeat` (único contrato oficial).\n * Sem fallback, sem aliases legacy.\n */\n\nimport type { BehaviorModuleConfig } from '@/config/types/modules/behavior';\n\nimport type { HeartbeatConfig } from './contracts/heartbeat';\n\nexport const DEFAULT_HEARTBEAT_CONFIG: HeartbeatConfig = {\n enabled: false,\n intervalMs: 15_000,\n hiddenIntervalMs: 60_000,\n emitWhenHidden: false,\n emitWhenIdle: true,\n includeSnapshot: true,\n fireImmediately: false,\n};\n\n/** Intervalo mínimo seguro (ms). */\nexport const HEARTBEAT_MIN_INTERVAL_MS = 1_000;\n\ntype PartialHeartbeat = Partial<{\n enabled: boolean;\n intervalMs: number;\n hiddenIntervalMs: number;\n emitWhenHidden: boolean;\n emitWhenIdle: boolean;\n includeSnapshot: boolean;\n fireImmediately: boolean;\n minActivityWindowMs: number;\n}>;\n\n/** Lê e normaliza exclusivamente `behavior.heartbeat`. */\nexport function resolveHeartbeatConfig(\n behavior: BehaviorModuleConfig\n): HeartbeatConfig {\n return normalizeHeartbeatConfig(behavior.heartbeat);\n}\n\nexport function normalizeHeartbeatConfig(\n raw: PartialHeartbeat | HeartbeatConfig | undefined\n): HeartbeatConfig {\n const enabled = raw?.enabled === true;\n\n let intervalMs =\n typeof raw?.intervalMs === 'number' && Number.isFinite(raw.intervalMs)\n ? Math.floor(raw.intervalMs)\n : DEFAULT_HEARTBEAT_CONFIG.intervalMs;\n\n if (intervalMs < HEARTBEAT_MIN_INTERVAL_MS) {\n intervalMs = HEARTBEAT_MIN_INTERVAL_MS;\n }\n\n let hiddenIntervalMs =\n typeof raw?.hiddenIntervalMs === 'number' &&\n Number.isFinite(raw.hiddenIntervalMs)\n ? Math.floor(raw.hiddenIntervalMs)\n : DEFAULT_HEARTBEAT_CONFIG.hiddenIntervalMs;\n\n if (hiddenIntervalMs < HEARTBEAT_MIN_INTERVAL_MS) {\n hiddenIntervalMs = HEARTBEAT_MIN_INTERVAL_MS;\n }\n\n const result: HeartbeatConfig = {\n enabled,\n intervalMs,\n hiddenIntervalMs,\n emitWhenHidden: raw?.emitWhenHidden === true,\n emitWhenIdle: raw?.emitWhenIdle !== false,\n includeSnapshot: raw?.includeSnapshot !== false,\n fireImmediately: raw?.fireImmediately === true,\n };\n\n if (\n typeof raw?.minActivityWindowMs === 'number' &&\n Number.isFinite(raw.minActivityWindowMs) &&\n raw.minActivityWindowMs >= 0\n ) {\n return {\n ...result,\n minActivityWindowMs: Math.floor(raw.minActivityWindowMs),\n };\n }\n\n return result;\n}\n","/**\n * Normaliza os contratos de Runtime Intelligence (Etapa 20):\n * `modules.behavior.rateLimit`, `.buffer`, `.stateMachine`, `.sessionSummary`.\n * Determinístico e defensivo — sem fallback legacy, sem aliases.\n */\n\nimport type { BehaviorModuleConfig } from '@/config/types/modules/behavior';\n\nimport type {\n BufferDropStrategy,\n NormalizedBufferConfig,\n NormalizedRateLimitConfig,\n NormalizedSessionSummaryConfig,\n NormalizedStateMachineConfig,\n} from './contracts';\n\nexport const RATE_LIMIT_MIN_WINDOW_MS = 100;\nexport const BUFFER_MIN_MAX_SIZE = 1;\nexport const STATE_MACHINE_MIN_HISTORY = 1;\nexport const STATE_MACHINE_MAX_HISTORY = 1_000;\n\nconst VALID_DROP_STRATEGIES: readonly BufferDropStrategy[] = [\n 'drop_oldest',\n 'drop_newest',\n 'compress_similar',\n];\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\nexport function normalizeRateLimitConfig(\n raw: Partial<NormalizedRateLimitConfig> | undefined\n): NormalizedRateLimitConfig {\n let windowMs = Math.floor(toFiniteNumber(raw?.windowMs, 1_000));\n if (windowMs < RATE_LIMIT_MIN_WINDOW_MS) windowMs = RATE_LIMIT_MIN_WINDOW_MS;\n\n let maxSignalsPerWindow = Math.floor(\n toFiniteNumber(raw?.maxSignalsPerWindow, 50)\n );\n if (maxSignalsPerWindow < 1) maxSignalsPerWindow = 1;\n\n return {\n enabled: raw?.enabled === true,\n windowMs,\n maxSignalsPerWindow,\n criticalBypass: toBoolean(raw?.criticalBypass, true),\n };\n}\n\nexport function normalizeBufferConfig(\n raw: Partial<NormalizedBufferConfig> | undefined\n): NormalizedBufferConfig {\n let maxSize = Math.floor(toFiniteNumber(raw?.maxSize, 200));\n if (maxSize < BUFFER_MIN_MAX_SIZE) maxSize = BUFFER_MIN_MAX_SIZE;\n\n let maxAgeMs = Math.floor(toFiniteNumber(raw?.maxAgeMs, 30_000));\n if (maxAgeMs < 0) maxAgeMs = 0;\n\n let flushSize = Math.floor(toFiniteNumber(raw?.flushSize, 50));\n if (flushSize < 1) flushSize = 1;\n if (flushSize > maxSize) flushSize = maxSize;\n\n const dropStrategy: BufferDropStrategy =\n raw?.dropStrategy && VALID_DROP_STRATEGIES.includes(raw.dropStrategy)\n ? raw.dropStrategy\n : 'compress_similar';\n\n return {\n enabled: raw?.enabled === true,\n maxSize,\n maxAgeMs,\n flushSize,\n dropStrategy,\n flushOnHidden: toBoolean(raw?.flushOnHidden, true),\n };\n}\n\nexport function normalizeStateMachineConfig(\n raw: Partial<NormalizedStateMachineConfig> | undefined\n): NormalizedStateMachineConfig {\n let historyLimit = Math.floor(toFiniteNumber(raw?.historyLimit, 50));\n if (historyLimit < STATE_MACHINE_MIN_HISTORY) {\n historyLimit = STATE_MACHINE_MIN_HISTORY;\n }\n if (historyLimit > STATE_MACHINE_MAX_HISTORY) {\n historyLimit = STATE_MACHINE_MAX_HISTORY;\n }\n\n return {\n enabled: raw?.enabled === true,\n historyLimit,\n };\n}\n\nexport function normalizeSessionSummaryConfig(\n raw: Partial<NormalizedSessionSummaryConfig> | undefined\n): NormalizedSessionSummaryConfig {\n let minimumSessionMs = Math.floor(toFiniteNumber(raw?.minimumSessionMs, 0));\n if (minimumSessionMs < 0) minimumSessionMs = 0;\n\n return {\n enabled: raw?.enabled === true,\n emitOnHidden: raw?.emitOnHidden === true,\n emitOnDestroy: toBoolean(raw?.emitOnDestroy, true),\n minimumSessionMs,\n };\n}\n\nexport type NormalizedRuntimeIntelligenceConfig = {\n readonly rateLimit: NormalizedRateLimitConfig;\n readonly buffer: NormalizedBufferConfig;\n readonly stateMachine: NormalizedStateMachineConfig;\n readonly sessionSummary: NormalizedSessionSummaryConfig;\n};\n\nexport function resolveRuntimeIntelligenceConfig(\n behavior: BehaviorModuleConfig\n): NormalizedRuntimeIntelligenceConfig {\n return {\n rateLimit: normalizeRateLimitConfig(behavior.rateLimit),\n buffer: normalizeBufferConfig(behavior.buffer),\n stateMachine: normalizeStateMachineConfig(behavior.stateMachine),\n sessionSummary: normalizeSessionSummaryConfig(behavior.sessionSummary),\n };\n}\n","/** Contratos do Behavior Rate Limiter (Etapa 20) — readonly, serializáveis. */\n\nimport type { BehaviorSignalType } from './signals';\n\n/** Config normalizada do rate limiter. */\nexport type NormalizedRateLimitConfig = {\n readonly enabled: boolean;\n readonly windowMs: number;\n readonly maxSignalsPerWindow: number;\n readonly criticalBypass: boolean;\n};\n\n/** Decisão determinística por sinal. */\nexport type RateLimitDecision = 'accepted' | 'dropped' | 'bypassed';\n\n/** Sinais críticos que nunca são descartados por default. */\nexport const CRITICAL_SIGNAL_TYPES: readonly BehaviorSignalType[] = [\n 'IDLE',\n 'ACTIVITY',\n 'VISIBLE',\n 'HIDDEN',\n 'EXIT_INTENT',\n];\n\n/** Snapshot read-only para diagnostics. */\nexport type RateLimitSnapshot = {\n readonly enabled: boolean;\n readonly windowMs: number;\n readonly maxSignalsPerWindow: number;\n readonly criticalBypass: boolean;\n readonly accepted: number;\n readonly dropped: number;\n readonly bypassed: number;\n /** Sinais na janela corrente. */\n readonly windowCount: number;\n readonly windowStartedAt: number | undefined;\n};\n","import type {\n NormalizedRateLimitConfig,\n RateLimitDecision,\n RateLimitSnapshot,\n} from '../../contracts/rateLimit';\nimport { CRITICAL_SIGNAL_TYPES } from '../../contracts/rateLimit';\nimport type { BehaviorSignalType } from '../../contracts/signals';\n\nconst CRITICAL_SET = new Set<BehaviorSignalType>(CRITICAL_SIGNAL_TYPES);\n\n/**\n * Limitador interno por instância (Etapa 20). Sliding window com limpeza lazy\n * por timestamp — sem timers permanentes. Sinais críticos podem ignorar o limite\n * (criticalBypass) e nunca contam contra a janela.\n */\nexport class BehaviorRateLimiter {\n private readonly config: NormalizedRateLimitConfig;\n\n /** Timestamps dos sinais aceitos na janela deslizante corrente. */\n private windowTimestamps: number[] = [];\n\n private accepted = 0;\n\n private dropped = 0;\n\n private bypassed = 0;\n\n constructor(config: NormalizedRateLimitConfig) {\n this.config = config;\n }\n\n reset(): void {\n this.windowTimestamps = [];\n this.accepted = 0;\n this.dropped = 0;\n this.bypassed = 0;\n }\n\n /** Decide de forma determinística se um sinal deve seguir o pipeline. */\n evaluate(type: BehaviorSignalType, now: number): RateLimitDecision {\n if (!this.config.enabled) {\n this.accepted += 1;\n return 'accepted';\n }\n\n if (this.config.criticalBypass && CRITICAL_SET.has(type)) {\n this.bypassed += 1;\n return 'bypassed';\n }\n\n this.prune(now);\n\n if (this.windowTimestamps.length < this.config.maxSignalsPerWindow) {\n this.windowTimestamps.push(now);\n this.accepted += 1;\n return 'accepted';\n }\n\n this.dropped += 1;\n return 'dropped';\n }\n\n private prune(now: number): void {\n const cutoff = now - this.config.windowMs;\n // Timestamps são monotônicos crescentes: remove os expirados do início.\n let removeCount = 0;\n for (const ts of this.windowTimestamps) {\n if (ts <= cutoff) removeCount += 1;\n else break;\n }\n if (removeCount > 0) {\n this.windowTimestamps.splice(0, removeCount);\n }\n }\n\n getSnapshot(): RateLimitSnapshot {\n return {\n enabled: this.config.enabled,\n windowMs: this.config.windowMs,\n maxSignalsPerWindow: this.config.maxSignalsPerWindow,\n criticalBypass: this.config.criticalBypass,\n accepted: this.accepted,\n dropped: this.dropped,\n bypassed: this.bypassed,\n windowCount: this.windowTimestamps.length,\n windowStartedAt: this.windowTimestamps[0],\n };\n }\n}\n","/** Contratos do Behavior Buffer (Etapa 20) — agregação interna, não Transport. */\n\nimport type { BehaviorSignal, BehaviorSignalType } from './signals';\n\nexport type BufferDropStrategy =\n | 'drop_oldest'\n | 'drop_newest'\n | 'compress_similar';\n\nexport type BufferFlushReason =\n | 'size'\n | 'age'\n | 'hidden'\n | 'destroy'\n | 'manual';\n\n/** Config normalizada do buffer. */\nexport type NormalizedBufferConfig = {\n readonly enabled: boolean;\n readonly maxSize: number;\n readonly maxAgeMs: number;\n readonly flushSize: number;\n readonly dropStrategy: BufferDropStrategy;\n readonly flushOnHidden: boolean;\n};\n\n/** Entry interna do buffer. `count` > 1 quando sinais similares foram compactados. */\nexport type BufferEntry = {\n readonly signal: BehaviorSignal;\n readonly bufferedAt: number;\n readonly count: number;\n};\n\n/**\n * Sinais que representam transições críticas de estado/causalidade e NUNCA\n * podem ser compactados nem descartados preferencialmente.\n */\nexport const NON_COMPRESSIBLE_SIGNAL_TYPES: readonly BehaviorSignalType[] = [\n 'IDLE',\n 'ACTIVITY',\n 'VISIBLE',\n 'HIDDEN',\n 'EXIT_INTENT',\n];\n\n/** Snapshot read-only para diagnostics. */\nexport type BufferSnapshot = {\n readonly enabled: boolean;\n readonly size: number;\n readonly maxSize: number;\n readonly flushSize: number;\n readonly maxAgeMs: number;\n readonly dropStrategy: BufferDropStrategy;\n readonly flushCount: number;\n readonly dropCount: number;\n readonly compressedCount: number;\n readonly lastFlushAt: number | undefined;\n readonly lastFlushReason: BufferFlushReason | undefined;\n};\n","import type {\n BufferEntry,\n BufferFlushReason,\n BufferSnapshot,\n NormalizedBufferConfig,\n} from '../../contracts/buffer';\nimport { NON_COMPRESSIBLE_SIGNAL_TYPES } from '../../contracts/buffer';\nimport type {\n BehaviorSignal,\n BehaviorSignalType,\n} from '../../contracts/signals';\n\nconst NON_COMPRESSIBLE_SET = new Set<BehaviorSignalType>(\n NON_COMPRESSIBLE_SIGNAL_TYPES\n);\n\n/**\n * Buffer interno de agregação de sinais (Etapa 20).\n *\n * NÃO é a Transport Queue: sem persistência, retry, batch HTTP ou sendBeacon.\n * Aplica drop strategies em overflow e faz flush por tamanho/idade/hidden/destroy.\n * O flush é idempotente (drena as entries) e nunca chama Transport.\n */\nexport class BehaviorBuffer {\n private readonly config: NormalizedBufferConfig;\n\n private entries: BufferEntry[] = [];\n\n private flushCount = 0;\n\n private dropCount = 0;\n\n private compressedCount = 0;\n\n private lastFlushAt: number | undefined;\n\n private lastFlushReason: BufferFlushReason | undefined;\n\n constructor(config: NormalizedBufferConfig) {\n this.config = config;\n }\n\n reset(): void {\n this.entries = [];\n this.flushCount = 0;\n this.dropCount = 0;\n this.compressedCount = 0;\n this.lastFlushAt = undefined;\n this.lastFlushReason = undefined;\n }\n\n size(): number {\n return this.entries.length;\n }\n\n /** Adiciona um sinal, aplicando a drop strategy quando em overflow. */\n add(signal: BehaviorSignal, now: number): void {\n if (this.entries.length < this.config.maxSize) {\n this.entries.push({ signal, bufferedAt: now, count: 1 });\n return;\n }\n\n switch (this.config.dropStrategy) {\n case 'drop_newest':\n this.dropCount += 1;\n return;\n case 'drop_oldest':\n this.entries.shift();\n this.dropCount += 1;\n this.entries.push({ signal, bufferedAt: now, count: 1 });\n return;\n case 'compress_similar':\n default:\n this.addCompressed(signal, now);\n return;\n }\n }\n\n private addCompressed(signal: BehaviorSignal, now: number): void {\n if (!NON_COMPRESSIBLE_SET.has(signal.type)) {\n // Compacta no entry mais recente de mesmo tipo compactável (preserva\n // causalidade: não reordena, apenas incrementa a contagem).\n for (let i = this.entries.length - 1; i >= 0; i -= 1) {\n const entry = this.entries[i];\n if (entry && entry.signal.type === signal.type) {\n this.entries[i] = {\n signal,\n bufferedAt: now,\n count: entry.count + 1,\n };\n this.compressedCount += 1;\n return;\n }\n }\n }\n\n // Não compactável (crítico) ou sem par similar: abre espaço descartando o\n // entry compactável mais antigo; se só houver críticos, descarta o mais antigo.\n const dropIndex = this.findOldestCompressibleIndex();\n if (dropIndex >= 0) {\n this.entries.splice(dropIndex, 1);\n } else {\n this.entries.shift();\n }\n this.dropCount += 1;\n this.entries.push({ signal, bufferedAt: now, count: 1 });\n }\n\n private findOldestCompressibleIndex(): number {\n for (let i = 0; i < this.entries.length; i += 1) {\n const entry = this.entries[i];\n if (entry && !NON_COMPRESSIBLE_SET.has(entry.signal.type)) {\n return i;\n }\n }\n return -1;\n }\n\n shouldFlushBySize(): boolean {\n return this.entries.length >= this.config.flushSize;\n }\n\n hasAgedEntries(now: number): boolean {\n if (this.config.maxAgeMs <= 0) return false;\n const oldest = this.entries[0];\n if (!oldest) return false;\n return now - oldest.bufferedAt >= this.config.maxAgeMs;\n }\n\n /** Drena as entries do buffer. Idempotente: buffer vazio retorna lista vazia. */\n flush(reason: BufferFlushReason, now: number): readonly BufferEntry[] {\n const drained = this.entries;\n this.entries = [];\n this.flushCount += 1;\n this.lastFlushAt = now;\n this.lastFlushReason = reason;\n return drained;\n }\n\n getSnapshot(): BufferSnapshot {\n return {\n enabled: this.config.enabled,\n size: this.entries.length,\n maxSize: this.config.maxSize,\n flushSize: this.config.flushSize,\n maxAgeMs: this.config.maxAgeMs,\n dropStrategy: this.config.dropStrategy,\n flushCount: this.flushCount,\n dropCount: this.dropCount,\n compressedCount: this.compressedCount,\n lastFlushAt: this.lastFlushAt,\n lastFlushReason: this.lastFlushReason,\n };\n }\n}\n","import type {\n BehaviorState,\n NormalizedStateMachineConfig,\n StateMachineSnapshot,\n StateTransitionRecord,\n} from '../../contracts/stateMachine';\nimport type { BehaviorSignalType } from '../../contracts/signals';\n\n/** Tabela explícita de transições válidas (nenhum `if` espalhado). */\nconst TRANSITIONS: Readonly<Record<BehaviorState, readonly BehaviorState[]>> = {\n NOT_INITIALIZED: ['INITIALIZING', 'DESTROYING'],\n INITIALIZING: ['ACTIVE', 'DESTROYING'],\n ACTIVE: ['IDLE', 'HIDDEN', 'PAUSED', 'DESTROYING'],\n IDLE: ['ACTIVE', 'HIDDEN', 'PAUSED', 'DESTROYING'],\n HIDDEN: ['ACTIVE', 'IDLE', 'PAUSED', 'DESTROYING'],\n PAUSED: ['ACTIVE', 'IDLE', 'HIDDEN', 'DESTROYING'],\n DESTROYING: ['DESTROYED'],\n DESTROYED: ['INITIALIZING'],\n};\n\n/**\n * State machine do runtime Behavior (Etapa 20). Estado por instância, transições\n * explícitas, histórico limitado. Transições inválidas não derrubam o runtime:\n * são contabilizadas. `reinit` cria uma nova geração.\n */\nexport class BehaviorStateMachine {\n private readonly config: NormalizedStateMachineConfig;\n\n private state: BehaviorState = 'NOT_INITIALIZED';\n\n private previousState: BehaviorState | undefined;\n\n private generation = 0;\n\n private changedAt: number | undefined;\n\n private transitionCount = 0;\n\n private invalidTransitionCount = 0;\n\n private history: StateTransitionRecord[] = [];\n\n /** Estado anterior a HIDDEN, para restaurar em VISIBLE (ACTIVE/IDLE). */\n private preHiddenState: BehaviorState = 'ACTIVE';\n\n constructor(config: NormalizedStateMachineConfig) {\n this.config = config;\n }\n\n getState(): BehaviorState {\n return this.state;\n }\n\n getGeneration(): number {\n return this.generation;\n }\n\n getHistory(): readonly StateTransitionRecord[] {\n return this.history;\n }\n\n /** Início do ciclo de vida: NOT_INITIALIZED/DESTROYED → INITIALIZING → ACTIVE. */\n beginInit(now: number): void {\n this.generation += 1;\n this.transition('INITIALIZING', 'init', now);\n this.transition('ACTIVE', 'init_complete', now);\n }\n\n beginDestroy(now: number): void {\n this.transition('DESTROYING', 'destroy', now);\n }\n\n finishDestroy(now: number): void {\n this.transition('DESTROYED', 'destroy_complete', now);\n }\n\n /** Pausa/retoma explícitas (não dirigidas por sinais no escopo atual). */\n pause(now: number): boolean {\n return this.transition('PAUSED', 'pause', now);\n }\n\n resume(now: number): boolean {\n const target = this.preHiddenState === 'IDLE' ? 'IDLE' : 'ACTIVE';\n return this.transition(target, 'resume', now);\n }\n\n /** Mapeia um sinal para uma transição de estado, se aplicável. */\n applySignal(type: BehaviorSignalType, now: number): void {\n switch (type) {\n case 'ACTIVITY':\n this.transition('ACTIVE', 'signal:ACTIVITY', now);\n break;\n case 'IDLE':\n this.transition('IDLE', 'signal:IDLE', now);\n break;\n case 'HIDDEN':\n if (this.state === 'ACTIVE' || this.state === 'IDLE') {\n this.preHiddenState = this.state;\n }\n this.transition('HIDDEN', 'signal:HIDDEN', now);\n break;\n case 'VISIBLE': {\n if (this.state !== 'HIDDEN') break;\n const target = this.preHiddenState === 'IDLE' ? 'IDLE' : 'ACTIVE';\n this.transition(target, 'signal:VISIBLE', now);\n break;\n }\n default:\n break;\n }\n }\n\n /** Transição explícita. Retorna false (e contabiliza) se inválida. */\n transition(to: BehaviorState, reason: string, now: number): boolean {\n if (this.state === to) {\n // Reentrância no mesmo estado é no-op (não conta como transição).\n return true;\n }\n\n const allowed = TRANSITIONS[this.state] ?? [];\n if (!allowed.includes(to)) {\n this.invalidTransitionCount += 1;\n return false;\n }\n\n const record: StateTransitionRecord = {\n from: this.state,\n to,\n at: now,\n reason,\n generation: this.generation,\n };\n this.previousState = this.state;\n this.state = to;\n this.changedAt = now;\n this.transitionCount += 1;\n this.pushHistory(record);\n return true;\n }\n\n private pushHistory(record: StateTransitionRecord): void {\n this.history.push(record);\n if (this.history.length > this.config.historyLimit) {\n this.history.splice(0, this.history.length - this.config.historyLimit);\n }\n }\n\n getSnapshot(): StateMachineSnapshot {\n return {\n enabled: this.config.enabled,\n state: this.state,\n previousState: this.previousState,\n generation: this.generation,\n changedAt: this.changedAt,\n transitionCount: this.transitionCount,\n invalidTransitionCount: this.invalidTransitionCount,\n historySize: this.history.length,\n };\n }\n}\n","import type { BehaviorSignal } from '../../contracts/signals';\nimport type { SessionSummaryAccumulatorState } from '../../contracts/sessionSummary';\n\n/**\n * Acumula sinais internos da sessão em estruturas limitadas (Etapa 20).\n * Não guarda a lista de sinais; apenas contadores e durações derivadas de\n * transições de estado. Durações são computadas por \"flush\": o tempo decorrido\n * desde o último flush é atribuído ao bucket do estado atual.\n */\nexport class SessionSummaryAccumulator {\n private startedAt = 0;\n\n private lastFlushAt = 0;\n\n private lastSignalAt: number | undefined;\n\n private activeDurationMs = 0;\n\n private idleDurationMs = 0;\n\n private visibleDurationMs = 0;\n\n private hiddenDurationMs = 0;\n\n private viewportVisibleDurationMs = 0;\n\n private maxScrollPercent = 0;\n\n private clickCount = 0;\n\n private rageClickCount = 0;\n\n private viewportEntryCount = 0;\n\n private heartbeatCount = 0;\n\n private isIdle = false;\n\n private isVisible = true;\n\n private activeViewportCount = 0;\n\n reset(now: number): void {\n this.startedAt = now;\n this.lastFlushAt = now;\n this.lastSignalAt = undefined;\n this.activeDurationMs = 0;\n this.idleDurationMs = 0;\n this.visibleDurationMs = 0;\n this.hiddenDurationMs = 0;\n this.viewportVisibleDurationMs = 0;\n this.maxScrollPercent = 0;\n this.clickCount = 0;\n this.rageClickCount = 0;\n this.viewportEntryCount = 0;\n this.heartbeatCount = 0;\n this.isIdle = false;\n this.isVisible = true;\n this.activeViewportCount = 0;\n }\n\n /** Consolida o tempo decorrido desde o último flush nos buckets atuais. */\n flush(now: number): void {\n const elapsed = Math.max(0, now - this.lastFlushAt);\n if (elapsed > 0) {\n if (this.isIdle) {\n this.idleDurationMs += elapsed;\n } else {\n this.activeDurationMs += elapsed;\n }\n\n if (this.isVisible) {\n this.visibleDurationMs += elapsed;\n } else {\n this.hiddenDurationMs += elapsed;\n }\n\n if (this.activeViewportCount > 0) {\n this.viewportVisibleDurationMs += elapsed;\n }\n }\n this.lastFlushAt = now;\n }\n\n ingest(signal: BehaviorSignal): void {\n const now = signal.timestamp;\n this.flush(now);\n this.lastSignalAt = now;\n\n switch (signal.type) {\n case 'HEARTBEAT':\n this.heartbeatCount += 1;\n break;\n case 'CLICK':\n this.clickCount += 1;\n break;\n case 'RAGE_CLICK':\n this.rageClickCount += 1;\n break;\n case 'SCROLL': {\n const percent = signal.data?.maxScrollPercent;\n if (typeof percent === 'number' && Number.isFinite(percent)) {\n this.maxScrollPercent = Math.min(\n 100,\n Math.max(this.maxScrollPercent, percent)\n );\n }\n break;\n }\n case 'IDLE':\n this.isIdle = true;\n break;\n case 'ACTIVITY':\n this.isIdle = false;\n break;\n case 'VISIBLE':\n this.isVisible = true;\n break;\n case 'HIDDEN':\n this.isVisible = false;\n break;\n case 'VIEWPORT_ENTER':\n this.viewportEntryCount += 1;\n this.activeViewportCount += 1;\n break;\n case 'VIEWPORT_EXIT':\n if (this.activeViewportCount > 0) {\n this.activeViewportCount -= 1;\n }\n break;\n default:\n break;\n }\n }\n\n getState(): SessionSummaryAccumulatorState {\n return {\n activeDurationMs: this.activeDurationMs,\n idleDurationMs: this.idleDurationMs,\n visibleDurationMs: this.visibleDurationMs,\n hiddenDurationMs: this.hiddenDurationMs,\n maxScrollPercent: this.maxScrollPercent,\n clickCount: this.clickCount,\n rageClickCount: this.rageClickCount,\n viewportEntryCount: this.viewportEntryCount,\n viewportVisibleDurationMs: this.viewportVisibleDurationMs,\n heartbeatCount: this.heartbeatCount,\n startedAt: this.startedAt,\n lastSignalAt: this.lastSignalAt,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { BufferFlushReason } from '../../contracts/buffer';\nimport type {\n SessionSummaryData,\n SessionSummaryReason,\n SessionSummarySnapshot,\n} from '../../contracts/sessionSummary';\nimport type { RateLimitSnapshot } from '../../contracts/rateLimit';\nimport type { BufferSnapshot } from '../../contracts/buffer';\nimport type { StateMachineSnapshot } from '../../contracts/stateMachine';\nimport type {\n BehaviorSignal,\n BehaviorSignalBus,\n BehaviorSignalType,\n} from '../../contracts/signals';\nimport type { NormalizedRuntimeIntelligenceConfig } from '../../resolveRuntimeIntelligenceConfig';\n\nimport { BehaviorBuffer } from './BehaviorBuffer';\nimport { BehaviorRateLimiter } from './BehaviorRateLimiter';\nimport { BehaviorStateMachine } from './BehaviorStateMachine';\nimport { SessionSummaryAccumulator } from './SessionSummaryAccumulator';\n\nconst CONSUMED_SIGNALS: readonly BehaviorSignalType[] = [\n 'HEARTBEAT',\n 'SCROLL',\n 'CLICK',\n 'RAGE_CLICK',\n 'IDLE',\n 'ACTIVITY',\n 'VISIBLE',\n 'HIDDEN',\n 'EXIT_INTENT',\n 'VIEWPORT_ENTER',\n 'VIEWPORT_EXIT',\n];\n\nexport type EngagementScoreProvider = () => {\n readonly score: number;\n readonly peakScore: number;\n} | null;\n\nexport type BehaviorRuntimeCoordinatorOptions = {\n readonly config: NormalizedRuntimeIntelligenceConfig;\n readonly getEngagement: EngagementScoreProvider;\n};\n\n/**\n * Coordena o pipeline de Runtime Intelligence (Etapa 20):\n * SignalBus → RateLimiter → Buffer → StateMachine → SessionSummaryAccumulator →\n * BEHAVIOR_SESSION_SUMMARY. Isola falhas de cada componente para não impedir o\n * destroy. Não persiste eventos, não chama Transport, funciona no-op em SSR.\n */\nexport class BehaviorRuntimeCoordinator {\n readonly id = 'runtimeIntelligence';\n\n private readonly context: PixelRuntimeContext;\n\n private readonly config: NormalizedRuntimeIntelligenceConfig;\n\n private signalBus: BehaviorSignalBus | null = null;\n\n private readonly getEngagement: EngagementScoreProvider;\n\n private readonly rateLimiter: BehaviorRateLimiter;\n\n private readonly buffer: BehaviorBuffer;\n\n private readonly stateMachine: BehaviorStateMachine;\n\n private readonly accumulator = new SessionSummaryAccumulator();\n\n private unsubscribers: Array<() => void> = [];\n\n private initialized = false;\n\n private running = false;\n\n private destroyed = false;\n\n private startedAt: number | undefined;\n\n private emittedCount = 0;\n\n private lastEmittedAt: number | undefined;\n\n private hiddenSummaryEmitted = false;\n\n constructor(\n context: PixelRuntimeContext,\n options: BehaviorRuntimeCoordinatorOptions\n ) {\n this.context = context;\n this.config = options.config;\n this.getEngagement = options.getEngagement;\n this.rateLimiter = new BehaviorRateLimiter(options.config.rateLimit);\n this.buffer = new BehaviorBuffer(options.config.buffer);\n this.stateMachine = new BehaviorStateMachine(options.config.stateMachine);\n }\n\n init(signalBus: BehaviorSignalBus): void {\n if (this.initialized && !this.destroyed) return;\n\n const now = Date.now();\n this.signalBus = signalBus;\n this.destroyed = false;\n this.startedAt = now;\n this.hiddenSummaryEmitted = false;\n this.rateLimiter.reset();\n this.buffer.reset();\n this.accumulator.reset(now);\n // reinit cria nova geração (a state machine persiste entre init/destroy).\n this.stateMachine.beginInit(now);\n\n this.bindSignals();\n\n this.initialized = true;\n this.running = true;\n }\n\n destroy(): void {\n if (this.destroyed && !this.initialized) return;\n\n const wasRunning = this.running;\n this.running = false;\n this.destroyed = true;\n\n this.unbindSignals();\n\n const now = Date.now();\n\n this.safe(() => this.stateMachine.beginDestroy(now));\n\n if (this.config.buffer.enabled) {\n this.safe(() => this.drainBufferToAccumulator('destroy', now));\n }\n\n if (wasRunning && this.config.sessionSummary.emitOnDestroy) {\n this.safe(() => this.emitSummary('destroy', now));\n }\n\n this.safe(() => this.stateMachine.finishDestroy(now));\n\n this.signalBus = null;\n this.initialized = false;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n /** @internal Flush manual do buffer (playground/testes). */\n flushNow(): void {\n if (!this.running || this.destroyed) return;\n if (!this.config.buffer.enabled) return;\n this.drainBufferToAccumulator('manual', Date.now());\n }\n\n /** @internal Emissão manual de summary (playground/testes). */\n emitSummaryNow(reason: SessionSummaryReason = 'hidden'): boolean {\n if (!this.running || this.destroyed) return false;\n const now = Date.now();\n if (this.config.buffer.enabled) {\n this.drainBufferToAccumulator('manual', now);\n }\n return this.emitSummary(reason, now);\n }\n\n getRateLimitSnapshot(): RateLimitSnapshot {\n return this.rateLimiter.getSnapshot();\n }\n\n getBufferSnapshot(): BufferSnapshot {\n return this.buffer.getSnapshot();\n }\n\n getStateMachineSnapshot(): StateMachineSnapshot {\n return this.stateMachine.getSnapshot();\n }\n\n getSessionSummarySnapshot(): SessionSummarySnapshot {\n return {\n enabled: this.config.sessionSummary.enabled,\n emitOnHidden: this.config.sessionSummary.emitOnHidden,\n emitOnDestroy: this.config.sessionSummary.emitOnDestroy,\n minimumSessionMs: this.config.sessionSummary.minimumSessionMs,\n emittedCount: this.emittedCount,\n lastEmittedAt: this.lastEmittedAt,\n startedAt: this.startedAt,\n };\n }\n\n private bindSignals(): void {\n this.unbindSignals();\n const bus = this.signalBus;\n if (!bus) return;\n for (const type of CONSUMED_SIGNALS) {\n this.unsubscribers.push(\n bus.subscribe(type, signal => this.handleSignal(signal))\n );\n }\n }\n\n private unbindSignals(): void {\n for (const unsub of this.unsubscribers) {\n try {\n unsub();\n } catch {\n // ignore\n }\n }\n this.unsubscribers = [];\n }\n\n private handleSignal(signal: BehaviorSignal): void {\n if (this.destroyed || !this.running) return;\n\n try {\n const now = signal.timestamp;\n\n const decision = this.rateLimiter.evaluate(signal.type, now);\n if (decision === 'dropped') return;\n\n if (this.config.stateMachine.enabled) {\n this.stateMachine.applySignal(signal.type, now);\n }\n\n if (this.config.buffer.enabled) {\n this.buffer.add(signal, now);\n if (this.buffer.shouldFlushBySize()) {\n this.drainBufferToAccumulator('size', now);\n } else if (this.buffer.hasAgedEntries(now)) {\n this.drainBufferToAccumulator('age', now);\n }\n } else if (this.config.sessionSummary.enabled) {\n // Sem buffer, o accumulator é alimentado diretamente.\n this.accumulator.ingest(signal);\n }\n\n if (signal.type === 'HIDDEN') {\n this.onHidden(now);\n } else if (signal.type === 'VISIBLE' || signal.type === 'ACTIVITY') {\n this.hiddenSummaryEmitted = false;\n }\n } catch {\n // Isolation: falha no pipeline de um sinal não derruba o runtime.\n this.context.logger.warn(\n '[Pixel] Behavior runtime pipeline error (isolated)'\n );\n }\n }\n\n private onHidden(now: number): void {\n if (this.config.buffer.enabled && this.config.buffer.flushOnHidden) {\n this.drainBufferToAccumulator('hidden', now);\n }\n if (\n this.config.sessionSummary.enabled &&\n this.config.sessionSummary.emitOnHidden &&\n !this.hiddenSummaryEmitted\n ) {\n if (this.emitSummary('hidden', now)) {\n this.hiddenSummaryEmitted = true;\n }\n }\n }\n\n private drainBufferToAccumulator(\n reason: BufferFlushReason,\n now: number\n ): void {\n const entries = this.buffer.flush(reason, now);\n if (!this.config.sessionSummary.enabled) return;\n for (const entry of entries) {\n for (let i = 0; i < entry.count; i += 1) {\n this.accumulator.ingest(entry.signal);\n }\n }\n }\n\n private emitSummary(reason: SessionSummaryReason, now: number): boolean {\n if (!this.config.sessionSummary.enabled) return false;\n\n const startedAt = this.startedAt ?? now;\n if (\n this.config.sessionSummary.minimumSessionMs > 0 &&\n now - startedAt < this.config.sessionSummary.minimumSessionMs\n ) {\n return false;\n }\n\n this.accumulator.flush(now);\n const state = this.accumulator.getState();\n const engagement = this.getEngagement() ?? { score: 0, peakScore: 0 };\n const finalState = this.stateMachine.getState();\n const generation = this.stateMachine.getGeneration();\n\n const data: SessionSummaryData = {\n activeDurationMs: state.activeDurationMs,\n idleDurationMs: state.idleDurationMs,\n visibleDurationMs: state.visibleDurationMs,\n hiddenDurationMs: state.hiddenDurationMs,\n maxScrollPercent: state.maxScrollPercent,\n clickCount: state.clickCount,\n rageClickCount: state.rageClickCount,\n viewportEntryCount: state.viewportEntryCount,\n viewportVisibleDurationMs: state.viewportVisibleDurationMs,\n heartbeatCount: state.heartbeatCount,\n engagementScore: engagement.score,\n engagementPeakScore: engagement.peakScore,\n startedAt,\n endedAt: now,\n finalState,\n };\n\n try {\n const event = this.context.services.eventBuilder.build({\n type: 'BEHAVIOR_SESSION_SUMMARY',\n category: 'ENGAGEMENT',\n ...data,\n generation,\n reason,\n }) as PixelEvent;\n\n this.context.services.dispatcher.dispatch(event);\n this.emittedCount += 1;\n this.lastEmittedAt = now;\n return true;\n } catch {\n // Best-effort: conta como emitido para garantir \"no máximo uma vez\".\n this.emittedCount += 1;\n this.lastEmittedAt = now;\n this.context.logger.warn(\n '[Pixel] Behavior session summary emit failed (listener isolated)'\n );\n return true;\n }\n }\n\n private safe(fn: () => void): void {\n try {\n fn();\n } catch {\n this.context.logger.warn(\n '[Pixel] Behavior runtime coordinator step failed (isolated)'\n );\n }\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\nimport type { PixelEvent } from '@/events';\n\nimport type { IBehaviorTracker } from '../contracts/IBehaviorTracker';\n\ntype ListenerTarget = 'window' | 'document';\n\ntype ManagedListener = {\n readonly target: ListenerTarget;\n readonly type: string;\n readonly handler: EventListener;\n readonly options?: boolean | AddEventListenerOptions;\n};\n\nexport abstract class BehaviorTrackerBase implements IBehaviorTracker {\n protected readonly context: PixelRuntimeContext;\n\n private active = false;\n\n private readonly managedListeners: ManagedListener[] = [];\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (this.active) return;\n this.onInit();\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n this.onDestroy();\n this.removeAllManagedListeners();\n this.active = false;\n }\n\n protected abstract onInit(): void;\n\n protected abstract onDestroy(): void;\n\n protected isWindowAvailable(): boolean {\n return typeof window !== 'undefined';\n }\n\n protected isDocumentAvailable(): boolean {\n return typeof document !== 'undefined';\n }\n\n protected addWindowListener<K extends keyof WindowEventMap>(\n type: K,\n handler: (event: WindowEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!this.isWindowAvailable()) return;\n\n const listener = handler as EventListener;\n window.addEventListener(type, listener, options);\n this.managedListeners.push({\n target: 'window',\n type,\n handler: listener,\n options,\n });\n }\n\n protected addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n handler: (event: DocumentEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!this.isDocumentAvailable()) return;\n\n const listener = handler as EventListener;\n document.addEventListener(type, listener, options);\n this.managedListeners.push({\n target: 'document',\n type,\n handler: listener,\n options,\n });\n }\n\n protected removeAllManagedListeners(): void {\n for (const entry of this.managedListeners) {\n if (entry.target === 'window' && this.isWindowAvailable()) {\n window.removeEventListener(entry.type, entry.handler, entry.options);\n } else if (entry.target === 'document' && this.isDocumentAvailable()) {\n document.removeEventListener(entry.type, entry.handler, entry.options);\n }\n }\n this.managedListeners.length = 0;\n }\n\n protected clearManagedTimeout(\n timer: ReturnType<typeof setTimeout> | null\n ): null {\n if (timer) clearTimeout(timer);\n return null;\n }\n\n protected dispatchEngagement<T extends { type: string }>(\n partial: T & { category: 'ENGAGEMENT' }\n ): void {\n const event = this.context.services.eventBuilder.build(\n partial\n ) as PixelEvent;\n this.context.services.dispatcher.dispatch(event);\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\n\n/** Alinhado ao legado: throttle fixo de 100ms. */\nconst SCROLL_THROTTLE_MS = 100;\n\nexport type ScrollTrackerOptions = {\n readonly signalBus?: BehaviorSignalBus;\n};\n\ninterface ScrollState {\n maxScrollPercent: number;\n scrollEvents: number;\n scrollVelocityAvg: number;\n lastScrollAt: number;\n}\n\nexport class ScrollTracker extends BehaviorTrackerBase {\n private state: ScrollState = {\n maxScrollPercent: 0,\n scrollEvents: 0,\n scrollVelocityAvg: 0,\n lastScrollAt: 0,\n };\n\n private throttleTimer: ReturnType<typeof setTimeout> | null = null;\n\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private lastScrollY = 0;\n\n private lastScrollTime = 0;\n\n private velocitySum = 0;\n\n private crossedThresholds = new Set<number>();\n\n private lastDispatchedMaxPercent = -1;\n\n private lastDispatchAt = 0;\n\n private readonly signalBus: BehaviorSignalBus | undefined;\n\n constructor(context: PixelRuntimeContext, options?: ScrollTrackerOptions) {\n super(context);\n this.signalBus = options?.signalBus;\n }\n\n protected onInit(): void {\n if (!this.isWindowAvailable()) return;\n\n this.resetState();\n this.lastScrollY = window.scrollY;\n this.lastScrollTime = Date.now();\n\n this.addWindowListener('scroll', () => this.handleScroll(), {\n passive: true,\n });\n }\n\n protected onDestroy(): void {\n this.throttleTimer = this.clearManagedTimeout(this.throttleTimer);\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n }\n\n private resetState(): void {\n this.state = {\n maxScrollPercent: 0,\n scrollEvents: 0,\n scrollVelocityAvg: 0,\n lastScrollAt: 0,\n };\n this.lastScrollY = 0;\n this.lastScrollTime = 0;\n this.velocitySum = 0;\n this.crossedThresholds.clear();\n this.lastDispatchedMaxPercent = -1;\n this.lastDispatchAt = 0;\n }\n\n private getMaxScrollPercent(): number {\n if (!this.isWindowAvailable() || !this.isDocumentAvailable()) {\n return 0;\n }\n\n const doc = document.documentElement;\n const bodyScroll = document.body ? document.body.scrollHeight : 0;\n const scrollHeight = Math.max(doc.scrollHeight, bodyScroll);\n const clientHeight = doc.clientHeight;\n\n if (scrollHeight <= clientHeight) return 100;\n\n const maxScroll = scrollHeight - clientHeight;\n const current = window.scrollY || window.pageYOffset;\n return Math.min(100, Math.round((current / maxScroll) * 100));\n }\n\n private canDispatch(minIntervalMs: number): boolean {\n return Date.now() - this.lastDispatchAt >= minIntervalMs;\n }\n\n private handleScroll(): void {\n if (!this.isWindowAvailable()) return;\n\n const { debounceMs } = this.context.config.modules.behavior.trackers.scroll;\n\n if (this.throttleTimer) return;\n\n this.throttleTimer = setTimeout(() => {\n this.throttleTimer = null;\n this.updateScrollState();\n this.maybeDispatchOnThresholdCrossing(debounceMs);\n\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.maybeDispatchOnScrollEnd(debounceMs);\n }, debounceMs);\n }, SCROLL_THROTTLE_MS);\n }\n\n private updateScrollState(): void {\n if (!this.isWindowAvailable()) return;\n\n const now = Date.now();\n const scrollY = window.scrollY || window.pageYOffset;\n\n const percent = this.getMaxScrollPercent();\n if (percent > this.state.maxScrollPercent) {\n this.state.maxScrollPercent = percent;\n }\n\n this.state.scrollEvents += 1;\n this.state.lastScrollAt = now;\n\n if (this.state.scrollEvents > 1 && this.lastScrollTime > 0) {\n const deltaSeconds = (now - this.lastScrollTime) / 1000;\n const deltaY = Math.abs(scrollY - this.lastScrollY);\n if (deltaSeconds > 0) {\n const velocity = deltaY / deltaSeconds;\n this.velocitySum += velocity;\n this.state.scrollVelocityAvg =\n this.velocitySum / (this.state.scrollEvents - 1);\n }\n }\n\n this.lastScrollY = scrollY;\n this.lastScrollTime = now;\n }\n\n private maybeDispatchOnThresholdCrossing(minIntervalMs: number): void {\n const { thresholds } = this.context.config.modules.behavior.trackers.scroll;\n const percent = this.state.maxScrollPercent;\n\n let crossedNew = false;\n for (const threshold of thresholds) {\n if (percent >= threshold && !this.crossedThresholds.has(threshold)) {\n this.crossedThresholds.add(threshold);\n crossedNew = true;\n }\n }\n\n if (crossedNew && this.canDispatch(minIntervalMs)) {\n this.emitScrollEvent();\n }\n }\n\n private maybeDispatchOnScrollEnd(minIntervalMs: number): void {\n if (this.state.maxScrollPercent === this.lastDispatchedMaxPercent) return;\n if (!this.canDispatch(minIntervalMs)) return;\n\n this.emitScrollEvent();\n }\n\n private emitScrollEvent(): void {\n this.dispatchEngagement({\n type: 'SCROLL',\n category: 'ENGAGEMENT',\n maxScrollPercent: this.state.maxScrollPercent,\n scrollEvents: this.state.scrollEvents,\n scrollVelocityAvg: this.state.scrollVelocityAvg,\n lastScrollAt: this.state.lastScrollAt,\n });\n\n this.signalBus?.publish(\n this.signalBus.createSignal('SCROLL', 'ScrollTracker', {\n maxScrollPercent: this.state.maxScrollPercent,\n })\n );\n\n this.lastDispatchedMaxPercent = this.state.maxScrollPercent;\n this.lastDispatchAt = Date.now();\n }\n}\n","import type { ElementDescriptor } from '@/events/shared/ElementDescriptor';\n\nconst MAX_TEXT_LENGTH = 80;\n\nexport function describeElement(\n element: Element | null\n): ElementDescriptor | undefined {\n if (!element) return undefined;\n\n const htmlElement = element as HTMLElement;\n const classes = element.classList?.length\n ? Array.from(element.classList)\n : undefined;\n\n let text: string | undefined;\n const rawText =\n htmlElement.innerText?.trim() ?? htmlElement.textContent?.trim();\n if (rawText) {\n text =\n rawText.length > MAX_TEXT_LENGTH\n ? `${rawText.slice(0, MAX_TEXT_LENGTH)}…`\n : rawText;\n }\n\n const dataset: Record<string, string> = {};\n if (htmlElement.dataset) {\n for (const [key, value] of Object.entries(htmlElement.dataset)) {\n if (value !== undefined) {\n dataset[key] = value;\n }\n }\n }\n\n return {\n tagName: element.tagName?.toLowerCase(),\n id: element.id || undefined,\n classes,\n text,\n role: htmlElement.getAttribute('role') ?? undefined,\n name: htmlElement.getAttribute('name') ?? undefined,\n dataset: Object.keys(dataset).length > 0 ? dataset : undefined,\n };\n}\n\n/** Fingerprint estável alinhado ao algoritmo legado (tag + id + classes + data-*). */\nexport function getElementFingerprint(el: EventTarget | null): string {\n if (!el || !(el instanceof Element)) return 'unknown';\n\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n const classes =\n el.className && typeof el.className === 'string'\n ? `.${el.className.trim().split(/\\s+/).slice(0, 3).join('.')}`\n : '';\n\n const dataAttrs: string[] = [];\n if (typeof el.getAttributeNames === 'function') {\n el.getAttributeNames()\n .filter(name => name.startsWith('data-'))\n .slice(0, 5)\n .sort()\n .forEach(name => {\n const value = el.getAttribute(name);\n if (value != null) {\n dataAttrs.push(`${name}=${value.slice(0, 50)}`);\n }\n });\n }\n\n return [tag, id, classes, dataAttrs.join('|')].filter(Boolean).join('');\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\nimport { describeElement, getElementFingerprint } from './utils/element';\n\ninterface ClickState {\n clickCount: number;\n rageClickCount: number;\n lastClickAt: number;\n}\n\nexport type ClickTrackerOptions = {\n readonly signalBus?: BehaviorSignalBus;\n};\n\nexport class ClickTracker extends BehaviorTrackerBase {\n private state: ClickState = {\n clickCount: 0,\n rageClickCount: 0,\n lastClickAt: 0,\n };\n\n private clickHistory = new Map<string, number[]>();\n\n private rageCooldownUntil = new Map<string, number>();\n\n private readonly signalBus: BehaviorSignalBus | undefined;\n\n constructor(context: PixelRuntimeContext, options?: ClickTrackerOptions) {\n super(context);\n this.signalBus = options?.signalBus;\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n\n this.resetState();\n this.addDocumentListener(\n 'click',\n (event: MouseEvent) => this.handleClick(event),\n true\n );\n }\n\n protected onDestroy(): void {\n this.clickHistory.clear();\n this.rageCooldownUntil.clear();\n }\n\n private resetState(): void {\n this.state = {\n clickCount: 0,\n rageClickCount: 0,\n lastClickAt: 0,\n };\n this.clickHistory.clear();\n this.rageCooldownUntil.clear();\n }\n\n private handleClick(event: MouseEvent): void {\n const now = Date.now();\n const { rageClick } = this.context.config.modules.behavior.trackers.click;\n\n this.state.clickCount += 1;\n this.state.lastClickAt = now;\n\n this.signalBus?.publish(\n this.signalBus.createSignal('CLICK', 'ClickTracker', {\n clickCount: this.state.clickCount,\n })\n );\n\n const target = event.target instanceof Element ? event.target : null;\n const currentTarget =\n event.currentTarget instanceof Element ? event.currentTarget : null;\n\n const targetDescriptor = describeElement(target);\n const currentTargetDescriptor = describeElement(currentTarget);\n\n this.dispatchEngagement({\n type: 'PAGE_CLICK',\n category: 'ENGAGEMENT',\n clickCount: this.state.clickCount,\n rageClickCount: this.state.rageClickCount,\n lastClickAt: now,\n target: targetDescriptor,\n currentTarget: currentTargetDescriptor,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n });\n\n if (!target || !rageClick.enabled) return;\n\n const fingerprint = getElementFingerprint(target);\n\n const cooldownUntil = this.rageCooldownUntil.get(fingerprint) ?? 0;\n if (now < cooldownUntil) return;\n\n const history = this.clickHistory.get(fingerprint) ?? [];\n const recent = history.filter(ts => now - ts < rageClick.windowMs);\n recent.push(now);\n this.clickHistory.set(fingerprint, recent);\n\n if (recent.length >= rageClick.threshold) {\n this.state.rageClickCount += 1;\n this.signalBus?.publish(\n this.signalBus.createSignal('RAGE_CLICK', 'ClickTracker', {\n rageClickCount: this.state.rageClickCount,\n })\n );\n this.dispatchEngagement({\n type: 'RAGE_CLICK',\n category: 'ENGAGEMENT',\n threshold: rageClick.threshold,\n windowMs: rageClick.windowMs,\n clickCount: recent.length,\n target: targetDescriptor,\n });\n this.clickHistory.delete(fingerprint);\n this.rageCooldownUntil.set(fingerprint, now + rageClick.windowMs);\n }\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\n\ninterface VisibilityState {\n isVisible: boolean;\n visibleSince: number;\n hiddenAt: number | null;\n}\n\nexport type VisibilityTrackerOptions = {\n readonly signalBus?: BehaviorSignalBus;\n};\n\nexport class VisibilityTracker extends BehaviorTrackerBase {\n private state: VisibilityState = {\n isVisible: true,\n visibleSince: 0,\n hiddenAt: null,\n };\n\n private readonly signalBus: BehaviorSignalBus | undefined;\n\n constructor(\n context: PixelRuntimeContext,\n options?: VisibilityTrackerOptions\n ) {\n super(context);\n this.signalBus = options?.signalBus;\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n\n const now = Date.now();\n const isVisible = document.visibilityState === 'visible';\n\n this.state = {\n isVisible,\n visibleSince: now,\n hiddenAt: isVisible ? null : now,\n };\n\n this.publishVisibilitySignal();\n\n this.addDocumentListener('visibilitychange', () =>\n this.handleVisibilityChange()\n );\n this.emitVisibilityEvent();\n }\n\n protected onDestroy(): void {}\n\n private handleVisibilityChange(): void {\n if (!this.isDocumentAvailable()) return;\n\n const now = Date.now();\n const isVisible = document.visibilityState === 'visible';\n\n if (isVisible) {\n this.state = {\n isVisible: true,\n visibleSince: now,\n hiddenAt: null,\n };\n } else {\n this.state = {\n isVisible: false,\n visibleSince: this.state.visibleSince,\n hiddenAt: now,\n };\n }\n\n this.publishVisibilitySignal();\n this.emitVisibilityEvent();\n }\n\n private publishVisibilitySignal(): void {\n if (!this.signalBus) return;\n if (this.state.isVisible) {\n this.signalBus.publish(\n this.signalBus.createSignal('VISIBLE', 'VisibilityTracker', {\n visibleSince: this.state.visibleSince,\n })\n );\n } else {\n this.signalBus.publish(\n this.signalBus.createSignal('HIDDEN', 'VisibilityTracker', {\n hiddenAt: this.state.hiddenAt,\n })\n );\n }\n }\n\n private emitVisibilityEvent(): void {\n this.dispatchEngagement({\n type: 'VISIBILITY_CHANGE',\n category: 'ENGAGEMENT',\n isVisible: this.state.isVisible,\n visibleSince: this.state.visibleSince,\n hiddenAt: this.state.hiddenAt,\n });\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\n\nconst ACTIVITY_EVENTS = [\n 'mousemove',\n 'scroll',\n 'keydown',\n 'touchstart',\n] as const;\n\nexport type IdleTrackerOptions = {\n readonly signalBus?: BehaviorSignalBus;\n};\n\nexport class IdleTracker extends BehaviorTrackerBase {\n private isIdle = false;\n\n private idleSince = 0;\n\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly signalBus: BehaviorSignalBus | undefined;\n\n constructor(context: PixelRuntimeContext, options?: IdleTrackerOptions) {\n super(context);\n this.signalBus = options?.signalBus;\n }\n\n protected onInit(): void {\n if (!this.isWindowAvailable()) return;\n\n this.isIdle = false;\n this.idleSince = 0;\n this.scheduleIdleCheck();\n\n for (const eventName of ACTIVITY_EVENTS) {\n this.addWindowListener(eventName, () => this.onActivity(), {\n passive: true,\n });\n }\n }\n\n protected onDestroy(): void {\n this.idleTimer = this.clearManagedTimeout(this.idleTimer);\n this.isIdle = false;\n this.idleSince = 0;\n }\n\n private get thresholdMs(): number {\n return this.context.config.modules.behavior.trackers.idle.thresholdMs;\n }\n\n private scheduleIdleCheck(): void {\n this.idleTimer = this.clearManagedTimeout(this.idleTimer);\n this.idleTimer = setTimeout(() => this.enterIdle(), this.thresholdMs);\n }\n\n private onActivity(): void {\n const now = Date.now();\n\n this.signalBus?.publish(\n this.signalBus.createSignal('ACTIVITY', 'IdleTracker', { at: now })\n );\n\n if (this.isIdle) {\n const previousIdleDurationMs = Math.max(0, now - this.idleSince);\n this.isIdle = false;\n this.dispatchEngagement({\n type: 'USER_ACTIVE',\n category: 'ENGAGEMENT',\n activeAt: now,\n previousIdleDurationMs,\n });\n }\n\n this.scheduleIdleCheck();\n }\n\n private enterIdle(): void {\n if (this.isIdle) return;\n\n const now = Date.now();\n this.isIdle = true;\n this.idleSince = now;\n\n this.signalBus?.publish(\n this.signalBus.createSignal('IDLE', 'IdleTracker', {\n idleSince: now,\n thresholdMs: this.thresholdMs,\n })\n );\n\n this.dispatchEngagement({\n type: 'USER_IDLE',\n category: 'ENGAGEMENT',\n idleSince: now,\n thresholdMs: this.thresholdMs,\n });\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\n\nconst DEFAULT_EXIT_INTENT_THRESHOLD = 5;\n\nexport class ExitIntentTracker extends BehaviorTrackerBase {\n private fired = false;\n\n constructor(context: PixelRuntimeContext) {\n super(context);\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n\n this.fired = false;\n this.addDocumentListener(\n 'mousemove',\n (event: MouseEvent) => this.handleMouseMove(event),\n { passive: true }\n );\n }\n\n protected onDestroy(): void {\n this.fired = false;\n }\n\n private handleMouseMove(event: MouseEvent): void {\n if (this.fired) return;\n if (event.clientY > DEFAULT_EXIT_INTENT_THRESHOLD) return;\n\n this.fired = true;\n const now = Date.now();\n\n this.dispatchEngagement({\n type: 'EXIT_INTENT',\n category: 'ENGAGEMENT',\n triggeredAt: now,\n clientY: event.clientY,\n });\n }\n}\n","import type { ElementDescriptor } from '@/events/shared/ElementDescriptor';\n\n/**\n * Descritor sanitizado para eventos de Viewport.\n *\n * Deliberadamente mais restrito que `describeElement` (usado por Click/Scroll):\n * sem texto, sem dataset e sem HTML — apenas identidade estrutural segura.\n */\nexport function describeViewportElement(\n element: Element | null\n): ElementDescriptor | undefined {\n if (!element) return undefined;\n\n const classes = element.classList?.length\n ? Array.from(element.classList)\n : undefined;\n\n return {\n tagName: element.tagName ? element.tagName.toLowerCase() : undefined,\n id: element.id || undefined,\n classes,\n role: element.getAttribute('role') ?? undefined,\n name: element.getAttribute('name') ?? undefined,\n };\n}\n","import type {\n ViewportBehaviorConfig,\n ViewportTargetConfig,\n} from '@/config/types/modules/behavior';\n\nimport type {\n NormalizedViewportConfig,\n NormalizedViewportTarget,\n ViewportConfigWarning,\n} from '../contracts/viewport';\n\nconst DEFAULT_ENTER_THRESHOLD = 0.5;\nconst DEFAULT_EXIT_THRESHOLD = 0;\nconst DEFAULT_MIN_VISIBLE_MS = 0;\nconst DEFAULT_TRACK_EXIT = true;\nconst DEFAULT_ONCE = false;\nconst DEFAULT_INCLUDE_ELEMENT = false;\nconst DEFAULT_MUTATION_DEBOUNCE_MS = 100;\nconst DEFAULT_MAX_OBSERVED_ELEMENTS = 500;\nconst DEFAULT_ROOT_MARGIN = '0px';\n\n/** Clamp genérico usado pelo normalizador e pelo observer factory. */\nexport function clamp(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\n/**\n * Normaliza `ViewportBehaviorConfig` (contrato de config) em `NormalizedViewportConfig`\n * (contrato de runtime), coletando warnings sanitizados sem lançar erro global.\n *\n * Selector inválido não é validado aqui — é isolado em runtime na hora do\n * `querySelectorAll` (BEHAVIOR_VIEWPORT_INVALID_SELECTOR).\n */\nexport function normalizeViewportConfig(\n config: ViewportBehaviorConfig\n): NormalizedViewportConfig {\n const warnings: ViewportConfigWarning[] = [];\n const seenKeys = new Set<string>();\n const targets: NormalizedViewportTarget[] = [];\n\n const rawTargets = Array.isArray(config.targets) ? config.targets : [];\n\n for (const rawTarget of rawTargets) {\n const normalizedTarget = normalizeTarget(rawTarget, seenKeys, warnings);\n if (normalizedTarget) {\n targets.push(normalizedTarget);\n }\n }\n\n const mutationDebounceMs = Math.max(\n 0,\n toFiniteNumber(config.mutationDebounceMs, DEFAULT_MUTATION_DEBOUNCE_MS)\n );\n\n const maxObservedElements = Math.max(\n 1,\n toFiniteNumber(config.maxObservedElements, DEFAULT_MAX_OBSERVED_ELEMENTS)\n );\n\n return {\n enabled: config.enabled === true,\n targets,\n rootMargin: isNonEmptyString(config.rootMargin)\n ? config.rootMargin\n : DEFAULT_ROOT_MARGIN,\n observeMutations: config.observeMutations !== false,\n mutationDebounceMs,\n maxObservedElements,\n warnings,\n };\n}\n\nfunction normalizeTarget(\n raw: ViewportTargetConfig,\n seenKeys: Set<string>,\n warnings: ViewportConfigWarning[]\n): NormalizedViewportTarget | null {\n const key = typeof raw?.key === 'string' ? raw.key.trim() : '';\n\n if (!key) {\n warnings.push({\n code: 'BEHAVIOR_VIEWPORT_EMPTY_KEY',\n message: 'Viewport target ignored: empty key.',\n });\n return null;\n }\n\n if (seenKeys.has(key)) {\n warnings.push({\n code: 'BEHAVIOR_VIEWPORT_DUPLICATE_KEY',\n message: `Viewport target ignored: duplicate key \"${key}\".`,\n });\n return null;\n }\n\n const selector = typeof raw?.selector === 'string' ? raw.selector.trim() : '';\n\n if (!selector) {\n warnings.push({\n code: 'BEHAVIOR_VIEWPORT_EMPTY_SELECTOR',\n message: `Viewport target \"${key}\" ignored: empty selector.`,\n });\n return null;\n }\n\n seenKeys.add(key);\n\n const enterThreshold = clamp(\n toFiniteNumber(raw.enterThreshold, DEFAULT_ENTER_THRESHOLD),\n 0,\n 1\n );\n\n const exitThreshold = clamp(\n toFiniteNumber(raw.exitThreshold, DEFAULT_EXIT_THRESHOLD),\n 0,\n enterThreshold\n );\n\n const minVisibleMs = Math.max(\n 0,\n toFiniteNumber(raw.minVisibleMs, DEFAULT_MIN_VISIBLE_MS)\n );\n\n return {\n key,\n selector,\n enterThreshold,\n exitThreshold,\n minVisibleMs,\n trackExit: raw.trackExit ?? DEFAULT_TRACK_EXIT,\n once: raw.once ?? DEFAULT_ONCE,\n includeElement: raw.includeElement ?? DEFAULT_INCLUDE_ELEMENT,\n };\n}\n","/**\n * Estado por elemento observado, indexado por `targetKey + elementId`.\n * Nunca é module-level: cada `ViewportTracker` cria a sua própria instância.\n */\nexport type ViewportElementState = {\n readonly targetKey: string;\n readonly selector: string;\n readonly elementId: string;\n\n active: boolean;\n completed: boolean;\n\n candidateEnteredAt: number | undefined;\n enteredAt: number | undefined;\n exitedAt: number | undefined;\n\n lastRatio: number;\n maxRatio: number;\n\n pendingTimer: ReturnType<typeof setTimeout> | null;\n};\n\nexport type ViewportStateCounts = {\n readonly active: number;\n readonly pending: number;\n};\n\nfunction makeStateKey(targetKey: string, elementId: string): string {\n return `${targetKey}::${elementId}`;\n}\n\nfunction createInitialState(\n targetKey: string,\n selector: string,\n elementId: string\n): ViewportElementState {\n return {\n targetKey,\n selector,\n elementId,\n active: false,\n completed: false,\n candidateEnteredAt: undefined,\n enteredAt: undefined,\n exitedAt: undefined,\n lastRatio: 0,\n maxRatio: 0,\n pendingTimer: null,\n };\n}\n\nexport class ViewportStateStore {\n private readonly states = new Map<string, ViewportElementState>();\n\n get(targetKey: string, elementId: string): ViewportElementState | undefined {\n return this.states.get(makeStateKey(targetKey, elementId));\n }\n\n set(state: ViewportElementState): void {\n this.states.set(makeStateKey(state.targetKey, state.elementId), state);\n }\n\n getOrCreate(\n targetKey: string,\n selector: string,\n elementId: string\n ): ViewportElementState {\n const key = makeStateKey(targetKey, elementId);\n let state = this.states.get(key);\n if (!state) {\n state = createInitialState(targetKey, selector, elementId);\n this.states.set(key, state);\n }\n return state;\n }\n\n delete(targetKey: string, elementId: string): void {\n const key = makeStateKey(targetKey, elementId);\n const state = this.states.get(key);\n if (state) {\n this.cancelTimer(state);\n }\n this.states.delete(key);\n }\n\n clear(): void {\n for (const state of this.states.values()) {\n this.cancelTimer(state);\n }\n this.states.clear();\n }\n\n forEach(callback: (state: ViewportElementState, key: string) => void): void {\n for (const [key, state] of this.states) {\n callback(state, key);\n }\n }\n\n counts(): ViewportStateCounts {\n let active = 0;\n let pending = 0;\n for (const state of this.states.values()) {\n if (state.active) active += 1;\n if (state.pendingTimer !== null) pending += 1;\n }\n return { active, pending };\n }\n\n cancelTimer(state: ViewportElementState): void {\n if (state.pendingTimer !== null) {\n clearTimeout(state.pendingTimer);\n state.pendingTimer = null;\n }\n }\n\n size(): number {\n return this.states.size;\n }\n}\n","import type { NormalizedViewportTarget } from '../contracts/viewport';\n\n/**\n * Um elemento pode casar com mais de um target (selectors diferentes\n * apontando pro mesmo nó). Por isso `targets` é um Set: o elemento é\n * observado uma única vez pelo IntersectionObserver, mas o estado é\n * mantido por target (via `ViewportStateStore`, chave `targetKey + elementId`).\n */\nexport type ViewportRegistryEntry = {\n readonly elementId: string;\n readonly element: Element;\n readonly targets: Set<NormalizedViewportTarget>;\n};\n\nexport type ViewportRegisterResult =\n | {\n readonly ok: true;\n readonly entry: ViewportRegistryEntry;\n readonly isNewElement: boolean;\n }\n | { readonly ok: false; readonly reason: 'limit_reached' };\n\n/**\n * Registry por instância de `ViewportTracker`.\n * Element IDs (`vp_el_N`) são sequenciais por instância — nunca module-level.\n */\nexport class ViewportTargetRegistry {\n private readonly elementIds = new WeakMap<Element, string>();\n\n private readonly entriesById = new Map<string, ViewportRegistryEntry>();\n\n private sequence = 0;\n\n private readonly maxObservedElements: number;\n\n constructor(maxObservedElements: number) {\n this.maxObservedElements = Math.max(1, maxObservedElements);\n }\n\n tryRegister(\n element: Element,\n target: NormalizedViewportTarget\n ): ViewportRegisterResult {\n const existingId = this.elementIds.get(element);\n\n if (existingId !== undefined) {\n const entry = this.entriesById.get(existingId);\n if (entry) {\n entry.targets.add(target);\n return { ok: true, entry, isNewElement: false };\n }\n }\n\n if (this.entriesById.size >= this.maxObservedElements) {\n return { ok: false, reason: 'limit_reached' };\n }\n\n this.sequence += 1;\n const elementId = `vp_el_${this.sequence}`;\n const entry: ViewportRegistryEntry = {\n elementId,\n element,\n targets: new Set([target]),\n };\n\n this.elementIds.set(element, elementId);\n this.entriesById.set(elementId, entry);\n\n return { ok: true, entry, isNewElement: true };\n }\n\n unregister(element: Element): void {\n const elementId = this.elementIds.get(element);\n if (elementId === undefined) return;\n\n this.elementIds.delete(element);\n this.entriesById.delete(elementId);\n }\n\n unregisterById(elementId: string): void {\n const entry = this.entriesById.get(elementId);\n if (entry) {\n this.elementIds.delete(entry.element);\n }\n this.entriesById.delete(elementId);\n }\n\n getByElement(element: Element): ViewportRegistryEntry | undefined {\n const elementId = this.elementIds.get(element);\n return elementId !== undefined\n ? this.entriesById.get(elementId)\n : undefined;\n }\n\n getById(elementId: string): ViewportRegistryEntry | undefined {\n return this.entriesById.get(elementId);\n }\n\n allObserved(): ViewportRegistryEntry[] {\n return Array.from(this.entriesById.values());\n }\n\n isObserved(element: Element): boolean {\n return this.elementIds.has(element);\n }\n\n count(): number {\n return this.entriesById.size;\n }\n\n isAtCapacity(): boolean {\n return this.entriesById.size >= this.maxObservedElements;\n }\n\n /** Libera as referências internas; o WeakMap se esvazia sozinho via GC. */\n disconnect(): void {\n this.entriesById.clear();\n }\n}\n","import { clamp } from './normalizeViewportConfig';\n\nexport type ViewportObserverCallback = (\n entries: IntersectionObserverEntry[],\n observer: IntersectionObserver\n) => void;\n\nexport type ViewportObserverOptions = {\n readonly rootMargin: string;\n readonly thresholds: readonly number[];\n};\n\nexport type ViewportObserverResult =\n | {\n readonly available: true;\n readonly observer: IntersectionObserver;\n readonly error: undefined;\n }\n | {\n readonly available: false;\n readonly observer: undefined;\n readonly error: string | undefined;\n };\n\n/** SSR-safe: nunca referenciar `IntersectionObserver` fora de um typeof check. */\nexport function isIntersectionObserverAvailable(): boolean {\n return typeof IntersectionObserver !== 'undefined';\n}\n\n/** Deriva thresholds únicos e ordenados a partir de todos os targets: 0, enter/exit de cada, 1. */\nexport function buildThresholds(\n targets: readonly {\n readonly enterThreshold: number;\n readonly exitThreshold: number;\n }[]\n): number[] {\n const unique = new Set<number>([0, 1]);\n\n for (const target of targets) {\n unique.add(clamp(target.enterThreshold, 0, 1));\n unique.add(clamp(target.exitThreshold, 0, 1));\n }\n\n return Array.from(unique).sort((a, b) => a - b);\n}\n\n/**\n * Cria um `IntersectionObserver` isolado (uma instância por `ViewportTracker`).\n * Nunca cria polling como fallback: se indisponível, retorna `available: false`.\n */\nexport function createIntersectionObserver(\n callback: ViewportObserverCallback,\n options: ViewportObserverOptions\n): ViewportObserverResult {\n if (!isIntersectionObserverAvailable()) {\n return {\n available: false,\n observer: undefined,\n error: 'IntersectionObserver unavailable',\n };\n }\n\n try {\n const observer = new IntersectionObserver(callback, {\n root: null,\n rootMargin: options.rootMargin,\n threshold: options.thresholds as number[],\n });\n return { available: true, observer, error: undefined };\n } catch (error) {\n return {\n available: false,\n observer: undefined,\n error:\n error instanceof Error\n ? error.message\n : 'IntersectionObserver init failed',\n };\n }\n}\n","import type { ViewportBehaviorConfig } from '@/config/types/modules/behavior';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type {\n NormalizedViewportConfig,\n NormalizedViewportTarget,\n ViewportExitReason,\n ViewportSnapshot,\n} from '../contracts/viewport';\nimport type { BehaviorSignalBus } from '../contracts/signals';\nimport { describeViewportElement } from '../viewport/describeViewportElement';\nimport {\n normalizeViewportConfig,\n clamp,\n} from '../viewport/normalizeViewportConfig';\nimport type { ViewportElementState } from '../viewport/ViewportStateStore';\nimport { ViewportStateStore } from '../viewport/ViewportStateStore';\nimport { ViewportTargetRegistry } from '../viewport/ViewportTargetRegistry';\nimport {\n buildThresholds,\n createIntersectionObserver,\n} from '../viewport/ViewportObserverFactory';\nimport { BehaviorTrackerBase } from './BehaviorTrackerBase';\n\nexport type ViewportTrackerOptions = {\n readonly signalBus?: BehaviorSignalBus;\n readonly config: ViewportBehaviorConfig;\n};\n\n/**\n * Viewport Tracker (Etapa 18) — observa entrada/saída de elementos configurados\n * via `IntersectionObserver`. DOM tracker puro: não conhece Transport, Queue,\n * Sender ou API. Publica sinais internos no BehaviorSignalBus e eventos\n * públicos via BaseEventBuilder + Dispatcher (herdado de BehaviorTrackerBase).\n */\nexport class ViewportTracker extends BehaviorTrackerBase {\n private readonly signalBus: BehaviorSignalBus | undefined;\n\n private readonly rawConfig: ViewportBehaviorConfig;\n\n private normalized: NormalizedViewportConfig | null = null;\n\n private registry: ViewportTargetRegistry | null = null;\n\n private stateStore: ViewportStateStore | null = null;\n\n private observer: IntersectionObserver | null = null;\n\n private observerAvailable = false;\n\n private mutationObserver: MutationObserver | null = null;\n\n private mutationTimer: ReturnType<typeof setTimeout> | null = null;\n\n private initialized = false;\n\n private limitWarned = false;\n\n private enterCount = 0;\n\n private exitCount = 0;\n\n private lastEventAt: number | undefined;\n\n constructor(context: PixelRuntimeContext, options: ViewportTrackerOptions) {\n super(context);\n this.signalBus = options.signalBus;\n this.rawConfig = options.config;\n }\n\n protected onInit(): void {\n const normalized = normalizeViewportConfig(this.rawConfig);\n this.normalized = normalized;\n this.initialized = true;\n\n for (const warning of normalized.warnings) {\n this.context.logger.warn(`[Pixel] ${warning.code}: ${warning.message}`);\n }\n\n if (!normalized.enabled || normalized.targets.length === 0) {\n return;\n }\n\n if (!this.isDocumentAvailable()) {\n return;\n }\n\n this.registry = new ViewportTargetRegistry(normalized.maxObservedElements);\n this.stateStore = new ViewportStateStore();\n\n const thresholds = buildThresholds(normalized.targets);\n const observerResult = createIntersectionObserver(\n entries => this.handleIntersections(entries),\n { rootMargin: normalized.rootMargin, thresholds }\n );\n\n this.observerAvailable = observerResult.available;\n\n if (!observerResult.available) {\n this.context.logger.warn(\n `[Pixel] BEHAVIOR_VIEWPORT_UNAVAILABLE: ${observerResult.error ?? 'IntersectionObserver unavailable'}`\n );\n return;\n }\n\n this.observer = observerResult.observer;\n this.scanAndObserve(normalized.targets);\n\n if (\n normalized.observeMutations &&\n typeof MutationObserver !== 'undefined'\n ) {\n this.setupMutationObserver(normalized);\n }\n }\n\n protected onDestroy(): void {\n if (this.mutationTimer) {\n clearTimeout(this.mutationTimer);\n this.mutationTimer = null;\n }\n this.mutationObserver?.disconnect();\n this.mutationObserver = null;\n\n this.observer?.disconnect();\n this.observer = null;\n this.observerAvailable = false;\n\n this.stateStore?.clear();\n this.stateStore = null;\n\n this.registry?.disconnect();\n this.registry = null;\n\n this.enterCount = 0;\n this.exitCount = 0;\n this.lastEventAt = undefined;\n this.limitWarned = false;\n this.normalized = null;\n this.initialized = false;\n }\n\n /** Snapshot read-only e serializável para diagnostics/health. */\n getSnapshot(): ViewportSnapshot {\n const normalized = this.normalized;\n const counts = this.stateStore?.counts() ?? { active: 0, pending: 0 };\n const observedElementCount = this.registry?.count() ?? 0;\n\n return {\n enabled: normalized?.enabled ?? false,\n initialized: this.initialized,\n available: this.observerAvailable,\n targetCount: normalized?.targets.length ?? 0,\n matchedElementCount: observedElementCount,\n observedElementCount,\n activeElementCount: counts.active,\n pendingElementCount: counts.pending,\n enterCount: this.enterCount,\n exitCount: this.exitCount,\n mutationObserverEnabled: this.mutationObserver !== null,\n maxObservedElements: normalized?.maxObservedElements ?? 0,\n limitReached: this.limitWarned,\n lastEventAt: this.lastEventAt,\n };\n }\n\n // ---------------------------------------------------------------------\n // Scan / observação inicial e dinâmica\n // ---------------------------------------------------------------------\n\n private scanAndObserve(targets: readonly NormalizedViewportTarget[]): void {\n for (const target of targets) {\n this.observeTarget(target);\n }\n }\n\n private observeTarget(target: NormalizedViewportTarget): void {\n if (!this.registry || !this.observer || !this.isDocumentAvailable()) return;\n\n let elements: NodeListOf<Element>;\n try {\n elements = document.querySelectorAll(target.selector);\n } catch {\n this.context.logger.warn(\n `[Pixel] BEHAVIOR_VIEWPORT_INVALID_SELECTOR: target \"${target.key}\" has an invalid selector.`\n );\n return;\n }\n\n elements.forEach(element => this.registerElement(element, target));\n }\n\n private registerElement(\n element: Element,\n target: NormalizedViewportTarget\n ): void {\n if (!this.registry || !this.observer) return;\n\n const result = this.registry.tryRegister(element, target);\n\n if (!result.ok) {\n if (!this.limitWarned) {\n this.limitWarned = true;\n this.context.logger.warn(\n '[Pixel] BEHAVIOR_VIEWPORT_LIMIT_REACHED: maxObservedElements reached.'\n );\n }\n return;\n }\n\n if (result.isNewElement) {\n this.observer.observe(element);\n }\n }\n\n private setupMutationObserver(normalized: NormalizedViewportConfig): void {\n if (!this.isDocumentAvailable()) return;\n if (typeof MutationObserver === 'undefined') return;\n\n const rootNode = document.body ?? document.documentElement;\n if (!rootNode) return;\n\n try {\n this.mutationObserver = new MutationObserver(() => {\n this.scheduleMutationRescan(normalized);\n });\n this.mutationObserver.observe(rootNode, {\n childList: true,\n subtree: true,\n });\n } catch {\n this.mutationObserver = null;\n this.context.logger.warn(\n '[Pixel] BEHAVIOR_VIEWPORT_OBSERVER_FAILED: MutationObserver init failed.'\n );\n }\n }\n\n private scheduleMutationRescan(normalized: NormalizedViewportConfig): void {\n if (this.mutationTimer) {\n clearTimeout(this.mutationTimer);\n }\n\n this.mutationTimer = setTimeout(() => {\n this.mutationTimer = null;\n this.handleMutationRescan(normalized);\n }, normalized.mutationDebounceMs);\n }\n\n private handleMutationRescan(normalized: NormalizedViewportConfig): void {\n if (!this.registry) return;\n\n // Hardening 18.1: cleanup ANTES do scan libera capacidade para novos\n // elementos na mesma mutation batch (ex.: maxObservedElements=1).\n this.cleanupDisconnectedElements();\n this.scanAndObserve(normalized.targets);\n }\n\n private cleanupDisconnectedElements(): void {\n if (!this.registry || !this.stateStore) return;\n\n const disconnected = this.registry\n .allObserved()\n .filter(entry => !entry.element.isConnected);\n\n for (const entry of disconnected) {\n this.observer?.unobserve(entry.element);\n\n for (const target of entry.targets) {\n const state = this.stateStore.get(target.key, entry.elementId);\n if (state) {\n this.finalizeRemovedElement(state, target);\n }\n }\n\n this.registry.unregister(entry.element);\n }\n }\n\n private finalizeRemovedElement(\n state: ViewportElementState,\n target: NormalizedViewportTarget\n ): void {\n if (!this.stateStore) return;\n\n this.stateStore.cancelTimer(state);\n\n if (state.active) {\n state.exitedAt = Date.now();\n if (target.trackExit) {\n this.emitExit(state, target, 'removed');\n }\n }\n\n state.active = false;\n state.completed = true;\n this.stateStore.delete(target.key, state.elementId);\n }\n\n // ---------------------------------------------------------------------\n // IntersectionObserver callback / máquina de enter-exit\n // ---------------------------------------------------------------------\n\n private handleIntersections(entries: IntersectionObserverEntry[]): void {\n if (!this.registry || !this.stateStore) return;\n\n for (const entry of entries) {\n const registryEntry = this.registry.getByElement(entry.target);\n if (!registryEntry) continue;\n\n for (const target of registryEntry.targets) {\n this.processEntry(entry, registryEntry.elementId, target);\n }\n }\n }\n\n private processEntry(\n entry: IntersectionObserverEntry,\n elementId: string,\n target: NormalizedViewportTarget\n ): void {\n if (!this.stateStore) return;\n\n const state = this.stateStore.getOrCreate(\n target.key,\n target.selector,\n elementId\n );\n if (state.completed) return;\n\n const ratio = clamp(entry.intersectionRatio, 0, 1);\n state.lastRatio = ratio;\n if (ratio > state.maxRatio) state.maxRatio = ratio;\n\n if (!state.active) {\n const isCandidate =\n entry.isIntersecting && ratio >= target.enterThreshold;\n this.handleCandidateEnter(state, target, isCandidate);\n } else {\n this.handleActiveElement(state, target, entry, ratio);\n }\n }\n\n private handleCandidateEnter(\n state: ViewportElementState,\n target: NormalizedViewportTarget,\n isCandidate: boolean\n ): void {\n if (!this.stateStore) return;\n\n if (!isCandidate) {\n if (state.candidateEnteredAt !== undefined) {\n this.stateStore.cancelTimer(state);\n state.candidateEnteredAt = undefined;\n }\n return;\n }\n\n if (state.candidateEnteredAt !== undefined) {\n return;\n }\n\n state.candidateEnteredAt = Date.now();\n\n if (target.minVisibleMs === 0) {\n this.confirmEnter(state, target);\n return;\n }\n\n state.pendingTimer = setTimeout(() => {\n state.pendingTimer = null;\n this.confirmEnter(state, target);\n }, target.minVisibleMs);\n }\n\n private confirmEnter(\n state: ViewportElementState,\n target: NormalizedViewportTarget\n ): void {\n if (state.active || state.completed) return;\n\n state.active = true;\n state.enteredAt = Date.now();\n state.candidateEnteredAt = undefined;\n\n this.emitEnter(state, target);\n\n if (target.once && !target.trackExit) {\n state.completed = true;\n this.finishTargetCycle(state, target);\n }\n }\n\n private handleActiveElement(\n state: ViewportElementState,\n target: NormalizedViewportTarget,\n entry: IntersectionObserverEntry,\n ratio: number\n ): void {\n const shouldExit = !entry.isIntersecting || ratio <= target.exitThreshold;\n if (!shouldExit) return;\n\n const reason: ViewportExitReason = !entry.isIntersecting\n ? 'not_intersecting'\n : 'threshold';\n\n this.completeCycle(state, target, reason);\n }\n\n private completeCycle(\n state: ViewportElementState,\n target: NormalizedViewportTarget,\n reason: ViewportExitReason\n ): void {\n if (!this.stateStore) return;\n\n this.stateStore.cancelTimer(state);\n state.active = false;\n state.exitedAt = Date.now();\n\n if (target.trackExit) {\n this.emitExit(state, target, reason);\n }\n\n if (target.once) {\n state.completed = true;\n this.finishTargetCycle(state, target);\n } else {\n state.enteredAt = undefined;\n state.exitedAt = undefined;\n state.candidateEnteredAt = undefined;\n }\n }\n\n /** Remove a associação target↔elemento; unobserve só quando nenhum outro target precisar dele. */\n private finishTargetCycle(\n state: ViewportElementState,\n target: NormalizedViewportTarget\n ): void {\n if (this.registry) {\n const entry = this.registry.getById(state.elementId);\n if (entry) {\n entry.targets.delete(target);\n if (entry.targets.size === 0) {\n this.observer?.unobserve(entry.element);\n this.registry.unregisterById(state.elementId);\n }\n }\n }\n\n this.stateStore?.delete(target.key, state.elementId);\n }\n\n // ---------------------------------------------------------------------\n // Eventos públicos + sinais internos\n // ---------------------------------------------------------------------\n\n private emitEnter(\n state: ViewportElementState,\n target: NormalizedViewportTarget\n ): void {\n const enteredAt = state.enteredAt ?? Date.now();\n const visibilityRatio = clamp(state.lastRatio, 0, 1);\n const element = this.registry?.getById(state.elementId)?.element ?? null;\n\n this.enterCount += 1;\n this.lastEventAt = enteredAt;\n\n this.signalBus?.publish(\n this.signalBus.createSignal('VIEWPORT_ENTER', 'ViewportTracker', {\n key: target.key,\n elementId: state.elementId,\n visibilityRatio,\n enteredAt,\n })\n );\n\n this.dispatchEngagement({\n type: 'VIEWPORT_ENTER',\n category: 'ENGAGEMENT',\n key: target.key,\n selector: target.selector,\n elementId: state.elementId,\n visibilityRatio,\n enterThreshold: target.enterThreshold,\n exitThreshold: target.exitThreshold,\n enteredAt,\n minVisibleMs: target.minVisibleMs,\n ...(target.includeElement\n ? { element: describeViewportElement(element) }\n : {}),\n });\n }\n\n private emitExit(\n state: ViewportElementState,\n target: NormalizedViewportTarget,\n reason: ViewportExitReason\n ): void {\n const enteredAt = state.enteredAt ?? Date.now();\n const exitedAt = state.exitedAt ?? Date.now();\n const visibleDurationMs = Math.max(0, exitedAt - enteredAt);\n const visibilityRatio = clamp(state.lastRatio, 0, 1);\n const element = this.registry?.getById(state.elementId)?.element ?? null;\n\n this.exitCount += 1;\n this.lastEventAt = exitedAt;\n\n this.signalBus?.publish(\n this.signalBus.createSignal('VIEWPORT_EXIT', 'ViewportTracker', {\n key: target.key,\n elementId: state.elementId,\n visibilityRatio,\n enteredAt,\n exitedAt,\n visibleDurationMs,\n })\n );\n\n this.dispatchEngagement({\n type: 'VIEWPORT_EXIT',\n category: 'ENGAGEMENT',\n key: target.key,\n selector: target.selector,\n elementId: state.elementId,\n visibilityRatio,\n enterThreshold: target.enterThreshold,\n exitThreshold: target.exitThreshold,\n enteredAt,\n exitedAt,\n visibleDurationMs,\n reason,\n ...(target.includeElement\n ? { element: describeViewportElement(element) }\n : {}),\n });\n }\n}\n","import type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { EngagementSnapshot } from './contracts/engagement';\nimport type { HeartbeatSnapshot } from './contracts/heartbeat';\nimport type { IBehaviorTracker } from './contracts/IBehaviorTracker';\nimport type { RateLimitSnapshot } from './contracts/rateLimit';\nimport type { BufferSnapshot } from './contracts/buffer';\nimport type {\n BehaviorSignalData,\n BehaviorSignalType,\n} from './contracts/signals';\nimport type { StateMachineSnapshot } from './contracts/stateMachine';\nimport type {\n SessionSummaryReason,\n SessionSummarySnapshot,\n} from './contracts/sessionSummary';\nimport type { ViewportSnapshot } from './contracts/viewport';\nimport { EngagementEngine } from './engines/engagement';\nimport { HeartbeatEngine } from './engines/HeartbeatEngine';\nimport { resolveEngagementConfig } from './resolveEngagementConfig';\nimport { resolveHeartbeatConfig } from './resolveHeartbeatConfig';\nimport { resolveRuntimeIntelligenceConfig } from './resolveRuntimeIntelligenceConfig';\nimport { BehaviorSignalBus } from './runtime/BehaviorSignalBus';\nimport { BehaviorRuntimeCoordinator } from './runtime/intelligence';\nimport {\n ClickTracker,\n ExitIntentTracker,\n IdleTracker,\n ScrollTracker,\n VisibilityTracker,\n ViewportTracker,\n} from './trackers';\n\nexport class BehaviorModule implements PixelModule {\n readonly name = 'behavior' as const;\n\n private trackers: IBehaviorTracker[] = [];\n\n private heartbeatEngine: HeartbeatEngine | null = null;\n\n private engagementEngine: EngagementEngine | null = null;\n\n private viewportTracker: ViewportTracker | null = null;\n\n private signalBus: BehaviorSignalBus | null = null;\n\n /**\n * Coordenador de Runtime Intelligence (Etapa 20). Persiste entre init/destroy\n * para manter a continuidade de geração da state machine no reinit.\n */\n private coordinator: BehaviorRuntimeCoordinator | null = null;\n\n private coordinatorActive = false;\n\n private active = false;\n\n init(context: PixelRuntimeContext): void {\n if (this.active) {\n context.logger.debug('[Pixel] Behavior module already initialized');\n return;\n }\n\n const { enabled, trackers: trackerConfig } =\n context.config.modules.behavior;\n\n if (!enabled) {\n context.logger.debug('[Pixel] Behavior module disabled');\n return;\n }\n\n context.logger.debug('[Pixel] Behavior module initialized');\n\n // Ordem de init (Etapa 20): consumidores antes dos produtores.\n // 1. BehaviorSignalBus\n // 2. EngagementEngine (inscreve nos sinais)\n // 3. BehaviorRuntimeCoordinator (rate limit / buffer / state machine / summary)\n // 4. Trackers (produzem VISIBLE/HIDDEN iniciais no init)\n // 5. HeartbeatEngine (fireImmediately publica HEARTBEAT no init)\n // Assim os consumidores recebem os sinais iniciais emitidos durante o init().\n const signalBus = new BehaviorSignalBus();\n this.signalBus = signalBus;\n\n const engagementConfig = resolveEngagementConfig(\n context.config.modules.behavior\n );\n\n if (engagementConfig.enabled) {\n const engine = new EngagementEngine(context, {\n config: engagementConfig,\n signalBus,\n });\n engine.init();\n this.engagementEngine = engine;\n } else {\n this.engagementEngine = null;\n }\n\n const intelligenceConfig = resolveRuntimeIntelligenceConfig(\n context.config.modules.behavior\n );\n const intelligenceEnabled =\n intelligenceConfig.rateLimit.enabled ||\n intelligenceConfig.buffer.enabled ||\n intelligenceConfig.stateMachine.enabled ||\n intelligenceConfig.sessionSummary.enabled;\n\n if (intelligenceEnabled) {\n if (!this.coordinator) {\n this.coordinator = new BehaviorRuntimeCoordinator(context, {\n config: intelligenceConfig,\n getEngagement: () => {\n const snap = this.engagementEngine?.getSnapshot();\n if (!snap) return null;\n return { score: snap.score, peakScore: snap.peakScore };\n },\n });\n }\n this.coordinator.init(signalBus);\n this.coordinatorActive = true;\n }\n\n const trackers: IBehaviorTracker[] = [];\n\n if (trackerConfig.scroll.enabled) {\n trackers.push(new ScrollTracker(context, { signalBus }));\n }\n if (trackerConfig.click.enabled) {\n trackers.push(new ClickTracker(context, { signalBus }));\n }\n if (trackerConfig.visibility.enabled) {\n trackers.push(new VisibilityTracker(context, { signalBus }));\n }\n if (trackerConfig.idle.enabled) {\n trackers.push(new IdleTracker(context, { signalBus }));\n }\n if (trackerConfig.exitIntent.enabled) {\n trackers.push(new ExitIntentTracker(context));\n }\n\n let viewportTracker: ViewportTracker | null = null;\n if (trackerConfig.viewport.enabled) {\n viewportTracker = new ViewportTracker(context, {\n signalBus,\n config: trackerConfig.viewport,\n });\n trackers.push(viewportTracker);\n }\n this.viewportTracker = viewportTracker;\n\n for (const tracker of trackers) {\n tracker.init();\n }\n\n this.trackers = trackers;\n\n const heartbeatConfig = resolveHeartbeatConfig(\n context.config.modules.behavior\n );\n\n if (heartbeatConfig.enabled) {\n const engine = new HeartbeatEngine(context, {\n config: heartbeatConfig,\n signalBus,\n });\n engine.init();\n this.heartbeatEngine = engine;\n } else {\n this.heartbeatEngine = null;\n }\n\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) {\n this.destroyCoordinator();\n this.engagementEngine?.destroy();\n this.engagementEngine = null;\n this.heartbeatEngine?.destroy();\n this.heartbeatEngine = null;\n this.viewportTracker = null;\n this.signalBus?.clear();\n this.signalBus = null;\n return;\n }\n\n // Ordem de destroy (Etapa 20): Coordinator → Engagement → Heartbeat →\n // trackers → bus. O Coordinator emite BEHAVIOR_SESSION_SUMMARY primeiro,\n // enquanto o Engagement ainda expõe score/peak válidos e o Dispatcher e o\n // SignalBus continuam disponíveis.\n this.destroyCoordinator();\n\n this.engagementEngine?.destroy();\n this.engagementEngine = null;\n\n this.heartbeatEngine?.destroy();\n this.heartbeatEngine = null;\n\n for (let i = this.trackers.length - 1; i >= 0; i -= 1) {\n this.trackers[i]?.destroy();\n }\n this.trackers = [];\n this.viewportTracker = null;\n\n this.signalBus?.clear();\n this.signalBus = null;\n this.active = false;\n }\n\n private destroyCoordinator(): void {\n if (this.coordinatorActive && this.coordinator) {\n this.coordinator.destroy();\n }\n this.coordinatorActive = false;\n }\n\n getHeartbeatSnapshot(): HeartbeatSnapshot | null {\n if (!this.heartbeatEngine) {\n return null;\n }\n return this.heartbeatEngine.getSnapshot();\n }\n\n getViewportSnapshot(): ViewportSnapshot | null {\n if (!this.viewportTracker) {\n return null;\n }\n return this.viewportTracker.getSnapshot();\n }\n\n getEngagementSnapshot(): EngagementSnapshot | null {\n if (!this.engagementEngine) {\n return null;\n }\n return this.engagementEngine.getSnapshot();\n }\n\n getRateLimitSnapshot(): RateLimitSnapshot | null {\n if (!this.coordinator || !this.coordinatorActive) return null;\n return this.coordinator.getRateLimitSnapshot();\n }\n\n getBufferSnapshot(): BufferSnapshot | null {\n if (!this.coordinator || !this.coordinatorActive) return null;\n return this.coordinator.getBufferSnapshot();\n }\n\n getStateMachineSnapshot(): StateMachineSnapshot | null {\n if (!this.coordinator || !this.coordinatorActive) return null;\n return this.coordinator.getStateMachineSnapshot();\n }\n\n getSessionSummarySnapshot(): SessionSummarySnapshot | null {\n if (!this.coordinator || !this.coordinatorActive) return null;\n return this.coordinator.getSessionSummarySnapshot();\n }\n\n /** @internal Avaliação manual para playground/testes. */\n evaluateEngagementNow(): void {\n this.engagementEngine?.evaluateNow();\n }\n\n /** @internal Flush manual do buffer (playground/testes). */\n flushBufferNow(): void {\n this.coordinator?.flushNow();\n }\n\n /** @internal Emissão manual de session summary (playground/testes). */\n emitSessionSummaryNow(reason: SessionSummaryReason = 'hidden'): boolean {\n return this.coordinator?.emitSummaryNow(reason) ?? false;\n }\n\n /** @internal Publica um sinal interno no bus (playground/testes). */\n debugPublishSignal(\n type: BehaviorSignalType,\n data?: BehaviorSignalData\n ): void {\n if (!this.signalBus) return;\n this.signalBus.publish(this.signalBus.createSignal(type, 'debug', data));\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { IConversionDetector } from '../contracts';\n\ntype ManagedListener = {\n readonly target: 'window' | 'document';\n readonly type: string;\n readonly handler: EventListener;\n readonly options?: boolean | AddEventListenerOptions;\n};\n\nexport abstract class BaseAutoTracker implements IConversionDetector {\n protected readonly context: PixelRuntimeContext;\n\n private active = false;\n\n private readonly managedListeners: ManagedListener[] = [];\n\n private observer: MutationObserver | null = null;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (this.active) return;\n this.onInit();\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n this.onDestroy();\n this.removeAllManagedListeners();\n this.observer?.disconnect();\n this.observer = null;\n this.active = false;\n }\n\n protected abstract onInit(): void;\n\n protected abstract onDestroy(): void;\n\n protected isWindowAvailable(): boolean {\n return typeof window !== 'undefined';\n }\n\n protected isDocumentAvailable(): boolean {\n return typeof document !== 'undefined';\n }\n\n protected addWindowListener<K extends keyof WindowEventMap>(\n type: K,\n handler: (event: WindowEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!this.isWindowAvailable()) return;\n const listener = handler as EventListener;\n window.addEventListener(type, listener, options);\n this.managedListeners.push({\n target: 'window',\n type,\n handler: listener,\n options,\n });\n }\n\n protected addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n handler: (event: DocumentEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!this.isDocumentAvailable()) return;\n const listener = handler as EventListener;\n document.addEventListener(type, listener, options);\n this.managedListeners.push({\n target: 'document',\n type,\n handler: listener,\n options,\n });\n }\n\n protected observeDom(callback: () => void): void {\n if (!this.isDocumentAvailable()) return;\n this.observer?.disconnect();\n this.observer = new MutationObserver(() => callback());\n if (document.body) {\n this.observer.observe(document.body, { childList: true, subtree: true });\n }\n }\n\n protected clearManagedTimeout(\n timer: ReturnType<typeof setTimeout> | null\n ): null {\n if (timer) clearTimeout(timer);\n return null;\n }\n\n protected removeAllManagedListeners(): void {\n for (const entry of this.managedListeners) {\n if (entry.target === 'window' && this.isWindowAvailable()) {\n window.removeEventListener(entry.type, entry.handler, entry.options);\n } else if (entry.target === 'document' && this.isDocumentAvailable()) {\n document.removeEventListener(entry.type, entry.handler, entry.options);\n }\n }\n this.managedListeners.length = 0;\n }\n}\n","/**\n * Builds a stable origin string for an auto source detector.\n * Format: auto:<sourceType>:<eventType>:<sourceName>\n */\nexport function buildAutoSourceOrigin(\n sourceType: string,\n eventType: string,\n sourceName: string\n): string {\n const safeName = sourceName.trim().replace(/\\s+/g, '-') || 'unnamed';\n return `auto:${sourceType}:${eventType}:${safeName}`;\n}\n","/**\n * Utilitários compartilhados pelos extractors de commerce.\n * SSR-safe: sem acesso obrigatório a window/document.\n */\n\nconst SENSITIVE_PATTERN =\n /\\b(card|cardnumber|card_number|cc[-_]?number|credit[-_]?card|cvv|cvc|security(?:code)?|expir(?:y|ation)|exp(?:date|iry)?|password|senha|secret|token)\\b/i;\n\nexport function isBrowserElement(value: unknown): value is Element {\n return typeof Element !== 'undefined' && value instanceof Element;\n}\n\nexport function isHtmlFormElement(value: unknown): value is HTMLFormElement {\n return (\n typeof HTMLFormElement !== 'undefined' && value instanceof HTMLFormElement\n );\n}\n\nexport function isHtmlInputElement(value: unknown): value is HTMLInputElement {\n return (\n typeof HTMLInputElement !== 'undefined' && value instanceof HTMLInputElement\n );\n}\n\nexport function trimNonEmpty(value: unknown): string | undefined {\n if (value == null) return undefined;\n const text = String(value).trim();\n return text.length > 0 ? text : undefined;\n}\n\n/**\n * Normaliza preço para number decimal.\n * Exemplos: \"R$ 197,00\" → 197 · \"197.00\" → 197 · \"19700\" → 19700\n * Não divide automaticamente por 100 (centavos).\n */\nexport function normalizePrice(value: unknown): number | undefined {\n const raw = trimNonEmpty(value);\n if (!raw) return undefined;\n\n let cleaned = raw.replace(/[^\\d.,-]/g, '');\n if (!cleaned || cleaned === '-' || cleaned === '.' || cleaned === ',') {\n return undefined;\n }\n\n const hasComma = cleaned.includes(',');\n const hasDot = cleaned.includes('.');\n\n if (hasComma && hasDot) {\n // \"1.234,56\" (BR) vs \"1,234.56\" (US) — último separador é decimal.\n if (cleaned.lastIndexOf(',') > cleaned.lastIndexOf('.')) {\n cleaned = cleaned.replace(/\\./g, '').replace(',', '.');\n } else {\n cleaned = cleaned.replace(/,/g, '');\n }\n } else if (hasComma) {\n cleaned = cleaned.replace(',', '.');\n }\n\n const parsed = Number(cleaned);\n if (!Number.isFinite(parsed)) return undefined;\n return parsed;\n}\n\n/**\n * Normaliza quantity para number.\n * Inválido ou <= 0 → undefined (não preenche default nesta etapa).\n */\nexport function normalizeQuantity(value: unknown): number | undefined {\n const raw = trimNonEmpty(value);\n if (!raw) return undefined;\n\n const parsed = Number(raw.replace(',', '.'));\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\nexport function isSensitiveField(el: Element): boolean {\n if (isHtmlInputElement(el) && el.type === 'password') return true;\n\n const haystack = [\n el.getAttribute('name'),\n el.getAttribute('id'),\n el.getAttribute('autocomplete'),\n el.getAttribute('placeholder'),\n el.getAttribute('aria-label'),\n ]\n .filter(Boolean)\n .join(' ');\n\n return SENSITIVE_PATTERN.test(haystack);\n}\n\nexport function readAttribute(\n element: Element,\n names: readonly string[]\n): string | undefined {\n for (const name of names) {\n if (!name) continue;\n const attrName = name.startsWith('data-') ? name : name;\n const value = trimNonEmpty(element.getAttribute(attrName));\n if (value) return value;\n }\n return undefined;\n}\n\nexport function readInputValue(el: Element): string | undefined {\n if (isSensitiveField(el)) return undefined;\n\n if (isHtmlInputElement(el) || el instanceof HTMLTextAreaElement) {\n return trimNonEmpty(el.value);\n }\n\n if (el instanceof HTMLSelectElement) {\n return trimNonEmpty(el.value);\n }\n\n return undefined;\n}\n\n/**\n * Busca valor de campo por name/id (exatos e contains) dentro de um escopo.\n * Inclui o próprio `root` quando ele é um input/textarea/select.\n */\nexport function findFieldValue(\n root: Element,\n candidates: readonly string[]\n): string | undefined {\n for (const candidate of candidates) {\n if (!candidate) continue;\n\n const exact = root.querySelector(\n `input[name=\"${cssEscape(candidate)}\"], textarea[name=\"${cssEscape(candidate)}\"], select[name=\"${cssEscape(candidate)}\"], input[id=\"${cssEscape(candidate)}\"]`\n );\n if (exact) {\n const value = readInputValue(exact);\n if (value) return value;\n }\n }\n\n const inputs: Element[] = [];\n if (\n isHtmlInputElement(root) ||\n root instanceof HTMLTextAreaElement ||\n root instanceof HTMLSelectElement\n ) {\n inputs.push(root);\n }\n inputs.push(...Array.from(root.querySelectorAll('input, textarea, select')));\n\n for (const candidate of candidates) {\n const needle = candidate.toLowerCase();\n for (const input of inputs) {\n if (isSensitiveField(input)) continue;\n const name = (input.getAttribute('name') ?? '').toLowerCase();\n const id = (input.getAttribute('id') ?? '').toLowerCase();\n if (!fieldNameMatches(name, id, needle)) continue;\n const value = readInputValue(input);\n if (value) return value;\n }\n }\n\n return undefined;\n}\n\nfunction fieldNameMatches(name: string, id: string, needle: string): boolean {\n if (name === needle || id === needle) return true;\n // Chaves curtas (id, tel, qty…) só batem exact — evita falso positivo.\n if (needle.length < 4) return false;\n return name.includes(needle) || id.includes(needle);\n}\n\nfunction cssEscape(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\nexport function mergeDefined<T extends Record<string, unknown>>(\n ...sources: Array<Partial<T> | null | undefined>\n): T {\n const result: Record<string, unknown> = {};\n for (const source of sources) {\n if (!source) continue;\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined || value === null || value === '') continue;\n if (result[key] !== undefined) continue; // prioridade: primeiro preenchido vence\n result[key] = value;\n }\n }\n return result as T;\n}\n\nexport function uniqueNames(\n custom: readonly string[] | undefined,\n defaults: readonly string[]\n): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const name of [...(custom ?? []), ...defaults]) {\n const trimmed = name?.trim();\n if (!trimmed || seen.has(trimmed)) continue;\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","import {\n findFieldValue,\n isBrowserElement,\n isHtmlFormElement,\n mergeDefined,\n readAttribute,\n readInputValue,\n trimNonEmpty,\n uniqueNames,\n} from './extractor-utils';\n\nexport type CustomerData = {\n email?: string;\n phone?: string;\n name?: string;\n firstName?: string;\n lastName?: string;\n};\n\nexport type CustomerExtractorOptions = {\n fieldMappings?: Record<string, string[]>;\n};\n\nconst DEFAULT_EMAIL_FIELDS = [\n 'email',\n 'customerEmail',\n 'customer_email',\n 'e-mail',\n] as const;\n\nconst DEFAULT_PHONE_FIELDS = [\n 'phone',\n 'telefone',\n 'tel',\n 'customerPhone',\n 'customer_phone',\n 'celular',\n 'mobile',\n] as const;\n\nconst DEFAULT_NAME_FIELDS = ['name', 'nome', 'fullName', 'full_name'] as const;\n\nconst DEFAULT_FIRST_NAME_FIELDS = [\n 'firstName',\n 'first_name',\n 'primeiro',\n 'primeiro_nome',\n 'given-name',\n] as const;\n\nconst DEFAULT_LAST_NAME_FIELDS = [\n 'lastName',\n 'last_name',\n 'sobrenome',\n 'family-name',\n] as const;\n\nconst EMAIL_ATTRS = ['data-email'] as const;\nconst PHONE_ATTRS = ['data-phone', 'data-telefone'] as const;\nconst NAME_ATTRS = ['data-name', 'data-nome'] as const;\nconst FIRST_NAME_ATTRS = ['data-first-name', 'data-firstname'] as const;\nconst LAST_NAME_ATTRS = ['data-last-name', 'data-lastname'] as const;\n\n/**\n * Extrai dados de customer a partir de Element/Form/Container.\n * Não dispara eventos, não persiste e não acessa Transport.\n *\n * Prioridade de merge: elemento alvo → form mais próximo → container.\n */\nexport class CustomerExtractor {\n private readonly fieldMappings: Record<string, string[]>;\n\n constructor(options: CustomerExtractorOptions = {}) {\n this.fieldMappings = options.fieldMappings ?? {};\n }\n\n extractFromElement(element: Element | null): CustomerData {\n if (!isBrowserElement(element)) return {};\n\n const fromSelf = this.extractFromScope(element);\n const form = element.closest('form');\n const fromForm = isHtmlFormElement(form) ? this.extractFromScope(form) : {};\n const container = this.findCustomerContainer(element);\n const fromContainer =\n container && container !== element && container !== form\n ? this.extractFromScope(container)\n : {};\n\n return mergeDefined<CustomerData>(fromSelf, fromForm, fromContainer);\n }\n\n extractFromForm(form: HTMLFormElement | null): CustomerData {\n if (!isHtmlFormElement(form)) return {};\n return this.extractFromScope(form);\n }\n\n extractFromContainer(container: Element | null): CustomerData {\n if (!isBrowserElement(container)) return {};\n return this.extractFromScope(container);\n }\n\n private extractFromScope(root: Element): CustomerData {\n const email =\n this.readTypedInput(root, 'email') ??\n this.readAutocomplete(root, 'email') ??\n readAttribute(root, EMAIL_ATTRS) ??\n findFieldValue(root, this.fieldsFor('email', DEFAULT_EMAIL_FIELDS));\n\n const phone =\n this.readTypedInput(root, 'tel') ??\n this.readAutocomplete(root, 'tel') ??\n readAttribute(root, PHONE_ATTRS) ??\n findFieldValue(root, this.fieldsFor('phone', DEFAULT_PHONE_FIELDS));\n\n const name =\n this.readAutocomplete(root, 'name') ??\n readAttribute(root, NAME_ATTRS) ??\n findFieldValue(root, this.fieldsFor('name', DEFAULT_NAME_FIELDS));\n\n const firstName =\n this.readAutocomplete(root, 'given-name') ??\n readAttribute(root, FIRST_NAME_ATTRS) ??\n findFieldValue(\n root,\n this.fieldsFor('firstName', DEFAULT_FIRST_NAME_FIELDS)\n );\n\n const lastName =\n this.readAutocomplete(root, 'family-name') ??\n readAttribute(root, LAST_NAME_ATTRS) ??\n findFieldValue(\n root,\n this.fieldsFor('lastName', DEFAULT_LAST_NAME_FIELDS)\n );\n\n return mergeDefined<CustomerData>({\n email: trimNonEmpty(email),\n phone: trimNonEmpty(phone),\n name: trimNonEmpty(name),\n firstName: trimNonEmpty(firstName),\n lastName: trimNonEmpty(lastName),\n });\n }\n\n private fieldsFor(key: string, defaults: readonly string[]): string[] {\n return uniqueNames(this.fieldMappings[key], defaults);\n }\n\n private readTypedInput(root: Element, type: string): string | undefined {\n const selector = `input[type=\"${type}\"]`;\n const input = root.matches(selector) ? root : root.querySelector(selector);\n return input ? readInputValue(input) : undefined;\n }\n\n private readAutocomplete(\n root: Element,\n autocomplete: string\n ): string | undefined {\n const selector = `input[autocomplete=\"${autocomplete}\"]`;\n const input = root.matches(selector) ? root : root.querySelector(selector);\n return input ? readInputValue(input) : undefined;\n }\n\n private findCustomerContainer(element: Element): Element | null {\n return element.closest(\n '[data-email], [data-phone], [data-name], [data-track], .lead-form, .checkout-form'\n );\n }\n}\n","import {\n findFieldValue,\n isBrowserElement,\n isHtmlFormElement,\n mergeDefined,\n normalizePrice,\n normalizeQuantity,\n readAttribute,\n trimNonEmpty,\n uniqueNames,\n} from './extractor-utils';\n\nexport type ExtractedProductData = {\n productId?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n};\n\nexport type ProductExtractorOptions = {\n attributeMappings?: Record<string, string[]>;\n fieldMappings?: Record<string, string[]>;\n};\n\nconst DEFAULT_PRODUCT_ID_ATTRS = [\n 'data-product-id',\n 'data-product',\n 'data-sku',\n 'data-item-id',\n 'data-id',\n] as const;\n\nconst DEFAULT_PRODUCT_NAME_ATTRS = [\n 'data-product-name',\n 'data-name',\n 'data-item-name',\n] as const;\n\nconst DEFAULT_PRICE_ATTRS = [\n 'data-product-price',\n 'data-price',\n 'data-value',\n 'data-amount',\n] as const;\n\nconst DEFAULT_QUANTITY_ATTRS = ['data-quantity', 'data-qty'] as const;\n\nconst DEFAULT_CURRENCY_ATTRS = ['data-currency'] as const;\n\nconst DEFAULT_PRODUCT_ID_FIELDS = [\n 'productId',\n 'product_id',\n 'product',\n 'sku',\n 'item_id',\n 'id',\n] as const;\n\nconst DEFAULT_PRODUCT_NAME_FIELDS = [\n 'productName',\n 'product_name',\n 'item_name',\n 'name',\n] as const;\n\nconst DEFAULT_PRICE_FIELDS = [\n 'price',\n 'amount',\n 'value',\n 'product_price',\n] as const;\n\nconst DEFAULT_QUANTITY_FIELDS = ['quantity', 'qty'] as const;\n\nconst DEFAULT_CURRENCY_FIELDS = ['currency'] as const;\n\nconst PRODUCT_CONTAINER_SELECTOR = [\n '[data-product-id]',\n '[data-sku]',\n '[data-product]',\n '[data-item-id]',\n '[data-track]',\n '.product-card',\n '.product',\n '[data-product-card]',\n].join(', ');\n\n/**\n * Extrai dados de produto a partir de Element/Form/Container.\n * Usa mappings de attributes/fields. Não consulta ProductCatalog\n * nem atualiza CommerceState (etapa futura: CommerceResolver).\n *\n * Prioridade de merge: elemento alvo → form mais próximo → container.\n * Price/quantity são normalizados para `number` (sem conversão automática para centavos).\n */\nexport class ProductExtractor {\n private readonly attributeMappings: Record<string, string[]>;\n\n private readonly fieldMappings: Record<string, string[]>;\n\n constructor(options: ProductExtractorOptions = {}) {\n this.attributeMappings = options.attributeMappings ?? {};\n this.fieldMappings = options.fieldMappings ?? {};\n }\n\n extractFromElement(element: Element | null): ExtractedProductData {\n if (!isBrowserElement(element)) return {};\n\n const fromSelf = this.extractFromScope(element);\n const form = element.closest('form');\n const fromForm = isHtmlFormElement(form) ? this.extractFromScope(form) : {};\n const container = this.findProductContainer(element);\n const fromContainer =\n container && container !== element && container !== form\n ? this.extractFromScope(container)\n : {};\n\n return mergeDefined<ExtractedProductData>(\n fromSelf,\n fromForm,\n fromContainer\n );\n }\n\n extractFromForm(form: HTMLFormElement | null): ExtractedProductData {\n if (!isHtmlFormElement(form)) return {};\n return this.extractFromScope(form);\n }\n\n extractFromContainer(container: Element | null): ExtractedProductData {\n if (!isBrowserElement(container)) return {};\n return this.extractFromScope(container);\n }\n\n private extractFromScope(root: Element): ExtractedProductData {\n const productId =\n readAttribute(\n root,\n this.attrsFor('productId', DEFAULT_PRODUCT_ID_ATTRS)\n ) ??\n findFieldValue(\n root,\n this.fieldsFor('productId', DEFAULT_PRODUCT_ID_FIELDS)\n );\n\n const productName =\n readAttribute(\n root,\n this.attrsFor('productName', DEFAULT_PRODUCT_NAME_ATTRS)\n ) ??\n findFieldValue(\n root,\n this.fieldsFor('productName', DEFAULT_PRODUCT_NAME_FIELDS)\n );\n\n const priceRaw =\n readAttribute(root, this.attrsFor('price', DEFAULT_PRICE_ATTRS)) ??\n findFieldValue(root, this.fieldsFor('price', DEFAULT_PRICE_FIELDS));\n\n const quantityRaw =\n readAttribute(root, this.attrsFor('quantity', DEFAULT_QUANTITY_ATTRS)) ??\n findFieldValue(root, this.fieldsFor('quantity', DEFAULT_QUANTITY_FIELDS));\n\n const currency =\n readAttribute(root, this.attrsFor('currency', DEFAULT_CURRENCY_ATTRS)) ??\n findFieldValue(root, this.fieldsFor('currency', DEFAULT_CURRENCY_FIELDS));\n\n return mergeDefined<ExtractedProductData>({\n productId: trimNonEmpty(productId),\n productName: trimNonEmpty(productName),\n price: normalizePrice(priceRaw),\n quantity: normalizeQuantity(quantityRaw),\n currency: trimNonEmpty(currency),\n });\n }\n\n private attrsFor(key: string, defaults: readonly string[]): string[] {\n return uniqueNames(this.attributeMappings[key], defaults);\n }\n\n private fieldsFor(key: string, defaults: readonly string[]): string[] {\n return uniqueNames(this.fieldMappings[key], defaults);\n }\n\n private findProductContainer(element: Element): Element | null {\n // parentElement: o próprio elemento já é coberto por fromSelf;\n // closest no pai encontra card/container ancestral (ex.: botão com data-track).\n return element.parentElement?.closest(PRODUCT_CONTAINER_SELECTOR) ?? null;\n }\n}\n","import type {\n SelectorFormConfig,\n SelectorFormMode,\n SelectorFormTrigger,\n} from '@/config/shared/form';\n\nimport {\n findFieldValue,\n isBrowserElement,\n isHtmlFormElement,\n isHtmlInputElement,\n readAttribute,\n readInputValue,\n trimNonEmpty,\n} from './extractor-utils';\n\nexport type NormalizedSelectorFormConfig = {\n fields: string[];\n mode: SelectorFormMode;\n minRequired?: number;\n formSelector?: string;\n trigger: SelectorFormTrigger;\n debounceMs?: number;\n fireOnce?: boolean;\n};\n\nexport type FormConditionEvaluateInput = {\n element?: Element | null;\n form?: HTMLFormElement | null;\n container?: Element | null;\n trigger?: SelectorFormTrigger;\n};\n\nexport type FormConditionReason =\n | 'matched'\n | 'no_config'\n | 'no_fields'\n | 'no_form'\n | 'trigger_mismatch'\n | 'missing_required_fields'\n | 'min_required_not_met';\n\nexport type FormConditionEvaluateResult = {\n matched: boolean;\n reason: FormConditionReason;\n fields: string[];\n filledFields: string[];\n missingFields: string[];\n values: Record<string, string>;\n config: NormalizedSelectorFormConfig | null;\n};\n\nconst DEFAULT_MODE: SelectorFormMode = 'all';\nconst DEFAULT_TRIGGER: SelectorFormTrigger = 'auto';\n\nconst VALID_TRIGGERS: readonly SelectorFormTrigger[] = [\n 'input',\n 'change',\n 'submit',\n 'click',\n 'auto',\n];\n\n/** Heurísticas por campo conhecido → attributes + field names. */\nconst FIELD_HEURISTICS: Record<\n string,\n { attrs: string[]; fields: string[]; type?: string; autocomplete?: string }\n> = {\n email: {\n attrs: ['data-email'],\n fields: ['email', 'customerEmail', 'customer_email', 'e-mail'],\n type: 'email',\n autocomplete: 'email',\n },\n phone: {\n attrs: ['data-phone', 'data-telefone'],\n fields: [\n 'phone',\n 'telefone',\n 'tel',\n 'customerPhone',\n 'customer_phone',\n 'celular',\n 'mobile',\n ],\n type: 'tel',\n autocomplete: 'tel',\n },\n name: {\n attrs: ['data-name', 'data-nome'],\n fields: ['name', 'nome', 'fullName', 'full_name'],\n autocomplete: 'name',\n },\n firstName: {\n attrs: ['data-first-name', 'data-firstname'],\n fields: [\n 'firstName',\n 'first_name',\n 'primeiro',\n 'primeiro_nome',\n 'given-name',\n ],\n autocomplete: 'given-name',\n },\n lastName: {\n attrs: ['data-last-name', 'data-lastname'],\n fields: ['lastName', 'last_name', 'sobrenome', 'family-name'],\n autocomplete: 'family-name',\n },\n productId: {\n attrs: [\n 'data-product-id',\n 'data-product',\n 'data-sku',\n 'data-item-id',\n 'data-id',\n ],\n fields: ['productId', 'product_id', 'product', 'sku', 'item_id', 'id'],\n },\n quantity: {\n attrs: ['data-quantity', 'data-qty'],\n fields: ['quantity', 'qty'],\n },\n};\n\n/**\n * Avalia `selectorForm` como condição de formulário.\n * Não cria listeners, não dispara eventos e não altera payloads.\n */\nexport class FormConditionEvaluator {\n private readonly normalized: NormalizedSelectorFormConfig | null;\n\n private readonly hasConfig: boolean;\n\n constructor(config?: SelectorFormConfig) {\n this.hasConfig = config !== undefined && config !== null;\n this.normalized = this.hasConfig\n ? normalizeSelectorFormConfig(config)\n : null;\n }\n\n getConfig(): NormalizedSelectorFormConfig | null {\n if (!this.normalized) return null;\n return {\n ...this.normalized,\n fields: [...this.normalized.fields],\n };\n }\n\n evaluate(\n input: FormConditionEvaluateInput = {}\n ): FormConditionEvaluateResult {\n if (!this.hasConfig || !this.normalized) {\n return this.result({\n matched: false,\n reason: 'no_config',\n fields: [],\n filledFields: [],\n missingFields: [],\n values: {},\n config: null,\n });\n }\n\n const config = this.normalized;\n\n if (config.fields.length === 0) {\n return this.result({\n matched: false,\n reason: 'no_fields',\n fields: [],\n filledFields: [],\n missingFields: [],\n values: {},\n config,\n });\n }\n\n if (!this.isTriggerCompatible(config.trigger, input.trigger)) {\n return this.result({\n matched: false,\n reason: 'trigger_mismatch',\n fields: [...config.fields],\n filledFields: [],\n missingFields: [...config.fields],\n values: {},\n config,\n });\n }\n\n const scope = this.resolveScope(input, config);\n if (scope === 'missing_form_selector') {\n return this.result({\n matched: false,\n reason: 'no_form',\n fields: [...config.fields],\n filledFields: [],\n missingFields: [...config.fields],\n values: {},\n config,\n });\n }\n\n if (!scope) {\n return this.result({\n matched: false,\n reason: 'no_form',\n fields: [...config.fields],\n filledFields: [],\n missingFields: [...config.fields],\n values: {},\n config,\n });\n }\n\n const values: Record<string, string> = {};\n const filledFields: string[] = [];\n const missingFields: string[] = [];\n\n for (const field of config.fields) {\n const value = resolveFieldValue(scope, field);\n if (value) {\n values[field] = value;\n filledFields.push(field);\n } else {\n missingFields.push(field);\n }\n }\n\n const matched = this.matchesRequirement(\n config,\n filledFields.length,\n config.fields.length\n );\n\n let reason: FormConditionReason = 'matched';\n if (!matched) {\n reason =\n config.minRequired != null\n ? 'min_required_not_met'\n : 'missing_required_fields';\n }\n\n return this.result({\n matched,\n reason,\n fields: [...config.fields],\n filledFields,\n missingFields,\n values,\n config,\n });\n }\n\n private matchesRequirement(\n config: NormalizedSelectorFormConfig,\n filledCount: number,\n total: number\n ): boolean {\n if (config.minRequired != null) {\n const required = Math.max(0, config.minRequired);\n return filledCount >= required;\n }\n\n if (config.mode === 'any') {\n return filledCount >= 1;\n }\n\n // mode: all\n return filledCount === total && total > 0;\n }\n\n private isTriggerCompatible(\n configured: SelectorFormTrigger,\n received?: SelectorFormTrigger\n ): boolean {\n if (configured === 'auto') return true;\n if (received == null) return false;\n return received === configured;\n }\n\n /**\n * Ordem de resolução do escopo:\n * 1. formSelector (se configurado) — exige elemento dentro do form\n * 2. form explícito no input\n * 3. element.form / closest('form')\n * 4. container explícito\n * 5. próprio element\n */\n private resolveScope(\n input: FormConditionEvaluateInput,\n config: NormalizedSelectorFormConfig\n ): Element | null | 'missing_form_selector' {\n const element = isBrowserElement(input.element) ? input.element : null;\n\n if (config.formSelector) {\n const found = safeQuerySelector(config.formSelector);\n if (!found) return 'missing_form_selector';\n\n if (isHtmlFormElement(input.form)) {\n if (found === input.form || found.contains(input.form)) return found;\n return null;\n }\n\n if (element) {\n if (found === element || found.contains(element)) return found;\n return null;\n }\n\n return found;\n }\n\n if (isHtmlFormElement(input.form)) {\n return input.form;\n }\n\n if (element) {\n const ownerForm = getOwnerForm(element);\n if (ownerForm) return ownerForm;\n\n const closestForm = element.closest('form');\n if (isHtmlFormElement(closestForm)) return closestForm;\n }\n\n if (isBrowserElement(input.container)) {\n return input.container;\n }\n\n if (element) return element;\n\n return null;\n }\n\n private result(\n partial: FormConditionEvaluateResult\n ): FormConditionEvaluateResult {\n return {\n ...partial,\n config: partial.config\n ? {\n ...partial.config,\n fields: [...partial.config.fields],\n }\n : null,\n fields: [...partial.fields],\n filledFields: [...partial.filledFields],\n missingFields: [...partial.missingFields],\n values: { ...partial.values },\n };\n }\n}\n\nexport function normalizeSelectorFormConfig(\n config: SelectorFormConfig | undefined | null\n): NormalizedSelectorFormConfig | null {\n if (config == null) return null;\n\n if (Array.isArray(config)) {\n const fields = sanitizeFields(config);\n return {\n fields,\n mode: DEFAULT_MODE,\n trigger: DEFAULT_TRIGGER,\n };\n }\n\n if (typeof config !== 'object') return null;\n\n const fields = sanitizeFields(config.fields ?? []);\n const mode: SelectorFormMode =\n config.mode === 'any' || config.mode === 'all' ? config.mode : DEFAULT_MODE;\n const trigger: SelectorFormTrigger = VALID_TRIGGERS.includes(\n config.trigger as SelectorFormTrigger\n )\n ? (config.trigger as SelectorFormTrigger)\n : DEFAULT_TRIGGER;\n\n const normalized: NormalizedSelectorFormConfig = {\n fields,\n mode,\n trigger,\n };\n\n if (\n typeof config.minRequired === 'number' &&\n Number.isFinite(config.minRequired)\n ) {\n normalized.minRequired = config.minRequired;\n }\n\n const formSelector = trimNonEmpty(config.formSelector);\n if (formSelector) normalized.formSelector = formSelector;\n\n if (\n typeof config.debounceMs === 'number' &&\n Number.isFinite(config.debounceMs)\n ) {\n normalized.debounceMs = config.debounceMs;\n }\n\n if (typeof config.fireOnce === 'boolean') {\n normalized.fireOnce = config.fireOnce;\n }\n\n return normalized;\n}\n\nfunction sanitizeFields(fields: readonly string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const field of fields) {\n const trimmed = typeof field === 'string' ? field.trim() : '';\n if (!trimmed || seen.has(trimmed)) continue;\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n\nfunction getOwnerForm(element: Element): HTMLFormElement | null {\n if (\n isHtmlInputElement(element) ||\n element instanceof HTMLButtonElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const form = element.form;\n return isHtmlFormElement(form) ? form : null;\n }\n return null;\n}\n\nfunction safeQuerySelector(selector: string): Element | null {\n if (typeof document === 'undefined') return null;\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n}\n\nfunction resolveFieldValue(scope: Element, field: string): string | undefined {\n const key = field.trim();\n if (!key) return undefined;\n\n const heuristic = FIELD_HEURISTICS[key];\n\n if (heuristic?.type) {\n const typed = readTypedInput(scope, heuristic.type);\n if (typed) return typed;\n }\n\n if (heuristic?.autocomplete) {\n const auto = readAutocomplete(scope, heuristic.autocomplete);\n if (auto) return auto;\n }\n\n if (heuristic) {\n const fromAttr = readAttribute(scope, heuristic.attrs);\n if (fromAttr) return fromAttr;\n\n const fromFields = findFieldValue(scope, heuristic.fields);\n if (fromFields) return fromFields;\n }\n\n // Campo customizado / fallback genérico\n const kebab = toKebabCase(key);\n const fromCustomAttr = readAttribute(scope, [`data-${kebab}`, `data-${key}`]);\n if (fromCustomAttr) return fromCustomAttr;\n\n return findFieldValue(scope, [key, kebab]);\n}\n\nfunction readTypedInput(root: Element, type: string): string | undefined {\n const selector = `input[type=\"${type}\"]`;\n try {\n const input = root.matches(selector) ? root : root.querySelector(selector);\n return input ? readInputValue(input) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readAutocomplete(\n root: Element,\n autocomplete: string\n): string | undefined {\n const selector = `input[autocomplete=\"${autocomplete}\"]`;\n try {\n const input = root.matches(selector) ? root : root.querySelector(selector);\n return input ? readInputValue(input) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n","import type { CommerceProduct } from '@/config/shared/commerce';\n\nexport type ProductCatalogOptions = {\n readonly defaultCurrency?: string;\n};\n\nexport type ProductCatalogSnapshot = {\n readonly products: CommerceProduct[];\n readonly count: number;\n};\n\n/**\n * Catálogo de produtos configurados em `config.commerce.catalog`.\n * Isolado por instância — sem estado global / module-level.\n * Não acessa DOM, Transport nem altera payloads de eventos.\n */\nexport class ProductCatalog {\n private readonly productsById = new Map<string, CommerceProduct>();\n\n private readonly productsBySku = new Map<string, CommerceProduct>();\n\n private readonly orderedIds: string[] = [];\n\n constructor(\n products: readonly CommerceProduct[] | undefined = [],\n options: ProductCatalogOptions = {}\n ) {\n this.indexProducts(products ?? [], options.defaultCurrency);\n }\n\n list(): CommerceProduct[] {\n return this.orderedIds.map(id =>\n this.cloneProduct(this.productsById.get(id)!)\n );\n }\n\n getById(id: string): CommerceProduct | null {\n if (!id) return null;\n const product = this.productsById.get(id);\n return product ? this.cloneProduct(product) : null;\n }\n\n getBySku(sku: string): CommerceProduct | null {\n if (!sku) return null;\n const product = this.productsBySku.get(sku);\n return product ? this.cloneProduct(product) : null;\n }\n\n hasProduct(id: string): boolean {\n return Boolean(id) && this.productsById.has(id);\n }\n\n getSnapshot(): ProductCatalogSnapshot {\n const products = this.list();\n return { products, count: products.length };\n }\n\n private indexProducts(\n products: readonly CommerceProduct[],\n defaultCurrency?: string\n ): void {\n for (const raw of products) {\n if (!raw || typeof raw !== 'object') continue;\n\n const id = typeof raw.id === 'string' ? raw.id.trim() : '';\n if (!id) continue;\n\n // Duplicado por id: mantém o primeiro (determinístico).\n if (this.productsById.has(id)) continue;\n\n const product = this.normalizeProduct(raw, id, defaultCurrency);\n this.productsById.set(id, product);\n this.orderedIds.push(id);\n\n const sku = typeof product.sku === 'string' ? product.sku.trim() : '';\n if (sku && !this.productsBySku.has(sku)) {\n this.productsBySku.set(sku, product);\n }\n }\n }\n\n private normalizeProduct(\n raw: CommerceProduct,\n id: string,\n defaultCurrency?: string\n ): CommerceProduct {\n const sku =\n typeof raw.sku === 'string' && raw.sku.trim()\n ? raw.sku.trim()\n : undefined;\n\n const currency =\n typeof raw.currency === 'string' && raw.currency.trim()\n ? raw.currency.trim()\n : defaultCurrency;\n\n const quantity =\n typeof raw.quantity === 'number' && Number.isFinite(raw.quantity)\n ? raw.quantity\n : undefined;\n\n return {\n ...raw,\n id,\n ...(sku !== undefined ? { sku } : {}),\n ...(currency !== undefined ? { currency } : {}),\n ...(quantity !== undefined ? { quantity } : {}),\n ...(raw.metadata ? { metadata: { ...raw.metadata } } : {}),\n };\n }\n\n private cloneProduct(product: CommerceProduct): CommerceProduct {\n return {\n ...product,\n ...(product.metadata ? { metadata: { ...product.metadata } } : {}),\n };\n }\n}\n","import type { CommerceCartItem } from '@/config/shared/commerce';\n\nexport type CommerceStateOptions = {\n /**\n * Quando `false`, `upsertItem` só atualiza itens já presentes\n * (não adiciona novos productIds). Default: `true`.\n */\n readonly allowDynamicItems?: boolean;\n};\n\nexport type CommerceStateSnapshot = {\n /**\n * Estado vivo do carrinho (runtime).\n * Não confundir com `commerce.cart.initialItems` da config.\n */\n readonly selectedItems: CommerceCartItem[];\n readonly count: number;\n};\n\n/**\n * Estado em memória do cart da instância.\n * Inicializado com `config.commerce.cart.initialItems`.\n * Não persiste, não acessa DOM/Transport e não dispara eventos.\n */\nexport class CommerceState {\n private readonly itemsByProductId = new Map<string, CommerceCartItem>();\n\n private readonly allowDynamicItems: boolean;\n\n constructor(\n initialItems: readonly CommerceCartItem[] | undefined = [],\n options: CommerceStateOptions = {}\n ) {\n this.allowDynamicItems = options.allowDynamicItems !== false;\n this.seed(initialItems ?? []);\n }\n\n getSelectedItems(): CommerceCartItem[] {\n return Array.from(this.itemsByProductId.values()).map(item =>\n this.cloneItem(item)\n );\n }\n\n hasItem(productId: string): boolean {\n return Boolean(productId) && this.itemsByProductId.has(productId);\n }\n\n getItem(productId: string): CommerceCartItem | null {\n if (!productId) return null;\n const item = this.itemsByProductId.get(productId);\n return item ? this.cloneItem(item) : null;\n }\n\n /**\n * Insere ou atualiza item.\n * - Sem `productId` → no-op\n * - `selected === false` → remove se existir / não adiciona\n * - `quantity <= 0` → remove\n * - `allowDynamicItems === false` e item novo → no-op\n */\n upsertItem(item: CommerceCartItem): void {\n if (!item || typeof item !== 'object') return;\n\n const productId =\n typeof item.productId === 'string' ? item.productId.trim() : '';\n if (!productId) return;\n\n if (item.selected === false) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const quantity = this.normalizeQuantity(item.quantity);\n if (quantity <= 0) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const exists = this.itemsByProductId.has(productId);\n if (!exists && !this.allowDynamicItems) return;\n\n const previous = this.itemsByProductId.get(productId);\n const metadata = item.metadata\n ? { ...item.metadata }\n : previous?.metadata\n ? { ...previous.metadata }\n : undefined;\n\n const next: CommerceCartItem = {\n ...previous,\n ...item,\n productId,\n quantity,\n selected: true,\n ...(metadata ? { metadata } : {}),\n };\n\n this.itemsByProductId.set(productId, next);\n }\n\n removeItem(productId: string): void {\n if (!productId) return;\n this.itemsByProductId.delete(productId);\n }\n\n /**\n * Atualiza quantidade. `quantity <= 0` remove o item.\n */\n updateQuantity(productId: string, quantity: number): void {\n if (!productId || !this.itemsByProductId.has(productId)) return;\n\n const normalized = this.normalizeQuantity(quantity);\n if (normalized <= 0) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const current = this.itemsByProductId.get(productId)!;\n this.itemsByProductId.set(productId, {\n ...current,\n quantity: normalized,\n });\n }\n\n clear(): void {\n this.itemsByProductId.clear();\n }\n\n getSnapshot(): CommerceStateSnapshot {\n const selectedItems = this.getSelectedItems();\n return { selectedItems, count: selectedItems.length };\n }\n\n private seed(initialItems: readonly CommerceCartItem[]): void {\n for (const item of initialItems) {\n // Seed ignora allowDynamicItems — itens da config sempre entram\n // (exceto selected:false / inválidos / quantity<=0).\n this.seedItem(item);\n }\n }\n\n private seedItem(item: CommerceCartItem): void {\n if (!item || typeof item !== 'object') return;\n\n const productId =\n typeof item.productId === 'string' ? item.productId.trim() : '';\n if (!productId) return;\n if (item.selected === false) return;\n\n const quantity = this.normalizeQuantity(item.quantity);\n if (quantity <= 0) return;\n\n // Duplicado por productId no seed: mantém o primeiro.\n if (this.itemsByProductId.has(productId)) return;\n\n this.itemsByProductId.set(productId, {\n ...item,\n productId,\n quantity,\n selected: true,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n });\n }\n\n private normalizeQuantity(quantity: number | undefined): number {\n if (quantity === undefined || quantity === null) return 1;\n if (typeof quantity !== 'number' || !Number.isFinite(quantity)) return 1;\n return quantity;\n }\n\n private cloneItem(item: CommerceCartItem): CommerceCartItem {\n return {\n ...item,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n };\n }\n}\n","/**\n * Calcula value/currency a partir de items resolvidos.\n * Não conhece DOM, detectors, Transport nem Dispatcher.\n * Não muta o input.\n */\n\nexport type ResolvedCommerceItem = {\n productId?: string;\n sku?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n brand?: string;\n type?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type OrderCalculationInput = {\n items?: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n defaultCurrency?: string;\n};\n\nexport type OrderCalculationResult = {\n items: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n};\n\nexport class OrderCalculator {\n calculate(input: OrderCalculationInput): OrderCalculationResult {\n const sourceItems = Array.isArray(input.items) ? input.items : [];\n const items = sourceItems.map(item => this.cloneItem(item));\n\n for (const item of items) {\n if (item.quantity == null || !Number.isFinite(item.quantity)) {\n item.quantity = 1;\n }\n }\n\n const value =\n typeof input.value === 'number' && Number.isFinite(input.value)\n ? input.value\n : this.sumValue(items);\n\n const currency = this.resolveCurrency(input, items);\n\n return {\n items,\n ...(value !== undefined ? { value } : {}),\n ...(currency !== undefined ? { currency } : {}),\n };\n }\n\n private sumValue(items: ResolvedCommerceItem[]): number | undefined {\n let total = 0;\n let hasPriced = false;\n\n for (const item of items) {\n if (typeof item.price !== 'number' || !Number.isFinite(item.price)) {\n continue;\n }\n const qty =\n typeof item.quantity === 'number' && Number.isFinite(item.quantity)\n ? item.quantity\n : 1;\n total += item.price * qty;\n hasPriced = true;\n }\n\n return hasPriced ? total : undefined;\n }\n\n /**\n * Ordem: currency manual → primeiro item com currency → defaultCurrency.\n * Multi-currency: determinístico — usa o primeiro item com currency\n * (não normaliza conversão entre moedas nesta etapa).\n */\n private resolveCurrency(\n input: OrderCalculationInput,\n items: ResolvedCommerceItem[]\n ): string | undefined {\n if (typeof input.currency === 'string' && input.currency.trim()) {\n return input.currency.trim();\n }\n\n for (const item of items) {\n if (typeof item.currency === 'string' && item.currency.trim()) {\n return item.currency.trim();\n }\n }\n\n if (\n typeof input.defaultCurrency === 'string' &&\n input.defaultCurrency.trim()\n ) {\n return input.defaultCurrency.trim();\n }\n\n return undefined;\n }\n\n private cloneItem(item: ResolvedCommerceItem): ResolvedCommerceItem {\n return {\n ...item,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n };\n }\n}\n","/**\n * Contratos globais de commerce (root `PixelConfig.commerce`).\n * Não pertencem a conversion — representam o contexto comercial da página/fluxo.\n */\n\nexport type ProductType =\n | 'main'\n | 'order_bump'\n | 'upsell'\n | 'downsell'\n | 'cross_sell'\n | 'addon'\n | 'subscription'\n | 'custom'\n | 'other';\n\nexport type CommerceProduct = {\n id: string;\n name?: string;\n sku?: string;\n type?: ProductType;\n price?: number;\n currency?: string;\n quantity?: number;\n category?: string;\n variant?: string;\n brand?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceCartItem = {\n productId: string;\n quantity?: number;\n price?: number;\n currency?: string;\n selected?: boolean;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceCartMode =\n | 'landing_page'\n | 'single_product'\n | 'multi_product'\n | 'checkout'\n | 'upsell'\n | 'custom'\n | 'cart'\n | 'funnel';\n\nexport type CommerceCalculateValueFrom =\n | 'cart'\n | 'event'\n | 'manual'\n | 'catalog';\n\nexport type CommerceEnrichmentSource =\n | 'cart'\n | 'event'\n | 'event_or_cart'\n | 'catalog';\n\nexport type CommerceEventEnrichmentConfig = {\n enabled: boolean;\n source?: CommerceEnrichmentSource;\n};\n\nexport type CommerceEnrichmentConfig = {\n pageView?: CommerceEventEnrichmentConfig;\n viewContent?: CommerceEventEnrichmentConfig;\n lead?: CommerceEventEnrichmentConfig;\n addToCart?: CommerceEventEnrichmentConfig;\n removeFromCart?: CommerceEventEnrichmentConfig;\n initiateCheckout?: CommerceEventEnrichmentConfig;\n addPaymentInfo?: CommerceEventEnrichmentConfig;\n purchase?: CommerceEventEnrichmentConfig;\n};\n\nexport type ProductCatalogConfig = {\n products?: CommerceProduct[];\n};\n\nexport type CommerceCartConfig = {\n mode?: CommerceCartMode;\n /** Seed inicial do carrinho — não é estado vivo. */\n initialItems?: CommerceCartItem[];\n allowDynamicItems?: boolean;\n calculateValueFrom?: CommerceCalculateValueFrom;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceMappingsConfig = {\n attributes?: Record<string, string[]>;\n fields?: Record<string, string[]>;\n};\n\nexport type CommerceConfig = {\n enabled?: boolean;\n currency?: string;\n catalog?: ProductCatalogConfig;\n cart?: CommerceCartConfig;\n mappings?: CommerceMappingsConfig;\n enrichment?: CommerceEnrichmentConfig;\n};\n\nexport const DEFAULT_COMMERCE_ENRICHMENT: Required<CommerceEnrichmentConfig> = {\n pageView: { enabled: false, source: 'cart' },\n viewContent: { enabled: true, source: 'event_or_cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n removeFromCart: { enabled: true, source: 'event_or_cart' },\n initiateCheckout: { enabled: true, source: 'cart' },\n addPaymentInfo: { enabled: true, source: 'cart' },\n purchase: { enabled: true, source: 'cart' },\n};\n\n/** Default seguro: commerce off, sem produtos, sem itens. */\nexport const DEFAULT_COMMERCE_CONFIG: CommerceConfig = {\n enabled: false,\n currency: 'BRL',\n catalog: {\n products: [],\n },\n cart: {\n mode: 'custom',\n initialItems: [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: {},\n fields: {},\n },\n enrichment: { ...DEFAULT_COMMERCE_ENRICHMENT },\n};\n\n/** Normaliza calculateValueFrom (inclui aliases legado em runtime). */\nexport function normalizeCalculateValueFrom(\n value: CommerceCalculateValueFrom | string | undefined\n): 'cart' | 'event' | 'manual' | 'catalog' {\n switch (value) {\n case 'event':\n case 'event_items':\n return 'event';\n case 'manual':\n return 'manual';\n case 'catalog':\n return 'catalog';\n case 'cart':\n case 'selected_items':\n default:\n return 'cart';\n }\n}\n","import type { CommerceCalculateValueFrom } from '@/config/shared/commerce';\nimport { normalizeCalculateValueFrom } from '@/config/shared/commerce';\nimport type { PixelItem } from '@/events/conversion';\n\nimport type { CommerceState } from './CommerceState';\nimport type { ProductCatalog } from './ProductCatalog';\nimport type { OrderCalculator, ResolvedCommerceItem } from './OrderCalculator';\n\nexport type CommerceEventType =\n | 'ADD_TO_CART'\n | 'REMOVE_FROM_CART'\n | 'INITIATE_CHECKOUT'\n | 'PURCHASE'\n | 'VIEW_CONTENT'\n | 'ADD_PAYMENT_INFO';\n\nexport type ExtractedProductInput = {\n productId?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n sku?: string;\n};\n\nexport type CommerceResolverInput = {\n eventType: CommerceEventType;\n payload?: Record<string, unknown>;\n extractedProduct?: ExtractedProductInput;\n enrichmentSource?: import('@/config/shared/commerce').CommerceEnrichmentSource;\n items?: Array<{\n productId?: string;\n id?: string;\n sku?: string;\n name?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n }>;\n};\n\nexport type CommerceResolverResult = {\n data: Record<string, unknown>;\n items?: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n};\n\nexport type CommerceResolverOptions = {\n catalog: ProductCatalog;\n state: CommerceState;\n calculator: OrderCalculator;\n defaultCurrency?: string;\n calculateValueFrom?: CommerceCalculateValueFrom;\n};\n\n/**\n * Combina payload + extracted + state + catalog + defaults.\n * Não dispara eventos, não escreve em CommerceState, não conhece DOM/Transport.\n *\n * Prioridade de merge por campo:\n * manual payload > extractedProduct > commerce state > catalog > defaults\n */\nexport class CommerceResolver {\n private readonly catalog: ProductCatalog;\n\n private readonly state: CommerceState;\n\n private readonly calculator: OrderCalculator;\n\n private readonly defaultCurrency?: string;\n\n private readonly calculateValueFrom: ReturnType<\n typeof normalizeCalculateValueFrom\n >;\n\n constructor(options: CommerceResolverOptions) {\n this.catalog = options.catalog;\n this.state = options.state;\n this.calculator = options.calculator;\n this.defaultCurrency = trim(options.defaultCurrency);\n this.calculateValueFrom = normalizeCalculateValueFrom(\n options.calculateValueFrom\n );\n }\n\n resolve(input: CommerceResolverInput): CommerceResolverResult {\n const source = input.enrichmentSource;\n\n // source: 'event' — não completa via cart/catalog\n if (source === 'event') {\n return { data: { ...(input.payload ?? {}) } };\n }\n\n switch (input.eventType) {\n case 'ADD_TO_CART':\n return this.resolveAddToCart(input);\n case 'REMOVE_FROM_CART':\n return this.resolveRemoveFromCart(input);\n case 'INITIATE_CHECKOUT':\n return this.resolveCheckoutLike(input, false);\n case 'PURCHASE':\n return this.resolveCheckoutLike(input, true);\n case 'VIEW_CONTENT':\n return this.resolveViewContent(input);\n case 'ADD_PAYMENT_INFO':\n return this.resolveCheckoutLike(input, false);\n default:\n return { data: { ...(input.payload ?? {}) } };\n }\n }\n\n private resolveAddToCart(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = input.payload ?? {};\n const extracted = input.extractedProduct ?? {};\n const source = input.enrichmentSource ?? 'event_or_cart';\n const useCart = source === 'cart' || source === 'event_or_cart';\n const useCatalog =\n source === 'catalog' || source === 'cart' || source === 'event_or_cart';\n\n let productId =\n asString(payload.priceId) ??\n asString(payload.productId) ??\n asString(extracted.productId) ??\n (useCatalog\n ? this.lookupIdBySku(asString(payload.sku) ?? asString(extracted.sku))\n : undefined);\n\n // Fallback: sem productId/sku no evento → item principal do cart\n const cartFallback =\n !productId && useCart ? this.resolvePrimaryCartItem() : null;\n if (!productId && cartFallback) {\n productId = cartFallback.productId;\n }\n\n const catalogProduct =\n useCatalog && productId\n ? this.catalog.getById(productId)\n : useCatalog\n ? this.lookupProductBySku(\n asString(payload.sku) ?? asString(extracted.sku)\n )\n : null;\n\n const resolvedId = productId ?? catalogProduct?.id;\n const stateItem =\n useCart && resolvedId\n ? (this.state.getItem(resolvedId) ?? cartFallback)\n : null;\n\n // source: 'catalog' sem productId/sku → não injeta cart\n if (source === 'catalog' && !resolvedId && !catalogProduct) {\n return { data: { ...payload } };\n }\n\n const productName =\n asString(payload.productName) ??\n asString(extracted.productName) ??\n catalogProduct?.name;\n\n const price =\n asNumber(payload.price) ??\n asNumber(extracted.price) ??\n (useCart ? asNumber(stateItem?.price) : undefined) ??\n catalogProduct?.price;\n\n const quantity =\n asNumber(payload.quantity) ??\n asNumber(extracted.quantity) ??\n (useCart ? asNumber(stateItem?.quantity) : undefined) ??\n catalogProduct?.quantity ??\n 1;\n\n const currency =\n asString(payload.currency) ??\n asString(extracted.currency) ??\n (useCart ? asString(stateItem?.currency) : undefined) ??\n catalogProduct?.currency ??\n this.defaultCurrency;\n\n const identity = resolveCatalogItemIdentity(catalogProduct, {\n priceId: asString(payload.priceId),\n productId: resolvedId,\n offerId: asString(payload.offerId),\n id: asString(payload.id),\n });\n\n const data: Record<string, unknown> = {};\n if (identity.id) data.id = identity.id;\n if (identity.priceId) data.priceId = identity.priceId;\n if (identity.productId) data.productId = identity.productId;\n if (identity.offerId) data.offerId = identity.offerId;\n if (productName) data.productName = productName;\n if (price !== undefined) data.price = price;\n if (currency) data.currency = currency;\n if (quantity !== undefined) data.quantity = quantity;\n\n // Preserva campos extras do payload (sem sobrescrever resolvidos).\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) continue;\n if (!(key in data)) data[key] = value;\n }\n\n return { data };\n }\n\n /**\n * Escolhe o item principal do cart runtime:\n * 1. único item → esse\n * 2. múltiplos → preferir catalog.type === 'main'\n * 3. senão → primeiro do cart\n * 4. cart vazio → null\n */\n private resolvePrimaryCartItem(): {\n productId: string;\n quantity?: number;\n price?: number;\n currency?: string;\n } | null {\n const items = this.state.getSelectedItems();\n if (items.length === 0) return null;\n if (items.length === 1) return items[0] ?? null;\n\n const main = items.find(item => {\n const product = this.catalog.getById(item.productId);\n return product?.type === 'main';\n });\n return main ?? items[0] ?? null;\n }\n\n private resolveRemoveFromCart(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = input.payload ?? {};\n const extracted = input.extractedProduct ?? {};\n\n const productId =\n asString(payload.productId) ??\n asString(extracted.productId) ??\n this.lookupIdBySku(asString(payload.sku) ?? asString(extracted.sku));\n\n const catalogProduct = productId ? this.catalog.getById(productId) : null;\n\n const resolvedId = productId ?? catalogProduct?.id;\n const stateItem = resolvedId ? this.state.getItem(resolvedId) : null;\n\n const quantity =\n asNumber(payload.quantity) ??\n asNumber(extracted.quantity) ??\n asNumber(stateItem?.quantity) ??\n 1;\n\n const data: Record<string, unknown> = {};\n if (resolvedId) data.productId = resolvedId;\n if (quantity !== undefined) data.quantity = quantity;\n\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) continue;\n if (!(key in data)) data[key] = value;\n }\n\n return { data };\n }\n\n private resolveCheckoutLike(\n input: CommerceResolverInput,\n isPurchase: boolean\n ): CommerceResolverResult {\n const payload = { ...(input.payload ?? {}) };\n const manualValue = asNumber(payload.value);\n const manualCurrency = asString(payload.currency);\n const manualItems = this.readPayloadItems(input);\n const source = input.enrichmentSource;\n\n const resolvedItems = this.resolveItemsSource(manualItems, source);\n const pixelItems = resolvedItems.map(item => this.toPixelItem(item));\n\n const allowCalculatedValue =\n source !== 'catalog' && this.calculateValueFrom !== 'manual';\n\n const shouldCalculateValue =\n manualValue === undefined && allowCalculatedValue;\n\n const calc = this.calculator.calculate({\n items: resolvedItems,\n value: shouldCalculateValue ? undefined : manualValue,\n currency: manualCurrency,\n defaultCurrency: this.defaultCurrency,\n });\n\n const value =\n manualValue !== undefined\n ? manualValue\n : allowCalculatedValue\n ? calc.value\n : undefined;\n\n const currency = manualCurrency ?? calc.currency ?? this.defaultCurrency;\n\n const data: Record<string, unknown> = { ...payload };\n\n if (pixelItems.length > 0) {\n data.items = pixelItems;\n } else if (manualItems === null) {\n delete data.items;\n }\n\n if (value !== undefined) {\n data.value = value;\n } else {\n delete data.value;\n }\n\n if (currency) {\n data.currency = currency;\n }\n\n if (isPurchase) {\n // orderId e demais campos do payload já estão em data via spread.\n }\n\n return {\n data,\n items: calc.items,\n ...(value !== undefined ? { value } : {}),\n ...(currency ? { currency } : {}),\n };\n }\n\n private resolveViewContent(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = { ...(input.payload ?? {}) };\n const source = input.enrichmentSource ?? 'event_or_cart';\n\n // Tenta completar productId/name/price a partir de payload + cart/catalog\n if (source === 'cart' || source === 'event_or_cart') {\n const atc = this.resolveAddToCart({\n ...input,\n eventType: 'ADD_TO_CART',\n enrichmentSource: source,\n });\n\n const checkout = this.resolveCheckoutLike(\n { ...input, eventType: 'INITIATE_CHECKOUT', enrichmentSource: source },\n false\n );\n\n const data: Record<string, unknown> = { ...payload };\n\n const contentId =\n asString(payload.contentId) ??\n asString(atc.data.productId as string | undefined) ??\n (Array.isArray(checkout.data.items) &&\n checkout.data.items[0] &&\n typeof (checkout.data.items[0] as { id?: unknown }).id === 'string'\n ? (checkout.data.items[0] as { id: string }).id\n : undefined);\n\n const contentName =\n asString(payload.contentName) ??\n asString(atc.data.productName as string | undefined) ??\n (Array.isArray(checkout.data.items) &&\n checkout.data.items[0] &&\n typeof (checkout.data.items[0] as { name?: unknown }).name === 'string'\n ? (checkout.data.items[0] as { name: string }).name\n : undefined);\n\n if (contentId) data.contentId = contentId;\n if (contentName) data.contentName = contentName;\n\n if (\n asNumber(payload.value) === undefined &&\n checkout.value !== undefined\n ) {\n data.value = checkout.value;\n }\n if (!asString(payload.currency) && checkout.currency) {\n data.currency = checkout.currency;\n }\n if (payload.items === undefined && Array.isArray(checkout.data.items)) {\n data.items = checkout.data.items;\n }\n\n return {\n data,\n ...(checkout.value !== undefined ? { value: checkout.value } : {}),\n ...(checkout.currency ? { currency: checkout.currency } : {}),\n items: checkout.items,\n };\n }\n\n if (source === 'catalog') {\n const atc = this.resolveAddToCart({\n ...input,\n eventType: 'ADD_TO_CART',\n enrichmentSource: 'catalog',\n });\n const data: Record<string, unknown> = { ...payload };\n if (atc.data.productId && !asString(payload.contentId)) {\n data.contentId = atc.data.productId;\n }\n if (atc.data.productName && !asString(payload.contentName)) {\n data.contentName = atc.data.productName;\n }\n if (\n atc.data.price !== undefined &&\n asNumber(payload.value) === undefined\n ) {\n data.value = atc.data.price;\n }\n if (atc.data.currency && !asString(payload.currency)) {\n data.currency = atc.data.currency;\n }\n return { data };\n }\n\n return { data: payload };\n }\n\n /**\n * null = payload não trouxe items (usar state conforme calculateValueFrom)\n * [] = payload trouxe items vazios\n */\n private readPayloadItems(\n input: CommerceResolverInput\n ): ResolvedCommerceItem[] | null {\n if (input.items) {\n return input.items.map(item => this.normalizeLooseItem(item));\n }\n\n const raw = input.payload?.items;\n if (raw === undefined) return null;\n if (!Array.isArray(raw)) return null;\n return raw.map(item =>\n this.normalizeLooseItem(\n (item && typeof item === 'object' ? item : {}) as Record<\n string,\n unknown\n >\n )\n );\n }\n\n private resolveItemsSource(\n manualItems: ResolvedCommerceItem[] | null,\n enrichmentSource?: import('@/config/shared/commerce').CommerceEnrichmentSource\n ): ResolvedCommerceItem[] {\n // Items manuais sempre vencem state.\n if (manualItems !== null) {\n return manualItems.map(item => this.enrichItem(item));\n }\n\n // source: 'catalog' — não injeta cart inteiro\n if (enrichmentSource === 'catalog') {\n return [];\n }\n\n // source: 'cart' força fallback do carrinho (independente de calculateValueFrom),\n // exceto quando calculateValueFrom === 'manual' (value/items só do payload).\n if (\n enrichmentSource === 'cart' &&\n this.calculateValueFrom !== 'manual' &&\n this.calculateValueFrom !== 'event'\n ) {\n return this.state.getSelectedItems().map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n\n if (this.calculateValueFrom === 'cart') {\n return this.state.getSelectedItems().map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n\n if (this.calculateValueFrom === 'catalog') {\n const fromState = this.state.getSelectedItems();\n if (fromState.length > 0) {\n return fromState.map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n return this.catalog.list().map(product =>\n this.enrichItem({\n productId: product.id,\n price: product.price,\n quantity: product.quantity ?? 1,\n currency: product.currency,\n productName: product.name,\n sku: product.sku,\n category: product.category,\n })\n );\n }\n\n // event / manual sem items no payload → sem items\n return [];\n }\n\n private enrichItem(item: ResolvedCommerceItem): ResolvedCommerceItem {\n const productId =\n item.productId ?? this.lookupIdBySku(item.sku) ?? undefined;\n const catalog = productId\n ? this.catalog.getById(productId)\n : this.lookupProductBySku(item.sku);\n\n const resolvedId = productId ?? catalog?.id;\n\n return {\n ...item,\n ...(resolvedId ? { productId: resolvedId } : {}),\n productName: item.productName ?? catalog?.name,\n sku: item.sku ?? catalog?.sku,\n price: item.price ?? catalog?.price,\n quantity: item.quantity ?? catalog?.quantity ?? 1,\n currency: item.currency ?? catalog?.currency ?? this.defaultCurrency,\n category: item.category ?? catalog?.category,\n variant: item.variant ?? catalog?.variant,\n brand: item.brand ?? catalog?.brand,\n type: item.type ?? catalog?.type,\n metadata: item.metadata ?? catalog?.metadata,\n };\n }\n\n private toPixelItem(item: ResolvedCommerceItem): PixelItem {\n const pixel: PixelItem = {\n ...(item.productId ? { id: item.productId } : {}),\n ...(item.productName ? { name: item.productName } : {}),\n ...(item.category ? { category: item.category } : {}),\n ...(item.price !== undefined ? { price: item.price } : {}),\n ...(item.quantity !== undefined ? { quantity: item.quantity } : {}),\n };\n return pixel;\n }\n\n private normalizeLooseItem(\n item:\n | Record<string, unknown>\n | {\n productId?: string;\n id?: string;\n sku?: string;\n name?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n }\n ): ResolvedCommerceItem {\n return {\n productId:\n asString((item as { productId?: unknown }).productId) ??\n asString((item as { id?: unknown }).id),\n sku: asString((item as { sku?: unknown }).sku),\n productName:\n asString((item as { productName?: unknown }).productName) ??\n asString((item as { name?: unknown }).name),\n price: asNumber((item as { price?: unknown }).price),\n quantity: asNumber((item as { quantity?: unknown }).quantity),\n currency: asString((item as { currency?: unknown }).currency),\n category: asString((item as { category?: unknown }).category),\n };\n }\n\n private lookupIdBySku(sku: string | undefined): string | undefined {\n if (!sku) return undefined;\n return this.catalog.getBySku(sku)?.id;\n }\n\n private lookupProductBySku(sku: string | undefined) {\n if (!sku) return null;\n return this.catalog.getBySku(sku);\n }\n}\n\nfunction resolveCatalogItemIdentity(\n catalogProduct: import('@/config/shared/commerce').CommerceProduct | null,\n incoming: {\n id?: string;\n priceId?: string;\n productId?: string;\n offerId?: string;\n }\n): {\n id?: string;\n priceId?: string;\n productId?: string;\n offerId?: string;\n} {\n const meta = catalogProduct?.metadata ?? {};\n const metaPriceId = asString(meta.priceId);\n const metaProductId = asString(meta.productId);\n const metaOfferId = asString(meta.offerId);\n\n // Identidade Bemony (id/priceId/offerId) só quando priceId explícito ou metadata.\n // Catálogo genérico do Core continua só com productId.\n const priceId = incoming.priceId ?? metaPriceId;\n if (!priceId) {\n const productId = incoming.productId ?? catalogProduct?.id;\n return {\n ...(incoming.id ? { id: incoming.id } : {}),\n ...(productId ? { productId } : {}),\n ...(incoming.offerId ? { offerId: incoming.offerId } : {}),\n };\n }\n\n return {\n id: incoming.id ?? priceId,\n priceId,\n productId: metaProductId ?? incoming.productId ?? priceId,\n offerId: metaOfferId ?? incoming.offerId ?? priceId,\n };\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value)) return undefined;\n return value;\n}\n\nfunction trim(value: string | undefined): string | undefined {\n if (typeof value !== 'string') return undefined;\n const t = value.trim();\n return t.length > 0 ? t : undefined;\n}\n","import type {\n CommerceConfig,\n CommerceEnrichmentSource,\n CommerceEventEnrichmentConfig,\n} from '@/config/shared/commerce';\nimport {\n DEFAULT_COMMERCE_CONFIG,\n DEFAULT_COMMERCE_ENRICHMENT,\n normalizeCalculateValueFrom,\n} from '@/config/shared/commerce';\nimport type { PixelItem } from '@/events/conversion';\n\nimport { CommerceResolver } from './CommerceResolver';\nimport { CommerceState } from './CommerceState';\nimport { OrderCalculator } from './OrderCalculator';\nimport { ProductCatalog } from './ProductCatalog';\n\nexport type CommerceEnrichmentEvent =\n | 'pageView'\n | 'viewContent'\n | 'lead'\n | 'addToCart'\n | 'removeFromCart'\n | 'initiateCheckout'\n | 'addPaymentInfo'\n | 'purchase';\n\nexport type PageViewCommercePayload = {\n readonly value?: number;\n readonly currency?: string;\n readonly items?: PixelItem[];\n readonly contentId?: string;\n readonly contentName?: string;\n};\n\n/**\n * Serviço compartilhado de commerce (root config).\n * Usado por Core (PAGE_VIEW) e Conversion sem dependência circular\n * entre os módulos.\n */\nexport class CommerceService {\n readonly enabled: boolean;\n\n readonly config: CommerceConfig;\n\n readonly catalog: ProductCatalog;\n\n readonly state: CommerceState;\n\n private readonly resolver: CommerceResolver;\n\n constructor(config: CommerceConfig | undefined) {\n this.config = {\n ...DEFAULT_COMMERCE_CONFIG,\n ...config,\n catalog: {\n products: config?.catalog?.products ?? [],\n },\n cart: {\n ...DEFAULT_COMMERCE_CONFIG.cart,\n ...config?.cart,\n initialItems: config?.cart?.initialItems\n ? config.cart.initialItems.map(item => ({ ...item }))\n : [],\n },\n mappings: {\n attributes: { ...(config?.mappings?.attributes ?? {}) },\n fields: { ...(config?.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...DEFAULT_COMMERCE_ENRICHMENT,\n ...config?.enrichment,\n },\n };\n\n this.enabled = this.config.enabled === true;\n\n this.catalog = new ProductCatalog(this.config.catalog?.products, {\n defaultCurrency: this.config.currency,\n });\n\n this.state = new CommerceState(this.config.cart?.initialItems, {\n allowDynamicItems: this.config.cart?.allowDynamicItems !== false,\n });\n\n this.resolver = new CommerceResolver({\n catalog: this.catalog,\n state: this.state,\n calculator: new OrderCalculator(),\n defaultCurrency: this.config.currency,\n calculateValueFrom: normalizeCalculateValueFrom(\n this.config.cart?.calculateValueFrom\n ),\n });\n }\n\n getEnrichment(event: CommerceEnrichmentEvent): CommerceEventEnrichmentConfig {\n const fromConfig = this.config.enrichment?.[event];\n const fallback = DEFAULT_COMMERCE_ENRICHMENT[event];\n return {\n enabled: fromConfig?.enabled ?? fallback.enabled,\n source: fromConfig?.source ?? fallback.source,\n };\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n isEnrichmentEnabled(event: CommerceEnrichmentEvent): boolean {\n return this.enabled && this.getEnrichment(event).enabled === true;\n }\n\n getEnrichmentSource(\n event: CommerceEnrichmentEvent\n ): CommerceEnrichmentSource {\n return this.getEnrichment(event).source ?? 'event_or_cart';\n }\n\n /**\n * Resolve payload de commerce para um evento conversion.\n * Retorna null quando enrichment está desabilitado (caller usa payload original).\n */\n resolveForEvent(\n event: CommerceEnrichmentEvent,\n eventType:\n | 'ADD_TO_CART'\n | 'REMOVE_FROM_CART'\n | 'INITIATE_CHECKOUT'\n | 'PURCHASE'\n | 'VIEW_CONTENT'\n | 'ADD_PAYMENT_INFO',\n payload: Record<string, unknown> = {}\n ): Record<string, unknown> | null {\n if (!this.isEnrichmentEnabled(event)) return null;\n\n const result = this.resolver.resolve({\n eventType,\n payload,\n enrichmentSource: this.getEnrichmentSource(event),\n });\n\n return result.data;\n }\n\n /**\n * Payload de commerce para PAGE_VIEW quando enrichment.pageView.enabled.\n * Não depende de ConversionEngine.\n */\n resolvePageViewEnrichment(): PageViewCommercePayload | null {\n if (!this.isEnrichmentEnabled('pageView')) return null;\n\n const source = this.getEnrichment('pageView').source ?? 'cart';\n if (source === 'event') return null;\n\n const resolved = this.resolver.resolve({\n eventType: 'INITIATE_CHECKOUT',\n payload: {},\n });\n\n const items = (resolved.data.items as PixelItem[] | undefined) ?? [];\n const first = items[0];\n const contentId =\n first && typeof first.id === 'string' ? first.id : undefined;\n const contentName =\n first && typeof first.name === 'string' ? first.name : undefined;\n\n if (\n resolved.value === undefined &&\n !resolved.currency &&\n items.length === 0\n ) {\n return null;\n }\n\n return {\n ...(resolved.value !== undefined ? { value: resolved.value } : {}),\n ...(resolved.currency ? { currency: resolved.currency } : {}),\n ...(items.length > 0 ? { items } : {}),\n ...(contentId ? { contentId } : {}),\n ...(contentName ? { contentName } : {}),\n };\n }\n\n getResolver(): CommerceResolver {\n return this.resolver;\n }\n\n getCalculateValueFrom(): ReturnType<typeof normalizeCalculateValueFrom> {\n return normalizeCalculateValueFrom(this.config.cart?.calculateValueFrom);\n }\n\n getMappings() {\n return this.config.mappings;\n }\n}\n","import type { SelectorDescriptor } from '@/config/shared/selector';\n\nexport type TextMatchOptions = Pick<\n SelectorDescriptor,\n 'value' | 'exact' | 'caseSensitive'\n>;\n\n/** Normaliza espaços em branco (trim + colapsa runs). */\nexport function normalizeSelectorText(text: string): string {\n return text.trim().replace(/\\s+/g, ' ');\n}\n\nfunction prepare(text: string, caseSensitive: boolean): string {\n const normalized = normalizeSelectorText(text);\n return caseSensitive ? normalized : normalized.toLowerCase();\n}\n\n/**\n * Compara texto bruto de um elemento (`textContent`, inclui descendentes).\n * Preferir `isTextMatchLeaf` em match de click/walk-up.\n */\nexport function elementMatchesText(\n element: Element,\n options: TextMatchOptions\n): boolean {\n const raw = element.textContent;\n if (raw == null) return false;\n\n const caseSensitive = options.caseSensitive === true;\n const haystack = prepare(raw, caseSensitive);\n const needle = prepare(options.value, caseSensitive);\n if (!needle) return false;\n\n if (options.exact === true) {\n return haystack === needle;\n }\n\n return haystack.includes(needle);\n}\n\n/**\n * Match de texto no elemento “folha”: o próprio elemento bate e nenhum\n * descendente também bate. Evita que ancestrais (card/body) disparem só\n * porque contêm um botão `text:Comprar agora` no `textContent`.\n */\nexport function isTextMatchLeaf(\n element: Element,\n options: TextMatchOptions\n): boolean {\n if (!elementMatchesText(element, options)) return false;\n\n const descendants = element.querySelectorAll('*');\n for (let i = 0; i < descendants.length; i += 1) {\n const child = descendants[i];\n if (child && elementMatchesText(child, options)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Busca elementos cujo texto satisfaz o seletor.\n * Escopo opcional via `closest` (container CSS). SSR-safe: sem document → [].\n */\nexport function queryElementsByText(\n options: TextMatchOptions & { closest?: string },\n root?: ParentNode | null\n): Element[] {\n if (typeof document === 'undefined') return [];\n\n const scope = root ?? document;\n\n if (options.closest) {\n try {\n const containers: Element[] = [];\n if (scope instanceof Element && scope.matches(options.closest)) {\n containers.push(scope);\n }\n containers.push(...Array.from(scope.querySelectorAll(options.closest)));\n\n const matched: Element[] = [];\n for (const container of containers) {\n matched.push(...collectTextMatches(container, options));\n }\n return Array.from(new Set(matched));\n } catch {\n return [];\n }\n }\n\n return collectTextMatches(scope, options);\n}\n\nfunction collectTextMatches(\n root: ParentNode,\n options: TextMatchOptions\n): Element[] {\n const results: Element[] = [];\n const nodes = Array.from(root.querySelectorAll('*'));\n\n if (root instanceof Element) {\n nodes.unshift(root);\n }\n\n for (const el of nodes) {\n if (isTextMatchLeaf(el, options)) {\n results.push(el);\n }\n }\n\n return results;\n}\n\nexport const TextSelectorResolver = {\n normalizeSelectorText,\n elementMatchesText,\n isTextMatchLeaf,\n queryElementsByText,\n} as const;\n","import {\n DEFAULT_SELECTOR_TYPE,\n type SelectorConfig,\n type SelectorDescriptor,\n type SelectorInput,\n type SelectorType,\n} from '@/config/shared/selector';\nimport type { PixelLogger } from '@/logger';\n\nimport { isTextMatchLeaf, queryElementsByText } from './TextSelectorResolver';\n\nconst PREFIX_TO_TYPE: Record<string, SelectorType> = {\n css: 'css',\n id: 'id',\n class: 'class',\n attr: 'attribute',\n attribute: 'attribute',\n text: 'text',\n};\n\nexport type NormalizedSelector = {\n readonly type: SelectorType;\n readonly value: string;\n readonly exact?: boolean;\n readonly caseSensitive?: boolean;\n readonly closest?: string;\n};\n\ntype SelectorLogger = Pick<PixelLogger, 'debug'>;\n\n/**\n * Resolve `SelectorConfig` (string | array | objeto) em descritores normalizados\n * e consulta/match no DOM de forma SSR-safe.\n *\n * Ordem de resolução por item:\n * 1. Objeto → type do objeto\n * 2. String com prefixo (css:|id:|class:|attr:|attribute:|text:) → prefixo\n * 3. String sem prefixo → selectorType (fallback)\n * 4. Sem selectorType → css\n */\nexport class SelectorResolver {\n private readonly logger: SelectorLogger | null;\n\n constructor(logger?: SelectorLogger | null) {\n this.logger = logger ?? null;\n }\n\n hasEntries(selector: SelectorConfig | undefined): boolean {\n return this.normalize(selector).length > 0;\n }\n\n normalize(\n selector: SelectorConfig | undefined,\n selectorType: SelectorType = DEFAULT_SELECTOR_TYPE\n ): NormalizedSelector[] {\n if (selector == null) return [];\n\n const inputs = Array.isArray(selector) ? selector : [selector];\n const result: NormalizedSelector[] = [];\n\n for (const input of inputs) {\n const normalized = this.normalizeInput(input, selectorType);\n if (normalized) result.push(normalized);\n }\n\n return result;\n }\n\n /**\n * Retorna elementos que batem com qualquer seletor (OR).\n * Selector inválido → debug log + lista vazia para aquele item.\n */\n queryAll(\n selector: SelectorConfig | undefined,\n selectorType: SelectorType = DEFAULT_SELECTOR_TYPE,\n root?: ParentNode | null\n ): Element[] {\n if (typeof document === 'undefined') return [];\n\n const scope = root ?? document;\n const matched: Element[] = [];\n\n for (const item of this.normalize(selector, selectorType)) {\n matched.push(...this.queryNormalized(item, scope));\n }\n\n return Array.from(new Set(matched));\n }\n\n /**\n * Verifica se `element` satisfaz algum seletor normalizado.\n * Usado no walk-up de click — não usa `element.matches('text:...')`.\n */\n matches(\n element: Element,\n selector: SelectorConfig | undefined,\n selectorType: SelectorType = DEFAULT_SELECTOR_TYPE\n ): boolean {\n for (const item of this.normalize(selector, selectorType)) {\n if (this.matchesNormalized(element, item)) return true;\n }\n return false;\n }\n\n private normalizeInput(\n input: SelectorInput,\n fallbackType: SelectorType\n ): NormalizedSelector | null {\n if (typeof input !== 'string') {\n return this.fromDescriptor(input);\n }\n\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const prefixed = this.parsePrefix(trimmed);\n if (prefixed) {\n return this.fromDescriptor({\n type: prefixed.type,\n value: prefixed.value,\n });\n }\n\n return this.fromDescriptor({\n type: fallbackType,\n value: trimmed,\n });\n }\n\n private fromDescriptor(\n descriptor: SelectorDescriptor\n ): NormalizedSelector | null {\n const value = descriptor.value?.trim();\n if (!value) return null;\n\n return {\n type: descriptor.type,\n value,\n exact: descriptor.exact,\n caseSensitive: descriptor.caseSensitive,\n closest: descriptor.closest,\n };\n }\n\n private parsePrefix(\n raw: string\n ): { type: SelectorType; value: string } | null {\n const colon = raw.indexOf(':');\n if (colon <= 0) return null;\n\n const prefix = raw.slice(0, colon).toLowerCase();\n const type = PREFIX_TO_TYPE[prefix];\n if (!type) return null;\n\n const value = raw.slice(colon + 1).trim();\n if (!value) return null;\n\n return { type, value };\n }\n\n private queryNormalized(\n item: NormalizedSelector,\n root: ParentNode\n ): Element[] {\n if (item.type === 'text') {\n return queryElementsByText(\n {\n value: item.value,\n exact: item.exact,\n caseSensitive: item.caseSensitive,\n closest: item.closest,\n },\n root\n );\n }\n\n const css = this.toCssSelector(item);\n if (!css) return [];\n\n try {\n const nodes = Array.from(root.querySelectorAll(css));\n if (!item.closest) return nodes;\n\n return nodes.filter(el => {\n try {\n return el.closest(item.closest!) != null;\n } catch {\n return false;\n }\n });\n } catch (error) {\n this.logger?.debug(\n `[SelectorResolver] Invalid CSS selector ignored: ${css}`,\n error\n );\n return [];\n }\n }\n\n private matchesNormalized(\n element: Element,\n item: NormalizedSelector\n ): boolean {\n if (item.closest) {\n try {\n if (element.closest(item.closest) == null) return false;\n } catch {\n this.logger?.debug(\n `[SelectorResolver] Invalid closest selector ignored: ${item.closest}`\n );\n return false;\n }\n }\n\n if (item.type === 'text') {\n // Folha apenas — senão walk-up dispara em card/body que contém o botão\n return isTextMatchLeaf(element, {\n value: item.value,\n exact: item.exact,\n caseSensitive: item.caseSensitive,\n });\n }\n\n const css = this.toCssSelector(item);\n if (!css) return false;\n\n try {\n return element.matches(css);\n } catch (error) {\n this.logger?.debug(\n `[SelectorResolver] Invalid CSS selector ignored: ${css}`,\n error\n );\n return false;\n }\n }\n\n /**\n * Converte descritor não-text em CSS.\n * Preserva compat legado: `#` / `.` / `[` passam direto;\n * `attribute` sem isso vira `[data-track=\"...\"]`.\n */\n toCssSelector(\n item: Pick<NormalizedSelector, 'type' | 'value'>\n ): string | null {\n if (item.type === 'text') return null;\n\n const { value } = item;\n if (\n value.startsWith('[') ||\n value.startsWith('.') ||\n value.startsWith('#')\n ) {\n return value;\n }\n\n switch (item.type) {\n case 'id':\n return `#${escapeCssIdent(value)}`;\n case 'class':\n return `.${escapeCssIdent(value)}`;\n case 'attribute':\n return `[data-track=\"${escapeAttrValue(value)}\"]`;\n case 'css':\n return value;\n default:\n return value;\n }\n }\n}\n\nfunction escapeCssIdent(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/([ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n}\n\nfunction escapeAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n","import type { FormAutoSource } from '@/config/shared/auto-source';\nimport type { SelectorFormTrigger } from '@/config/shared/form';\nimport { DEFAULT_SELECTOR_TYPE } from '@/config/shared/selector';\nimport type { ConversionEventData } from '@/events/conversion';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport {\n CustomerExtractor,\n FormConditionEvaluator,\n ProductExtractor,\n} from '../../commerce';\nimport { isHtmlFormElement } from '../../commerce/extractor-utils';\nimport type { ConversionEventOrigin } from '../../contracts';\nimport { SelectorResolver } from '../SelectorResolver';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nexport type FormCapableEventType = 'LEAD' | 'ADD_TO_CART' | 'INITIATE_CHECKOUT';\n\nexport type ConfiguredFormOptions = {\n readonly eventType: FormCapableEventType;\n readonly source: FormAutoSource;\n readonly origin?: ConversionEventOrigin;\n};\n\n/**\n * Detector de source `type: 'form'`: escuta DOM, avalia condição e dispara via TrackerFactory.\n * Não usa CommerceResolver / OrderCalculator.\n * Não chama Dispatcher diretamente.\n */\nexport class ConfiguredFormDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly options: ConfiguredFormOptions;\n\n private readonly formEvaluator: FormConditionEvaluator;\n\n private readonly selectorResolver: SelectorResolver;\n\n private readonly customerExtractor: CustomerExtractor;\n\n private readonly productExtractor: ProductExtractor;\n\n private readonly hasSelector: boolean;\n\n private readonly selectorType: ReturnType<typeof resolveSelectorType>;\n\n private readonly debounceMs: number;\n\n private readonly fireOnce: boolean;\n\n private readonly origin: ConversionEventOrigin;\n\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private hasFired = false;\n\n private destroyed = false;\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n options: ConfiguredFormOptions\n ) {\n super(context);\n this.factory = factory;\n this.options = options;\n\n const { source } = options;\n this.formEvaluator = new FormConditionEvaluator(source.selectorForm);\n this.selectorResolver = new SelectorResolver(context.logger);\n this.hasSelector = this.selectorResolver.hasEntries(source.selector);\n this.selectorType = resolveSelectorType(source);\n this.origin =\n options.origin ??\n buildAutoSourceOrigin('form', options.eventType, source.name);\n\n const commerce = context.services.commerce.config;\n this.customerExtractor = new CustomerExtractor({\n fieldMappings: commerce?.mappings?.fields,\n });\n this.productExtractor = new ProductExtractor({\n attributeMappings: commerce?.mappings?.attributes,\n fieldMappings: commerce?.mappings?.fields,\n });\n\n const normalized = this.formEvaluator.getConfig();\n const sourceDebounce = source.debounceMs;\n const formDebounce = normalized?.debounceMs;\n this.debounceMs =\n typeof sourceDebounce === 'number' && sourceDebounce > 0\n ? sourceDebounce\n : typeof formDebounce === 'number' && formDebounce > 0\n ? formDebounce\n : 0;\n this.fireOnce = source.fireOnce === true || normalized?.fireOnce === true;\n }\n\n get name(): string {\n return `ConfiguredForm(${this.options.eventType}:${this.options.source.name})`;\n }\n\n protected onInit(): void {\n this.destroyed = false;\n this.hasFired = false;\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n\n if (!this.isDocumentAvailable()) return;\n\n const trigger = this.formEvaluator.getConfig()?.trigger ?? 'auto';\n const events = this.resolveDomEvents(trigger);\n\n for (const type of events) {\n this.addDocumentListener(\n type,\n event => this.handleDomEvent(event, type),\n true\n );\n }\n }\n\n protected onDestroy(): void {\n this.destroyed = true;\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n }\n\n private resolveDomEvents(\n trigger: SelectorFormTrigger\n ): Array<'input' | 'change' | 'submit' | 'click'> {\n if (trigger === 'auto') {\n return ['input', 'change', 'submit', 'click'];\n }\n return [trigger];\n }\n\n private handleDomEvent(\n event: Event,\n domType: 'input' | 'change' | 'submit' | 'click'\n ): void {\n if (this.destroyed) return;\n if (this.fireOnce && this.hasFired) return;\n\n const trigger = domType as SelectorFormTrigger;\n const element = event.target instanceof Element ? event.target : null;\n\n // Selector/formSelector: restringe TODOS os triggers ao escopo.\n if (!this.isEventInScope(element, trigger)) return;\n\n const evaluation = this.formEvaluator.evaluate({\n element,\n trigger,\n });\n\n if (!evaluation.matched) {\n this.context.logger.debug(\n `[ConfiguredFormDetector] ${this.options.eventType} skipped: ${evaluation.reason}`\n );\n return;\n }\n\n const data = this.buildPayload(element);\n if (data === null) return;\n\n this.scheduleTrack(data);\n }\n\n private isEventInScope(\n element: Element | null,\n trigger: SelectorFormTrigger\n ): boolean {\n if (this.hasSelector) {\n if (!this.matchesSelector(element)) return false;\n }\n\n const formSelector = this.formEvaluator.getConfig()?.formSelector;\n if (formSelector && typeof document !== 'undefined') {\n try {\n const form = document.querySelector(formSelector);\n if (!form) return false;\n if (!element) return trigger !== 'click';\n if (form !== element && !form.contains(element)) return false;\n } catch {\n return false;\n }\n }\n\n return true;\n }\n\n private matchesSelector(element: Element | null): boolean {\n if (!element || !this.options.source.selector) return false;\n\n let current: Element | null = element;\n while (current && current !== document.body) {\n if (\n this.selectorResolver.matches(\n current,\n this.options.source.selector,\n this.selectorType\n )\n ) {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n }\n\n private resolveCustomerRoot(element: Element | null): Element | null {\n const formSelector = this.formEvaluator.getConfig()?.formSelector;\n if (formSelector && typeof document !== 'undefined') {\n try {\n const found = document.querySelector(formSelector);\n if (found) return found;\n } catch {\n // CSS inválido — fallback abaixo\n }\n }\n\n return element;\n }\n\n private buildPayload(element: Element | null): ConversionEventData | null {\n const { eventType } = this.options;\n\n if (eventType === 'LEAD') {\n const root = this.resolveCustomerRoot(element);\n const customer = isHtmlFormElement(root)\n ? this.customerExtractor.extractFromForm(root)\n : this.customerExtractor.extractFromElement(root);\n if (!customer.email && !customer.phone && !customer.name) {\n this.context.logger.debug(\n '[ConfiguredFormDetector] LEAD skipped: no email/phone/name'\n );\n return null;\n }\n return {\n ...(customer.email ? { email: customer.email } : {}),\n ...(customer.phone ? { phone: customer.phone } : {}),\n ...(customer.name ? { name: customer.name } : {}),\n };\n }\n\n if (eventType === 'ADD_TO_CART') {\n const product = this.productExtractor.extractFromElement(element);\n return {\n ...(product.productId ? { productId: product.productId } : {}),\n ...(product.productName ? { productName: product.productName } : {}),\n ...(product.price != null ? { price: product.price } : {}),\n ...(product.currency ? { currency: product.currency } : {}),\n ...(product.quantity != null ? { quantity: product.quantity } : {}),\n };\n }\n\n return {};\n }\n\n private scheduleTrack(data: ConversionEventData): void {\n if (this.debounceMs <= 0) {\n this.track(data);\n return;\n }\n\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n if (this.destroyed) return;\n this.track(data);\n }, this.debounceMs);\n }\n\n private track(data: ConversionEventData): void {\n if (this.destroyed) return;\n if (this.fireOnce && this.hasFired) return;\n\n this.factory.trackAuto(this.options.eventType, data, {\n origin: this.origin,\n });\n\n if (this.fireOnce) {\n this.hasFired = true;\n }\n }\n}\n\nfunction resolveSelectorType(source: FormAutoSource) {\n return source.selectorType ?? DEFAULT_SELECTOR_TYPE;\n}\n","/**\n * Mapper LinkResolvedBindings → ConversionEventData por tipo de evento.\n *\n * Chaves semânticas conhecidas (productId, etc.) alimentam o payload oficial.\n * Chaves desconhecidas não vazam no evento.\n */\n\nimport type { ConversionEventData } from '@/events/conversion';\n\nimport type { ConversionEventType } from '../../contracts';\nimport type {\n LinkResolvedBindings,\n LinkResolvedValue,\n} from './LinkValueResolver';\n\nexport type LinkMapResult =\n | {\n readonly ok: true;\n readonly data: ConversionEventData;\n readonly unknownKeys?: readonly string[];\n }\n | {\n readonly ok: false;\n readonly reason: string;\n readonly unknownKeys?: readonly string[];\n };\n\nconst ADD_TO_CART_KEYS = new Set([\n 'id',\n 'priceId',\n 'productId',\n 'offerId',\n 'priceCode',\n 'productName',\n 'price',\n 'currency',\n 'quantity',\n]);\n\nconst REMOVE_KEYS = new Set([\n 'id',\n 'priceId',\n 'productId',\n 'priceCode',\n 'quantity',\n]);\n\nconst VIEW_CONTENT_KEYS = new Set([\n 'id',\n 'priceId',\n 'productId',\n 'offerId',\n 'contentId',\n 'priceCode',\n 'value',\n 'price',\n 'currency',\n]);\n\nconst LEAD_KEYS = new Set(['email', 'phone', 'name']);\n\nconst CHECKOUT_KEYS = new Set(['value', 'currency']);\n\nfunction asString(value: LinkResolvedValue | undefined): string | undefined {\n if (typeof value === 'string' && value.trim() !== '') return value.trim();\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction asNumber(value: LinkResolvedValue | undefined): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return undefined;\n const num = Number(trimmed);\n return Number.isFinite(num) ? num : undefined;\n }\n return undefined;\n}\n\nfunction collectUnknown(\n values: LinkResolvedBindings,\n known: ReadonlySet<string>\n): string[] {\n return Object.keys(values).filter(key => !known.has(key));\n}\n\n/**\n * Eventos que a source `link` pode produzir com segurança nesta etapa.\n */\nexport function isLinkSupportedEvent(eventType: ConversionEventType): boolean {\n switch (eventType) {\n case 'ADD_TO_CART':\n case 'REMOVE_FROM_CART':\n case 'VIEW_CONTENT':\n case 'SEARCH':\n case 'LEAD':\n case 'INITIATE_CHECKOUT':\n return true;\n case 'ADD_PAYMENT_INFO':\n case 'PURCHASE':\n return false;\n default:\n return false;\n }\n}\n\nexport function mapLinkBindingsToEvent(\n eventType: ConversionEventType,\n values: LinkResolvedBindings\n): LinkMapResult {\n switch (eventType) {\n case 'ADD_TO_CART': {\n const unknownKeys = collectUnknown(values, ADD_TO_CART_KEYS);\n const explicitPriceId =\n asString(values.priceId) ?? asString(values.priceCode);\n const productId = asString(values.productId) ?? explicitPriceId;\n const offerId = asString(values.offerId);\n const id = asString(values.id) ?? explicitPriceId;\n const productName = asString(values.productName);\n const price = asNumber(values.price);\n const currency = asString(values.currency);\n const quantity = asNumber(values.quantity);\n if (!productId && !explicitPriceId) {\n return {\n ok: false,\n reason: 'ADD_TO_CART link source requires priceId or productId',\n unknownKeys,\n };\n }\n const data = {\n ...(id ? { id } : {}),\n ...(explicitPriceId ? { priceId: explicitPriceId } : {}),\n ...(productId ? { productId } : {}),\n ...(offerId ? { offerId } : {}),\n ...(productName ? { productName } : {}),\n ...(price != null ? { price } : {}),\n ...(currency ? { currency } : {}),\n ...(quantity != null ? { quantity } : {}),\n };\n return { ok: true, data, ...(unknownKeys.length ? { unknownKeys } : {}) };\n }\n\n case 'REMOVE_FROM_CART': {\n const unknownKeys = collectUnknown(values, REMOVE_KEYS);\n const explicitPriceId =\n asString(values.priceId) ?? asString(values.priceCode);\n const productId = asString(values.productId) ?? explicitPriceId;\n const id = asString(values.id) ?? explicitPriceId;\n const quantity = asNumber(values.quantity);\n if (!productId && !explicitPriceId) {\n return {\n ok: false,\n reason: 'REMOVE_FROM_CART link source requires priceId or productId',\n unknownKeys,\n };\n }\n return {\n ok: true,\n data: {\n ...(id ? { id } : {}),\n ...(explicitPriceId ? { priceId: explicitPriceId } : {}),\n ...(productId ? { productId } : {}),\n ...(quantity != null ? { quantity } : {}),\n },\n ...(unknownKeys.length ? { unknownKeys } : {}),\n };\n }\n\n case 'VIEW_CONTENT': {\n const unknownKeys = collectUnknown(values, VIEW_CONTENT_KEYS);\n const contentId = asString(values.contentId);\n const productId = asString(values.productId);\n const explicitPriceId =\n asString(values.priceId) ?? asString(values.priceCode);\n const offerId = asString(values.offerId);\n\n if (\n contentId &&\n productId &&\n contentId !== productId &&\n !explicitPriceId\n ) {\n return {\n ok: false,\n reason: 'VIEW_CONTENT contentId/productId conflict',\n unknownKeys,\n };\n }\n\n const resolvedId =\n explicitPriceId ?? contentId ?? productId ?? asString(values.id);\n if (!resolvedId) {\n return {\n ok: false,\n reason: 'VIEW_CONTENT requires priceId, contentId, or productId',\n unknownKeys,\n };\n }\n\n const value = asNumber(values.value) ?? asNumber(values.price);\n const currency = asString(values.currency);\n return {\n ok: true,\n data: {\n ...(explicitPriceId\n ? {\n id: asString(values.id) ?? explicitPriceId,\n priceId: explicitPriceId,\n }\n : {}),\n contentId: contentId ?? resolvedId,\n productId: productId ?? resolvedId,\n ...(offerId ? { offerId } : {}),\n ...(value != null ? { value } : {}),\n ...(currency ? { currency } : {}),\n },\n ...(unknownKeys.length ? { unknownKeys } : {}),\n };\n }\n\n case 'SEARCH': {\n const query = asString(values.query);\n if (!query) {\n return { ok: false, reason: 'SEARCH requires query' };\n }\n return {\n ok: true,\n data: { query },\n unknownKeys: collectUnknown(values, new Set(['query'])),\n };\n }\n\n case 'LEAD': {\n const unknownKeys = collectUnknown(values, LEAD_KEYS);\n const email = asString(values.email);\n const phone = asString(values.phone);\n const name = asString(values.name);\n if (!email && !phone && !name) {\n return {\n ok: false,\n reason: 'LEAD requires email, phone, or name',\n unknownKeys,\n };\n }\n return {\n ok: true,\n data: {\n ...(email ? { email } : {}),\n ...(phone ? { phone } : {}),\n ...(name ? { name } : {}),\n },\n ...(unknownKeys.length ? { unknownKeys } : {}),\n };\n }\n\n case 'INITIATE_CHECKOUT': {\n const unknownKeys = collectUnknown(values, CHECKOUT_KEYS);\n const value = asNumber(values.value);\n const currency = asString(values.currency);\n return {\n ok: true,\n data: {\n ...(value != null ? { value } : {}),\n ...(currency ? { currency } : {}),\n },\n ...(unknownKeys.length ? { unknownKeys } : {}),\n };\n }\n\n case 'ADD_PAYMENT_INFO':\n return {\n ok: false,\n reason: 'link source does not support ADD_PAYMENT_INFO',\n };\n\n case 'PURCHASE':\n return {\n ok: false,\n reason: 'link source does not support PURCHASE in this stage',\n };\n\n default:\n return { ok: false, reason: `unsupported event: ${eventType}` };\n }\n}\n","/**\n * Matcher puro: URL normalizada + LinkTargetMatch → matched + pathParams.\n *\n * Política de trailing slash: paths (exceto `/`) são comparados sem `/` final.\n * Hash é ignorado. Grupos configurados usam AND; arrays internos usam OR.\n */\n\nimport type {\n LinkQueryCondition,\n LinkTargetMatch,\n} from '@/config/shared/auto-source';\n\nexport type LinkTargetMatchedPath = {\n readonly type: 'template' | 'exact' | 'prefix';\n /** Pattern da configuração (nunca o pathname real do usuário). */\n readonly pattern: string;\n};\n\nexport type LinkTargetMatchResult = {\n readonly matched: boolean;\n readonly pathParams: Readonly<Record<string, string>>;\n readonly matchedPath?: LinkTargetMatchedPath;\n};\n\nconst EMPTY_PARAMS: Readonly<Record<string, string>> = Object.freeze({});\n\n/**\n * Remove trailing slash (exceto root `/`).\n */\nexport function normalizePathname(pathname: string): string {\n if (!pathname || pathname === '/') return '/';\n const withLeading = pathname.startsWith('/') ? pathname : `/${pathname}`;\n return withLeading.length > 1 && withLeading.endsWith('/')\n ? withLeading.slice(0, -1)\n : withLeading;\n}\n\nfunction safeDecode(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\n/**\n * `/pri` → `/pri6670988` (dígito a seguir), mas não `/privacy`.\n * `/offer_` → `/offer_1` (sufixo não alfanumérico no prefixo).\n */\nexport function matchesSegmentPrefix(segment: string, prefix: string): boolean {\n const normalizedPrefix = prefix.replace(/^\\/+|\\/+$/g, '');\n if (!normalizedPrefix) return false;\n if (segment === normalizedPrefix) return true;\n if (!segment.startsWith(normalizedPrefix)) return false;\n if (/[^a-zA-Z0-9]$/.test(normalizedPrefix)) return true;\n const next = segment.charAt(normalizedPrefix.length);\n // `/pri` → `/pri6670988` ou `/pri_123`, mas não `/privacy`.\n if (next >= '0' && next <= '9') return true;\n if (next === '_' && /\\d/.test(segment.slice(normalizedPrefix.length + 1))) {\n return true;\n }\n return false;\n}\n\n/**\n * Faz match de template simples `/pay/:offerId`.\n * Retorna null se não corresponder; {} se corresponder sem params.\n */\nexport function matchPathTemplate(\n pathname: string,\n template: string\n): Record<string, string> | null {\n const pathParts = normalizePathname(pathname)\n .split('/')\n .filter(Boolean)\n .map(safeDecode);\n const templateParts = normalizePathname(template).split('/').filter(Boolean);\n\n if (pathParts.length !== templateParts.length) {\n return null;\n }\n\n const params: Record<string, string> = Object.create(null);\n const seen = new Set<string>();\n\n for (let i = 0; i < templateParts.length; i += 1) {\n const tpl = templateParts[i]!;\n const seg = pathParts[i]!;\n if (tpl.startsWith(':')) {\n const key = tpl.slice(1);\n if (!key || seen.has(key)) {\n return null;\n }\n // Nomes inseguros / inválidos não capturam (defesa em runtime).\n if (\n key === '__proto__' ||\n key === 'constructor' ||\n key === 'prototype' ||\n !/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)\n ) {\n return null;\n }\n seen.add(key);\n params[key] = seg;\n continue;\n }\n if (tpl !== seg) {\n return null;\n }\n }\n\n return params;\n}\n\nfunction compareStrings(\n left: string,\n right: string,\n caseSensitive: boolean\n): boolean {\n if (caseSensitive) return left === right;\n return left.toLowerCase() === right.toLowerCase();\n}\n\nfunction startsWithSafe(\n value: string,\n prefix: string,\n caseSensitive: boolean\n): boolean {\n if (caseSensitive) return value.startsWith(prefix);\n return value.toLowerCase().startsWith(prefix.toLowerCase());\n}\n\nfunction matchQueryCondition(\n params: URLSearchParams,\n condition: LinkQueryCondition\n): boolean {\n const raw = params.get(condition.key);\n const caseSensitive =\n 'caseSensitive' in condition && condition.caseSensitive === true;\n\n switch (condition.operator) {\n case 'exists':\n return raw !== null && raw !== '';\n case 'absent':\n return raw === null || raw === '';\n case 'equals':\n if (raw === null) return false;\n return compareStrings(raw, condition.value, caseSensitive);\n case 'starts_with':\n if (raw === null) return false;\n return startsWithSafe(raw, condition.value, caseSensitive);\n case 'one_of': {\n if (raw === null) return false;\n return condition.value.some(v => compareStrings(raw, v, caseSensitive));\n }\n default:\n return false;\n }\n}\n\n/**\n * Avalia match do destino. Determinístico e sem side effects.\n */\nexport function matchLinkTarget(\n url: URL,\n rule: LinkTargetMatch\n): LinkTargetMatchResult {\n if (rule.protocols?.length) {\n if (!rule.protocols.includes(url.protocol as 'http:' | 'https:')) {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n } else if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n\n if (rule.origins?.length) {\n const originOk = rule.origins.some(origin => origin === url.origin);\n if (!originOk) {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n }\n\n if (rule.hostnames?.length) {\n const host = url.hostname.toLowerCase();\n const hostOk = rule.hostnames.some(h => h.toLowerCase() === host);\n if (!hostOk) {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n }\n\n let pathParams: Record<string, string> = Object.create(null);\n let matchedPath: LinkTargetMatchedPath | undefined;\n const pathRule = rule.path;\n if (pathRule) {\n const pathname = normalizePathname(url.pathname);\n\n // Prioriza template para capturar pathParams mesmo com prefixes/exact.\n if (pathRule.template) {\n const params = matchPathTemplate(pathname, pathRule.template);\n if (params) {\n pathParams = params;\n matchedPath = {\n type: 'template',\n pattern: normalizePathname(pathRule.template),\n };\n }\n }\n\n if (!matchedPath && pathRule.exact?.length) {\n const exactHit = pathRule.exact.find(\n exact => normalizePathname(exact) === pathname\n );\n if (exactHit !== undefined) {\n matchedPath = {\n type: 'exact',\n pattern: normalizePathname(exactHit),\n };\n }\n }\n\n if (!matchedPath && pathRule.prefixes?.length) {\n const prefixHit = pathRule.prefixes.find(prefix => {\n const normalizedPrefix = normalizePathname(prefix);\n if (normalizedPrefix === '/') return true;\n if (pathname === normalizedPrefix) return true;\n // Directory semantics: `/pay` → `/pay/foo`\n if (pathname.startsWith(`${normalizedPrefix}/`)) return true;\n // Literal pathname prefix when the pattern ends with a separator\n // (e.g. `/offer_` → `/offer_1`). Does not make `/pay` match `/payment`.\n if (\n /[^a-zA-Z0-9/]$/.test(normalizedPrefix) &&\n pathname.startsWith(normalizedPrefix)\n ) {\n return true;\n }\n // Alphanumeric prefix + digit: `/pri` → `/pri6670988`, not `/privacy`.\n const bare = normalizedPrefix.replace(/^\\//, '');\n const firstSeg = pathname.split('/').filter(Boolean)[0] ?? '';\n if (\n pathname.startsWith(normalizedPrefix) &&\n matchesSegmentPrefix(firstSeg, bare)\n ) {\n return true;\n }\n return false;\n });\n if (prefixHit !== undefined) {\n matchedPath = {\n type: 'prefix',\n pattern: normalizePathname(prefixHit),\n };\n }\n }\n\n if (!matchedPath && pathRule.segmentPrefixes?.length) {\n const segments = pathname.split('/').filter(Boolean);\n const segmentHit = pathRule.segmentPrefixes.find(prefix =>\n segments.some(seg => matchesSegmentPrefix(seg, prefix))\n );\n if (segmentHit !== undefined) {\n matchedPath = {\n type: 'prefix',\n pattern: `/${segmentHit.replace(/^\\/+|\\/+$/g, '')}`,\n };\n }\n }\n\n if (!matchedPath) {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n }\n\n if (rule.query?.conditions?.length) {\n const mode = rule.query.mode ?? 'all';\n const results = rule.query.conditions.map(c =>\n matchQueryCondition(url.searchParams, c)\n );\n const queryOk =\n mode === 'any' ? results.some(Boolean) : results.every(Boolean);\n if (!queryOk) {\n return { matched: false, pathParams: EMPTY_PARAMS };\n }\n }\n\n return {\n matched: true,\n pathParams: Object.freeze({ ...pathParams }),\n ...(matchedPath ? { matchedPath } : {}),\n };\n}\n\n/**\n * Path seguro para diagnostics: usa a regra configurada, nunca o pathname do usuário.\n * - template → pattern com placeholders (ex.: `/pay/:offerId`)\n * - prefix → `pattern/:redacted`\n * - exact → todos os segmentos redigidos (tokens opacos na config não vazam)\n */\nexport function formatMatchedPathForDiagnostics(\n matchedPath: LinkTargetMatchedPath | undefined\n): string | null {\n if (!matchedPath) return null;\n if (matchedPath.type === 'prefix') {\n const prefix = normalizePathname(matchedPath.pattern);\n return prefix === '/' ? '/:redacted' : `${prefix}/:redacted`;\n }\n if (matchedPath.type === 'exact') {\n const parts = normalizePathname(matchedPath.pattern)\n .split('/')\n .filter(Boolean);\n if (parts.length === 0) return '/';\n return `/${parts.map(() => ':redacted').join('/')}`;\n }\n return matchedPath.pattern;\n}\n","/**\n * Resolve bindings genéricos de um LinkAutoSource.\n *\n * Ausente: undefined, string vazia após trim, resolver sem resultado.\n * Presente deliberado: 0, false, null estático.\n *\n * Atributos: preferem o elemento matched (selector); fallback no anchor.\n */\n\nimport type {\n LinkValueBinding,\n LinkValueResolver,\n LinkValueTransform,\n} from '@/config/shared/auto-source';\n\nimport { normalizePathname } from './LinkTargetMatcher';\n\nexport type LinkResolvedValue = string | number | boolean | null;\n\nexport type LinkResolvedBindings = Readonly<Record<string, LinkResolvedValue>>;\n\nexport type LinkResolveContext = {\n readonly anchor: HTMLAnchorElement;\n /** Elemento que casou o selector (ou o próprio anchor). */\n readonly target: Element;\n readonly url: URL;\n readonly pathParams: Readonly<Record<string, string>>;\n};\n\nexport type LinkBindingsResolution = {\n readonly valid: boolean;\n readonly values: LinkResolvedBindings;\n readonly missingRequired: readonly string[];\n};\n\nfunction isAbsent(value: LinkResolvedValue | undefined): boolean {\n if (value === undefined) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n return false;\n}\n\nfunction pathSegments(pathname: string): string[] {\n return normalizePathname(pathname)\n .split('/')\n .filter(Boolean)\n .map(seg => {\n try {\n return decodeURIComponent(seg);\n } catch {\n return seg;\n }\n });\n}\n\n/** Remove extensão estática comum de simulações HTML locais. */\nfunction stripStaticExtension(segment: string): string {\n return segment.replace(/\\.html?$/i, '');\n}\n\nfunction normalizeText(raw: string | null): string | undefined {\n if (raw == null) return undefined;\n const collapsed = raw.replace(/\\s+/g, ' ').trim();\n return collapsed === '' ? undefined : collapsed;\n}\n\nfunction readDataset(el: Element, key: string): string | undefined {\n if (!(el instanceof HTMLElement)) return undefined;\n const value = el.dataset[key];\n if (value === undefined) return undefined;\n return value.trim() === '' ? undefined : value;\n}\n\nfunction readAttribute(el: Element, name: string): string | undefined {\n const value = el.getAttribute(name);\n if (value === null) return undefined;\n return value.trim() === '' ? undefined : value;\n}\n\nfunction resolveOne(\n resolver: LinkValueResolver,\n ctx: LinkResolveContext\n): LinkResolvedValue | undefined {\n switch (resolver.source) {\n case 'query': {\n const value = ctx.url.searchParams.get(resolver.key);\n return value === null ? undefined : value;\n }\n case 'pathParam': {\n const value = ctx.pathParams[resolver.key];\n return value === undefined ? undefined : value;\n }\n case 'pathSegment': {\n const segments = pathSegments(ctx.url.pathname);\n let index = resolver.index;\n if (!Number.isInteger(index)) {\n return undefined;\n }\n if (index < 0) {\n index = segments.length + index;\n }\n if (index < 0 || index >= segments.length) {\n return undefined;\n }\n const raw = segments[index];\n return raw === undefined ? undefined : stripStaticExtension(raw);\n }\n case 'attribute': {\n return (\n readAttribute(ctx.target, resolver.name) ??\n readAttribute(ctx.anchor, resolver.name)\n );\n }\n case 'dataset': {\n return (\n readDataset(ctx.target, resolver.key) ??\n readDataset(ctx.anchor, resolver.key)\n );\n }\n case 'static':\n return resolver.value;\n case 'href':\n return ctx.url.href;\n case 'origin':\n return ctx.url.origin;\n case 'hostname':\n return ctx.url.hostname;\n case 'pathname':\n return normalizePathname(ctx.url.pathname);\n case 'text':\n return normalizeText(ctx.anchor.textContent);\n default:\n return undefined;\n }\n}\n\nfunction applyTransform(\n value: LinkResolvedValue,\n transform: LinkValueTransform\n): LinkResolvedValue | undefined {\n switch (transform) {\n case 'trim':\n return typeof value === 'string' ? value.trim() : undefined;\n case 'lowercase':\n return typeof value === 'string' ? value.toLowerCase() : undefined;\n case 'uppercase':\n return typeof value === 'string' ? value.toUpperCase() : undefined;\n case 'number': {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '' || !/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return undefined;\n }\n const num = Number(trimmed);\n return Number.isFinite(num) ? num : undefined;\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction resolveBinding(\n binding: LinkValueBinding,\n ctx: LinkResolveContext\n): { value: LinkResolvedValue | undefined; transformFailed: boolean } {\n const resolvers = Array.isArray(binding.from) ? binding.from : [binding.from];\n let sawTransformFailure = false;\n\n for (const resolver of resolvers) {\n const candidate = resolveOne(resolver, ctx);\n if (isAbsent(candidate)) continue;\n\n if (!binding.transform) {\n return { value: candidate, transformFailed: false };\n }\n\n const transformed = applyTransform(candidate!, binding.transform);\n if (transformed === undefined) {\n sawTransformFailure = true;\n continue;\n }\n if (typeof transformed === 'string' && transformed.trim() === '') {\n continue;\n }\n return { value: transformed, transformFailed: false };\n }\n\n return {\n value: undefined,\n transformFailed: sawTransformFailure,\n };\n}\n\n/**\n * Resolve todos os bindings. Não muta inputs.\n */\nexport function resolveLinkBindings(\n bindings: Readonly<Record<string, LinkValueBinding>> | undefined,\n ctx: LinkResolveContext\n): LinkBindingsResolution {\n if (!bindings || Object.keys(bindings).length === 0) {\n return {\n valid: true,\n values: Object.freeze({}),\n missingRequired: Object.freeze([]),\n };\n }\n\n const values: Record<string, LinkResolvedValue> = Object.create(null);\n const missingRequired: string[] = [];\n\n for (const [key, binding] of Object.entries(bindings)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n const { value } = resolveBinding(binding, ctx);\n if (value !== undefined) {\n values[key] = value;\n continue;\n }\n // Transform inválido só invalida se o binding for obrigatório.\n if (binding.required === true) {\n missingRequired.push(key);\n }\n }\n\n return {\n valid: missingRequired.length === 0,\n values: Object.freeze(values),\n missingRequired: Object.freeze(missingRequired),\n };\n}\n","/**\n * Validação e normalização defensiva de `LinkAutoSource`.\n * Não muta a configuração original. Retorna clone normalizado ou erro.\n * Nunca lança — JSON malformado resulta em `{ ok: false }`.\n */\n\nimport type {\n LinkAutoSource,\n LinkMatchProtocol,\n LinkQueryCondition,\n LinkTargetMatch,\n LinkValueBinding,\n LinkValueResolver,\n LinkValueTransform,\n} from '@/config/shared/auto-source';\nimport type { SelectorConfig, SelectorInput } from '@/config/shared/selector';\n\nimport { matchPathTemplate, normalizePathname } from './LinkTargetMatcher';\n\nexport type NormalizeLinkAutoSourceResult =\n | { readonly ok: true; readonly source: LinkAutoSource }\n | { readonly ok: false; readonly reason: string };\n\nconst MAX_ORIGINS = 50;\nconst MAX_HOSTNAMES = 50;\nconst MAX_PATH_ENTRIES = 50;\nconst MAX_QUERY_CONDITIONS = 20;\nconst MAX_BINDINGS = 30;\nconst MAX_FROM = 10;\nconst MAX_ONE_OF = 50;\nconst MAX_NAME_LENGTH = 128;\nconst MAX_STRING_LENGTH = 2048;\n\nconst RESERVED_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst PATH_PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst TRANSFORMS = new Set<LinkValueTransform>([\n 'trim',\n 'lowercase',\n 'uppercase',\n 'number',\n]);\n\nfunction fail(reason: string): NormalizeLinkAutoSourceResult {\n return { ok: false, reason };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isSafeObjectKey(key: string): boolean {\n return !RESERVED_OBJECT_KEYS.has(key);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isBoundedString(\n value: unknown,\n max = MAX_STRING_LENGTH\n): value is string {\n return typeof value === 'string' && value.length <= max;\n}\n\nfunction isValidHostname(host: string): boolean {\n if (!host || host.length > 253) return false;\n if (host.includes('/') || host.includes(' ') || host.includes(':')) {\n return false;\n }\n return /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i.test(\n host\n );\n}\n\nfunction normalizeTimerMs(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n const MAX_TIMER_MS = 60_000;\n return Math.min(value, MAX_TIMER_MS);\n}\n\n/**\n * Origin estrita: apenas protocol + host + port.\n * Rejeita pathname ≠ `/`, query, hash, username/password.\n */\nfunction normalizeOrigin(raw: string): string | null {\n try {\n const url = new URL(raw);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return null;\n }\n if (url.username !== '' || url.password !== '') {\n return null;\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n return null;\n }\n if (url.search !== '' || url.hash !== '') {\n return null;\n }\n return url.origin;\n } catch {\n return null;\n }\n}\n\nfunction cloneSelectorInput(item: unknown): SelectorInput | null {\n if (typeof item === 'string') {\n return isBoundedString(item) ? item : null;\n }\n if (!isPlainObject(item)) return null;\n if (\n !isNonEmptyString(item.type) ||\n !isNonEmptyString(item.value) ||\n !isBoundedString(item.value)\n ) {\n return null;\n }\n const type = item.type;\n if (\n type !== 'css' &&\n type !== 'id' &&\n type !== 'class' &&\n type !== 'attribute' &&\n type !== 'text'\n ) {\n return null;\n }\n return {\n type,\n value: item.value,\n ...(item.exact === true ? { exact: true } : {}),\n ...(item.caseSensitive === true ? { caseSensitive: true } : {}),\n ...(typeof item.closest === 'string' && isBoundedString(item.closest)\n ? { closest: item.closest }\n : {}),\n };\n}\n\nfunction cloneSelector(selector: unknown): SelectorConfig | null {\n if (typeof selector === 'string') {\n return isBoundedString(selector) ? selector : null;\n }\n if (Array.isArray(selector)) {\n if (selector.length === 0) return null;\n const items: SelectorInput[] = [];\n for (const item of selector) {\n const cloned = cloneSelectorInput(item);\n if (!cloned) return null;\n items.push(cloned);\n }\n return items;\n }\n return cloneSelectorInput(selector);\n}\n\nfunction validateTemplateParams(template: string): string | null {\n const parts = normalizePathname(template).split('/').filter(Boolean);\n const seen = new Set<string>();\n for (const part of parts) {\n if (!part.startsWith(':')) continue;\n const key = part.slice(1);\n if (!key) return 'path.template has empty param name';\n if (!PATH_PARAM_NAME.test(key)) {\n return `path.template param name is invalid: ${key}`;\n }\n if (!isSafeObjectKey(key)) {\n return `path.template param name is reserved: ${key}`;\n }\n if (seen.has(key)) return `path.template has duplicate param: ${key}`;\n seen.add(key);\n }\n void matchPathTemplate(template.replace(/:[^/]+/g, 'x'), template);\n return null;\n}\n\nfunction normalizeQueryCondition(\n condition: unknown\n): LinkQueryCondition | null {\n if (!isPlainObject(condition)) return null;\n if (!isNonEmptyString(condition.key) || !isBoundedString(condition.key)) {\n return null;\n }\n const key = condition.key.trim();\n if (!isSafeObjectKey(key)) return null;\n\n const operator = condition.operator;\n if (operator === 'exists' || operator === 'absent') {\n return { key, operator };\n }\n\n if (operator === 'equals' || operator === 'starts_with') {\n if (typeof condition.value !== 'string') return null;\n if (!isBoundedString(condition.value)) return null;\n return {\n key,\n operator,\n value: condition.value,\n ...(condition.caseSensitive === true ? { caseSensitive: true } : {}),\n };\n }\n\n if (operator === 'one_of') {\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n return null;\n }\n if (condition.value.length > MAX_ONE_OF) return null;\n const values = condition.value.filter(\n (v): v is string => typeof v === 'string' && isBoundedString(v)\n );\n if (values.length === 0) return null;\n return {\n key,\n operator: 'one_of',\n value: [...values],\n ...(condition.caseSensitive === true ? { caseSensitive: true } : {}),\n };\n }\n\n return null;\n}\n\nfunction normalizeResolver(\n resolver: unknown,\n hasTemplate: boolean\n): LinkValueResolver | null {\n if (!isPlainObject(resolver)) return null;\n const source = resolver.source;\n if (typeof source !== 'string') return null;\n\n switch (source) {\n case 'query':\n return isNonEmptyString(resolver.key) && isBoundedString(resolver.key)\n ? { source: 'query', key: resolver.key.trim() }\n : null;\n case 'pathParam':\n if (!hasTemplate) return null;\n if (!isNonEmptyString(resolver.key) || !isBoundedString(resolver.key)) {\n return null;\n }\n {\n const key = resolver.key.trim();\n if (!PATH_PARAM_NAME.test(key) || !isSafeObjectKey(key)) return null;\n return { source: 'pathParam', key };\n }\n case 'pathSegment':\n if (\n typeof resolver.index !== 'number' ||\n !Number.isInteger(resolver.index)\n ) {\n return null;\n }\n // Índice negativo = a partir do fim (`-1` = último segmento).\n if (resolver.index < -32 || resolver.index > 64) {\n return null;\n }\n return { source: 'pathSegment', index: resolver.index };\n case 'attribute':\n return isNonEmptyString(resolver.name) && isBoundedString(resolver.name)\n ? { source: 'attribute', name: resolver.name.trim() }\n : null;\n case 'dataset':\n return isNonEmptyString(resolver.key) && isBoundedString(resolver.key)\n ? { source: 'dataset', key: resolver.key.trim() }\n : null;\n case 'static': {\n const value = resolver.value;\n if (value === null || typeof value === 'boolean') {\n return { source: 'static', value };\n }\n if (typeof value === 'string') {\n if (!isBoundedString(value)) return null;\n return { source: 'static', value };\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return { source: 'static', value };\n }\n return null;\n }\n case 'href':\n case 'origin':\n case 'hostname':\n case 'pathname':\n case 'text':\n return { source };\n default:\n return null;\n }\n}\n\nfunction normalizeBinding(\n binding: unknown,\n hasTemplate: boolean\n): LinkValueBinding | null {\n if (!isPlainObject(binding)) return null;\n if (binding.from == null) return null;\n\n const fromList = Array.isArray(binding.from) ? binding.from : [binding.from];\n if (fromList.length === 0 || fromList.length > MAX_FROM) return null;\n\n const normalizedFrom: LinkValueResolver[] = [];\n for (const item of fromList) {\n const resolved = normalizeResolver(item, hasTemplate);\n if (!resolved) return null;\n normalizedFrom.push(resolved);\n }\n\n const transform = binding.transform;\n if (\n transform !== undefined &&\n (typeof transform !== 'string' ||\n !TRANSFORMS.has(transform as LinkValueTransform))\n ) {\n return null;\n }\n\n return {\n from: normalizedFrom.length === 1 ? normalizedFrom[0]! : normalizedFrom,\n ...(binding.required === true ? { required: true } : {}),\n ...(typeof transform === 'string'\n ? { transform: transform as LinkValueTransform }\n : {}),\n };\n}\n\nfunction hasUsefulMatch(match: LinkTargetMatch): boolean {\n return Boolean(\n match.protocols?.length ||\n match.origins?.length ||\n match.hostnames?.length ||\n match.path?.exact?.length ||\n match.path?.prefixes?.length ||\n match.path?.segmentPrefixes?.length ||\n match.path?.template ||\n match.query?.conditions?.length\n );\n}\n\nfunction normalizeLinkAutoSourceInner(\n input: unknown\n): NormalizeLinkAutoSourceResult {\n if (!isPlainObject(input)) {\n return fail('source must be an object');\n }\n\n if (!isNonEmptyString(input.name)) {\n return fail('name is required');\n }\n if (input.name.trim().length > MAX_NAME_LENGTH) {\n return fail('name exceeds defensive limit');\n }\n if (input.type !== 'link') {\n return fail('type must be link');\n }\n if (input.trigger !== undefined && input.trigger !== 'click') {\n return fail('trigger must be click when provided');\n }\n if (!isPlainObject(input.match)) {\n return fail('match is required');\n }\n\n const matchIn = input.match;\n const match: LinkTargetMatch = {};\n\n if (matchIn.protocols !== undefined) {\n if (!Array.isArray(matchIn.protocols) || matchIn.protocols.length === 0) {\n return fail('protocols must be a non-empty array when provided');\n }\n const protocols: LinkMatchProtocol[] = [];\n for (const p of matchIn.protocols) {\n if (p !== 'http:' && p !== 'https:') {\n return fail('protocols only allow http: and https:');\n }\n if (!protocols.includes(p)) protocols.push(p);\n }\n match.protocols = protocols;\n }\n\n if (matchIn.origins !== undefined) {\n if (!Array.isArray(matchIn.origins) || matchIn.origins.length === 0) {\n return fail('origins must be a non-empty array when provided');\n }\n if (matchIn.origins.length > MAX_ORIGINS) {\n return fail('origins exceeds defensive limit');\n }\n const origins: string[] = [];\n for (const raw of matchIn.origins) {\n if (!isNonEmptyString(raw) || !isBoundedString(raw)) {\n return fail('origin entries must be non-empty');\n }\n const normalized = normalizeOrigin(raw.trim());\n if (!normalized) {\n return fail(\n 'origin must be protocol+host[+port] only (no path/query/hash/userinfo)'\n );\n }\n if (!origins.includes(normalized)) origins.push(normalized);\n }\n match.origins = origins;\n }\n\n if (matchIn.hostnames !== undefined) {\n if (!Array.isArray(matchIn.hostnames) || matchIn.hostnames.length === 0) {\n return fail('hostnames must be a non-empty array when provided');\n }\n if (matchIn.hostnames.length > MAX_HOSTNAMES) {\n return fail('hostnames exceeds defensive limit');\n }\n const hostnames: string[] = [];\n for (const raw of matchIn.hostnames) {\n if (!isNonEmptyString(raw)) {\n return fail('hostname entries must be non-empty');\n }\n const host = raw.trim().toLowerCase();\n if (!isValidHostname(host)) {\n return fail('hostname is invalid');\n }\n if (!hostnames.includes(host)) hostnames.push(host);\n }\n match.hostnames = hostnames;\n }\n\n if (matchIn.path !== undefined) {\n if (!isPlainObject(matchIn.path)) {\n return fail('path must be an object when provided');\n }\n const path: NonNullable<LinkTargetMatch['path']> = {};\n if (matchIn.path.exact !== undefined) {\n if (\n !Array.isArray(matchIn.path.exact) ||\n matchIn.path.exact.length === 0\n ) {\n return fail('path.exact must be non-empty when provided');\n }\n if (matchIn.path.exact.length > MAX_PATH_ENTRIES) {\n return fail('path.exact exceeds defensive limit');\n }\n path.exact = matchIn.path.exact\n .filter((p): p is string => isNonEmptyString(p) && isBoundedString(p))\n .map(p => normalizePathname(p.trim()));\n if (path.exact.length === 0) {\n return fail('path.exact has no valid entries');\n }\n }\n if (matchIn.path.prefixes !== undefined) {\n if (\n !Array.isArray(matchIn.path.prefixes) ||\n matchIn.path.prefixes.length === 0\n ) {\n return fail('path.prefixes must be non-empty when provided');\n }\n if (matchIn.path.prefixes.length > MAX_PATH_ENTRIES) {\n return fail('path.prefixes exceeds defensive limit');\n }\n path.prefixes = matchIn.path.prefixes\n .filter((p): p is string => isNonEmptyString(p) && isBoundedString(p))\n .map(p => normalizePathname(p.trim()));\n if (path.prefixes.length === 0) {\n return fail('path.prefixes has no valid entries');\n }\n }\n if (matchIn.path.segmentPrefixes !== undefined) {\n if (\n !Array.isArray(matchIn.path.segmentPrefixes) ||\n matchIn.path.segmentPrefixes.length === 0\n ) {\n return fail('path.segmentPrefixes must be non-empty when provided');\n }\n if (matchIn.path.segmentPrefixes.length > MAX_PATH_ENTRIES) {\n return fail('path.segmentPrefixes exceeds defensive limit');\n }\n path.segmentPrefixes = matchIn.path.segmentPrefixes\n .filter((p): p is string => isNonEmptyString(p) && isBoundedString(p))\n .map(p => p.trim().replace(/^\\/+|\\/+$/g, ''))\n .filter(Boolean);\n if (path.segmentPrefixes.length === 0) {\n return fail('path.segmentPrefixes has no valid entries');\n }\n }\n if (matchIn.path.template !== undefined) {\n if (!isNonEmptyString(matchIn.path.template)) {\n return fail('path.template must be non-empty when provided');\n }\n if (!isBoundedString(matchIn.path.template)) {\n return fail('path.template exceeds defensive limit');\n }\n const template = normalizePathname(matchIn.path.template.trim());\n const templateError = validateTemplateParams(template);\n if (templateError) return fail(templateError);\n path.template = template;\n }\n if (\n !path.exact &&\n !path.prefixes &&\n !path.segmentPrefixes &&\n !path.template\n ) {\n return fail(\n 'path must define exact, prefixes, segmentPrefixes, or template'\n );\n }\n match.path = path;\n }\n\n if (matchIn.query !== undefined) {\n if (!isPlainObject(matchIn.query)) {\n return fail('query must be an object when provided');\n }\n if (\n !Array.isArray(matchIn.query.conditions) ||\n matchIn.query.conditions.length === 0\n ) {\n return fail('query.conditions must be a non-empty array');\n }\n if (matchIn.query.conditions.length > MAX_QUERY_CONDITIONS) {\n return fail('query.conditions exceeds defensive limit');\n }\n if (\n matchIn.query.mode !== undefined &&\n matchIn.query.mode !== 'all' &&\n matchIn.query.mode !== 'any'\n ) {\n return fail('query.mode must be all or any');\n }\n const conditions: LinkQueryCondition[] = [];\n for (const condition of matchIn.query.conditions) {\n const normalized = normalizeQueryCondition(condition);\n if (!normalized) return fail('query condition is invalid');\n conditions.push(normalized);\n }\n match.query = {\n ...(matchIn.query.mode === 'all' || matchIn.query.mode === 'any'\n ? { mode: matchIn.query.mode }\n : {}),\n conditions,\n };\n }\n\n if (!hasUsefulMatch(match)) {\n return fail('match must include at least one useful rule');\n }\n\n const hasTemplate = Boolean(match.path?.template);\n let bindings: Record<string, LinkValueBinding> | undefined;\n\n if (input.bindings !== undefined) {\n if (!isPlainObject(input.bindings)) {\n return fail('bindings must be an object when provided');\n }\n const keys = Object.keys(input.bindings);\n if (keys.length > MAX_BINDINGS) {\n return fail('bindings exceeds defensive limit');\n }\n bindings = Object.create(null) as Record<string, LinkValueBinding>;\n const seenKeys = new Set<string>();\n for (const key of keys) {\n if (!isNonEmptyString(key)) return fail('binding key must be non-empty');\n const trimmedKey = key.trim();\n if (!isSafeObjectKey(trimmedKey)) {\n return fail(`binding key is reserved: ${trimmedKey}`);\n }\n if (seenKeys.has(trimmedKey)) {\n return fail(`binding key collision after trim: ${trimmedKey}`);\n }\n seenKeys.add(trimmedKey);\n const binding = input.bindings[key];\n const normalized = normalizeBinding(binding, hasTemplate);\n if (!normalized) {\n if (\n !hasTemplate &&\n isPlainObject(binding) &&\n JSON.stringify(binding).includes('\"pathParam\"')\n ) {\n return fail('pathParam requires path.template');\n }\n return fail(`binding ${key} is invalid`);\n }\n bindings[trimmedKey] = normalized;\n }\n }\n\n const debounceMs = normalizeTimerMs(input.debounceMs);\n const cooldownMs = normalizeTimerMs(input.cooldownMs);\n\n let selector: SelectorConfig | undefined;\n if (input.selector !== undefined) {\n const cloned = cloneSelector(input.selector);\n if (!cloned) return fail('selector is invalid');\n selector = cloned;\n }\n\n const source: LinkAutoSource = {\n name: input.name.trim(),\n type: 'link',\n match,\n ...(input.enabled === false ? { enabled: false } : {}),\n ...(input.fireOnce === true ? { fireOnce: true } : {}),\n ...(debounceMs !== undefined ? { debounceMs } : {}),\n ...(cooldownMs !== undefined ? { cooldownMs } : {}),\n ...(input.trigger === 'click' ? { trigger: 'click' } : {}),\n ...(selector !== undefined ? { selector } : {}),\n ...(input.selectorType === 'css' ||\n input.selectorType === 'id' ||\n input.selectorType === 'class' ||\n input.selectorType === 'attribute' ||\n input.selectorType === 'text'\n ? { selectorType: input.selectorType }\n : {}),\n ...(bindings ? { bindings } : {}),\n };\n\n return { ok: true, source };\n}\n\n/**\n * Valida e clona uma source `link`. Nunca lança.\n */\nexport function normalizeLinkAutoSource(\n input: LinkAutoSource | unknown\n): NormalizeLinkAutoSourceResult {\n try {\n return normalizeLinkAutoSourceInner(input);\n } catch {\n return fail('source normalization failed');\n }\n}\n","/**\n * Detector de source `type: 'link'`.\n *\n * Event delegation em `document` (capture). Nunca chama preventDefault\n * nem altera navegação. Tracking ocorre também com meta/ctrl (nova aba).\n *\n * Política disabled: ignora se o matched element ou o anchor tiverem\n * `disabled` / `aria-disabled=\"true\"`.\n */\n\nimport type { LinkAutoSource } from '@/config/shared/auto-source';\nimport type { SelectorType } from '@/config/shared/selector';\nimport { DEFAULT_SELECTOR_TYPE } from '@/config/shared/selector';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport {\n isLinkSupportedEvent,\n mapLinkBindingsToEvent,\n} from '../../auto/link/LinkAutoEventMapper';\nimport {\n formatMatchedPathForDiagnostics,\n matchLinkTarget,\n} from '../../auto/link/LinkTargetMatcher';\nimport { resolveLinkBindings } from '../../auto/link/LinkValueResolver';\nimport { normalizeLinkAutoSource } from '../../auto/link/normalizeLinkAutoSource';\nimport type {\n ConversionEventOrigin,\n ConversionEventType,\n} from '../../contracts';\nimport { SelectorResolver } from '../SelectorResolver';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nexport type ConfiguredLinkOptions = {\n readonly eventType: ConversionEventType;\n readonly source: LinkAutoSource;\n readonly origin?: ConversionEventOrigin;\n};\n\nexport type LinkDetectorDebugSnapshot = {\n readonly sourceName: string;\n readonly sourceType: 'link';\n readonly eventType: ConversionEventType;\n readonly enabled: boolean;\n readonly initialized: boolean;\n readonly matches: number;\n readonly ignoredClicks: number;\n readonly invalidUrl: number;\n readonly unsupportedProtocol: number;\n readonly missingRequired: number;\n readonly mapperRejected: number;\n readonly fired: number;\n readonly fireOnceBlocked: number;\n readonly debounceBlocked: number;\n readonly cooldownBlocked: number;\n readonly lastIgnoredReason: string | null;\n readonly lastResolvedKeys: readonly string[];\n readonly lastHostname: string | null;\n /** Path da regra de match (nunca o pathname real do usuário). */\n readonly lastPathname: string | null;\n};\n\nconst SUPPORTED_PROTOCOLS = new Set(['http:', 'https:']);\n\nfunction isDisabled(el: Element): boolean {\n if (el.hasAttribute('disabled')) return true;\n if (el.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\nfunction findAnchor(from: Element): HTMLAnchorElement | null {\n if (\n typeof HTMLAnchorElement !== 'undefined' &&\n from instanceof HTMLAnchorElement &&\n from.hasAttribute('href')\n ) {\n return from;\n }\n const closest = from.closest('a[href]');\n return closest instanceof HTMLAnchorElement ? closest : null;\n}\n\n/**\n * @deprecated Prefer `formatMatchedPathForDiagnostics` (regra de match).\n * Fallback: redige todos os segmentos — nunca preserva literais do pathname.\n */\nexport function sanitizePathnameForDiagnostics(pathname: string): string {\n const trimmed = pathname.trim();\n if (!trimmed || trimmed === '/') return '/';\n const withLeading = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n const normalized =\n withLeading.length > 1 && withLeading.endsWith('/')\n ? withLeading.slice(0, -1)\n : withLeading;\n if (normalized === '/') return '/';\n return (\n '/' +\n normalized\n .split('/')\n .filter(Boolean)\n .map(() => ':redacted')\n .join('/')\n );\n}\n\n/**\n * Normaliza href absoluto a partir do baseURI do documento.\n */\nexport function normalizeLinkHref(href: string, baseURI: string): URL | null {\n try {\n const url = new URL(href, baseURI);\n if (!SUPPORTED_PROTOCOLS.has(url.protocol)) {\n return null;\n }\n return url;\n } catch {\n return null;\n }\n}\n\nexport class ConfiguredLinkDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly eventType: ConversionEventType;\n\n private readonly source: LinkAutoSource;\n\n private readonly inactiveReason: string | null;\n\n private readonly resolver: SelectorResolver;\n\n private readonly selectorType: SelectorType;\n\n private readonly fireOnce: boolean;\n\n private readonly debounceMs: number;\n\n private readonly cooldownMs: number;\n\n private readonly origin: ConversionEventOrigin;\n\n private hasFired = false;\n\n private destroyed = false;\n\n private initialized = false;\n\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private lastFireAt = 0;\n\n private readonly stats = {\n matches: 0,\n ignoredClicks: 0,\n invalidUrl: 0,\n unsupportedProtocol: 0,\n missingRequired: 0,\n mapperRejected: 0,\n fired: 0,\n fireOnceBlocked: 0,\n debounceBlocked: 0,\n cooldownBlocked: 0,\n lastIgnoredReason: null as string | null,\n lastResolvedKeys: [] as string[],\n lastHostname: null as string | null,\n lastPathname: null as string | null,\n };\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n config: ConfiguredLinkOptions\n ) {\n super(context);\n this.factory = factory;\n this.eventType = config.eventType;\n\n const normalized = normalizeLinkAutoSource(config.source);\n if (!normalized.ok) {\n this.inactiveReason = normalized.reason;\n // Placeholder mínimo — listener não será instalado (fail closed).\n this.source = {\n name: config.source.name?.trim() || 'invalid-link',\n type: 'link',\n match: { path: { exact: ['/__invalid_link_source__'] } },\n };\n this.context.logger.debug(\n `[ConfiguredLinkDetector] inactive: ${normalized.reason}`\n );\n } else {\n this.inactiveReason = null;\n this.source = normalized.source;\n }\n\n this.selectorType = this.source.selectorType ?? DEFAULT_SELECTOR_TYPE;\n this.fireOnce = this.source.fireOnce === true;\n this.debounceMs =\n typeof this.source.debounceMs === 'number' &&\n Number.isFinite(this.source.debounceMs) &&\n this.source.debounceMs > 0\n ? this.source.debounceMs\n : 0;\n this.cooldownMs =\n typeof this.source.cooldownMs === 'number' &&\n Number.isFinite(this.source.cooldownMs) &&\n this.source.cooldownMs > 0\n ? this.source.cooldownMs\n : 0;\n this.origin =\n config.origin ??\n buildAutoSourceOrigin('link', config.eventType, this.source.name);\n this.resolver = new SelectorResolver(context.logger);\n }\n\n get name(): string {\n return `ConfiguredLink(${this.eventType}:${this.source.name})`;\n }\n\n get isActive(): boolean {\n return this.inactiveReason === null && this.source.enabled !== false;\n }\n\n getDebugSnapshot(): LinkDetectorDebugSnapshot {\n return {\n sourceName: this.source.name,\n sourceType: 'link',\n eventType: this.eventType,\n enabled: this.isActive,\n initialized: this.initialized,\n matches: this.stats.matches,\n ignoredClicks: this.stats.ignoredClicks,\n invalidUrl: this.stats.invalidUrl,\n unsupportedProtocol: this.stats.unsupportedProtocol,\n missingRequired: this.stats.missingRequired,\n mapperRejected: this.stats.mapperRejected,\n fired: this.stats.fired,\n fireOnceBlocked: this.stats.fireOnceBlocked,\n debounceBlocked: this.stats.debounceBlocked,\n cooldownBlocked: this.stats.cooldownBlocked,\n lastIgnoredReason: this.inactiveReason ?? this.stats.lastIgnoredReason,\n lastResolvedKeys: [...this.stats.lastResolvedKeys],\n lastHostname: this.stats.lastHostname,\n lastPathname: this.stats.lastPathname,\n };\n }\n\n protected onInit(): void {\n this.destroyed = false;\n this.hasFired = false;\n this.lastFireAt = 0;\n this.initialized = true;\n if (this.inactiveReason) return;\n if (this.source.enabled === false) return;\n if (!this.isDocumentAvailable()) return;\n if (!isLinkSupportedEvent(this.eventType)) return;\n this.addDocumentListener('click', event => this.handleClick(event), true);\n }\n\n protected onDestroy(): void {\n this.destroyed = true;\n this.initialized = false;\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n }\n\n private ignore(reason: string): void {\n this.stats.ignoredClicks += 1;\n this.stats.lastIgnoredReason = reason;\n }\n\n private handleClick(event: MouseEvent): void {\n if (this.destroyed || this.inactiveReason) return;\n if (this.source.enabled === false) return;\n if (this.fireOnce && this.hasFired) {\n this.stats.fireOnceBlocked += 1;\n return;\n }\n\n try {\n if (typeof event.button === 'number' && event.button !== 0) {\n this.ignore('non-primary-button');\n return;\n }\n\n const resolved = this.resolveClickElements(event);\n if (!resolved) {\n this.ignore('no-match');\n return;\n }\n const { anchor, target } = resolved;\n\n if (isDisabled(target) || isDisabled(anchor)) {\n this.ignore('disabled');\n return;\n }\n\n const href = anchor.getAttribute('href');\n if (!href || href.trim() === '') {\n this.ignore('missing-href');\n return;\n }\n\n const lower = href.trim().toLowerCase();\n if (\n lower.startsWith('mailto:') ||\n lower.startsWith('tel:') ||\n lower.startsWith('javascript:')\n ) {\n this.stats.unsupportedProtocol += 1;\n this.ignore('unsupported-protocol');\n return;\n }\n\n const baseURI =\n typeof document !== 'undefined' && document.baseURI\n ? document.baseURI\n : 'https://localhost/';\n const url = normalizeLinkHref(href, baseURI);\n if (!url) {\n this.stats.invalidUrl += 1;\n this.ignore('invalid-url');\n return;\n }\n\n if (!SUPPORTED_PROTOCOLS.has(url.protocol)) {\n this.stats.unsupportedProtocol += 1;\n this.ignore('unsupported-protocol');\n return;\n }\n\n const matchResult = matchLinkTarget(url, this.source.match);\n if (!matchResult.matched) {\n this.ignore('target-mismatch');\n return;\n }\n\n this.stats.matches += 1;\n this.stats.lastHostname = url.hostname;\n this.stats.lastPathname = formatMatchedPathForDiagnostics(\n matchResult.matchedPath\n );\n\n const resolution = resolveLinkBindings(this.source.bindings, {\n anchor,\n target,\n url,\n pathParams: matchResult.pathParams,\n });\n\n this.stats.lastResolvedKeys = Object.keys(resolution.values);\n\n if (!resolution.valid) {\n this.stats.missingRequired += 1;\n this.ignore(`missing-required:${resolution.missingRequired.join(',')}`);\n this.context.logger.debug(\n `[ConfiguredLinkDetector] ${this.source.name} missing required bindings`,\n resolution.missingRequired\n );\n return;\n }\n\n const mapped = mapLinkBindingsToEvent(this.eventType, resolution.values);\n if (!mapped.ok) {\n this.stats.mapperRejected += 1;\n this.ignore(`mapper:${mapped.reason}`);\n this.context.logger.debug(\n `[ConfiguredLinkDetector] ${this.source.name} mapper rejected: ${mapped.reason}`\n );\n return;\n }\n\n if (mapped.unknownKeys?.length) {\n this.context.logger.debug(\n `[ConfiguredLinkDetector] ${this.source.name} unknown binding keys ignored`,\n mapped.unknownKeys\n );\n }\n\n this.scheduleFire(mapped.data);\n } catch (error) {\n this.ignore('exception');\n this.context.logger.debug(\n `[ConfiguredLinkDetector] ${this.eventType} ignored:`,\n error\n );\n }\n }\n\n private scheduleFire(data: Parameters<TrackerFactory['trackAuto']>[1]): void {\n const now = Date.now();\n if (this.cooldownMs > 0 && now - this.lastFireAt < this.cooldownMs) {\n this.stats.cooldownBlocked += 1;\n return;\n }\n\n if (this.debounceMs > 0) {\n this.stats.debounceBlocked += 1;\n this.debounceTimer = this.clearManagedTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.fire(data);\n }, this.debounceMs);\n return;\n }\n\n this.fire(data);\n }\n\n private fire(data: Parameters<TrackerFactory['trackAuto']>[1]): void {\n if (this.destroyed || this.inactiveReason) return;\n if (this.source.enabled === false) return;\n if (this.fireOnce && this.hasFired) {\n this.stats.fireOnceBlocked += 1;\n return;\n }\n\n this.factory.trackAuto(this.eventType, data, { origin: this.origin });\n this.stats.fired += 1;\n this.lastFireAt = Date.now();\n if (this.fireOnce) {\n this.hasFired = true;\n }\n }\n\n /**\n * 1) Resolve o `<a href>` a partir do event.target\n * 2) Se houver selector, exige que o match esteja no anchor, no target\n * do clique ou em um ancestral do anchor (container).\n */\n private resolveClickElements(\n event: Event\n ): { anchor: HTMLAnchorElement; target: Element } | null {\n const clickTarget = event.target instanceof Element ? event.target : null;\n if (!clickTarget) return null;\n\n const anchor = findAnchor(clickTarget);\n if (!anchor) return null;\n\n if (!this.source.selector) {\n return { anchor, target: anchor };\n }\n\n // Candidatos: click target → ancestrais até document; inclui o anchor.\n const candidates: Element[] = [];\n let current: Element | null = clickTarget;\n while (current && current !== document.documentElement) {\n candidates.push(current);\n current = current.parentElement;\n }\n if (!candidates.includes(anchor)) {\n candidates.unshift(anchor);\n }\n\n for (const element of candidates) {\n if (\n this.resolver.matches(element, this.source.selector, this.selectorType)\n ) {\n return { anchor, target: element };\n }\n }\n\n return null;\n }\n}\n","import type { SelectorAutoSource } from '@/config/shared/auto-source';\nimport type { SelectorType } from '@/config/shared/selector';\nimport { DEFAULT_SELECTOR_TYPE } from '@/config/shared/selector';\nimport type { ConversionEventData } from '@/events/conversion';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport { CustomerExtractor, ProductExtractor } from '../../commerce';\nimport type {\n ConversionEventOrigin,\n ConversionEventType,\n} from '../../contracts';\nimport { SelectorResolver } from '../SelectorResolver';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nexport type ConfiguredSelectorOptions = {\n readonly eventType: ConversionEventType;\n readonly source: SelectorAutoSource;\n readonly origin?: ConversionEventOrigin;\n};\n\n/**\n * Detector de source `type: 'selector'`.\n * Extrai dados mínimos via extractors e dispara via TrackerFactory.trackAuto.\n */\nexport class ConfiguredSelectorDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly config: ConfiguredSelectorOptions;\n\n private readonly resolver: SelectorResolver;\n\n private readonly selectorType: SelectorType;\n\n private readonly fireOnce: boolean;\n\n private readonly trigger: 'click' | 'submit' | 'both';\n\n private readonly origin: ConversionEventOrigin;\n\n private readonly customerExtractor: CustomerExtractor;\n\n private readonly productExtractor: ProductExtractor;\n\n private hasFired = false;\n\n private destroyed = false;\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n config: ConfiguredSelectorOptions\n ) {\n super(context);\n this.factory = factory;\n this.config = config;\n this.selectorType = config.source.selectorType ?? DEFAULT_SELECTOR_TYPE;\n this.fireOnce = config.source.fireOnce === true;\n this.trigger = config.source.trigger ?? 'both';\n this.origin =\n config.origin ??\n buildAutoSourceOrigin('selector', config.eventType, config.source.name);\n this.resolver = new SelectorResolver(context.logger);\n\n const commerce = context.services.commerce.config;\n this.customerExtractor = new CustomerExtractor({\n fieldMappings: commerce?.mappings?.fields,\n });\n this.productExtractor = new ProductExtractor({\n attributeMappings: commerce?.mappings?.attributes,\n fieldMappings: commerce?.mappings?.fields,\n });\n }\n\n get name(): string {\n return `ConfiguredSelector(${this.config.eventType}:${this.config.source.name})`;\n }\n\n protected onInit(): void {\n this.destroyed = false;\n this.hasFired = false;\n if (!this.isDocumentAvailable()) return;\n\n if (this.trigger === 'click' || this.trigger === 'both') {\n this.addDocumentListener('click', event => this.handleEvent(event), true);\n }\n if (this.trigger === 'submit' || this.trigger === 'both') {\n this.addDocumentListener(\n 'submit',\n event => this.handleEvent(event),\n true\n );\n }\n }\n\n protected onDestroy(): void {\n this.destroyed = true;\n }\n\n private handleEvent(event: Event): void {\n if (this.destroyed) return;\n if (this.fireOnce && this.hasFired) return;\n\n try {\n if (this.trigger === 'click' && event.type !== 'click') return;\n if (this.trigger === 'submit' && event.type !== 'submit') return;\n\n const matched = this.findMatchedElement(event);\n if (!matched) return;\n\n const data = this.extractData(matched);\n if (data === null) return;\n\n this.factory.trackAuto(this.config.eventType, data, {\n origin: this.origin,\n });\n\n if (this.fireOnce) {\n this.hasFired = true;\n }\n } catch (error) {\n this.context.logger.debug(\n `[ConfiguredSelectorDetector] ${this.config.eventType} ignored:`,\n error\n );\n }\n }\n\n private findMatchedElement(event: Event): Element | null {\n const candidates: Element[] = [];\n\n if (event.type === 'submit' && event.target instanceof Element) {\n candidates.push(event.target);\n }\n\n let current: Element | null =\n event.target instanceof Element ? event.target : null;\n\n while (current && current !== document.documentElement) {\n candidates.push(current);\n current = current.parentElement;\n }\n\n for (const element of candidates) {\n if (\n this.resolver.matches(\n element,\n this.config.source.selector,\n this.selectorType\n )\n ) {\n return element;\n }\n }\n\n return null;\n }\n\n private extractData(element: Element): ConversionEventData | null {\n const { eventType } = this.config;\n\n if (eventType === 'LEAD') {\n const customer = this.customerExtractor.extractFromElement(element);\n if (!customer.email && !customer.phone && !customer.name) {\n this.context.logger.debug(\n '[ConfiguredSelectorDetector] LEAD skipped: no email/phone/name'\n );\n return null;\n }\n return {\n ...(customer.email ? { email: customer.email } : {}),\n ...(customer.phone ? { phone: customer.phone } : {}),\n ...(customer.name ? { name: customer.name } : {}),\n };\n }\n\n if (eventType === 'ADD_TO_CART' || eventType === 'REMOVE_FROM_CART') {\n const product = this.productExtractor.extractFromElement(element);\n if (eventType === 'REMOVE_FROM_CART') {\n return {\n ...(product.productId ? { productId: product.productId } : {}),\n ...(product.quantity != null ? { quantity: product.quantity } : {}),\n };\n }\n return {\n ...(product.productId ? { productId: product.productId } : {}),\n ...(product.productName ? { productName: product.productName } : {}),\n ...(product.price != null ? { price: product.price } : {}),\n ...(product.currency ? { currency: product.currency } : {}),\n ...(product.quantity != null ? { quantity: product.quantity } : {}),\n };\n }\n\n if (eventType === 'SEARCH') {\n const query =\n element.getAttribute('data-query') ??\n (typeof HTMLInputElement !== 'undefined' &&\n element instanceof HTMLInputElement\n ? element.value\n : '');\n if (!query.trim()) return null;\n return { query: query.trim() };\n }\n\n if (eventType === 'INITIATE_CHECKOUT' || eventType === 'PURCHASE') {\n return {};\n }\n\n if (eventType === 'VIEW_CONTENT') {\n const product = this.productExtractor.extractFromElement(element);\n return {\n ...(product.productId ? { contentId: product.productId } : {}),\n ...(product.price != null ? { value: product.price } : {}),\n ...(product.currency ? { currency: product.currency } : {}),\n };\n }\n\n return {};\n }\n}\n","const CARD_NUMBER_IDS = [\n 'card_number',\n 'cardNumber',\n 'card-number',\n 'cc_number',\n];\nconst CARD_NUMBER_NAMES = ['card_number', 'cardNumber', 'cc_number'];\nconst CVV_IDS = ['cvv', 'cvc', 'security_code'];\nconst CVV_NAMES = ['cvv', 'cvc', 'security_code'];\n\nfunction isVisibleInput(el: HTMLInputElement): boolean {\n return el.type !== 'hidden' && !el.disabled;\n}\n\nfunction inputHasValue(input: HTMLInputElement): boolean {\n return input.value.length > 0;\n}\n\nfunction resolveRoot(root?: ParentNode | null): ParentNode | null {\n if (typeof document === 'undefined') return null;\n return root ?? document;\n}\n\nfunction findStartedByIdOrName(\n ids: string[],\n names: string[],\n root?: ParentNode | null\n): boolean {\n const scope = resolveRoot(root);\n if (!scope) return false;\n\n for (const id of ids) {\n const el =\n scope === document\n ? document.getElementById(id)\n : scope.querySelector(`#${cssEscape(id)}`);\n if (\n el instanceof HTMLInputElement &&\n isVisibleInput(el) &&\n inputHasValue(el)\n ) {\n return true;\n }\n }\n\n for (const name of names) {\n const elements = scope.querySelectorAll(`input[name=\"${name}\"]`);\n for (const el of elements) {\n if (\n el instanceof HTMLInputElement &&\n isVisibleInput(el) &&\n inputHasValue(el)\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction findStartedByAutocomplete(\n value: string,\n root?: ParentNode | null\n): boolean {\n const scope = resolveRoot(root);\n if (!scope) return false;\n\n const elements = scope.querySelectorAll(`input[autocomplete=\"${value}\"]`);\n for (const el of elements) {\n if (\n el instanceof HTMLInputElement &&\n isVisibleInput(el) &&\n inputHasValue(el)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction cssEscape(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/([^a-zA-Z0-9_-])/g, '\\\\$1');\n}\n\n/**\n * Detecta início de preenchimento — nenhum valor é armazenado ou retornado.\n * `root` restringe a busca (ex.: formSelector do PaymentSource).\n */\nexport function scanPaymentInputStarted(root?: ParentNode | null): boolean {\n return (\n findStartedByAutocomplete('cc-number', root) ||\n findStartedByIdOrName(CARD_NUMBER_IDS, CARD_NUMBER_NAMES, root) ||\n findStartedByAutocomplete('cc-exp', root) ||\n findStartedByAutocomplete('cc-exp-month', root) ||\n findStartedByAutocomplete('cc-exp-year', root) ||\n findStartedByAutocomplete('cc-csc', root) ||\n findStartedByIdOrName(CVV_IDS, CVV_NAMES, root)\n );\n}\n","import type { PaymentAutoSource } from '@/config/shared/auto-source';\nimport type { PaymentMethod as EventPaymentMethod } from '@/events/conversion';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport type { ConversionEventOrigin } from '../../contracts';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\nimport { scanPaymentInputStarted } from './card-field-detection';\n\nconst FIELD_EVENTS = ['input', 'change', 'focusin'] as const;\n\nexport type CardDetectorOptions = {\n readonly source?: PaymentAutoSource;\n readonly origin?: ConversionEventOrigin;\n};\n\nexport class CardDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly paymentMethod: EventPaymentMethod;\n\n private readonly fireOnce: boolean;\n\n private readonly formSelector: string | undefined;\n\n private readonly origin: ConversionEventOrigin;\n\n private checkTimer: ReturnType<typeof setTimeout> | null = null;\n\n private tracked = false;\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n options?: CardDetectorOptions\n ) {\n super(context);\n this.factory = factory;\n const source = options?.source;\n this.paymentMethod = normalizePaymentMethod(source?.paymentMethod);\n this.fireOnce = source?.fireOnce !== false;\n this.formSelector = source?.formSelector;\n this.origin =\n options?.origin ??\n (source\n ? buildAutoSourceOrigin('payment', 'ADD_PAYMENT_INFO', source.name)\n : 'auto:card');\n }\n\n get name(): string {\n const sourceName = this.origin.includes(':')\n ? this.origin.split(':').pop()\n : 'card';\n return `CardDetector(${sourceName})`;\n }\n\n protected onInit(): void {\n this.tracked = false;\n if (!this.isDocumentAvailable()) return;\n\n for (const eventName of FIELD_EVENTS) {\n this.addDocumentListener(eventName, () => this.scheduleCheck(), true);\n }\n\n this.observeDom(() => this.scheduleCheck());\n this.scheduleCheck();\n }\n\n protected onDestroy(): void {\n this.checkTimer = this.clearManagedTimeout(this.checkTimer);\n this.tracked = false;\n }\n\n private scheduleCheck(): void {\n if (this.fireOnce && this.tracked) return;\n this.checkTimer = this.clearManagedTimeout(this.checkTimer);\n this.checkTimer = setTimeout(() => {\n this.checkTimer = null;\n this.evaluate();\n }, 300);\n }\n\n private evaluate(): void {\n if ((this.fireOnce && this.tracked) || !this.isDocumentAvailable()) return;\n\n const root = this.resolveFormRoot();\n if (this.formSelector && !root) return;\n if (!scanPaymentInputStarted(root)) return;\n\n this.tracked = true;\n this.factory.trackAuto(\n 'ADD_PAYMENT_INFO',\n { paymentMethod: this.paymentMethod },\n { origin: this.origin }\n );\n }\n\n /**\n * Retorna o container do formSelector, ou document se não houver restrição.\n * null = formSelector configurado mas não encontrado.\n */\n private resolveFormRoot(): ParentNode | null {\n if (!this.formSelector || typeof document === 'undefined') {\n return typeof document !== 'undefined' ? document : null;\n }\n try {\n return document.querySelector(this.formSelector);\n } catch {\n return null;\n }\n }\n}\n\nfunction normalizePaymentMethod(value: string | undefined): EventPaymentMethod {\n switch (value) {\n case 'CREDIT_CARD':\n case 'PIX':\n case 'BOLETO':\n case 'PAYPAL':\n case 'OTHER':\n return value;\n case 'BANK_SLIP':\n return 'BOLETO';\n default:\n return 'CREDIT_CARD';\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nconst CHECKOUT_SELECTORS = [\n 'form[action*=\"checkout\"]',\n '[data-checkout]',\n '[name=\"checkout\"]',\n 'button[name=\"checkout\"]',\n 'a[href*=\"checkout\"]',\n];\n\nexport class CheckoutDetector extends BaseAutoTracker {\n readonly name = 'CheckoutDetector';\n private readonly factory: TrackerFactory;\n\n constructor(context: PixelRuntimeContext, factory: TrackerFactory) {\n super(context);\n this.factory = factory;\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n this.addDocumentListener('click', event => this.handleClick(event), true);\n this.addDocumentListener('submit', event => this.handleSubmit(event), true);\n }\n\n protected onDestroy(): void {}\n\n private handleClick(event: Event): void {\n const element =\n event.target instanceof Element\n ? event.target.closest('a,button,[role=\"button\"],input[type=\"submit\"]')\n : null;\n\n if (!element) return;\n\n const text = element.textContent?.toLowerCase() ?? '';\n const href = (element as HTMLAnchorElement).href?.toLowerCase() ?? '';\n\n const isCheckout =\n CHECKOUT_SELECTORS.some(selector => element.matches(selector)) ||\n (text.includes('checkout') && !text.includes('continue shopping')) ||\n (text.includes('finalizar') && text.includes('compra')) ||\n href.includes('/checkout');\n\n if (isCheckout) {\n this.factory.trackAuto(\n 'INITIATE_CHECKOUT',\n {},\n {\n origin: 'auto:checkout',\n }\n );\n }\n }\n\n private handleSubmit(event: Event): void {\n const form = event.target instanceof HTMLFormElement ? event.target : null;\n if (!form) return;\n\n const action = form.getAttribute('action')?.toLowerCase() ?? '';\n if (action.includes('checkout') || form.matches('[data-checkout]')) {\n this.factory.trackAuto(\n 'INITIATE_CHECKOUT',\n {},\n {\n origin: 'auto:checkout',\n }\n );\n }\n }\n}\n","import type { LifecycleAutoSource } from '@/config/shared/auto-source';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport type {\n ConversionEventOrigin,\n ConversionEventType,\n} from '../../contracts';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nexport type LifecycleAutoDetectorOptions = {\n readonly eventType: ConversionEventType;\n readonly source: LifecycleAutoSource;\n readonly origin?: ConversionEventOrigin;\n};\n\n/**\n * Dispara evento no lifecycle do Pixel (init/ready), sem listeners DOM.\n */\nexport class LifecycleAutoDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly options: LifecycleAutoDetectorOptions;\n\n private readonly fireOnce: boolean;\n\n private readonly origin: ConversionEventOrigin;\n\n private hasFired = false;\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n options: LifecycleAutoDetectorOptions\n ) {\n super(context);\n this.factory = factory;\n this.options = options;\n this.fireOnce = options.source.fireOnce !== false;\n this.origin =\n options.origin ??\n buildAutoSourceOrigin(\n 'lifecycle',\n options.eventType,\n options.source.name\n );\n }\n\n get name(): string {\n return `Lifecycle(${this.options.eventType}:${this.options.source.name})`;\n }\n\n protected onInit(): void {\n this.hasFired = false;\n // init e ready: no momento do init do detector o Pixel já está pronto.\n this.fire();\n }\n\n protected onDestroy(): void {\n this.hasFired = false;\n }\n\n private fire(): void {\n if (this.fireOnce && this.hasFired) return;\n\n this.factory.trackAuto(\n this.options.eventType,\n {},\n {\n origin: this.origin,\n }\n );\n\n if (this.fireOnce) {\n this.hasFired = true;\n }\n }\n}\n","import type { SelectorType } from '@/config/shared/selector';\n\nimport type { ConversionEventType } from '../../contracts';\n\nconst DATA_TRACK_EVENT_MAP: Record<string, ConversionEventType> = {\n purchase: 'PURCHASE',\n lead: 'LEAD',\n add_to_cart: 'ADD_TO_CART',\n addtocart: 'ADD_TO_CART',\n remove_from_cart: 'REMOVE_FROM_CART',\n removefromcart: 'REMOVE_FROM_CART',\n initiate_checkout: 'INITIATE_CHECKOUT',\n initiatecheckout: 'INITIATE_CHECKOUT',\n checkout: 'INITIATE_CHECKOUT',\n add_payment_info: 'ADD_PAYMENT_INFO',\n addpaymentinfo: 'ADD_PAYMENT_INFO',\n view_content: 'VIEW_CONTENT',\n viewcontent: 'VIEW_CONTENT',\n search: 'SEARCH',\n};\n\nexport function resolveDataTrackEvent(\n value: string\n): ConversionEventType | null {\n const normalized = value.trim().toLowerCase().replace(/\\s+/g, '_');\n return DATA_TRACK_EVENT_MAP[normalized] ?? null;\n}\n\nexport function buildSelector(selector: string): string {\n if (\n selector.startsWith('[') ||\n selector.startsWith('.') ||\n selector.startsWith('#')\n ) {\n return selector;\n }\n return `[data-track=\"${selector}\"]`;\n}\n\nexport function buildSelectorFromConfig(\n selector: string,\n selectorType: SelectorType = 'css'\n): string {\n if (\n selector.startsWith('[') ||\n selector.startsWith('.') ||\n selector.startsWith('#')\n ) {\n return selector;\n }\n\n switch (selectorType) {\n case 'id':\n return selector.startsWith('#') ? selector : `#${selector}`;\n case 'class':\n return selector.startsWith('.') ? selector : `.${selector}`;\n case 'css':\n return selector;\n case 'text':\n // Text selectors are resolved by SelectorResolver (Etapa 12B).\n // Do not wrap as data-track — that would be incorrect.\n return selector;\n case 'attribute':\n return buildSelector(selector);\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { ConversionEventData } from '@/events/conversion';\n\nimport type { ConversionEventType } from '../../contracts';\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\nimport { buildSelector, resolveDataTrackEvent } from './selector-utils';\n\nexport class SelectorDetector extends BaseAutoTracker {\n readonly name = 'SelectorDetector';\n private readonly factory: TrackerFactory;\n\n private readonly selectors: string[];\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n selectors: string[] = []\n ) {\n super(context);\n this.factory = factory;\n this.selectors =\n selectors.length > 0 ? selectors : ['[data-track]', '[data-track-event]'];\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n this.addDocumentListener('click', event => this.handleClick(event), true);\n }\n\n protected onDestroy(): void {}\n\n private handleClick(event: Event): void {\n let element = event.target instanceof Element ? event.target : null;\n\n while (element && element !== document.body) {\n const match = this.matchElement(element);\n if (match) {\n this.factory.trackAuto(match.type, match.data, {\n origin: 'auto:selector',\n });\n return;\n }\n element = element.parentElement;\n }\n }\n\n private matchElement(\n element: Element\n ): { type: ConversionEventType; data: ConversionEventData } | null {\n for (const selector of this.selectors) {\n const built = buildSelector(selector);\n if (!element.matches(built)) continue;\n\n const trackValue =\n element.getAttribute('data-track') ??\n element.getAttribute('data-track-event') ??\n element.getAttribute('data-event');\n\n if (!trackValue) continue;\n\n const type = resolveDataTrackEvent(trackValue);\n if (!type) continue;\n\n const data: ConversionEventData = {};\n const valueAttr = element.getAttribute('data-track-value');\n if (valueAttr && type === 'PURCHASE') {\n Object.assign(data, { value: Number(valueAttr) || undefined });\n }\n\n return { type, data };\n }\n\n const dataTrack = element.getAttribute('data-track');\n if (dataTrack) {\n const type = resolveDataTrackEvent(dataTrack);\n if (type) return { type, data: {} };\n }\n\n return null;\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\n\nconst DEFAULT_KEYWORD_EVENTS: Array<{\n keyword: string;\n type: 'INITIATE_CHECKOUT' | 'ADD_TO_CART';\n}> = [\n { keyword: 'comprar agora', type: 'INITIATE_CHECKOUT' },\n { keyword: 'finalizar compra', type: 'INITIATE_CHECKOUT' },\n { keyword: 'checkout', type: 'INITIATE_CHECKOUT' },\n { keyword: 'comprar', type: 'ADD_TO_CART' },\n];\n\nexport class TextDetector extends BaseAutoTracker {\n readonly name = 'TextDetector';\n private readonly factory: TrackerFactory;\n\n private readonly keywords: string[];\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n keywords: string[] = []\n ) {\n super(context);\n this.factory = factory;\n this.keywords = keywords;\n }\n\n protected onInit(): void {\n if (!this.isDocumentAvailable()) return;\n this.addDocumentListener('click', event => this.handleClick(event), true);\n }\n\n protected onDestroy(): void {}\n\n private handleClick(event: Event): void {\n const element =\n event.target instanceof Element\n ? event.target.closest('a,button,[role=\"button\"],input[type=\"submit\"]')\n : null;\n\n if (!element?.textContent) return;\n\n const text = element.textContent.trim().toLowerCase();\n if (!text) return;\n\n for (const rule of DEFAULT_KEYWORD_EVENTS) {\n if (\n this.keywords.some(k => k.toLowerCase() === rule.keyword) &&\n text.includes(rule.keyword)\n ) {\n this.factory.trackAuto(\n rule.type,\n {},\n {\n origin: 'auto:text',\n }\n );\n return;\n }\n }\n\n for (const keyword of this.keywords) {\n const normalized = keyword.toLowerCase();\n if (text.includes(normalized)) {\n this.factory.trackAuto(\n 'INITIATE_CHECKOUT',\n {},\n {\n origin: 'auto:text',\n }\n );\n return;\n }\n }\n }\n}\n","/**\n * Coordenador de patch do History API para multi-instance.\n * Infraestrutura de browser — não armazena estado de negócio.\n */\ntype NavigationListener = () => void;\n\nexport class HistoryNavigationPatch {\n private static refCount = 0;\n\n private static readonly listeners = new Set<NavigationListener>();\n\n private static originalPushState: History['pushState'] | null = null;\n\n private static originalReplaceState: History['replaceState'] | null = null;\n\n private static installed = false;\n\n static subscribe(listener: NavigationListener): () => void {\n if (typeof window === 'undefined' || typeof history === 'undefined') {\n return () => {};\n }\n\n this.listeners.add(listener);\n this.refCount += 1;\n this.install();\n\n return () => {\n this.listeners.delete(listener);\n this.refCount -= 1;\n if (this.refCount <= 0) {\n this.uninstall();\n this.refCount = 0;\n }\n };\n }\n\n /** @internal Testes apenas. */\n static resetForTests(): void {\n this.listeners.clear();\n this.refCount = 0;\n this.uninstall();\n }\n\n private static install(): void {\n if (this.installed) return;\n\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n this.originalPushState?.(...args);\n this.notify();\n };\n\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n this.originalReplaceState?.(...args);\n this.notify();\n };\n\n this.installed = true;\n }\n\n private static uninstall(): void {\n if (!this.installed) return;\n\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n }\n\n this.originalPushState = null;\n this.originalReplaceState = null;\n this.installed = false;\n }\n\n private static notify(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BaseAutoTracker } from '../../auto/BaseAutoTracker';\nimport { buildAutoSourceOrigin } from '../../auto/build-auto-source-origin';\nimport type {\n ConversionEventOrigin,\n ConversionEventType,\n} from '../../contracts';\nimport type { TrackerFactory } from '../../tracks/TrackerFactory';\nimport { HistoryNavigationPatch } from './HistoryNavigationPatch';\n\nexport type UrlDetectorOptions = {\n readonly eventType?: ConversionEventType;\n readonly origin?: ConversionEventOrigin;\n readonly sourceName?: string;\n readonly fireOnce?: boolean;\n};\n\nexport class UrlDetector extends BaseAutoTracker {\n private readonly factory: TrackerFactory;\n\n private readonly patterns: RegExp[];\n\n private readonly eventType: ConversionEventType | undefined;\n\n private readonly origin: ConversionEventOrigin;\n\n private readonly fireOnce: boolean;\n\n private hasFired = false;\n\n private unsubscribeHistory: (() => void) | null = null;\n\n constructor(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n patterns: string[] = [],\n options?: UrlDetectorOptions\n ) {\n super(context);\n this.factory = factory;\n this.patterns = patterns.map(pattern => new RegExp(pattern, 'i'));\n this.eventType = options?.eventType;\n this.fireOnce = options?.fireOnce === true;\n this.origin =\n options?.origin ??\n (options?.sourceName && options.eventType\n ? buildAutoSourceOrigin('url', options.eventType, options.sourceName)\n : 'auto:url');\n }\n\n get name(): string {\n return this.eventType ? `UrlDetector(${this.eventType})` : 'UrlDetector';\n }\n\n protected onInit(): void {\n this.hasFired = false;\n if (!this.isWindowAvailable()) return;\n\n this.checkUrl();\n this.addWindowListener('popstate', () => this.checkUrl());\n this.unsubscribeHistory = HistoryNavigationPatch.subscribe(() =>\n this.checkUrl()\n );\n }\n\n protected onDestroy(): void {\n this.unsubscribeHistory?.();\n this.unsubscribeHistory = null;\n this.hasFired = false;\n }\n\n private checkUrl(): void {\n if (!this.isWindowAvailable()) return;\n if (this.fireOnce && this.hasFired) return;\n\n const href = window.location.href;\n const path = window.location.pathname;\n\n for (const pattern of this.patterns) {\n if (pattern.test(href) || pattern.test(path)) {\n const type =\n this.eventType ??\n (/thank|success|order|obrigado/i.test(pattern.source)\n ? 'PURCHASE'\n : 'INITIATE_CHECKOUT');\n\n this.factory.trackAuto(\n type,\n {},\n {\n origin: this.origin,\n }\n );\n\n if (this.fireOnce) {\n this.hasFired = true;\n }\n return;\n }\n }\n }\n}\n","import type {\n AutoConversionConfig,\n AutoDetectorConfig,\n} from '@/config/types/modules/conversion';\nimport type {\n AutoTrackSource,\n FormAutoSource,\n LifecycleAutoSource,\n LinkAutoSource,\n PaymentAutoSource,\n SelectorAutoSource,\n UrlAutoSource,\n} from '@/config/shared/auto-source';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type { ConversionEventType, IConversionDetector } from '../contracts';\nimport { TrackerFactory } from '../tracks/TrackerFactory';\nimport { ConfiguredFormDetector } from '../detectors/configured/ConfiguredFormDetector';\nimport type { FormCapableEventType } from '../detectors/configured/ConfiguredFormDetector';\nimport { ConfiguredLinkDetector } from '../detectors/configured/ConfiguredLinkDetector';\nimport { ConfiguredSelectorDetector } from '../detectors/configured/ConfiguredSelectorDetector';\nimport { CardDetector } from '../detectors/card/CardDetector';\nimport { CheckoutDetector } from '../detectors/checkout/CheckoutDetector';\nimport { LifecycleAutoDetector } from '../detectors/lifecycle/LifecycleAutoDetector';\nimport { SelectorDetector } from '../detectors/selector/SelectorDetector';\nimport { SelectorResolver } from '../detectors/SelectorResolver';\nimport { TextDetector } from '../detectors/text/TextDetector';\nimport { UrlDetector } from '../detectors/url/UrlDetector';\nimport { isLinkSupportedEvent } from './link/LinkAutoEventMapper';\nimport { normalizeLinkAutoSource } from './link/normalizeLinkAutoSource';\n\ntype DetectorConfigEntry = {\n readonly configKey: keyof AutoConversionConfig['detectors'];\n readonly eventType: ConversionEventType;\n};\n\nconst DETECTOR_ENTRIES: readonly DetectorConfigEntry[] = [\n { configKey: 'lead', eventType: 'LEAD' },\n { configKey: 'addToCart', eventType: 'ADD_TO_CART' },\n { configKey: 'removeFromCart', eventType: 'REMOVE_FROM_CART' },\n { configKey: 'initiateCheckout', eventType: 'INITIATE_CHECKOUT' },\n { configKey: 'purchase', eventType: 'PURCHASE' },\n { configKey: 'addPaymentInfo', eventType: 'ADD_PAYMENT_INFO' },\n { configKey: 'search', eventType: 'SEARCH' },\n { configKey: 'viewContent', eventType: 'VIEW_CONTENT' },\n];\n\nconst FORM_EVENT_TYPES = new Set<ConversionEventType>([\n 'LEAD',\n 'ADD_TO_CART',\n 'INITIATE_CHECKOUT',\n]);\n\n/**\n * Orquestra auto-detectors a partir de `detectors[event].sources[]`.\n *\n * Cada source vira um detector independente — não há mais\n * prioridade selectorForm > selector no mesmo detector.\n */\nexport class AutoTrackerFactory {\n static create(\n context: PixelRuntimeContext,\n factory: TrackerFactory\n ): IConversionDetector[] {\n const { auto, rules } = context.config.modules.conversion;\n const detectors: IConversionDetector[] = [];\n const logger = context.logger;\n\n if (!auto.enabled) {\n logger.debug('[AutoTrackerFactory] Auto detection disabled');\n return detectors;\n }\n\n detectors.push(...this.createSourceDetectors(context, factory, auto));\n\n if (rules.enabled) {\n if (rules.selectors.length > 0) {\n detectors.push(new SelectorDetector(context, factory, rules.selectors));\n logger.debug('[AutoTrackerFactory] SelectorDetector registered');\n }\n if (rules.texts.length > 0) {\n detectors.push(new TextDetector(context, factory, rules.texts));\n logger.debug('[AutoTrackerFactory] TextDetector registered');\n }\n if (rules.urlPatterns.length > 0) {\n detectors.push(new UrlDetector(context, factory, rules.urlPatterns));\n logger.debug('[AutoTrackerFactory] UrlDetector registered');\n }\n if (rules.checkout.enabled) {\n detectors.push(new CheckoutDetector(context, factory));\n logger.debug('[AutoTrackerFactory] CheckoutDetector registered');\n }\n if (rules.card.enabled) {\n detectors.push(new CardDetector(context, factory));\n logger.debug('[AutoTrackerFactory] CardDetector registered (rules)');\n }\n }\n\n logger.debug(\n `[AutoTrackerFactory] Created ${detectors.length} detector(s)`\n );\n\n return detectors;\n }\n\n private static createSourceDetectors(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n auto: AutoConversionConfig\n ): IConversionDetector[] {\n const detectors: IConversionDetector[] = [];\n const resolver = new SelectorResolver(context.logger);\n const logger = context.logger;\n const rulesCardActive = context.config.modules.conversion.rules.enabled\n ? context.config.modules.conversion.rules.card.enabled\n : false;\n\n for (const entry of DETECTOR_ENTRIES) {\n const cfg: AutoDetectorConfig = auto.detectors[entry.configKey];\n if (!cfg.enabled) {\n logger.debug(\n `[AutoTrackerFactory] Skipped disabled detector: ${entry.configKey}`\n );\n continue;\n }\n\n const sources = cfg.sources ?? [];\n for (const source of sources) {\n if (source.enabled === false) {\n logger.debug(\n `[AutoTrackerFactory] Skipped disabled source: ${entry.configKey}/${source.name}`\n );\n continue;\n }\n\n const created = this.createDetectorForSource(\n context,\n factory,\n entry.eventType,\n source,\n resolver,\n { rulesCardActive }\n );\n\n if (created) {\n if (\n source.type === 'payment' &&\n (source as PaymentAutoSource).cardDetection !== false\n ) {\n // Evita CardDetector duplicado se rules.card também estiver on\n // (rules já criou um; sources payment ainda podem rodar com origin própria).\n void rulesCardActive;\n }\n detectors.push(created);\n logger.debug(\n `[AutoTrackerFactory] ${created.name ?? source.type} registered for ${entry.eventType}`\n );\n }\n }\n }\n\n return detectors;\n }\n\n private static createDetectorForSource(\n context: PixelRuntimeContext,\n factory: TrackerFactory,\n eventType: ConversionEventType,\n source: AutoTrackSource,\n resolver: SelectorResolver,\n _opts: { rulesCardActive: boolean }\n ): IConversionDetector | null {\n const logger = context.logger;\n\n switch (source.type) {\n case 'form': {\n if (!FORM_EVENT_TYPES.has(eventType)) {\n logger.debug(\n `[AutoTrackerFactory] Skipped form source for unsupported event: ${eventType}`\n );\n return null;\n }\n return new ConfiguredFormDetector(context, factory, {\n eventType: eventType as FormCapableEventType,\n source: source as FormAutoSource,\n });\n }\n\n case 'selector': {\n const selectorSource = source as SelectorAutoSource;\n if (!resolver.hasEntries(selectorSource.selector)) {\n logger.debug(\n `[AutoTrackerFactory] Skipped selector source ${source.name}: empty selector`\n );\n return null;\n }\n return new ConfiguredSelectorDetector(context, factory, {\n eventType,\n source: selectorSource,\n });\n }\n\n case 'payment': {\n if (eventType !== 'ADD_PAYMENT_INFO') {\n logger.debug(\n `[AutoTrackerFactory] Skipped payment source for ${eventType}`\n );\n return null;\n }\n const payment = source as PaymentAutoSource;\n if (payment.cardDetection === false) {\n logger.debug(\n `[AutoTrackerFactory] Skipped payment source ${source.name}: cardDetection false`\n );\n return null;\n }\n if (payment.autoDispatch === false) {\n logger.debug(\n `[AutoTrackerFactory] Skipped payment source ${source.name}: autoDispatch false`\n );\n return null;\n }\n return new CardDetector(context, factory, { source: payment });\n }\n\n case 'lifecycle': {\n return new LifecycleAutoDetector(context, factory, {\n eventType,\n source: source as LifecycleAutoSource,\n });\n }\n\n case 'url': {\n const urlSource = source as UrlAutoSource;\n if (!urlSource.patterns?.length) {\n logger.debug(\n `[AutoTrackerFactory] Skipped url source ${source.name}: empty patterns`\n );\n return null;\n }\n return new UrlDetector(context, factory, urlSource.patterns, {\n eventType,\n sourceName: urlSource.name,\n fireOnce: urlSource.fireOnce,\n });\n }\n\n case 'link': {\n if (!isLinkSupportedEvent(eventType)) {\n logger.debug(\n `[AutoTrackerFactory] Skipped link source for unsupported event: ${eventType}`\n );\n return null;\n }\n let normalized;\n try {\n normalized = normalizeLinkAutoSource(source as LinkAutoSource);\n } catch (error) {\n logger.debug(\n `[AutoTrackerFactory] Skipped link source ${source.name}: normalization threw`,\n error\n );\n return null;\n }\n if (!normalized.ok) {\n logger.debug(\n `[AutoTrackerFactory] Skipped link source ${source.name}: ${normalized.reason}`\n );\n return null;\n }\n return new ConfiguredLinkDetector(context, factory, {\n eventType,\n source: normalized.source,\n });\n }\n\n default:\n logger.debug(\n `[AutoTrackerFactory] Unknown source type: ${(source as AutoTrackSource).type}`\n );\n return null;\n }\n }\n}\n","export class ConversionDeduper {\n private readonly sentKeys = new Set<string>();\n\n has(key: string): boolean {\n return this.sentKeys.has(key);\n }\n\n add(key: string): void {\n this.sentKeys.add(key);\n }\n\n clear(): void {\n this.sentKeys.clear();\n }\n\n getKeys(): readonly string[] {\n return Array.from(this.sentKeys);\n }\n\n get size(): number {\n return this.sentKeys.size;\n }\n}\n","import type { AddToCartData } from '@/events/conversion';\n\n/** Janela de interação para dedupe de ADD_TO_CART / cross-detector (ms). */\nexport const CONVERSION_INTERACTION_WINDOW_MS = 500;\n\n/**\n * Estratégia de dedupe para ADD_TO_CART (Etapa 12J).\n *\n * Objetivo:\n * - Bloquear duplicidade na mesma interação (mesmo bucket).\n * - Permitir nova ação legítima após a janela.\n * - Não bloquear o mesmo productId para sempre.\n *\n * Chave (com productId):\n * ADD_TO_CART:product:{id}:qty:{n}:bucket:{t}\n *\n * Origin NÃO entra na chave quando há productId — assim selector + form\n * na mesma interação colidem corretamente.\n *\n * Sem productId:\n * ADD_TO_CART:name:{name}:qty:{n}:bucket:{t} | ADD_TO_CART:interaction:{bucket}\n */\nexport function buildAddToCartDedupeKey(\n data: AddToCartData | undefined,\n now: number = Date.now(),\n windowMs: number = CONVERSION_INTERACTION_WINDOW_MS\n): string {\n const bucket = getInteractionBucket(now, windowMs);\n const productId =\n typeof data?.productId === 'string' ? data.productId.trim() : '';\n const quantity = normalizeQuantity(data?.quantity);\n const productName =\n typeof data?.productName === 'string' ? data.productName.trim() : '';\n\n if (productId) {\n return `ADD_TO_CART:product:${productId}:qty:${quantity}:bucket:${bucket}`;\n }\n\n if (productName) {\n return `ADD_TO_CART:name:${productName}:qty:${quantity}:bucket:${bucket}`;\n }\n\n return `ADD_TO_CART:interaction:${bucket}`;\n}\n\nexport function getInteractionBucket(\n now: number = Date.now(),\n windowMs: number = CONVERSION_INTERACTION_WINDOW_MS\n): number {\n const window = windowMs > 0 ? windowMs : CONVERSION_INTERACTION_WINDOW_MS;\n return Math.floor(now / window);\n}\n\nfunction normalizeQuantity(quantity: number | undefined): number {\n if (typeof quantity === 'number' && Number.isFinite(quantity)) {\n return quantity;\n }\n return 1;\n}\n","import type {\n AddToCartData,\n ConversionEventData,\n LeadData,\n PurchaseData,\n RemoveFromCartData,\n SearchData,\n ViewContentData,\n} from '@/events/conversion';\n\nimport type { ConversionEventOrigin, ConversionEventType } from '../contracts';\nimport {\n buildAddToCartDedupeKey,\n CONVERSION_INTERACTION_WINDOW_MS,\n getInteractionBucket,\n} from './AddToCartDedupe';\n\nexport { CONVERSION_INTERACTION_WINDOW_MS, getInteractionBucket };\n\nconst CLICK_ORIGINS = new Set<string>([\n 'manual',\n 'auto:selector',\n 'auto:text',\n 'auto:checkout',\n 'auto:purchase',\n 'auto:lead',\n 'auto:addToCart',\n 'auto:removeFromCart',\n 'auto:initiateCheckout',\n 'auto:addPaymentInfo',\n 'auto:search',\n 'auto:viewContent',\n]);\n\nfunction isUrlOrigin(origin: ConversionEventOrigin): boolean {\n return origin === 'auto:url' || origin.startsWith('auto:url:');\n}\n\nfunction isInteractionOrigin(origin: ConversionEventOrigin): boolean {\n if (isUrlOrigin(origin)) return false;\n if (CLICK_ORIGINS.has(origin)) return true;\n // Sources Etapa 14: auto:form:… / auto:selector:… / auto:lifecycle:…\n return (\n origin.startsWith('auto:form:') ||\n origin.startsWith('auto:selector:') ||\n origin.startsWith('auto:lifecycle:')\n );\n}\n\nfunction secondBucket(now = Date.now()): number {\n return Math.floor(now / 1000);\n}\n\nfunction currentPath(): string {\n if (typeof window === 'undefined') return '';\n return window.location.pathname;\n}\n\n/**\n * Chave canônica de dedupe — sem origem (exceto fallbacks específicos).\n * Garante 1 evento por tipo/interação mesmo com múltiplos detectores.\n */\nexport function buildCanonicalDedupeKey(\n type: ConversionEventType,\n data: ConversionEventData | undefined,\n origin: ConversionEventOrigin,\n sessionId: string,\n now = Date.now()\n): string {\n const payload = data ?? {};\n const bucket = getInteractionBucket(now, CONVERSION_INTERACTION_WINDOW_MS);\n\n switch (type) {\n case 'PURCHASE': {\n const purchase = payload as PurchaseData;\n if (purchase.orderId) {\n return `PURCHASE:order:${purchase.orderId}`;\n }\n if (isUrlOrigin(origin)) {\n return `PURCHASE:url:${currentPath()}`;\n }\n if (isInteractionOrigin(origin)) {\n return `PURCHASE:interaction:${bucket}`;\n }\n return `PURCHASE:manual:${secondBucket(now)}`;\n }\n case 'LEAD': {\n const lead = payload as LeadData;\n const identity = `${lead.email ?? ''}:${lead.phone ?? ''}`;\n if (identity !== ':') {\n return `LEAD:identity:${identity}`;\n }\n return `LEAD:interaction:${bucket}`;\n }\n case 'ADD_TO_CART':\n return buildAddToCartDedupeKey(\n payload as AddToCartData,\n now,\n CONVERSION_INTERACTION_WINDOW_MS\n );\n case 'REMOVE_FROM_CART': {\n const remove = payload as RemoveFromCartData;\n if (remove.productId) {\n return `REMOVE_FROM_CART:product:${remove.productId}`;\n }\n return `REMOVE_FROM_CART:interaction:${bucket}`;\n }\n case 'INITIATE_CHECKOUT': {\n if (isUrlOrigin(origin)) {\n return `INITIATE_CHECKOUT:url:${currentPath()}`;\n }\n return `INITIATE_CHECKOUT:interaction:${bucket}`;\n }\n case 'ADD_PAYMENT_INFO':\n return `ADD_PAYMENT_INFO:session:${sessionId}`;\n case 'VIEW_CONTENT': {\n const view = payload as ViewContentData;\n if (view.contentId) {\n return `VIEW_CONTENT:content:${view.contentId}`;\n }\n return `VIEW_CONTENT:interaction:${bucket}`;\n }\n case 'SEARCH': {\n const search = payload as SearchData;\n return `SEARCH:query:${search.query}`;\n }\n default:\n return `${type}:interaction:${bucket}`;\n }\n}\n","import type { ConversionEventData } from '@/events/conversion';\n\nimport type { ConversionEventType } from '../contracts';\nimport { TrackerFactory } from './TrackerFactory';\n\nexport type ConversionTrackFn = (\n type: ConversionEventType,\n data: ConversionEventData,\n options?: { dedupeKey?: string; origin?: string }\n) => void;\n\nexport abstract class BaseTracker {\n protected readonly factory: TrackerFactory;\n\n constructor(factory: TrackerFactory) {\n this.factory = factory;\n }\n}\n","import type { AddPaymentInfoData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class AddPaymentInfoTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: AddPaymentInfoData): void {\n if (!this.factory.isManualEnabled('addPaymentInfo')) return;\n this.factory.dispatchManual('ADD_PAYMENT_INFO', data);\n }\n}\n","import type { AddToCartData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class AddToCartTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: AddToCartData): void {\n if (!this.factory.isManualEnabled('addToCart')) return;\n this.factory.dispatchManual('ADD_TO_CART', data);\n }\n}\n","import type { InitiateCheckoutData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class InitiateCheckoutTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: InitiateCheckoutData): void {\n if (!this.factory.isManualEnabled('initiateCheckout')) return;\n this.factory.dispatchManual('INITIATE_CHECKOUT', data);\n }\n}\n","import type { LeadData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class LeadTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data: LeadData): void {\n if (!this.factory.isManualEnabled('lead')) return;\n this.factory.dispatchManual('LEAD', data);\n }\n}\n","import type { PurchaseData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class PurchaseTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: PurchaseData): void {\n if (!this.factory.isManualEnabled('purchase')) return;\n this.factory.dispatchManual('PURCHASE', data);\n }\n}\n","import type { RemoveFromCartData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class RemoveFromCartTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: RemoveFromCartData): void {\n if (!this.factory.isManualEnabled('removeFromCart')) return;\n this.factory.dispatchManual('REMOVE_FROM_CART', data);\n }\n}\n","import type { SearchData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class SearchTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data: SearchData): void {\n if (!this.factory.isManualEnabled('search')) return;\n this.factory.dispatchManual('SEARCH', data);\n }\n}\n","import type { ViewContentData } from '@/events/conversion';\n\nimport { BaseTracker } from './BaseTracker';\nimport type { TrackerFactory } from './TrackerFactory';\n\nexport class ViewContentTracker extends BaseTracker {\n constructor(factory: TrackerFactory) {\n super(factory);\n }\n\n track(data?: ViewContentData): void {\n if (!this.factory.isManualEnabled('viewContent')) return;\n this.factory.dispatchManual('VIEW_CONTENT', data);\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\nimport type {\n AddToCartData,\n ConversionEventData,\n LeadData,\n PurchaseData,\n RemoveFromCartData,\n ViewContentData,\n} from '@/events/conversion';\n\nimport type {\n ConversionEventOrigin,\n ConversionEventType,\n TrackConversionOptions,\n} from '../contracts';\nimport {\n CommerceResolver,\n type CommerceEnrichmentEvent,\n type CommerceEventType,\n} from '@/services/commerce';\nimport type { CommerceState, ProductCatalog } from '@/services/commerce';\nimport { OrderCalculator } from '@/services/commerce';\nimport { buildCanonicalDedupeKey } from '../dedupe/dedupe-key';\nimport type { ConversionTrackFn } from './BaseTracker';\nimport { AddPaymentInfoTracker } from './AddPaymentInfoTracker';\nimport { AddToCartTracker } from './AddToCartTracker';\nimport { InitiateCheckoutTracker } from './InitiateCheckoutTracker';\nimport { LeadTracker } from './LeadTracker';\nimport { PurchaseTracker } from './PurchaseTracker';\nimport { RemoveFromCartTracker } from './RemoveFromCartTracker';\nimport { SearchTracker } from './SearchTracker';\nimport { ViewContentTracker } from './ViewContentTracker';\n\nconst EVENT_TO_ENRICHMENT: Partial<\n Record<ConversionEventType, CommerceEnrichmentEvent>\n> = {\n VIEW_CONTENT: 'viewContent',\n ADD_TO_CART: 'addToCart',\n REMOVE_FROM_CART: 'removeFromCart',\n INITIATE_CHECKOUT: 'initiateCheckout',\n ADD_PAYMENT_INFO: 'addPaymentInfo',\n PURCHASE: 'purchase',\n LEAD: 'lead',\n};\n\nconst COMMERCE_EVENT_TYPES: readonly CommerceEventType[] = [\n 'ADD_TO_CART',\n 'REMOVE_FROM_CART',\n 'INITIATE_CHECKOUT',\n 'PURCHASE',\n 'VIEW_CONTENT',\n 'ADD_PAYMENT_INFO',\n];\n\nexport type TrackerFactoryCommerceDeps = {\n readonly catalog: ProductCatalog;\n readonly state: CommerceState;\n};\n\nexport class TrackerFactory {\n private readonly context: PixelRuntimeContext;\n\n private readonly trackFn: ConversionTrackFn;\n\n private readonly dedupeSessionId: string;\n\n private readonly resolver: CommerceResolver | null;\n\n private readonly commerceState: CommerceState | null;\n\n readonly purchase: PurchaseTracker;\n\n readonly lead: LeadTracker;\n\n readonly addToCart: AddToCartTracker;\n\n readonly removeFromCart: RemoveFromCartTracker;\n\n readonly initiateCheckout: InitiateCheckoutTracker;\n\n readonly addPaymentInfo: AddPaymentInfoTracker;\n\n readonly viewContent: ViewContentTracker;\n\n readonly search: SearchTracker;\n\n constructor(\n context: PixelRuntimeContext,\n trackFn: ConversionTrackFn,\n dedupeSessionId: string,\n commerce?: TrackerFactoryCommerceDeps\n ) {\n this.context = context;\n this.trackFn = trackFn;\n this.dedupeSessionId = dedupeSessionId;\n this.commerceState = commerce?.state ?? null;\n\n if (commerce) {\n const cfg = context.services.commerce.config;\n this.resolver = new CommerceResolver({\n catalog: commerce.catalog,\n state: commerce.state,\n calculator: new OrderCalculator(),\n defaultCurrency: cfg?.currency,\n calculateValueFrom: cfg?.cart?.calculateValueFrom ?? 'cart',\n });\n } else {\n this.resolver = null;\n }\n\n this.purchase = new PurchaseTracker(this);\n this.lead = new LeadTracker(this);\n this.addToCart = new AddToCartTracker(this);\n this.removeFromCart = new RemoveFromCartTracker(this);\n this.initiateCheckout = new InitiateCheckoutTracker(this);\n this.addPaymentInfo = new AddPaymentInfoTracker(this);\n this.viewContent = new ViewContentTracker(this);\n this.search = new SearchTracker(this);\n }\n\n trackAuto(\n type: ConversionEventType,\n data?: ConversionEventData,\n options?: TrackConversionOptions\n ): void {\n this.dispatch(type, data, options?.origin ?? 'auto:selector');\n }\n\n dispatchManual(type: ConversionEventType, data?: ConversionEventData): void {\n this.dispatch(type, data, 'manual');\n }\n\n normalize(\n type: ConversionEventType,\n data: ConversionEventData | undefined\n ): ConversionEventData {\n switch (type) {\n case 'SEARCH': {\n const search = data as { query?: string; searchTerm?: string };\n const query = search?.query ?? search?.searchTerm ?? '';\n if (!query.trim()) {\n throw new Error('[Conversion] SEARCH requires query');\n }\n return { query: query.trim() };\n }\n case 'PURCHASE': {\n const purchase = data as PurchaseData;\n if (purchase?.value != null && purchase.value < 0) {\n throw new Error('[Conversion] PURCHASE value cannot be negative');\n }\n return purchase ?? {};\n }\n case 'LEAD': {\n const lead = data as LeadData;\n if (!lead?.email && !lead?.phone && !lead?.name) {\n throw new Error('[Conversion] LEAD requires email, phone or name');\n }\n return lead;\n }\n case 'VIEW_CONTENT': {\n // productId é chave interna de enrichment (ex.: link → catalog);\n // o contrato público de ViewContentData usa contentId.\n const view = { ...((data ?? {}) as Record<string, unknown>) };\n delete view.productId;\n return view as ViewContentData;\n }\n default:\n return data ?? {};\n }\n }\n\n buildDedupeKey(\n type: ConversionEventType,\n data: ConversionEventData | undefined,\n origin: ConversionEventOrigin\n ): string {\n return buildCanonicalDedupeKey(type, data, origin, this.dedupeSessionId);\n }\n\n isManualEnabled(\n key:\n | 'purchase'\n | 'lead'\n | 'addToCart'\n | 'removeFromCart'\n | 'initiateCheckout'\n | 'addPaymentInfo'\n | 'viewContent'\n | 'search'\n ): boolean {\n return this.context.config.modules.conversion.manual[key].enabled;\n }\n\n private dispatch(\n type: ConversionEventType,\n data: ConversionEventData | undefined,\n origin: ConversionEventOrigin\n ): void {\n const enriched = this.enrichCommerce(type, data);\n const normalized = this.normalize(type, enriched);\n this.syncCommerceState(type, normalized);\n const key = buildCanonicalDedupeKey(\n type,\n normalized,\n origin,\n this.dedupeSessionId\n );\n this.trackFn(type, normalized, { dedupeKey: key, origin });\n }\n\n private enrichCommerce(\n type: ConversionEventType,\n data: ConversionEventData | undefined\n ): ConversionEventData | undefined {\n if (!this.resolver || !isCommerceEventType(type)) {\n return data;\n }\n\n const enrichmentKey = EVENT_TO_ENRICHMENT[type];\n if (!enrichmentKey) return data;\n\n const commerce = this.context.services.commerce;\n if (!commerce.isEnrichmentEnabled(enrichmentKey)) {\n return data;\n }\n\n const source = commerce.getEnrichmentSource(enrichmentKey);\n const result = this.resolver.resolve({\n eventType: type,\n payload: (data ?? {}) as Record<string, unknown>,\n enrichmentSource: source,\n });\n\n return result.data as ConversionEventData;\n }\n\n /**\n * Sync controlado do checkout/cart após resolução.\n * - ADD_TO_CART: upsertItem (sem incremento automático)\n * - REMOVE_FROM_CART: removeItem\n * - Demais eventos: no-op (só leitura via CommerceResolver)\n * Sem productId → não escreve.\n */\n private syncCommerceState(\n type: ConversionEventType,\n data: ConversionEventData\n ): void {\n if (!this.commerceState) return;\n\n if (type === 'ADD_TO_CART') {\n this.syncAddToCart(data as AddToCartData);\n return;\n }\n\n if (type === 'REMOVE_FROM_CART') {\n this.syncRemoveFromCart(data as RemoveFromCartData);\n }\n }\n\n private syncAddToCart(data: AddToCartData): void {\n if (!this.commerceState) return;\n\n const productId =\n typeof data.productId === 'string' ? data.productId.trim() : '';\n if (!productId) return;\n\n const quantity =\n typeof data.quantity === 'number' && Number.isFinite(data.quantity)\n ? data.quantity\n : 1;\n\n // quantity <= 0: CommerceState.upsertItem remove o item\n this.commerceState.upsertItem({\n productId,\n quantity,\n ...(typeof data.price === 'number' && Number.isFinite(data.price)\n ? { price: data.price }\n : {}),\n ...(typeof data.currency === 'string' && data.currency.trim()\n ? { currency: data.currency.trim() }\n : {}),\n });\n }\n\n private syncRemoveFromCart(data: RemoveFromCartData): void {\n if (!this.commerceState) return;\n\n const productId =\n typeof data.productId === 'string' ? data.productId.trim() : '';\n if (!productId) return;\n\n this.commerceState.removeItem(productId);\n }\n}\n\nfunction isCommerceEventType(\n type: ConversionEventType\n): type is CommerceEventType {\n return (COMMERCE_EVENT_TYPES as readonly string[]).includes(type);\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\nimport type { PixelEvent } from '@/events';\nimport type { ConversionEventData } from '@/events/conversion';\n\nimport type { ConversionEventType } from './contracts';\nimport { AutoTrackerFactory } from './auto/AutoTrackerFactory';\nimport type { CommerceState, ProductCatalog } from './commerce';\nimport { ConversionDeduper } from './dedupe/ConversionDeduper';\nimport type { IConversionDetector } from './contracts';\nimport { TrackerFactory } from './tracks/TrackerFactory';\n\nexport class ConversionEngine {\n private readonly context: PixelRuntimeContext;\n\n private readonly deduper = new ConversionDeduper();\n\n private readonly dedupeSessionId: string;\n\n /** Catálogo da instância — via CommerceService (root). */\n readonly catalog: ProductCatalog;\n\n /**\n * Estado de cart da instância (CommerceService).\n * Escrito de forma controlada no TrackerFactory após ADD/REMOVE.\n */\n readonly commerceState: CommerceState;\n\n readonly factory: TrackerFactory;\n\n private detectors: IConversionDetector[] = [];\n\n private active = false;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n this.dedupeSessionId = `${context.config.identity.pixelId}:${Date.now()}:${Math.random().toString(36).slice(2, 8)}`;\n\n const commerce = context.services.commerce;\n this.catalog = commerce.catalog;\n this.commerceState = commerce.state;\n\n this.factory = new TrackerFactory(\n context,\n (type, data, options) => {\n this.dispatch(type, data, options?.dedupeKey);\n },\n this.dedupeSessionId,\n { catalog: this.catalog, state: this.commerceState }\n );\n }\n\n init(): void {\n if (this.active) return;\n\n this.detectors = AutoTrackerFactory.create(this.context, this.factory);\n for (const detector of this.detectors) {\n detector.init();\n }\n\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n\n for (let i = this.detectors.length - 1; i >= 0; i -= 1) {\n this.detectors[i]?.destroy();\n }\n this.detectors = [];\n this.deduper.clear();\n // CommerceState vive no CommerceService (runtime) — não limpar aqui.\n this.active = false;\n }\n\n getDedupeKeys(): readonly string[] {\n return this.deduper.getKeys();\n }\n\n getActiveDetectors(): readonly string[] {\n return this.detectors.map(\n detector => detector.name ?? detector.constructor.name\n );\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n private dispatch(\n type: ConversionEventType,\n data: ConversionEventData,\n dedupeKey?: string\n ): void {\n const key = dedupeKey ?? this.factory.buildDedupeKey(type, data, 'manual');\n\n if (this.deduper.has(key)) {\n this.context.logger.debug(`[ConversionEngine] Deduped ${type} (${key})`);\n return;\n }\n\n this.deduper.add(key);\n\n const event = this.context.services.eventBuilder.build({\n type,\n category: 'CONVERSION' as const,\n data,\n }) as PixelEvent;\n\n this.context.logger.debug(`[ConversionEngine] Dispatching ${type}`);\n this.context.services.dispatcher.dispatch(event);\n }\n}\n","import type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\nimport type {\n AddPaymentInfoData,\n AddToCartData,\n InitiateCheckoutData,\n LeadData,\n PurchaseData,\n RemoveFromCartData,\n SearchData,\n ViewContentData,\n} from '@/events/conversion';\n\nimport { ConversionEngine } from './conversion.engine';\n\nexport class ConversionModule implements PixelModule {\n readonly name = 'conversion' as const;\n\n private engine: ConversionEngine | null = null;\n\n private active = false;\n\n init(context: PixelRuntimeContext): void {\n if (this.active) {\n context.logger.debug('[Pixel] Conversion module already initialized');\n return;\n }\n\n if (!context.config.modules.conversion.enabled) {\n context.logger.debug('[Pixel] Conversion module disabled');\n return;\n }\n\n context.logger.debug('[Pixel] Conversion module initialized');\n\n this.engine = new ConversionEngine(context);\n this.engine.init();\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n\n this.engine?.destroy();\n this.engine = null;\n this.active = false;\n }\n\n purchase(data?: PurchaseData): void {\n this.engine?.factory.purchase.track(data);\n }\n\n lead(data: LeadData): void {\n this.engine?.factory.lead.track(data);\n }\n\n addToCart(data?: AddToCartData): void {\n this.engine?.factory.addToCart.track(data);\n }\n\n removeFromCart(data?: RemoveFromCartData): void {\n this.engine?.factory.removeFromCart.track(data);\n }\n\n initiateCheckout(data?: InitiateCheckoutData): void {\n this.engine?.factory.initiateCheckout.track(data);\n }\n\n addPaymentInfo(data?: AddPaymentInfoData): void {\n this.engine?.factory.addPaymentInfo.track(data);\n }\n\n viewContent(data?: ViewContentData): void {\n this.engine?.factory.viewContent.track(data);\n }\n\n search(data: SearchData): void {\n this.engine?.factory.search.track(data);\n }\n\n /** @internal For playground and development only. */\n getDebugDedupeKeys(): readonly string[] {\n return this.engine?.getDedupeKeys() ?? [];\n }\n\n /** @internal For playground and development only. */\n getDebugActiveDetectors(): readonly string[] {\n return this.engine?.getActiveDetectors() ?? [];\n }\n\n /** @internal For playground and development only. */\n isEngineActive(): boolean {\n return this.engine?.isActive() ?? false;\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nexport class FingerprintEngine {\n private readonly context: PixelRuntimeContext;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (!this.context.config.modules.core.fingerprint.enabled) return;\n\n this.context.logger.debug('[FingerprintEngine] Ensuring fingerprint');\n this.context.services.fingerprint.ensureFingerprint();\n }\n\n destroy(): void {}\n}\n","export type NavigationReason =\n | 'pushState'\n | 'replaceState'\n | 'back'\n | 'forward'\n | 'hash';\n\ntype NavigationCallback = (reason: NavigationReason) => void;\n\nexport class NavigationObserver {\n private readonly onNavigate: NavigationCallback;\n\n private started = false;\n\n private originalPushState: History['pushState'] | null = null;\n\n private originalReplaceState: History['replaceState'] | null = null;\n\n private readonly handlePopState = (): void => {\n this.onNavigate('back');\n };\n\n private readonly handleHashChange = (): void => {\n this.onNavigate('hash');\n };\n\n constructor(onNavigate: NavigationCallback) {\n this.onNavigate = onNavigate;\n }\n\n start(): void {\n if (this.started || typeof window === 'undefined') return;\n\n this.started = true;\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n this.originalPushState?.(...args);\n this.onNavigate('pushState');\n };\n\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n this.originalReplaceState?.(...args);\n this.onNavigate('replaceState');\n };\n\n window.addEventListener('popstate', this.handlePopState);\n window.addEventListener('hashchange', this.handleHashChange);\n }\n\n destroy(): void {\n if (!this.started || typeof window === 'undefined') return;\n\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n }\n\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n }\n\n window.removeEventListener('popstate', this.handlePopState);\n window.removeEventListener('hashchange', this.handleHashChange);\n\n this.originalPushState = null;\n this.originalReplaceState = null;\n this.started = false;\n }\n}\n","export class PageViewDeduper {\n private lastPath: string | null = null;\n\n private lastTimestamp = 0;\n\n private readonly dedupeMs: number;\n\n constructor(dedupeMs: number) {\n this.dedupeMs = dedupeMs;\n }\n\n shouldDispatch(path: string, timestamp = Date.now()): boolean {\n if (\n this.lastPath === path &&\n timestamp - this.lastTimestamp < this.dedupeMs\n ) {\n return false;\n }\n\n this.lastPath = path;\n this.lastTimestamp = timestamp;\n return true;\n }\n\n reset(): void {\n this.lastPath = null;\n this.lastTimestamp = 0;\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { NavigationObserver } from './NavigationObserver';\nimport { PageViewDeduper } from './PageViewDeduper';\n\nexport class PageViewEngine {\n private readonly context: PixelRuntimeContext;\n\n private readonly deduper: PageViewDeduper;\n\n private navigationObserver: NavigationObserver | null = null;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n this.deduper = new PageViewDeduper(\n context.config.modules.core.pageView.dedupeMs\n );\n }\n\n init(): void {\n const { pageView } = this.context.config.modules.core;\n\n if (!pageView.enabled) return;\n\n if (pageView.trackInitialPageView) {\n this.trackPageView();\n }\n\n if (pageView.spa) {\n this.navigationObserver = new NavigationObserver(() => {\n this.trackPageView();\n });\n this.navigationObserver.start();\n }\n }\n\n trackPageView(): void {\n const metadata = this.context.services.browserMetadata.getMetadata();\n const path = metadata.path ?? '';\n const timestamp = Date.now();\n\n if (!this.deduper.shouldDispatch(path, timestamp)) {\n this.context.logger.debug('[PageViewEngine] Page view deduplicated');\n return;\n }\n\n const commercePayload =\n this.context.services.commerce.resolvePageViewEnrichment();\n\n const event = this.context.services.eventBuilder.build({\n type: 'PAGE_VIEW' as const,\n ...(commercePayload ?? {}),\n });\n\n this.context.logger.debug('[PageViewEngine] Dispatching PAGE_VIEW');\n this.context.services.dispatcher.dispatch(event);\n }\n\n destroy(): void {\n this.navigationObserver?.destroy();\n this.navigationObserver = null;\n this.deduper.reset();\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nexport class SessionEngine {\n private readonly context: PixelRuntimeContext;\n\n private unsubscribe: (() => void) | null = null;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (!this.context.config.modules.core.session.enabled) return;\n\n this.context.logger.debug('[SessionEngine] Ensuring session');\n\n const { ttlMs } = this.context.config.modules.core.session;\n this.applySessionLifecycle(ttlMs);\n\n this.unsubscribe = this.context.services.dispatcher.subscribe(event => {\n if (event.type === 'PAGE_VIEW') {\n this.handlePageViewActivity();\n }\n });\n }\n\n destroy(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n private handlePageViewActivity(): void {\n const { ttlMs, renewOnActivity } = this.context.config.modules.core.session;\n const { session } = this.context.services;\n\n if (session.isExpired(ttlMs)) {\n this.applySessionLifecycle(ttlMs);\n return;\n }\n\n if (renewOnActivity) {\n session.touchActivity();\n this.context.logger.debug('[SessionEngine] Session activity renewed');\n }\n }\n\n private applySessionLifecycle(ttlMs: number): void {\n const result = this.context.services.session.ensureSession(ttlMs);\n\n if (result.expired && result.previousSessionId) {\n const expiredEvent = this.context.services.eventBuilder.build({\n type: 'SESSION_EXPIRED' as const,\n sessionId: result.previousSessionId,\n });\n\n this.context.logger.debug('[SessionEngine] Dispatching SESSION_EXPIRED');\n this.context.services.dispatcher.dispatch(expiredEvent);\n\n const renewedEvent = this.context.services.eventBuilder.build({\n type: 'SESSION_RENEWED' as const,\n sessionId: result.sessionId,\n previousSessionId: result.previousSessionId,\n });\n\n this.context.logger.debug('[SessionEngine] Dispatching SESSION_RENEWED');\n this.context.services.dispatcher.dispatch(renewedEvent);\n }\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\n/**\n * Engine fino: inicia UrlContextService antes do PageView.\n */\nexport class UrlContextEngine {\n private readonly context: PixelRuntimeContext;\n\n private started = false;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (this.started) return;\n this.started = true;\n\n if (!this.context.config.modules.core.enabled) return;\n\n const urlContext = this.context.services.urlContext;\n if (!urlContext) return;\n\n urlContext.init();\n this.context.logger.debug('[Pixel] UrlContext engine initialized');\n }\n\n destroy(): void {\n if (!this.started) return;\n this.context.services.urlContext?.destroy();\n this.started = false;\n }\n\n /** Alias de destroy — limpeza completa do engine. */\n dispose(): void {\n this.destroy();\n }\n}\n","import type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nexport class VisitorEngine {\n private readonly context: PixelRuntimeContext;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n init(): void {\n if (!this.context.config.modules.core.visitor.enabled) return;\n\n this.context.logger.debug('[VisitorEngine] Ensuring visitor');\n this.context.services.visitor.ensureVisitorId();\n }\n\n destroy(): void {}\n}\n","import type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport {\n FingerprintEngine,\n PageViewEngine,\n SessionEngine,\n UrlContextEngine,\n VisitorEngine,\n} from './engines';\n\nexport class CoreModule implements PixelModule {\n readonly name = 'core' as const;\n\n private urlContextEngine: UrlContextEngine | null = null;\n\n private visitorEngine: VisitorEngine | null = null;\n\n private sessionEngine: SessionEngine | null = null;\n\n private fingerprintEngine: FingerprintEngine | null = null;\n\n private pageViewEngine: PageViewEngine | null = null;\n\n init(context: PixelRuntimeContext): void {\n context.logger.debug('[Pixel] Core module initialized');\n\n // UrlContext ANTES do PageView — primeiro PAGE_VIEW já sai enriquecido.\n this.urlContextEngine = new UrlContextEngine(context);\n this.visitorEngine = new VisitorEngine(context);\n this.sessionEngine = new SessionEngine(context);\n this.fingerprintEngine = new FingerprintEngine(context);\n this.pageViewEngine = new PageViewEngine(context);\n\n this.urlContextEngine.init();\n this.visitorEngine.init();\n this.sessionEngine.init();\n this.fingerprintEngine.init();\n this.pageViewEngine.init();\n }\n\n destroy(): void {\n this.pageViewEngine?.destroy();\n this.fingerprintEngine?.destroy();\n this.sessionEngine?.destroy();\n this.visitorEngine?.destroy();\n this.urlContextEngine?.destroy();\n\n this.pageViewEngine = null;\n this.fingerprintEngine = null;\n this.sessionEngine = null;\n this.visitorEngine = null;\n this.urlContextEngine = null;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { DestinationAdapter } from './types';\n\n/**\n * Registry of destination adapters — mirror of ModuleRegistry pattern.\n * No switch/if cascades; support decisions live inside each adapter.\n */\nexport class DestinationRegistry {\n private readonly adapters = new Map<string, DestinationAdapter>();\n\n register(destination: DestinationAdapter): void {\n if (this.adapters.has(destination.name)) {\n throw new Error(\n `[Integration] Destination \"${destination.name}\" is already registered`\n );\n }\n this.adapters.set(destination.name, destination);\n }\n\n remove(name: string): boolean {\n const existing = this.adapters.get(name);\n if (!existing) return false;\n existing.destroy?.();\n return this.adapters.delete(name);\n }\n\n get(name: string): DestinationAdapter | undefined {\n return this.adapters.get(name);\n }\n\n getAll(): readonly DestinationAdapter[] {\n return [...this.adapters.values()];\n }\n\n supports(event: PixelEvent): readonly DestinationAdapter[] {\n return this.getAll().filter(adapter => {\n try {\n return adapter.supports(event);\n } catch {\n return false;\n }\n });\n }\n\n has(name: string): boolean {\n return this.adapters.has(name);\n }\n\n size(): number {\n return this.adapters.size;\n }\n\n clear(): void {\n for (const adapter of this.adapters.values()) {\n adapter.destroy?.();\n }\n this.adapters.clear();\n }\n}\n","import type { DestinationMetricsSnapshot, DestinationResult } from './types';\n\ntype DestinationCounters = {\n sent: number;\n failed: number;\n ignored: number;\n skipped: number;\n totalDuration: number;\n pageViewSent: number;\n pageViewDeduped: number;\n pageViewFailed: number;\n scriptLoadAttempts: number;\n scriptLoadSuccess: number;\n scriptLoadFailure: number;\n initAttempts: number;\n initSuccess: number;\n initFailure: number;\n lastError: string | null;\n};\n\nfunction emptyCounters(): DestinationCounters {\n return {\n sent: 0,\n failed: 0,\n ignored: 0,\n skipped: 0,\n totalDuration: 0,\n pageViewSent: 0,\n pageViewDeduped: 0,\n pageViewFailed: 0,\n scriptLoadAttempts: 0,\n scriptLoadSuccess: 0,\n scriptLoadFailure: 0,\n initAttempts: 0,\n initSuccess: 0,\n initFailure: 0,\n lastError: null,\n };\n}\n\nexport class DestinationMetrics {\n private registeredDestinations = 0;\n\n private eventsSent = 0;\n\n private eventsFailed = 0;\n\n private eventsIgnored = 0;\n\n private eventsSkipped = 0;\n\n private pageViewReceived = 0;\n\n private pageViewSent = 0;\n\n private pageViewSkipped = 0;\n\n private pageViewDeduped = 0;\n\n private pageViewFailed = 0;\n\n private scriptLoadAttempts = 0;\n\n private scriptLoadSuccess = 0;\n\n private scriptLoadFailure = 0;\n\n private initAttempts = 0;\n\n private initSuccess = 0;\n\n private initFailure = 0;\n\n private totalDuration = 0;\n\n private lastExecutionAt: number | null = null;\n\n private lastErrorAt: number | null = null;\n\n private lastErrorMessage: string | null = null;\n\n private readonly perDestination = new Map<string, DestinationCounters>();\n\n private readonly perDestinationId = new Map<\n string,\n {\n sent: number;\n failed: number;\n pageViewSent: number;\n pageViewDeduped: number;\n pageViewFailed: number;\n }\n >();\n\n private getDestinationCounters(name: string): DestinationCounters {\n let counters = this.perDestination.get(name);\n if (!counters) {\n counters = emptyCounters();\n this.perDestination.set(name, counters);\n }\n return counters;\n }\n\n setRegisteredCount(count: number): void {\n this.registeredDestinations = count;\n }\n\n recordPageViewReceived(): void {\n this.pageViewReceived += 1;\n }\n\n recordScriptLoadAttempt(adapter: string): void {\n this.scriptLoadAttempts += 1;\n this.getDestinationCounters(adapter).scriptLoadAttempts += 1;\n }\n\n recordScriptLoadSuccess(adapter: string): void {\n this.scriptLoadSuccess += 1;\n this.getDestinationCounters(adapter).scriptLoadSuccess += 1;\n }\n\n recordScriptLoadFailure(adapter: string): void {\n this.scriptLoadFailure += 1;\n this.getDestinationCounters(adapter).scriptLoadFailure += 1;\n }\n\n recordInitAttempt(adapter: string): void {\n this.initAttempts += 1;\n this.getDestinationCounters(adapter).initAttempts += 1;\n }\n\n recordInitSuccess(adapter: string): void {\n this.initSuccess += 1;\n this.getDestinationCounters(adapter).initSuccess += 1;\n }\n\n recordInitFailure(adapter: string): void {\n this.initFailure += 1;\n this.getDestinationCounters(adapter).initFailure += 1;\n }\n\n record(result: DestinationResult): void {\n const adapter = result.adapter;\n const counters = this.getDestinationCounters(adapter);\n\n this.lastExecutionAt = result.timestamp;\n this.totalDuration += result.duration;\n\n if (result.status === 'success') {\n this.eventsSent += 1;\n counters.sent += 1;\n } else if (result.status === 'failed') {\n this.eventsFailed += 1;\n counters.failed += 1;\n this.lastErrorAt = result.timestamp;\n this.lastErrorMessage = result.error ?? 'Unknown error';\n counters.lastError = this.lastErrorMessage;\n } else if (result.status === 'ignored') {\n this.eventsIgnored += 1;\n counters.ignored += 1;\n } else if (result.status === 'skipped') {\n this.eventsSkipped += 1;\n counters.skipped += 1;\n }\n\n counters.totalDuration += result.duration;\n\n if (result.metadata) {\n const sent = Number(result.metadata.sent ?? 0);\n const deduped = Number(result.metadata.deduped ?? 0);\n const failed = Number(result.metadata.failed ?? 0);\n\n if (sent > 0) {\n this.pageViewSent += sent;\n counters.pageViewSent += sent;\n }\n if (deduped > 0) {\n this.pageViewDeduped += deduped;\n counters.pageViewDeduped += deduped;\n }\n if (failed > 0) {\n this.pageViewFailed += failed;\n counters.pageViewFailed += failed;\n }\n\n const pixelIds = result.metadata.pixelIds as string[] | undefined;\n const tagIds = result.metadata.tagIds as string[] | undefined;\n const ids = pixelIds ?? tagIds;\n if (ids && sent > 0) {\n for (const id of ids.slice(0, sent)) {\n this.recordDestinationId(adapter, id, 'sent', sent / ids.length);\n }\n }\n }\n\n if (result.status === 'failed' && result.error) {\n this.pageViewFailed += 1;\n counters.pageViewFailed += 1;\n }\n }\n\n private recordDestinationId(\n adapter: string,\n id: string,\n kind: 'sent' | 'failed',\n count: number\n ): void {\n const key = `${adapter}:${id}`;\n let counters = this.perDestinationId.get(key);\n if (!counters) {\n counters = {\n sent: 0,\n failed: 0,\n pageViewSent: 0,\n pageViewDeduped: 0,\n pageViewFailed: 0,\n };\n this.perDestinationId.set(key, counters);\n }\n if (kind === 'sent') {\n counters.sent += count;\n counters.pageViewSent += count;\n } else {\n counters.failed += count;\n counters.pageViewFailed += count;\n }\n }\n\n getSnapshot(): DestinationMetricsSnapshot {\n const total = this.eventsSent + this.eventsFailed;\n const perDestination: Record<\n string,\n DestinationMetricsSnapshot['perDestination'][string]\n > = {};\n\n for (const [name, counters] of this.perDestination) {\n const destTotal = counters.sent + counters.failed;\n perDestination[name] = {\n sent: counters.sent,\n failed: counters.failed,\n ignored: counters.ignored,\n skipped: counters.skipped,\n averageDuration: destTotal > 0 ? counters.totalDuration / destTotal : 0,\n successRate: destTotal > 0 ? counters.sent / destTotal : 0,\n pageViewSent: counters.pageViewSent,\n pageViewDeduped: counters.pageViewDeduped,\n pageViewFailed: counters.pageViewFailed,\n scriptLoadAttempts: counters.scriptLoadAttempts,\n scriptLoadSuccess: counters.scriptLoadSuccess,\n scriptLoadFailure: counters.scriptLoadFailure,\n initAttempts: counters.initAttempts,\n initSuccess: counters.initSuccess,\n initFailure: counters.initFailure,\n lastError: counters.lastError,\n };\n }\n\n return {\n registeredDestinations: this.registeredDestinations,\n activeDestinations: this.registeredDestinations,\n eventsSent: this.eventsSent,\n eventsFailed: this.eventsFailed,\n eventsIgnored: this.eventsIgnored,\n eventsSkipped: this.eventsSkipped,\n pageViewReceived: this.pageViewReceived,\n pageViewSent: this.pageViewSent,\n pageViewSkipped: this.pageViewSkipped,\n pageViewDeduped: this.pageViewDeduped,\n pageViewFailed: this.pageViewFailed,\n scriptLoadAttempts: this.scriptLoadAttempts,\n scriptLoadSuccess: this.scriptLoadSuccess,\n scriptLoadFailure: this.scriptLoadFailure,\n initAttempts: this.initAttempts,\n initSuccess: this.initSuccess,\n initFailure: this.initFailure,\n averageDuration: total > 0 ? this.totalDuration / total : 0,\n successRate: total > 0 ? this.eventsSent / total : 0,\n lastExecutionAt: this.lastExecutionAt,\n lastErrorAt: this.lastErrorAt,\n lastErrorMessage: this.lastErrorMessage,\n perDestination,\n perDestinationId: Object.fromEntries(this.perDestinationId),\n };\n }\n\n reset(): void {\n this.registeredDestinations = 0;\n this.eventsSent = 0;\n this.eventsFailed = 0;\n this.eventsIgnored = 0;\n this.eventsSkipped = 0;\n this.pageViewReceived = 0;\n this.pageViewSent = 0;\n this.pageViewSkipped = 0;\n this.pageViewDeduped = 0;\n this.pageViewFailed = 0;\n this.scriptLoadAttempts = 0;\n this.scriptLoadSuccess = 0;\n this.scriptLoadFailure = 0;\n this.initAttempts = 0;\n this.initSuccess = 0;\n this.initFailure = 0;\n this.totalDuration = 0;\n this.lastExecutionAt = null;\n this.lastErrorAt = null;\n this.lastErrorMessage = null;\n this.perDestination.clear();\n this.perDestinationId.clear();\n }\n}\n","import type { PixelLogger } from '@/logger';\n\n/**\n * Prefixed logger scoped to Integration Engine — never mixes with Transport logs.\n */\nexport class DestinationLogger {\n private readonly logger: PixelLogger;\n\n private readonly scope: string;\n\n constructor(logger: PixelLogger, scope = 'Integration') {\n this.logger = logger;\n this.scope = scope;\n }\n\n forAdapter(name: string): DestinationLogger {\n return new DestinationLogger(this.logger, name);\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.logger.debug(`[${this.scope}] ${message}`, ...args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.logger.info(`[${this.scope}] ${message}`, ...args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.logger.warn(`[${this.scope}] ${message}`, ...args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.logger.error(`[${this.scope}] ${message}`, ...args);\n }\n}\n","import type { DestinationAdapter, DestinationResult } from './types';\nimport type { DestinationLogger } from './DestinationLogger';\n\n/**\n * Isolates destination failures so one adapter never brings down others.\n */\nexport class DestinationErrorHandler {\n private readonly logger: DestinationLogger;\n\n private readonly continueOnError: boolean;\n\n constructor(logger: DestinationLogger, continueOnError: boolean) {\n this.logger = logger;\n this.continueOnError = continueOnError;\n }\n\n toFailedResult(\n adapter: DestinationAdapter,\n error: unknown,\n duration: number\n ): DestinationResult {\n const message = error instanceof Error ? error.message : String(error);\n this.logger.forAdapter(adapter.name).error(`Execution failed: ${message}`);\n\n return {\n status: 'failed',\n adapter: adapter.name,\n duration,\n timestamp: Date.now(),\n error: message,\n };\n }\n\n shouldContinue(): boolean {\n return this.continueOnError;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type {\n DestinationAdapter,\n DestinationContext,\n DestinationHooks,\n DestinationResult,\n} from './types';\nimport type { DestinationErrorHandler } from './DestinationErrorHandler';\nimport type { DestinationLogger } from './DestinationLogger';\n\n/**\n * Executes a single destination with timeout (AbortSignal), hooks and error isolation.\n */\nexport class DestinationExecutor {\n private readonly logger: DestinationLogger;\n\n private readonly errorHandler: DestinationErrorHandler;\n\n private readonly hooks: DestinationHooks;\n\n private readonly timeoutMs: number;\n\n private readonly debug: boolean;\n\n constructor(options: {\n logger: DestinationLogger;\n errorHandler: DestinationErrorHandler;\n hooks?: DestinationHooks;\n timeoutMs: number;\n debug?: boolean;\n }) {\n this.logger = options.logger;\n this.errorHandler = options.errorHandler;\n this.hooks = options.hooks ?? {};\n this.timeoutMs = options.timeoutMs;\n this.debug = options.debug ?? false;\n }\n\n async execute(\n adapter: DestinationAdapter,\n event: PixelEvent\n ): Promise<DestinationResult> {\n const startedAt = Date.now();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const context: DestinationContext = {\n event,\n signal: controller.signal,\n timeoutMs: this.timeoutMs,\n debug: this.debug,\n };\n\n try {\n await this.hooks.beforeExecute?.(adapter, event);\n\n const result = await adapter.execute(context);\n const enriched: DestinationResult = {\n ...result,\n adapter: result.adapter || adapter.name,\n duration: result.duration || Date.now() - startedAt,\n timestamp: result.timestamp || Date.now(),\n };\n\n await this.hooks.afterExecute?.(adapter, event, enriched);\n\n if (enriched.status === 'success') {\n await this.hooks.onSuccess?.(adapter, event, enriched);\n } else if (enriched.status === 'failed' || enriched.status === 'retry') {\n await this.hooks.onFailure?.(adapter, event, enriched);\n } else if (\n enriched.status === 'ignored' ||\n enriched.status === 'skipped'\n ) {\n await this.hooks.onIgnored?.(adapter, event, enriched);\n }\n\n if (this.debug) {\n this.logger\n .forAdapter(adapter.name)\n .debug(`Result ${enriched.status} in ${enriched.duration}ms`);\n }\n\n return enriched;\n } catch (error) {\n const failed = this.errorHandler.toFailedResult(\n adapter,\n error,\n Date.now() - startedAt\n );\n await this.hooks.onFailure?.(adapter, event, failed);\n await this.hooks.afterExecute?.(adapter, event, failed);\n return failed;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { DestinationRegistry } from './DestinationRegistry';\nimport type { DestinationExecutor } from './DestinationExecutor';\nimport type { DestinationMetrics } from './DestinationMetrics';\nimport type { DestinationLogger } from './DestinationLogger';\nimport type { DestinationResult } from './types';\n\nexport type DestinationDispatcherConfig = {\n readonly registry: DestinationRegistry;\n readonly executor: DestinationExecutor;\n readonly metrics: DestinationMetrics;\n readonly logger: DestinationLogger;\n readonly concurrency?: number;\n};\n\nexport class DestinationDispatcher {\n private readonly registry: DestinationRegistry;\n\n private readonly executor: DestinationExecutor;\n\n private readonly metrics: DestinationMetrics;\n\n private readonly logger: DestinationLogger;\n\n private readonly concurrency: number;\n\n private lastResults: DestinationResult[] = [];\n\n constructor(config: DestinationDispatcherConfig) {\n this.registry = config.registry;\n this.executor = config.executor;\n this.metrics = config.metrics;\n this.logger = config.logger;\n const raw = config.concurrency ?? 3;\n this.concurrency = raw <= 0 ? 1 : raw;\n }\n\n async dispatch(event: PixelEvent): Promise<readonly DestinationResult[]> {\n const destinations = this.registry.supports(event);\n if (destinations.length === 0) {\n this.lastResults = [];\n return [];\n }\n\n const results: DestinationResult[] = [];\n\n for (let i = 0; i < destinations.length; i += this.concurrency) {\n const batch = destinations.slice(i, i + this.concurrency);\n const settled = await Promise.allSettled(\n batch.map(adapter => this.executor.execute(adapter, event))\n );\n\n for (let j = 0; j < settled.length; j += 1) {\n const outcome = settled[j]!;\n const adapter = batch[j]!;\n\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n this.metrics.record(outcome.value);\n } else {\n const failed: DestinationResult = {\n status: 'failed',\n adapter: adapter.name,\n duration: 0,\n timestamp: Date.now(),\n error:\n outcome.reason instanceof Error\n ? outcome.reason.message\n : String(outcome.reason),\n };\n results.push(failed);\n this.metrics.record(failed);\n this.logger.error(\n `Unhandled destination error: ${adapter.name}`,\n outcome.reason\n );\n }\n }\n }\n\n this.lastResults = results;\n return results;\n }\n\n getLastResults(): readonly DestinationResult[] {\n return this.lastResults;\n }\n\n clearLastResults(): void {\n this.lastResults = [];\n }\n}\n","import type { PixelEvent } from '@/events';\n\nexport type DestinationPipelineStage = {\n readonly name: string;\n process(event: PixelEvent): PixelEvent | null;\n};\n\n/**\n * Optional internal pipeline for destinations / engine ingress.\n * Stages compose; PixelEvent is never mutated in place — stages return new or same reference.\n */\nexport class DestinationPipeline {\n private readonly stages: readonly DestinationPipelineStage[];\n\n private lastSteps: string[] = [];\n\n constructor(stages: readonly DestinationPipelineStage[] = []) {\n this.stages = stages;\n }\n\n static identity(): DestinationPipeline {\n return new DestinationPipeline([\n {\n name: 'identity',\n process(event) {\n return event;\n },\n },\n ]);\n }\n\n process(event: PixelEvent): PixelEvent | null {\n const steps: string[] = [];\n let current: PixelEvent | null = event;\n\n for (const stage of this.stages) {\n steps.push(stage.name);\n if (!current) break;\n current = stage.process(current);\n }\n\n this.lastSteps = steps;\n return current;\n }\n\n getLastSteps(): readonly string[] {\n return this.lastSteps;\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { DispatcherService } from '@/services/dispatcher/types';\n\n/**\n * Subscribes Integration Engine to Dispatcher — owns no Transport knowledge.\n */\nexport class DestinationSubscriber {\n private readonly dispatcher: DispatcherService;\n\n private readonly onEvent: (event: PixelEvent) => void;\n\n private unsubscribe: (() => void) | null = null;\n\n constructor(\n dispatcher: DispatcherService,\n onEvent: (event: PixelEvent) => void\n ) {\n this.dispatcher = dispatcher;\n this.onEvent = onEvent;\n }\n\n subscribe(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = this.dispatcher.subscribe(event => this.onEvent(event));\n }\n\n unsubscribeAll(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n isSubscribed(): boolean {\n return this.unsubscribe !== null;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { DestinationAdapter, DestinationResult } from '../types';\n\n/** Events typically relevant for conversion / commerce destinations. */\nexport const DEFAULT_COMMERCE_EVENT_TYPES = new Set([\n 'PAGE_VIEW',\n 'PAGE_CLICK',\n 'SEARCH',\n 'LEAD',\n 'INITIATE_CHECKOUT',\n 'PURCHASE',\n 'ADD_PAYMENT_INFO',\n 'ADD_TO_CART',\n 'REMOVE_FROM_CART',\n 'VIEW_CONTENT',\n]);\n\nexport type BaseDestinationOptions = {\n readonly name: string;\n readonly version?: string;\n readonly supportedTypes?: ReadonlySet<string>;\n};\n\n/**\n * Shared helpers for destination adapters — each subclass owns supports() subset\n * and builds its own external payload without mutating PixelEvent.\n */\nexport abstract class BaseDestinationAdapter implements DestinationAdapter {\n readonly name: string;\n\n readonly version: string;\n\n protected readonly supportedTypes: ReadonlySet<string>;\n\n constructor(options: BaseDestinationOptions) {\n this.name = options.name;\n this.version = options.version ?? '1.0.0';\n this.supportedTypes =\n options.supportedTypes ?? DEFAULT_COMMERCE_EVENT_TYPES;\n }\n\n supports(event: PixelEvent): boolean {\n return this.supportedTypes.has(event.type);\n }\n\n abstract execute(context: {\n readonly event: PixelEvent;\n readonly signal: AbortSignal;\n readonly timeoutMs: number;\n readonly debug: boolean;\n }): Promise<DestinationResult>;\n\n protected createResult(\n status: DestinationResult['status'],\n duration: number,\n extras?: Partial<DestinationResult>\n ): DestinationResult {\n return {\n status,\n adapter: this.name,\n duration,\n timestamp: Date.now(),\n ...extras,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport {\n BaseDestinationAdapter,\n DEFAULT_COMMERCE_EVENT_TYPES,\n} from './BaseDestinationAdapter';\nimport type { DestinationResult } from '../types';\n\nexport type ConsoleDestinationOptions = {\n readonly log?: (message: string, payload?: unknown) => void;\n};\n\n/**\n * Test / debug destination — logs events to console without side effects.\n */\nexport class ConsoleDestination extends BaseDestinationAdapter {\n private readonly log: (message: string, payload?: unknown) => void;\n\n private sent = 0;\n\n constructor(options: ConsoleDestinationOptions = {}) {\n super({\n name: 'console',\n version: '1.0.0',\n supportedTypes: DEFAULT_COMMERCE_EVENT_TYPES,\n });\n this.log =\n options.log ??\n ((message, payload) => {\n // eslint-disable-next-line no-console\n console.log(message, payload);\n });\n }\n\n async execute(context: {\n readonly event: PixelEvent;\n readonly signal: AbortSignal;\n }): Promise<DestinationResult> {\n const startedAt = Date.now();\n\n if (context.signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n const payload = {\n type: context.event.type,\n timestamp: context.event.timestamp,\n category:\n 'category' in context.event ? context.event.category : undefined,\n };\n\n this.log(`[Console] ${context.event.type}`, payload);\n this.sent += 1;\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { sent: this.sent },\n });\n }\n\n getSentCount(): number {\n return this.sent;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport {\n BaseDestinationAdapter,\n DEFAULT_COMMERCE_EVENT_TYPES,\n} from './BaseDestinationAdapter';\nimport type { DestinationResult } from '../types';\n\n/**\n * In-memory destination for tests and playground inspection.\n * Stores transformed payloads — never mutates PixelEvent.\n */\nexport class MemoryDestination extends BaseDestinationAdapter {\n private readonly records: Array<{\n readonly at: number;\n readonly type: string;\n readonly payload: Readonly<Record<string, unknown>>;\n }> = [];\n\n constructor() {\n super({\n name: 'memory',\n version: '1.0.0',\n supportedTypes: DEFAULT_COMMERCE_EVENT_TYPES,\n });\n }\n\n async execute(context: {\n readonly event: PixelEvent;\n readonly signal: AbortSignal;\n }): Promise<DestinationResult> {\n const startedAt = Date.now();\n\n if (context.signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n const payload = this.transform(context.event);\n this.records.push({\n at: Date.now(),\n type: context.event.type,\n payload,\n });\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { recordCount: this.records.length },\n });\n }\n\n getRecords(): readonly {\n readonly at: number;\n readonly type: string;\n readonly payload: Readonly<Record<string, unknown>>;\n }[] {\n return [...this.records];\n }\n\n clear(): void {\n this.records.length = 0;\n }\n\n destroy(): void {\n this.clear();\n }\n\n private transform(event: PixelEvent): Record<string, unknown> {\n return {\n destination: 'memory',\n eventType: event.type,\n timestamp: event.timestamp,\n path: 'path' in event ? event.path : undefined,\n data: 'data' in event ? event.data : undefined,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport {\n BaseDestinationAdapter,\n DEFAULT_COMMERCE_EVENT_TYPES,\n} from './BaseDestinationAdapter';\nimport type { DestinationResult } from '../types';\n\nexport type MockDestinationOptions = {\n readonly failOnTypes?: ReadonlySet<string>;\n readonly ignoreTypes?: ReadonlySet<string>;\n readonly delayMs?: number;\n readonly supportedTypes?: ReadonlySet<string>;\n};\n\n/**\n * Controllable mock destination for unit tests (fail / ignore / delay).\n */\nexport class MockDestination extends BaseDestinationAdapter {\n private readonly failOnTypes: ReadonlySet<string>;\n\n private readonly ignoreTypes: ReadonlySet<string>;\n\n private readonly delayMs: number;\n\n private executions = 0;\n\n constructor(options: MockDestinationOptions = {}) {\n super({\n name: 'mock',\n version: '1.0.0',\n supportedTypes: options.supportedTypes ?? DEFAULT_COMMERCE_EVENT_TYPES,\n });\n this.failOnTypes = options.failOnTypes ?? new Set();\n this.ignoreTypes = options.ignoreTypes ?? new Set();\n this.delayMs = options.delayMs ?? 0;\n }\n\n async execute(context: {\n readonly event: PixelEvent;\n readonly signal: AbortSignal;\n }): Promise<DestinationResult> {\n const startedAt = Date.now();\n this.executions += 1;\n\n if (this.delayMs > 0) {\n await this.wait(this.delayMs, context.signal);\n }\n\n if (context.signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n if (this.ignoreTypes.has(context.event.type)) {\n return this.createResult('ignored', Date.now() - startedAt, {\n ignored: true,\n });\n }\n\n if (this.failOnTypes.has(context.event.type)) {\n throw new Error(`[Mock] Simulated failure for ${context.event.type}`);\n }\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { executions: this.executions },\n });\n }\n\n getExecutionCount(): number {\n return this.executions;\n }\n\n private wait(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = (): void => {\n cleanup();\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n };\n\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n\n if (signal.aborted) {\n cleanup();\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n return;\n }\n\n signal.addEventListener('abort', onAbort);\n });\n }\n}\n","/**\n * Shared PAGE_VIEW dedupe across Pixel instances (browser infra only).\n * Key: destinationName + destinationId + eventType + path/url + sessionId\n * Example: meta:877074838786597:PAGE_VIEW:/checkout:sess_abc\n */\nconst globalSeen = new Set<string>();\n\nexport function buildExternalPageViewKey(\n destinationName: string,\n destinationId: string,\n eventType: string,\n pathOrUrl: string,\n sessionId: string\n): string {\n return `${destinationName}:${destinationId}:${eventType}:${pathOrUrl}:${sessionId}`;\n}\n\nexport function shouldSkipExternalPageView(key: string): boolean {\n if (globalSeen.has(key)) return true;\n globalSeen.add(key);\n return false;\n}\n\n/** Test-only — clears shared dedupe state. */\nexport function clearExternalPageViewDeduper(): void {\n globalSeen.clear();\n}\n\nexport function getExternalPageViewDeduperSize(): number {\n return globalSeen.size;\n}\n\n/** @deprecated Use module functions — kept for backward compatibility in tests. */\nexport class ExternalPageViewDeduper {\n buildKey(\n destinationName: string,\n destinationId: string,\n eventType: string,\n path: string,\n sessionId: string\n ): string {\n return buildExternalPageViewKey(\n destinationName,\n destinationId,\n eventType,\n path,\n sessionId\n );\n }\n\n shouldSkip(key: string): boolean {\n return shouldSkipExternalPageView(key);\n }\n\n clear(): void {\n clearExternalPageViewDeduper();\n }\n\n size(): number {\n return getExternalPageViewDeduperSize();\n }\n}\n","type ScriptEntry = {\n promise: Promise<void>;\n refCount: number;\n loaded: boolean;\n};\n\n/**\n * SSR-safe script loader with URL-level cache + ref-count.\n * Infrastructure only — no business state.\n */\nconst scriptCache = new Map<string, ScriptEntry>();\n\nexport type ScriptLoaderOptions = {\n readonly src: string;\n readonly id?: string;\n readonly timeoutMs?: number;\n readonly attributes?: Readonly<Record<string, string>>;\n};\n\nexport function loadScript(options: ScriptLoaderOptions): Promise<void> {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return Promise.reject(new Error('[ScriptLoader] Browser APIs unavailable'));\n }\n\n const existing = scriptCache.get(options.src);\n if (existing) {\n existing.refCount += 1;\n return existing.promise;\n }\n\n const timeoutMs = options.timeoutMs ?? 10_000;\n\n const promise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.async = true;\n script.src = options.src;\n if (options.id) script.id = options.id;\n\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n script.setAttribute(key, value);\n }\n }\n\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`[ScriptLoader] Timeout loading ${options.src}`));\n }, timeoutMs);\n\n const cleanup = (): void => {\n clearTimeout(timer);\n script.onload = null;\n script.onerror = null;\n };\n\n script.onload = () => {\n cleanup();\n const entry = scriptCache.get(options.src);\n if (entry) entry.loaded = true;\n resolve();\n };\n\n script.onerror = () => {\n cleanup();\n scriptCache.delete(options.src);\n reject(new Error(`[ScriptLoader] Failed to load ${options.src}`));\n };\n\n document.head.appendChild(script);\n });\n\n scriptCache.set(options.src, { promise, refCount: 1, loaded: false });\n return promise;\n}\n\nexport function releaseScript(src: string): void {\n const entry = scriptCache.get(src);\n if (!entry) return;\n entry.refCount = Math.max(0, entry.refCount - 1);\n // Keep script in DOM for other instances; only drop cache entry when unused.\n if (entry.refCount === 0 && !entry.loaded) {\n scriptCache.delete(src);\n }\n}\n\n/** @internal tests */\nexport function _testClearScriptCache(): void {\n scriptCache.clear();\n}\n","export type MetaFbq = {\n (...args: unknown[]): void;\n callMethod?: (...args: unknown[]) => void;\n queue?: unknown[];\n loaded?: boolean;\n version?: string;\n push?: (...args: unknown[]) => void;\n};\n\nexport const META_PIXEL_SCRIPT_SRC =\n 'https://connect.facebook.net/en_US/fbevents.js';\n","import { loadScript, releaseScript } from '../../../browser/ScriptLoader';\nimport { META_PIXEL_SCRIPT_SRC, type MetaFbq } from './types';\n\ntype WindowWithFbq = Window & { fbq?: MetaFbq; _fbq?: MetaFbq };\n\nfunction getWindow(): WindowWithFbq | null {\n return typeof window !== 'undefined' ? (window as WindowWithFbq) : null;\n}\n\nfunction ensureFbqStub(): MetaFbq {\n const win = getWindow();\n if (!win) throw new Error('[MetaScriptLoader] window unavailable');\n if (win.fbq) return win.fbq as MetaFbq;\n\n const fbq = function (...args: unknown[]) {\n const fn = fbq as MetaFbq;\n if (fn.callMethod) {\n fn.callMethod(...args);\n } else {\n (fn.queue = fn.queue || []).push(args);\n }\n } as MetaFbq;\n\n fbq.push = fbq;\n fbq.loaded = false;\n fbq.version = '2.0';\n fbq.queue = [];\n\n win.fbq = fbq;\n if (!win._fbq) win._fbq = fbq;\n\n return fbq;\n}\n\nexport class MetaScriptLoader {\n private loaded = false;\n\n async load(timeoutMs = 10_000): Promise<MetaFbq> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('[MetaScriptLoader] Browser APIs unavailable');\n }\n\n const fbq = ensureFbqStub();\n if (this.loaded && fbq.loaded) return fbq;\n\n await loadScript({\n src: META_PIXEL_SCRIPT_SRC,\n id: 'pixel-v2-meta-fbevents',\n timeoutMs,\n });\n\n fbq.loaded = true;\n this.loaded = true;\n return fbq;\n }\n\n release(): void {\n releaseScript(META_PIXEL_SCRIPT_SRC);\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { MetaBrowserDestinationConfig } from '@/config/types/modules/integrations';\n\nimport { BaseDestinationAdapter } from '../../BaseDestinationAdapter';\nimport type { DestinationContext, DestinationResult } from '../../../types';\nimport {\n buildExternalPageViewKey,\n shouldSkipExternalPageView,\n} from '../../../browser/ExternalPageViewDeduper';\nimport type { DestinationMetrics } from '../../../DestinationMetrics';\nimport { DestinationLogger } from '../../../DestinationLogger';\nimport { MetaScriptLoader } from './MetaScriptLoader';\nimport type { MetaFbq } from './types';\n\nexport type MetaBrowserDestinationDeps = {\n readonly config: MetaBrowserDestinationConfig;\n readonly getSessionId: () => string;\n readonly logger: DestinationLogger;\n readonly metrics?: DestinationMetrics;\n readonly debug: boolean;\n};\n\n/**\n * Meta Pixel browser destination — PAGE_VIEW only.\n * Conversões Meta CAPI pertencem ao backend.\n */\nexport class MetaBrowserDestination extends BaseDestinationAdapter {\n private readonly config: MetaBrowserDestinationConfig;\n\n private readonly getSessionId: () => string;\n\n private readonly logger: DestinationLogger;\n\n private readonly metrics?: DestinationMetrics;\n\n private readonly debug: boolean;\n\n private readonly scriptLoader = new MetaScriptLoader();\n\n private readonly pixelIds: string[];\n\n private initialized = false;\n\n private fbq: MetaFbq | null = null;\n\n constructor(deps: MetaBrowserDestinationDeps) {\n super({\n name: 'meta',\n version: '1.0.0',\n supportedTypes: new Set(['PAGE_VIEW']),\n });\n this.config = deps.config;\n this.getSessionId = deps.getSessionId;\n this.logger = deps.logger.forAdapter('MetaBrowser');\n this.metrics = deps.metrics;\n this.debug = deps.debug;\n this.pixelIds = [...new Set(deps.config.pixelIds.filter(Boolean))];\n }\n\n supports(event: PixelEvent): boolean {\n return (\n this.config.enabled &&\n this.config.autoPageView !== false &&\n this.pixelIds.length > 0 &&\n event.type === 'PAGE_VIEW'\n );\n }\n\n async ensureInit(timeoutMs: number): Promise<void> {\n if (this.initialized) return;\n if (!this.config.enabled || this.pixelIds.length === 0) return;\n\n this.metrics?.recordInitAttempt('meta');\n if (this.debug) this.logger.debug('destination_init_start');\n\n if (this.config.loadScript !== false) {\n this.metrics?.recordScriptLoadAttempt('meta');\n if (this.debug) this.logger.debug('script_load_start');\n try {\n this.fbq = await this.scriptLoader.load(timeoutMs);\n this.metrics?.recordScriptLoadSuccess('meta');\n if (this.debug) this.logger.debug('script_load_success');\n } catch (error) {\n this.metrics?.recordScriptLoadFailure('meta');\n this.logger.error('script_load_failure', error);\n throw error;\n }\n } else if (\n typeof window !== 'undefined' &&\n (window as { fbq?: MetaFbq }).fbq\n ) {\n this.fbq = (window as { fbq?: MetaFbq }).fbq ?? null;\n }\n\n const fbq = this.fbq;\n if (!fbq) {\n this.metrics?.recordInitFailure('meta');\n throw new Error('[MetaBrowser] fbq unavailable');\n }\n\n let initFailed = false;\n for (const pixelId of this.pixelIds) {\n try {\n fbq('init', pixelId);\n } catch (error) {\n initFailed = true;\n this.metrics?.recordInitFailure('meta');\n this.logger.error(`destination_init_failure id=${pixelId}`, error);\n }\n }\n\n this.initialized = true;\n if (!initFailed) this.metrics?.recordInitSuccess('meta');\n if (this.debug) this.logger.debug('destination_init_success');\n }\n\n async execute(context: DestinationContext): Promise<DestinationResult> {\n const startedAt = Date.now();\n const { event, signal, timeoutMs } = context;\n\n if (event.type !== 'PAGE_VIEW') {\n return this.createResult('ignored', Date.now() - startedAt, {\n ignored: true,\n });\n }\n\n if (signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n if (this.debug) this.logger.debug('pageview_received');\n\n try {\n await this.ensureInit(timeoutMs);\n } catch (error) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const fbq =\n this.fbq ??\n (typeof window !== 'undefined'\n ? ((window as { fbq?: MetaFbq }).fbq ?? null)\n : null);\n if (!fbq) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'fbq unavailable',\n });\n }\n\n const path = event.path ?? event.url ?? '/';\n const sessionId = this.getSessionId();\n let sent = 0;\n let deduped = 0;\n\n for (const pixelId of this.pixelIds) {\n const key = buildExternalPageViewKey(\n 'meta',\n pixelId,\n 'PAGE_VIEW',\n path,\n sessionId\n );\n\n if (shouldSkipExternalPageView(key)) {\n deduped += 1;\n if (this.debug)\n this.logger.debug(`pageview_skipped_dedupe id=${pixelId}`);\n continue;\n }\n\n try {\n if (typeof fbq === 'function') {\n try {\n fbq('trackSingle', pixelId, 'PageView');\n } catch {\n fbq('track', 'PageView');\n }\n }\n sent += 1;\n if (this.debug) this.logger.debug(`pageview_sent id=${pixelId}`);\n } catch (error) {\n this.logger.error(`destination_execute_failure id=${pixelId}`, error);\n }\n }\n\n if (sent === 0 && deduped > 0) {\n return this.createResult('skipped', Date.now() - startedAt, {\n skipped: true,\n metadata: { sent, deduped },\n });\n }\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { sent, deduped, pixelIds: this.pixelIds },\n });\n }\n\n destroy(): void {\n this.scriptLoader.release();\n this.initialized = false;\n this.fbq = null;\n }\n}\n","export type GoogleGtag = (...args: unknown[]) => void;\n\nexport const GOOGLE_GTAG_SCRIPT_BASE =\n 'https://www.googletagmanager.com/gtag/js';\n","import { loadScript, releaseScript } from '../../../browser/ScriptLoader';\nimport { GOOGLE_GTAG_SCRIPT_BASE, type GoogleGtag } from './types';\n\ntype WindowWithGtag = Window & {\n dataLayer?: unknown[];\n gtag?: GoogleGtag;\n};\n\nfunction getWindow(): WindowWithGtag | null {\n return typeof window !== 'undefined' ? (window as WindowWithGtag) : null;\n}\n\nfunction ensureGtagStub(): GoogleGtag {\n const win = getWindow();\n if (!win) throw new Error('[GoogleScriptLoader] window unavailable');\n\n win.dataLayer = win.dataLayer || [];\n if (!win.gtag) {\n win.gtag = function gtag(...args: unknown[]) {\n win.dataLayer?.push(args);\n };\n }\n return win.gtag;\n}\n\nexport class GoogleScriptLoader {\n private loadedSrc: string | null = null;\n\n async load(primaryTagId: string, timeoutMs = 10_000): Promise<GoogleGtag> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('[GoogleScriptLoader] Browser APIs unavailable');\n }\n\n const gtag = ensureGtagStub();\n const src = `${GOOGLE_GTAG_SCRIPT_BASE}?id=${encodeURIComponent(primaryTagId)}`;\n\n await loadScript({\n src,\n id: 'pixel-v2-google-gtag',\n timeoutMs,\n });\n\n this.loadedSrc = src;\n gtag('js', new Date());\n return gtag;\n }\n\n release(): void {\n if (this.loadedSrc) {\n releaseScript(this.loadedSrc);\n this.loadedSrc = null;\n }\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { GoogleBrowserDestinationConfig } from '@/config/types/modules/integrations';\n\nimport { BaseDestinationAdapter } from '../../BaseDestinationAdapter';\nimport type { DestinationContext, DestinationResult } from '../../../types';\nimport {\n buildExternalPageViewKey,\n shouldSkipExternalPageView,\n} from '../../../browser/ExternalPageViewDeduper';\nimport type { DestinationMetrics } from '../../../DestinationMetrics';\nimport { DestinationLogger } from '../../../DestinationLogger';\nimport { GoogleScriptLoader } from './GoogleScriptLoader';\nimport type { GoogleGtag } from './types';\n\nexport type GoogleBrowserDestinationDeps = {\n readonly config: GoogleBrowserDestinationConfig;\n readonly getSessionId: () => string;\n readonly logger: DestinationLogger;\n readonly metrics?: DestinationMetrics;\n readonly debug: boolean;\n};\n\n/**\n * Google gtag browser destination — PAGE_VIEW only.\n * Conversões server-side pertencem ao backend.\n */\nexport class GoogleBrowserDestination extends BaseDestinationAdapter {\n private readonly config: GoogleBrowserDestinationConfig;\n\n private readonly getSessionId: () => string;\n\n private readonly logger: DestinationLogger;\n\n private readonly metrics?: DestinationMetrics;\n\n private readonly debug: boolean;\n\n private readonly scriptLoader = new GoogleScriptLoader();\n\n private readonly tagIds: string[];\n\n private initialized = false;\n\n private gtag: GoogleGtag | null = null;\n\n constructor(deps: GoogleBrowserDestinationDeps) {\n super({\n name: 'google',\n version: '1.0.0',\n supportedTypes: new Set(['PAGE_VIEW']),\n });\n this.config = deps.config;\n this.getSessionId = deps.getSessionId;\n this.logger = deps.logger.forAdapter('GoogleBrowser');\n this.metrics = deps.metrics;\n this.debug = deps.debug;\n this.tagIds = [...new Set(deps.config.tagIds.filter(Boolean))];\n }\n\n supports(event: PixelEvent): boolean {\n return (\n this.config.enabled &&\n this.config.autoPageView !== false &&\n this.tagIds.length > 0 &&\n event.type === 'PAGE_VIEW'\n );\n }\n\n async ensureInit(timeoutMs: number): Promise<void> {\n if (this.initialized) return;\n if (!this.config.enabled || this.tagIds.length === 0) return;\n\n this.metrics?.recordInitAttempt('google');\n if (this.debug) this.logger.debug('destination_init_start');\n const primary = this.tagIds[0]!;\n\n if (this.config.loadScript !== false) {\n this.metrics?.recordScriptLoadAttempt('google');\n if (this.debug) this.logger.debug('script_load_start');\n try {\n this.gtag = await this.scriptLoader.load(primary, timeoutMs);\n this.metrics?.recordScriptLoadSuccess('google');\n if (this.debug) this.logger.debug('script_load_success');\n } catch (error) {\n this.metrics?.recordScriptLoadFailure('google');\n this.logger.error('script_load_failure', error);\n throw error;\n }\n } else if (\n typeof window !== 'undefined' &&\n (window as { gtag?: GoogleGtag }).gtag\n ) {\n this.gtag = (window as { gtag?: GoogleGtag }).gtag ?? null;\n }\n\n const gtag = this.gtag;\n if (!gtag) {\n this.metrics?.recordInitFailure('google');\n throw new Error('[GoogleBrowser] gtag unavailable');\n }\n\n let initFailed = false;\n for (const tagId of this.tagIds) {\n try {\n gtag('config', tagId, { send_page_view: false });\n } catch (error) {\n initFailed = true;\n this.metrics?.recordInitFailure('google');\n this.logger.error(`destination_init_failure id=${tagId}`, error);\n }\n }\n\n this.initialized = true;\n if (!initFailed) this.metrics?.recordInitSuccess('google');\n if (this.debug) this.logger.debug('destination_init_success');\n }\n\n async execute(context: DestinationContext): Promise<DestinationResult> {\n const startedAt = Date.now();\n const { event, signal, timeoutMs } = context;\n\n if (event.type !== 'PAGE_VIEW') {\n return this.createResult('ignored', Date.now() - startedAt, {\n ignored: true,\n });\n }\n\n if (signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n if (this.debug) this.logger.debug('pageview_received');\n\n try {\n await this.ensureInit(timeoutMs);\n } catch (error) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const gtag =\n this.gtag ??\n (typeof window !== 'undefined'\n ? ((window as { gtag?: GoogleGtag }).gtag ?? null)\n : null);\n if (!gtag) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'gtag unavailable',\n });\n }\n\n const path = event.path ?? '/';\n const url =\n event.url ??\n (typeof window !== 'undefined' ? window.location?.href : undefined) ??\n path;\n const title = typeof document !== 'undefined' ? document.title : undefined;\n const sessionId = this.getSessionId();\n let sent = 0;\n let deduped = 0;\n\n for (const tagId of this.tagIds) {\n const key = buildExternalPageViewKey(\n 'google',\n tagId,\n 'PAGE_VIEW',\n path,\n sessionId\n );\n\n if (shouldSkipExternalPageView(key)) {\n deduped += 1;\n if (this.debug)\n this.logger.debug(`pageview_skipped_dedupe id=${tagId}`);\n continue;\n }\n\n try {\n gtag('event', 'page_view', {\n send_to: tagId,\n page_location: url,\n page_path: path,\n page_title: title,\n });\n sent += 1;\n if (this.debug) this.logger.debug(`pageview_sent id=${tagId}`);\n } catch (error) {\n this.logger.error(`destination_execute_failure id=${tagId}`, error);\n }\n }\n\n if (sent === 0 && deduped > 0) {\n return this.createResult('skipped', Date.now() - startedAt, {\n skipped: true,\n metadata: { sent, deduped },\n });\n }\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { sent, deduped, tagIds: this.tagIds },\n });\n }\n\n destroy(): void {\n this.scriptLoader.release();\n this.initialized = false;\n this.gtag = null;\n }\n}\n","export type TikTokTtq = {\n load: (pixelId: string) => void;\n page: () => void;\n track?: (event: string, payload?: Record<string, unknown>) => void;\n instance?: (pixelId: string) => TikTokTtq;\n};\n\nexport const TIKTOK_PIXEL_SCRIPT_SRC =\n 'https://analytics.tiktok.com/i18n/pixel/events.js';\n","import { loadScript, releaseScript } from '../../../browser/ScriptLoader';\nimport { TIKTOK_PIXEL_SCRIPT_SRC, type TikTokTtq } from './types';\n\ntype WindowWithTtq = Window & {\n ttq?: TikTokTtq;\n TiktokAnalyticsObject?: string;\n};\n\nfunction getWindow(): WindowWithTtq | null {\n return typeof window !== 'undefined' ? (window as WindowWithTtq) : null;\n}\n\nfunction ensureTtqStub(): TikTokTtq {\n const win = getWindow();\n if (!win) throw new Error('[TikTokScriptLoader] window unavailable');\n if (win.ttq) return win.ttq;\n\n const ttq = {\n load() {},\n page() {},\n track() {},\n } as TikTokTtq;\n\n win.TiktokAnalyticsObject = 'ttq';\n win.ttq = ttq;\n return ttq;\n}\n\nexport class TikTokScriptLoader {\n private loaded = false;\n\n async load(timeoutMs = 10_000): Promise<TikTokTtq> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('[TikTokScriptLoader] Browser APIs unavailable');\n }\n\n const ttq = ensureTtqStub();\n if (this.loaded) return ttq;\n\n await loadScript({\n src: TIKTOK_PIXEL_SCRIPT_SRC,\n id: 'pixel-v2-tiktok-analytics',\n timeoutMs,\n });\n\n this.loaded = true;\n return getWindow()?.ttq ?? ttq;\n }\n\n release(): void {\n releaseScript(TIKTOK_PIXEL_SCRIPT_SRC);\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { TikTokBrowserDestinationConfig } from '@/config/types/modules/integrations';\n\nimport { BaseDestinationAdapter } from '../../BaseDestinationAdapter';\nimport type { DestinationContext, DestinationResult } from '../../../types';\nimport {\n buildExternalPageViewKey,\n shouldSkipExternalPageView,\n} from '../../../browser/ExternalPageViewDeduper';\nimport type { DestinationMetrics } from '../../../DestinationMetrics';\nimport { DestinationLogger } from '../../../DestinationLogger';\nimport { TikTokScriptLoader } from './TikTokScriptLoader';\nimport type { TikTokTtq } from './types';\n\nexport type TikTokBrowserDestinationDeps = {\n readonly config: TikTokBrowserDestinationConfig;\n readonly getSessionId: () => string;\n readonly logger: DestinationLogger;\n readonly metrics?: DestinationMetrics;\n readonly debug: boolean;\n};\n\n/**\n * TikTok Pixel browser destination — PAGE_VIEW only.\n *\n * Limitation: when only the global `ttq.page()` API exists (no `ttq.instance`),\n * a single page() call is issued per PAGE_VIEW event — not once per pixelId.\n * Multi-pixel dedupe still tracks per pixelId for the instance API path.\n */\nexport class TikTokBrowserDestination extends BaseDestinationAdapter {\n private readonly config: TikTokBrowserDestinationConfig;\n\n private readonly getSessionId: () => string;\n\n private readonly logger: DestinationLogger;\n\n private readonly metrics?: DestinationMetrics;\n\n private readonly debug: boolean;\n\n private readonly scriptLoader = new TikTokScriptLoader();\n\n private readonly pixelIds: string[];\n\n private initialized = false;\n\n private ttq: TikTokTtq | null = null;\n\n constructor(deps: TikTokBrowserDestinationDeps) {\n super({\n name: 'tiktok',\n version: '1.0.0',\n supportedTypes: new Set(['PAGE_VIEW']),\n });\n this.config = deps.config;\n this.getSessionId = deps.getSessionId;\n this.logger = deps.logger.forAdapter('TikTokBrowser');\n this.metrics = deps.metrics;\n this.debug = deps.debug;\n this.pixelIds = [...new Set(deps.config.pixelIds.filter(Boolean))];\n }\n\n supports(event: PixelEvent): boolean {\n return (\n this.config.enabled &&\n this.config.autoPageView !== false &&\n this.pixelIds.length > 0 &&\n event.type === 'PAGE_VIEW'\n );\n }\n\n async ensureInit(timeoutMs: number): Promise<void> {\n if (this.initialized) return;\n if (!this.config.enabled || this.pixelIds.length === 0) return;\n\n this.metrics?.recordInitAttempt('tiktok');\n if (this.debug) this.logger.debug('destination_init_start');\n\n if (this.config.loadScript !== false) {\n this.metrics?.recordScriptLoadAttempt('tiktok');\n if (this.debug) this.logger.debug('script_load_start');\n try {\n this.ttq = await this.scriptLoader.load(timeoutMs);\n this.metrics?.recordScriptLoadSuccess('tiktok');\n if (this.debug) this.logger.debug('script_load_success');\n } catch (error) {\n this.metrics?.recordScriptLoadFailure('tiktok');\n this.logger.error('script_load_failure', error);\n throw error;\n }\n } else if (\n typeof window !== 'undefined' &&\n (window as { ttq?: TikTokTtq }).ttq\n ) {\n this.ttq = (window as { ttq?: TikTokTtq }).ttq ?? null;\n }\n\n const ttq = this.ttq;\n if (!ttq) {\n this.metrics?.recordInitFailure('tiktok');\n throw new Error('[TikTokBrowser] ttq unavailable');\n }\n\n let initFailed = false;\n for (const pixelId of this.pixelIds) {\n try {\n ttq.load(pixelId);\n } catch (error) {\n initFailed = true;\n this.metrics?.recordInitFailure('tiktok');\n this.logger.error(`destination_init_failure id=${pixelId}`, error);\n }\n }\n\n this.initialized = true;\n if (!initFailed) this.metrics?.recordInitSuccess('tiktok');\n if (this.debug) this.logger.debug('destination_init_success');\n }\n\n async execute(context: DestinationContext): Promise<DestinationResult> {\n const startedAt = Date.now();\n const { event, signal, timeoutMs } = context;\n\n if (event.type !== 'PAGE_VIEW') {\n return this.createResult('ignored', Date.now() - startedAt, {\n ignored: true,\n });\n }\n\n if (signal.aborted) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'Aborted',\n });\n }\n\n if (this.debug) this.logger.debug('pageview_received');\n\n try {\n await this.ensureInit(timeoutMs);\n } catch (error) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const ttq =\n this.ttq ??\n (typeof window !== 'undefined'\n ? ((window as { ttq?: TikTokTtq }).ttq ?? null)\n : null);\n if (!ttq) {\n return this.createResult('failed', Date.now() - startedAt, {\n error: 'ttq unavailable',\n });\n }\n\n const path = event.path ?? event.url ?? '/';\n const sessionId = this.getSessionId();\n let sent = 0;\n let deduped = 0;\n\n const hasInstanceApi = typeof ttq.instance === 'function';\n\n if (hasInstanceApi) {\n for (const pixelId of this.pixelIds) {\n const key = buildExternalPageViewKey(\n 'tiktok',\n pixelId,\n 'PAGE_VIEW',\n path,\n sessionId\n );\n\n if (shouldSkipExternalPageView(key)) {\n deduped += 1;\n if (this.debug)\n this.logger.debug(`pageview_skipped_dedupe id=${pixelId}`);\n continue;\n }\n\n try {\n const instance = ttq.instance!(pixelId);\n instance.page();\n sent += 1;\n if (this.debug) this.logger.debug(`pageview_sent id=${pixelId}`);\n } catch (error) {\n this.logger.error(`destination_execute_failure id=${pixelId}`, error);\n }\n }\n } else {\n // Global ttq.page() — single call per PAGE_VIEW, not per pixelId.\n const dedupeId = this.pixelIds[0] ?? 'global';\n const key = buildExternalPageViewKey(\n 'tiktok',\n dedupeId,\n 'PAGE_VIEW',\n path,\n sessionId\n );\n\n if (shouldSkipExternalPageView(key)) {\n deduped = 1;\n if (this.debug) this.logger.debug('pageview_skipped_dedupe global');\n } else {\n try {\n ttq.page();\n sent = 1;\n if (this.debug) this.logger.debug('pageview_sent global');\n } catch (error) {\n this.logger.error('destination_execute_failure global', error);\n }\n }\n }\n\n if (sent === 0 && deduped > 0) {\n return this.createResult('skipped', Date.now() - startedAt, {\n skipped: true,\n metadata: { sent, deduped },\n });\n }\n\n return this.createResult('success', Date.now() - startedAt, {\n metadata: { sent, deduped, pixelIds: this.pixelIds },\n });\n }\n\n destroy(): void {\n this.scriptLoader.release();\n this.initialized = false;\n this.ttq = null;\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger';\nimport type { IntegrationsModuleConfig } from '@/config/types/modules/integrations';\n\nimport {\n ConsoleDestination,\n MemoryDestination,\n MockDestination,\n} from './adapters';\nimport {\n MetaBrowserDestination,\n GoogleBrowserDestination,\n TikTokBrowserDestination,\n} from './adapters/browser';\nimport type { DestinationAdapter } from './types';\nimport type {\n IntegrationDebugState,\n DestinationHooks,\n DestinationResult,\n} from './types';\nimport { DestinationDispatcher } from './DestinationDispatcher';\nimport { DestinationErrorHandler } from './DestinationErrorHandler';\nimport { DestinationExecutor } from './DestinationExecutor';\nimport { DestinationLogger } from './DestinationLogger';\nimport { DestinationMetrics } from './DestinationMetrics';\nimport { DestinationPipeline } from './DestinationPipeline';\nimport { DestinationRegistry } from './DestinationRegistry';\n\nexport type IntegrationEngineConfig = {\n readonly moduleConfig: IntegrationsModuleConfig;\n readonly getSessionId: () => string;\n};\n\n/**\n * Browser destinations fan-out only.\n * Does NOT collect attribution, enrich events, or talk to Transport/API.\n */\nexport class IntegrationEngine {\n private readonly registry: DestinationRegistry;\n\n private readonly metrics: DestinationMetrics;\n\n private readonly logger: DestinationLogger;\n\n private readonly pipeline: DestinationPipeline;\n\n private readonly dispatcher: DestinationDispatcher;\n\n private memoryDestination: MemoryDestination | null = null;\n\n private active = false;\n\n private readonly debug: boolean;\n\n constructor(\n pixelLogger: PixelLogger,\n config: IntegrationEngineConfig,\n hooks?: DestinationHooks,\n extraAdapters: readonly DestinationAdapter[] = []\n ) {\n this.registry = new DestinationRegistry();\n this.metrics = new DestinationMetrics();\n this.logger = new DestinationLogger(pixelLogger);\n this.pipeline = DestinationPipeline.identity();\n this.debug = config.moduleConfig.debug;\n\n const errorHandler = new DestinationErrorHandler(\n this.logger,\n config.moduleConfig.continueOnError\n );\n const executor = new DestinationExecutor({\n logger: this.logger,\n errorHandler,\n hooks,\n timeoutMs: config.moduleConfig.timeoutMs,\n debug: config.moduleConfig.debug,\n });\n\n this.dispatcher = new DestinationDispatcher({\n registry: this.registry,\n executor,\n metrics: this.metrics,\n logger: this.logger,\n concurrency: config.moduleConfig.concurrency,\n });\n\n const destinations = config.moduleConfig.destinations;\n const debug = config.moduleConfig.debug;\n\n if (destinations.console.enabled) {\n this.registry.register(\n new ConsoleDestination({\n log: debug\n ? (message, payload) => this.logger.debug(message, payload)\n : () => undefined,\n })\n );\n }\n\n if (destinations.memory.enabled) {\n this.memoryDestination = new MemoryDestination();\n this.registry.register(this.memoryDestination);\n }\n\n if (destinations.mock.enabled) {\n this.registry.register(new MockDestination());\n }\n\n if (destinations.meta.enabled && destinations.meta.pixelIds.length > 0) {\n this.registry.register(\n new MetaBrowserDestination({\n config: destinations.meta,\n getSessionId: config.getSessionId,\n logger: this.logger,\n metrics: this.metrics,\n debug,\n })\n );\n }\n\n if (destinations.google.enabled && destinations.google.tagIds.length > 0) {\n this.registry.register(\n new GoogleBrowserDestination({\n config: destinations.google,\n getSessionId: config.getSessionId,\n logger: this.logger,\n metrics: this.metrics,\n debug,\n })\n );\n }\n\n if (\n destinations.tiktok.enabled &&\n destinations.tiktok.pixelIds.length > 0\n ) {\n this.registry.register(\n new TikTokBrowserDestination({\n config: destinations.tiktok,\n getSessionId: config.getSessionId,\n logger: this.logger,\n metrics: this.metrics,\n debug,\n })\n );\n }\n\n for (const adapter of extraAdapters) {\n this.registry.register(adapter);\n }\n\n this.metrics.setRegisteredCount(this.registry.size());\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n if (this.debug) {\n this.logger.debug('IntegrationEngine initialized (browser destinations)');\n }\n }\n\n destroy(): void {\n if (!this.active) return;\n this.registry.clear();\n this.metrics.reset();\n this.dispatcher.clearLastResults();\n this.memoryDestination = null;\n this.active = false;\n if (this.debug) {\n this.logger.debug('IntegrationEngine destroyed');\n }\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n handleEvent(event: PixelEvent): void {\n if (!this.active) return;\n\n if (event.type === 'PAGE_VIEW') {\n this.metrics.recordPageViewReceived();\n }\n\n const processed = this.pipeline.process(event);\n if (!processed) {\n if (this.debug) {\n this.logger.debug(\n `Event dropped by destination pipeline: ${event.type}`\n );\n }\n return;\n }\n\n void this.dispatcher.dispatch(processed);\n }\n\n async handleEventAsync(\n event: PixelEvent\n ): Promise<readonly DestinationResult[]> {\n if (!this.active) return [];\n\n if (event.type === 'PAGE_VIEW') {\n this.metrics.recordPageViewReceived();\n }\n\n const processed = this.pipeline.process(event);\n if (!processed) return [];\n\n return this.dispatcher.dispatch(processed);\n }\n\n registerDestination(adapter: DestinationAdapter): void {\n this.registry.register(adapter);\n this.metrics.setRegisteredCount(this.registry.size());\n }\n\n removeDestination(name: string): boolean {\n const removed = this.registry.remove(name);\n this.metrics.setRegisteredCount(this.registry.size());\n return removed;\n }\n\n getRegistry(): DestinationRegistry {\n return this.registry;\n }\n\n getMemoryRecords() {\n return this.memoryDestination?.getRecords() ?? [];\n }\n\n getDebugState(): IntegrationDebugState {\n return {\n active: this.active,\n destinationNames: this.registry.getAll().map(adapter => adapter.name),\n metrics: this.metrics.getSnapshot(),\n lastResults: this.dispatcher.getLastResults(),\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport {\n IntegrationEngine,\n DestinationSubscriber,\n type IntegrationDebugState,\n type DestinationAdapter,\n} from '@/integration';\n\n/**\n * PixelModule facade — browser destinations only.\n * Subscribes Dispatcher in parallel with Transport.\n * Attribution is a separate Runtime service.\n */\nexport class IntegrationsModule implements PixelModule {\n readonly name = 'integrations' as const;\n\n private engine: IntegrationEngine | null = null;\n\n private subscriber: DestinationSubscriber | null = null;\n\n private active = false;\n\n init(context: PixelRuntimeContext): void {\n if (this.active) {\n context.logger.debug('[Pixel] Integrations module already initialized');\n return;\n }\n\n if (!context.config.modules.integrations.enabled) {\n context.logger.debug('[Pixel] Integrations module disabled');\n return;\n }\n\n const moduleConfig = context.config.modules.integrations;\n\n this.engine = new IntegrationEngine(context.logger, {\n moduleConfig: {\n ...moduleConfig,\n debug: moduleConfig.debug || context.config.app.debug === true,\n },\n getSessionId: () =>\n context.services.session.getSessionId() ??\n `anon_${context.config.identity.pixelId || 'pixel'}`,\n });\n\n this.engine.init();\n\n this.subscriber = new DestinationSubscriber(\n context.services.dispatcher,\n event => this.engine?.handleEvent(event)\n );\n this.subscriber.subscribe();\n\n this.active = true;\n context.logger.debug('[Pixel] Integrations module initialized');\n }\n\n destroy(): void {\n if (!this.active) return;\n\n this.subscriber?.unsubscribeAll();\n this.subscriber = null;\n\n this.engine?.destroy();\n this.engine = null;\n\n this.active = false;\n }\n\n getDebugState(): IntegrationDebugState | null {\n return this.engine?.getDebugState() ?? null;\n }\n\n isEngineActive(): boolean {\n return this.engine?.isActive() ?? false;\n }\n\n registerDestination(adapter: DestinationAdapter): void {\n this.engine?.registerDestination(adapter);\n }\n\n removeDestination(name: string): boolean {\n return this.engine?.removeDestination(name) ?? false;\n }\n\n getMemoryRecords() {\n return this.engine?.getMemoryRecords() ?? [];\n }\n\n handleEventAsync(event: PixelEvent) {\n return this.engine?.handleEventAsync(event) ?? Promise.resolve([]);\n }\n}\n","import type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nexport class PrivacyModule implements PixelModule {\n readonly name = 'privacy' as const;\n\n init(context: PixelRuntimeContext): void {\n context.logger.debug('[Pixel] Privacy module initialized');\n }\n\n destroy(): void {}\n}\n","import type { PixelEvent } from '@/events';\nimport type { DispatcherService } from '@/services/dispatcher/types';\n\nexport class DispatcherSubscriber {\n private readonly dispatcher: DispatcherService;\n\n private readonly onEvent: (event: PixelEvent) => void;\n\n private unsubscribe: (() => void) | null = null;\n\n constructor(\n dispatcher: DispatcherService,\n onEvent: (event: PixelEvent) => void\n ) {\n this.dispatcher = dispatcher;\n this.onEvent = onEvent;\n }\n\n subscribe(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = this.dispatcher.subscribe(event => this.onEvent(event));\n }\n\n unsubscribeAll(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n isSubscribed(): boolean {\n return this.unsubscribe !== null;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { BatchConfig, BatchDebugState, IBatchManager } from './types';\n\nexport class BatchManager implements IBatchManager {\n private buffer: PixelEvent[] = [];\n\n private oldestAt: number | null = null;\n\n add(events: readonly PixelEvent[]): void {\n if (events.length === 0) return;\n\n if (this.buffer.length === 0) {\n this.oldestAt = Date.now();\n }\n\n this.buffer.push(...events);\n }\n\n takeBatch(maxSize?: number): PixelEvent[] {\n if (this.buffer.length === 0) return [];\n\n const limit = maxSize ?? this.buffer.length;\n const batch = this.buffer.splice(0, limit);\n\n if (this.buffer.length === 0) {\n this.oldestAt = null;\n }\n\n return batch;\n }\n\n peek(): readonly PixelEvent[] {\n return [...this.buffer];\n }\n\n size(): number {\n return this.buffer.length;\n }\n\n clear(): void {\n this.buffer = [];\n this.oldestAt = null;\n }\n\n shouldFlush(config: BatchConfig): boolean {\n if (this.buffer.length === 0) return false;\n if (this.buffer.length >= config.batchSize) return true;\n\n if (\n this.oldestAt !== null &&\n Date.now() - this.oldestAt >= config.maxWaitMs\n ) {\n return true;\n }\n\n return false;\n }\n\n getState(): BatchDebugState {\n return {\n bufferSize: this.buffer.length,\n oldestEventAt: this.oldestAt,\n pendingBatches: this.buffer.length,\n };\n }\n}\n","import type { CompressionResult, CompressionStrategy } from './types';\n\nexport class IdentityCompressionStrategy implements CompressionStrategy {\n readonly name = 'identity';\n\n compress(payload: string): CompressionResult {\n return {\n encoding: 'identity',\n body: payload,\n originalSize: payload.length,\n compressedSize: payload.length,\n };\n }\n}\n","import { IdentityCompressionStrategy } from './IdentityCompressionStrategy';\nimport type {\n CompressionConfig,\n CompressionDebugState,\n CompressionStrategy,\n} from './types';\n\nexport function createCompressionStrategy(\n config: CompressionConfig\n): CompressionStrategy {\n if (!config.enabled || config.strategy === 'identity') {\n return new IdentityCompressionStrategy();\n }\n\n return new IdentityCompressionStrategy();\n}\n\nexport function getCompressionDebugState(\n config: CompressionConfig,\n strategy: CompressionStrategy,\n lastResult?: { originalSize: number; compressedSize: number } | null\n): CompressionDebugState {\n return {\n enabled: config.enabled,\n strategy: strategy.name,\n lastOriginalSize: lastResult?.originalSize ?? null,\n lastCompressedSize: lastResult?.compressedSize ?? null,\n };\n}\n\nexport type {\n CompressionConfig,\n CompressionDebugState,\n CompressionStrategy,\n CompressionResult,\n} from './types';\nexport { IdentityCompressionStrategy } from './IdentityCompressionStrategy';\n","export type CoordinationConfig = {\n readonly enabled: boolean;\n readonly channelName?: string;\n};\n\nexport type CoordinationDebugState = {\n readonly enabled: boolean;\n readonly tabId: string;\n readonly isLeader: boolean;\n readonly leaderTabId: string | null;\n readonly tabCount: number;\n readonly transport: 'broadcastChannel' | 'storageEvents' | 'none';\n};\n\ntype LeaderMessage =\n | { type: 'leader_claim'; tabId: string; at: number }\n | { type: 'leader_release'; tabId: string }\n | { type: 'heartbeat'; tabId: string; at: number };\n\nexport class CoordinationManager {\n private readonly config: CoordinationConfig;\n\n private readonly tabId: string;\n\n private readonly channelName: string;\n\n private channel: BroadcastChannel | null = null;\n\n private storageKey: string;\n\n private isLeader = false;\n\n private leaderTabId: string | null = null;\n\n private tabCount = 1;\n\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n\n private onLeaderChange: ((isLeader: boolean) => void) | null = null;\n\n private storageListener: ((event: StorageEvent) => void) | null = null;\n\n private transport: CoordinationDebugState['transport'] = 'none';\n\n constructor(config: CoordinationConfig, instanceId: string) {\n this.config = config;\n this.tabId = `tab_${instanceId}_${crypto.randomUUID().slice(0, 8)}`;\n this.channelName =\n config.channelName ?? `pixel_transport_coordination_${instanceId}`;\n this.storageKey = `${this.channelName}:leader`;\n }\n\n init(onLeaderChange?: (isLeader: boolean) => void): void {\n if (!this.config.enabled || typeof window === 'undefined') {\n this.isLeader = true;\n this.leaderTabId = this.tabId;\n return;\n }\n\n this.onLeaderChange = onLeaderChange ?? null;\n\n if (typeof BroadcastChannel !== 'undefined') {\n this.transport = 'broadcastChannel';\n this.channel = new BroadcastChannel(this.channelName);\n this.channel.onmessage = event =>\n this.handleMessage(event.data as LeaderMessage);\n } else {\n this.transport = 'storageEvents';\n this.storageListener = (event: StorageEvent) => {\n if (event.key !== this.storageKey || !event.newValue) return;\n try {\n this.handleMessage(JSON.parse(event.newValue) as LeaderMessage);\n } catch {\n // ignore malformed messages\n }\n };\n window.addEventListener('storage', this.storageListener);\n }\n\n this.claimLeadership();\n this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), 2000);\n }\n\n destroy(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n if (this.isLeader) {\n this.releaseLeadership();\n }\n\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n\n if (this.storageListener && typeof window !== 'undefined') {\n window.removeEventListener('storage', this.storageListener);\n this.storageListener = null;\n }\n\n this.onLeaderChange = null;\n }\n\n canSend(): boolean {\n if (!this.config.enabled) return true;\n return this.isLeader;\n }\n\n shouldPersistOnly(): boolean {\n return this.config.enabled && !this.isLeader;\n }\n\n isTabLeader(): boolean {\n return this.isLeader;\n }\n\n getDebugState(): CoordinationDebugState {\n return {\n enabled: this.config.enabled,\n tabId: this.tabId,\n isLeader: this.isLeader,\n leaderTabId: this.leaderTabId,\n tabCount: this.tabCount,\n transport: this.transport,\n };\n }\n\n private claimLeadership(): void {\n const message: LeaderMessage = {\n type: 'leader_claim',\n tabId: this.tabId,\n at: Date.now(),\n };\n this.broadcast(message);\n\n if (!this.leaderTabId) {\n this.setLeader(this.tabId);\n }\n }\n\n private releaseLeadership(): void {\n const message: LeaderMessage = {\n type: 'leader_release',\n tabId: this.tabId,\n };\n this.broadcast(message);\n if (this.isLeader) {\n this.setLeader(null);\n }\n }\n\n private sendHeartbeat(): void {\n if (!this.isLeader) return;\n this.broadcast({ type: 'heartbeat', tabId: this.tabId, at: Date.now() });\n }\n\n private handleMessage(message: LeaderMessage): void {\n switch (message.type) {\n case 'leader_claim':\n if (!this.leaderTabId || message.at < Date.now()) {\n this.setLeader(message.tabId);\n }\n break;\n case 'leader_release':\n if (this.leaderTabId === message.tabId) {\n this.setLeader(null);\n if (!this.isLeader) {\n this.claimLeadership();\n }\n }\n break;\n case 'heartbeat':\n this.tabCount = Math.max(this.tabCount, 1);\n if (this.leaderTabId === message.tabId) {\n this.leaderTabId = message.tabId;\n }\n break;\n default:\n break;\n }\n }\n\n private setLeader(tabId: string | null): void {\n const wasLeader = this.isLeader;\n this.leaderTabId = tabId;\n this.isLeader = tabId === this.tabId;\n\n if (wasLeader !== this.isLeader) {\n this.onLeaderChange?.(this.isLeader);\n }\n }\n\n private broadcast(message: LeaderMessage): void {\n if (this.channel) {\n this.channel.postMessage(message);\n return;\n }\n\n if (typeof window !== 'undefined' && window.localStorage) {\n try {\n window.localStorage.setItem(this.storageKey, JSON.stringify(message));\n } catch {\n // ignore quota errors\n }\n }\n }\n}\n","import type { PixelEvent } from '@/events';\n\nexport type DeadLetterReason =\n | 'max_retries_exceeded'\n | 'circuit_open'\n | 'permanent_failure'\n | 'manual';\n\nexport type DeadLetterEntry = {\n readonly id: string;\n readonly events: readonly PixelEvent[];\n readonly reason: DeadLetterReason;\n readonly failedAt: number;\n readonly attempts: number;\n readonly lastError?: string;\n};\n\nexport type DeadLetterConfig = {\n readonly enabled: boolean;\n readonly maxEntries: number;\n};\n\nexport type DeadLetterDebugState = {\n readonly enabled: boolean;\n readonly count: number;\n readonly maxEntries: number;\n readonly entries: readonly DeadLetterEntry[];\n};\n\nexport class DeadLetterManager {\n private readonly config: DeadLetterConfig;\n\n private entries: DeadLetterEntry[] = [];\n\n constructor(config: DeadLetterConfig) {\n this.config = config;\n }\n\n move(\n events: readonly PixelEvent[],\n reason: DeadLetterReason,\n attempts = 0,\n lastError?: string\n ): DeadLetterEntry | null {\n if (!this.config.enabled || events.length === 0) return null;\n\n const entry: DeadLetterEntry = {\n id: crypto.randomUUID(),\n events: [...events],\n reason,\n failedAt: Date.now(),\n attempts,\n lastError,\n };\n\n this.entries.push(entry);\n\n if (this.entries.length > this.config.maxEntries) {\n this.entries = this.entries.slice(-this.config.maxEntries);\n }\n\n return entry;\n }\n\n replayEntry(id: string): readonly PixelEvent[] | null {\n const index = this.entries.findIndex(entry => entry.id === id);\n if (index < 0) return null;\n\n const [entry] = this.entries.splice(index, 1);\n return entry?.events ?? null;\n }\n\n replayAll(): PixelEvent[] {\n const events = this.entries.flatMap(entry => [...entry.events]);\n this.entries = [];\n return events;\n }\n\n clear(): void {\n this.entries = [];\n }\n\n getEntries(): readonly DeadLetterEntry[] {\n return [...this.entries];\n }\n\n getCount(): number {\n return this.entries.length;\n }\n\n getDebugState(): DeadLetterDebugState {\n return {\n enabled: this.config.enabled,\n count: this.entries.length,\n maxEntries: this.config.maxEntries,\n entries: this.getEntries(),\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger';\n\nimport type { IBatchManager, BatchConfig } from '../batch/types';\nimport type { IFlushManager } from '../flush/types';\nimport type { IOfflineDetector } from '../network/types';\nimport type { IRetryEngine } from '../retry/types';\nimport type { EventSender } from '../sender/types';\n\nexport type DeliveryConfig = {\n readonly batch: BatchConfig;\n readonly timeoutMs: number;\n};\n\nexport type DeliveryDebugState = {\n readonly batch: ReturnType<IBatchManager['getState']>;\n readonly retry: ReturnType<IRetryEngine['getState']>;\n readonly offline: ReturnType<IOfflineDetector['getState']>;\n readonly flush: ReturnType<IFlushManager['getState']>;\n readonly timeoutMs: number;\n readonly inFlight: boolean;\n readonly ackCount: number;\n};\n\nexport class TransportDelivery {\n private readonly batchManager: IBatchManager;\n\n private readonly flushManager: IFlushManager;\n\n private readonly retryEngine: IRetryEngine;\n\n private readonly offlineDetector: IOfflineDetector;\n\n private readonly sender: EventSender;\n\n private readonly config: DeliveryConfig;\n\n private readonly logger: PixelLogger;\n\n private active = false;\n\n private inFlight = false;\n\n private ackCount = 0;\n\n private abortPending: (() => void) | null = null;\n\n private readonly onPermanentFailure:\n | ((events: readonly PixelEvent[], error: unknown) => void)\n | null;\n\n constructor(deps: {\n batchManager: IBatchManager;\n flushManager: IFlushManager;\n retryEngine: IRetryEngine;\n offlineDetector: IOfflineDetector;\n sender: EventSender;\n config: DeliveryConfig;\n logger: PixelLogger;\n abortPending?: () => void;\n onPermanentFailure?: (\n events: readonly PixelEvent[],\n error: unknown\n ) => void;\n }) {\n this.batchManager = deps.batchManager;\n this.flushManager = deps.flushManager;\n this.retryEngine = deps.retryEngine;\n this.offlineDetector = deps.offlineDetector;\n this.sender = deps.sender;\n this.config = deps.config;\n this.logger = deps.logger;\n this.abortPending = deps.abortPending ?? null;\n this.onPermanentFailure = deps.onPermanentFailure ?? null;\n }\n\n init(): void {\n if (this.active) return;\n\n this.offlineDetector.init(\n () => {\n this.logger.debug('[TransportDelivery] Online — resuming');\n this.flush();\n },\n () => {\n this.logger.debug('[TransportDelivery] Offline — paused');\n }\n );\n\n this.flushManager.init(() => this.flush());\n this.active = true;\n }\n\n destroy(): void {\n if (!this.active) return;\n\n this.abortPending?.();\n this.retryEngine.cancelAll();\n this.flushManager.destroy();\n this.offlineDetector.destroy();\n this.batchManager.clear();\n this.active = false;\n this.inFlight = false;\n }\n\n ingest(events: readonly PixelEvent[]): void {\n if (!this.active || events.length === 0) return;\n\n this.batchManager.add(events);\n\n if (this.batchManager.shouldFlush(this.config.batch)) {\n this.flush();\n }\n }\n\n flush(): void {\n if (!this.active || !this.offlineDetector.isOnline()) return;\n void this.processBatch();\n }\n\n getDebugState(): DeliveryDebugState {\n return {\n batch: this.batchManager.getState(),\n retry: this.retryEngine.getState(),\n offline: this.offlineDetector.getState(),\n flush: this.flushManager.getState(),\n timeoutMs: this.config.timeoutMs,\n inFlight: this.inFlight,\n ackCount: this.ackCount,\n };\n }\n\n getOfflineDetector(): IOfflineDetector {\n return this.offlineDetector;\n }\n\n private async processBatch(): Promise<void> {\n if (this.inFlight || !this.offlineDetector.isOnline()) return;\n\n const batch = this.batchManager.takeBatch(this.config.batch.batchSize);\n if (batch.length === 0) return;\n\n this.inFlight = true;\n\n try {\n await this.retryEngine.retry(async () => {\n const result = await this.sender.send(batch);\n if (!result.ack) {\n throw new Error('[TransportDelivery] Send not acknowledged');\n }\n this.ackCount += result.eventCount;\n }, `delivery-${Date.now()}`);\n } catch (error) {\n this.logger.error(\n '[TransportDelivery] Delivery failed after retries',\n error\n );\n\n if (this.onPermanentFailure) {\n this.onPermanentFailure(batch, error);\n } else {\n this.batchManager.add(batch);\n }\n } finally {\n this.inFlight = false;\n\n if (this.batchManager.size() > 0 && this.offlineDetector.isOnline()) {\n this.flush();\n }\n }\n }\n}\n","import type { FlushConfig, FlushDebugState, IFlushManager } from './types';\n\ntype ManagedListener = {\n readonly target: 'window' | 'document';\n readonly type: string;\n readonly handler: EventListener;\n};\n\nexport class FlushManager implements IFlushManager {\n private readonly config: FlushConfig;\n\n private onFlush: (() => void) | null = null;\n\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n private flushCount = 0;\n\n private lastFlushAt: number | null = null;\n\n private readonly listeners: ManagedListener[] = [];\n\n constructor(config: FlushConfig) {\n this.config = config;\n }\n\n init(onFlush: () => void): void {\n this.onFlush = onFlush;\n\n if (this.config.flushIntervalMs > 0) {\n this.intervalId = setInterval(\n () => this.flush(),\n this.config.flushIntervalMs\n );\n }\n\n if (this.config.prepareUnloadHooks) {\n this.registerUnloadHooks();\n }\n }\n\n flush(): void {\n if (!this.onFlush) return;\n\n this.flushCount += 1;\n this.lastFlushAt = Date.now();\n this.onFlush();\n }\n\n destroy(): void {\n if (this.config.flushOnDestroy) {\n this.flush();\n }\n\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n this.removeListeners();\n this.onFlush = null;\n }\n\n getState(): FlushDebugState {\n return {\n flushCount: this.flushCount,\n lastFlushAt: this.lastFlushAt,\n intervalActive: this.intervalId !== null,\n };\n }\n\n private registerUnloadHooks(): void {\n if (typeof window === 'undefined') return;\n\n const handler = (): void => this.flush();\n\n for (const type of ['pagehide', 'beforeunload'] as const) {\n window.addEventListener(type, handler);\n this.listeners.push({ target: 'window', type, handler });\n }\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handler);\n this.listeners.push({\n target: 'document',\n type: 'visibilitychange',\n handler,\n });\n }\n }\n\n private removeListeners(): void {\n for (const entry of this.listeners) {\n if (entry.target === 'window' && typeof window !== 'undefined') {\n window.removeEventListener(entry.type, entry.handler);\n } else if (\n entry.target === 'document' &&\n typeof document !== 'undefined'\n ) {\n document.removeEventListener(entry.type, entry.handler);\n }\n }\n this.listeners.length = 0;\n }\n}\n","import type { OfflineDebugState, IOfflineDetector } from './types';\n\ntype ManagedListener = {\n readonly type: string;\n readonly handler: EventListener;\n};\n\nexport class OfflineDetector implements IOfflineDetector {\n private online = true;\n\n private paused = false;\n\n private simulatedOffline = false;\n\n private onOnline: (() => void) | null = null;\n\n private onOffline: (() => void) | null = null;\n\n private readonly listeners: ManagedListener[] = [];\n\n init(onOnline: () => void, onOffline: () => void): void {\n this.onOnline = onOnline;\n this.onOffline = onOffline;\n\n if (typeof window === 'undefined') return;\n\n this.online = typeof navigator === 'undefined' ? true : navigator.onLine;\n\n const handleOnline = (): void => {\n if (this.simulatedOffline) return;\n this.online = true;\n this.paused = false;\n this.onOnline?.();\n };\n\n const handleOffline = (): void => {\n if (this.simulatedOffline) return;\n this.online = false;\n this.paused = true;\n this.onOffline?.();\n };\n\n window.addEventListener('online', handleOnline);\n window.addEventListener('offline', handleOffline);\n this.listeners.push(\n { type: 'online', handler: handleOnline as EventListener },\n { type: 'offline', handler: handleOffline as EventListener }\n );\n }\n\n isOnline(): boolean {\n return this.online && !this.simulatedOffline;\n }\n\n isPaused(): boolean {\n return this.paused || this.simulatedOffline;\n }\n\n destroy(): void {\n if (typeof window !== 'undefined') {\n for (const entry of this.listeners) {\n window.removeEventListener(entry.type, entry.handler);\n }\n }\n this.listeners.length = 0;\n this.onOnline = null;\n this.onOffline = null;\n }\n\n simulateOffline(offline: boolean): void {\n this.simulatedOffline = offline;\n if (offline) {\n this.paused = true;\n this.onOffline?.();\n } else {\n this.paused = false;\n this.online = true;\n this.onOnline?.();\n }\n }\n\n getState(): OfflineDebugState {\n return {\n isOnline: this.isOnline(),\n paused: this.isPaused(),\n simulatedOffline: this.simulatedOffline,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { QueuedEventRecord } from '../queue/storage/types';\n\nexport type OrderingConfig = {\n readonly enabled: boolean;\n};\n\nexport type OrderingDebugState = {\n readonly enabled: boolean;\n readonly globalSequence: number;\n readonly sessionSequence: number;\n readonly lastCorrelationId: string | null;\n readonly recordCount: number;\n};\n\nexport class OrderingManager {\n private readonly enabled: boolean;\n\n private globalSequence = 0;\n\n private sessionSequence = 0;\n\n private lastCorrelationId: string | null = null;\n\n constructor(config: OrderingConfig) {\n this.enabled = config.enabled;\n }\n\n assign(\n event: PixelEvent,\n correlationId?: string,\n transactionGroup?: string\n ): QueuedEventRecord {\n if (this.enabled) {\n this.globalSequence += 1;\n this.sessionSequence += 1;\n }\n\n if (correlationId) {\n this.lastCorrelationId = correlationId;\n }\n\n return {\n id: crypto.randomUUID(),\n event,\n sequence: this.globalSequence,\n sessionSequence: this.sessionSequence,\n correlationId: correlationId ?? this.lastCorrelationId ?? undefined,\n transactionGroup,\n enqueuedAt: Date.now(),\n };\n }\n\n sort(records: readonly QueuedEventRecord[]): QueuedEventRecord[] {\n if (!this.enabled) return [...records];\n\n return [...records].sort((left, right) => {\n if (left.sequence !== right.sequence) {\n return left.sequence - right.sequence;\n }\n return left.enqueuedAt - right.enqueuedAt;\n });\n }\n\n restoreFromRecords(records: readonly QueuedEventRecord[]): void {\n if (!this.enabled || records.length === 0) return;\n\n const maxGlobal = records.reduce(\n (max, record) => Math.max(max, record.sequence),\n 0\n );\n const maxSession = records.reduce(\n (max, record) => Math.max(max, record.sessionSequence),\n 0\n );\n\n this.globalSequence = Math.max(this.globalSequence, maxGlobal);\n this.sessionSequence = Math.max(this.sessionSequence, maxSession);\n\n const lastWithCorrelation = [...records]\n .reverse()\n .find(record => record.correlationId);\n if (lastWithCorrelation?.correlationId) {\n this.lastCorrelationId = lastWithCorrelation.correlationId;\n }\n }\n\n resetSessionSequence(): void {\n this.sessionSequence = 0;\n }\n\n getDebugState(recordCount = 0): OrderingDebugState {\n return {\n enabled: this.enabled,\n globalSequence: this.globalSequence,\n sessionSequence: this.sessionSequence,\n lastCorrelationId: this.lastCorrelationId,\n recordCount,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { IEventQueue } from '../../queue/types';\nimport type { PipelineStage } from '../types';\n\nexport class EnqueueStage implements PipelineStage {\n readonly name = 'enqueue';\n\n private readonly queue: IEventQueue;\n\n constructor(queue: IEventQueue) {\n this.queue = queue;\n }\n\n process(event: PixelEvent): PixelEvent | null {\n this.queue.enqueue(event);\n return event;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { PipelineStage } from '../types';\n\nexport class NormalizeStage implements PipelineStage {\n readonly name = 'normalize';\n\n process(event: PixelEvent): PixelEvent | null {\n return {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { PipelineStage } from '../types';\n\nexport class ValidateStage implements PipelineStage {\n readonly name = 'validate';\n\n process(event: PixelEvent): PixelEvent | null {\n if (!event.type || typeof event.type !== 'string') {\n return null;\n }\n\n if (typeof event.timestamp !== 'number' || Number.isNaN(event.timestamp)) {\n return null;\n }\n\n return event;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { IEventQueue } from '../queue/types';\nimport { EnqueueStage } from './stages/EnqueueStage';\nimport { NormalizeStage } from './stages/NormalizeStage';\nimport { ValidateStage } from './stages/ValidateStage';\nimport type { PipelineResult, PipelineStage } from './types';\n\nexport class TransportPipeline {\n private readonly stages: readonly PipelineStage[];\n\n private lastSteps: string[] = [];\n\n constructor(stages: readonly PipelineStage[]) {\n this.stages = stages;\n }\n\n static createDefault(queue: IEventQueue): TransportPipeline {\n return new TransportPipeline([\n new ValidateStage(),\n new NormalizeStage(),\n new EnqueueStage(queue),\n ]);\n }\n\n process(event: PixelEvent): PipelineResult {\n const steps: string[] = [];\n let current: PixelEvent | null = event;\n\n for (const stage of this.stages) {\n steps.push(stage.name);\n if (!current) break;\n current = stage.process(current);\n }\n\n this.lastSteps = steps;\n return { event: current, steps };\n }\n\n getLastSteps(): readonly string[] {\n return this.lastSteps;\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { BackpressureManager } from '../resilience/BackpressureManager';\nimport type { OrderingManager } from '../ordering/OrderingManager';\nimport type { IQueueStorage, QueuedEventRecord } from './storage/types';\nimport type { IEventQueue } from './types';\n\nexport class PersistentQueue implements IEventQueue {\n private readonly storage: IQueueStorage;\n\n private readonly ordering: OrderingManager;\n\n private readonly backpressure: BackpressureManager;\n\n private records: QueuedEventRecord[] = [];\n\n private loaded = false;\n\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n storage: IQueueStorage,\n ordering: OrderingManager,\n backpressure: BackpressureManager\n ) {\n this.storage = storage;\n this.ordering = ordering;\n this.backpressure = backpressure;\n }\n\n async init(): Promise<void> {\n await this.storage.init();\n const loaded = await this.storage.load();\n this.records = this.ordering.sort(loaded);\n this.ordering.restoreFromRecords(this.records);\n this.loaded = true;\n }\n\n destroy(): void {\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n void this.flushPersist();\n this.storage.destroy();\n this.records = [];\n this.loaded = false;\n }\n\n enqueue(event: PixelEvent): void {\n this.ensureLoaded();\n\n const decision = this.backpressure.evaluateEnqueue(this.records.length);\n if (!decision.accepted) return;\n\n if (decision.policy === 'drop_oldest' && this.records.length > 0) {\n this.records.shift();\n }\n\n if (decision.policy === 'drop_newest' && decision.dropped > 0) {\n return;\n }\n\n const record = this.ordering.assign(event);\n const applied = this.backpressure.applyPolicy(this.records, record);\n this.records = applied.items;\n this.schedulePersist();\n }\n\n dequeue(): PixelEvent | undefined {\n this.ensureLoaded();\n const record = this.records.shift();\n this.schedulePersist();\n return record?.event;\n }\n\n peek(): PixelEvent | undefined {\n this.ensureLoaded();\n return this.records[0]?.event;\n }\n\n size(): number {\n this.ensureLoaded();\n return this.records.length;\n }\n\n clear(): void {\n this.records = [];\n this.schedulePersist();\n }\n\n remove(predicate: (event: PixelEvent) => boolean): number {\n this.ensureLoaded();\n const before = this.records.length;\n this.records = this.records.filter(record => !predicate(record.event));\n const removed = before - this.records.length;\n if (removed > 0) this.schedulePersist();\n return removed;\n }\n\n isEmpty(): boolean {\n return this.size() === 0;\n }\n\n getAll(): readonly PixelEvent[] {\n this.ensureLoaded();\n return this.records.map(record => record.event);\n }\n\n getRecords(): readonly QueuedEventRecord[] {\n this.ensureLoaded();\n return [...this.records];\n }\n\n importRecords(records: readonly QueuedEventRecord[]): void {\n this.records = this.ordering.sort(records);\n this.ordering.restoreFromRecords(this.records);\n this.schedulePersist();\n }\n\n exportRecords(): readonly QueuedEventRecord[] {\n return this.getRecords();\n }\n\n getStorageAdapterName(): string {\n return this.storage.getAdapterName();\n }\n\n async reload(): Promise<void> {\n const loaded = await this.storage.load();\n this.records = this.ordering.sort(loaded);\n this.ordering.restoreFromRecords(this.records);\n this.loaded = true;\n }\n\n private ensureLoaded(): void {\n if (!this.loaded) {\n this.loaded = true;\n }\n }\n\n private schedulePersist(): void {\n if (this.persistTimer) clearTimeout(this.persistTimer);\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n void this.flushPersist();\n }, 0);\n }\n\n private async flushPersist(): Promise<void> {\n await this.storage.save(this.records);\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { IEventQueue } from './types';\n\nexport class MemoryQueue implements IEventQueue {\n private readonly items: PixelEvent[] = [];\n\n enqueue(event: PixelEvent): void {\n this.items.push(event);\n }\n\n dequeue(): PixelEvent | undefined {\n return this.items.shift();\n }\n\n peek(): PixelEvent | undefined {\n return this.items[0];\n }\n\n size(): number {\n return this.items.length;\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n remove(predicate: (event: PixelEvent) => boolean): number {\n const before = this.items.length;\n const kept = this.items.filter(event => !predicate(event));\n this.items.length = 0;\n this.items.push(...kept);\n return before - kept.length;\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n getAll(): readonly PixelEvent[] {\n return [...this.items];\n }\n}\n","import type { IQueueStorage, QueuedEventRecord } from './types';\n\nexport class MemoryQueueStorage implements IQueueStorage {\n private records: QueuedEventRecord[] = [];\n\n init(): void {\n // no-op\n }\n\n destroy(): void {\n this.records = [];\n }\n\n load(): readonly QueuedEventRecord[] {\n return [...this.records];\n }\n\n save(records: readonly QueuedEventRecord[]): void {\n this.records = [...records];\n }\n\n getAdapterName(): string {\n return 'MemoryQueueStorage';\n }\n\n isAvailable(): boolean {\n return true;\n }\n}\n","import type { IQueueStorage, QueuedEventRecord } from './types';\n\nexport class LocalStorageQueueStorage implements IQueueStorage {\n private readonly storageKey: string;\n\n constructor(storageKey: string) {\n this.storageKey = storageKey;\n }\n\n init(): void {\n // no-op\n }\n\n destroy(): void {\n // persistence survives destroy by design\n }\n\n load(): readonly QueuedEventRecord[] {\n if (typeof window === 'undefined' || !window.localStorage) return [];\n\n try {\n const raw = window.localStorage.getItem(this.storageKey);\n if (!raw) return [];\n const parsed = JSON.parse(raw) as QueuedEventRecord[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n save(records: readonly QueuedEventRecord[]): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n\n try {\n window.localStorage.setItem(this.storageKey, JSON.stringify(records));\n } catch {\n // quota exceeded — caller may apply backpressure\n }\n }\n\n getAdapterName(): string {\n return 'LocalStorageQueueStorage';\n }\n\n isAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const testKey = `${this.storageKey}__probe`;\n window.localStorage.setItem(testKey, '1');\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { IQueueStorage, QueuedEventRecord } from './types';\n\nconst DB_VERSION = 1;\nconst STORE_NAME = 'queue_records';\n\nexport class IndexedDBQueueStorage implements IQueueStorage {\n private readonly dbName: string;\n\n private db: IDBDatabase | null = null;\n\n constructor(dbName: string) {\n this.dbName = dbName;\n }\n\n async init(): Promise<void> {\n if (typeof indexedDB === 'undefined') return;\n\n this.db = await new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.dbName, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n database.createObjectStore(STORE_NAME, { keyPath: 'id' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () =>\n reject(request.error ?? new Error('IndexedDB open failed'));\n });\n }\n\n destroy(): void {\n this.db?.close();\n this.db = null;\n }\n\n async load(): Promise<readonly QueuedEventRecord[]> {\n if (!this.db) return [];\n\n return new Promise<readonly QueuedEventRecord[]>((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.getAll();\n\n request.onsuccess = () => {\n const records = request.result as QueuedEventRecord[];\n resolve(Array.isArray(records) ? records : []);\n };\n request.onerror = () =>\n reject(request.error ?? new Error('IndexedDB load failed'));\n });\n }\n\n async save(records: readonly QueuedEventRecord[]): Promise<void> {\n if (!this.db) return;\n\n await new Promise<void>((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const clearRequest = store.clear();\n\n clearRequest.onsuccess = () => {\n for (const record of records) {\n store.put(record);\n }\n };\n\n transaction.oncomplete = () => resolve();\n transaction.onerror = () =>\n reject(transaction.error ?? new Error('IndexedDB save failed'));\n });\n }\n\n getAdapterName(): string {\n return 'IndexedDBQueueStorage';\n }\n\n isAvailable(): boolean {\n return typeof indexedDB !== 'undefined';\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { QueueStoragePersistence } from '@/config/shared/persistence';\n\nimport { IndexedDBQueueStorage } from './IndexedDBQueueStorage';\nimport { LocalStorageQueueStorage } from './LocalStorageQueueStorage';\nimport { MemoryQueueStorage } from './MemoryQueueStorage';\nimport type { IQueueStorage } from './types';\n\nexport type QueueStorageFactoryOptions = {\n readonly preferred?: QueueStoragePersistence;\n readonly namespace: string;\n readonly prefix?: string;\n readonly pixelId: string;\n};\n\nfunction buildStorageKey(options: QueueStorageFactoryOptions): string {\n const prefix = options.prefix ?? '__gmk';\n const namespace = options.namespace || 'pixel';\n const pixelId = options.pixelId || 'default';\n return `${prefix}:${namespace}:${pixelId}:transport-queue`;\n}\n\nfunction buildDbName(options: QueueStorageFactoryOptions): string {\n const namespace = options.namespace || 'pixel';\n const pixelId = options.pixelId || 'default';\n return `${namespace}_${pixelId}_transport_queue`;\n}\n\nfunction createByType(\n type: QueueStoragePersistence,\n options: QueueStorageFactoryOptions\n): IQueueStorage {\n const key = buildStorageKey(options);\n\n switch (type) {\n case 'localStorage':\n return new LocalStorageQueueStorage(key);\n case 'indexedDB':\n return new IndexedDBQueueStorage(buildDbName(options));\n case 'memory':\n default:\n return new MemoryQueueStorage();\n }\n}\n\nfunction resolveFallbackChain(\n preferred?: QueueStoragePersistence\n): QueueStoragePersistence[] {\n const order: QueueStoragePersistence[] = [\n 'indexedDB',\n 'localStorage',\n 'memory',\n ];\n\n if (!preferred || preferred === 'memory') {\n return order;\n }\n\n const rest = order.filter(item => item !== preferred);\n return [preferred, ...rest];\n}\n\nexport function createQueueStorage(\n options: QueueStorageFactoryOptions\n): IQueueStorage {\n if (typeof window === 'undefined') {\n return new MemoryQueueStorage();\n }\n\n const chain = resolveFallbackChain(options.preferred);\n\n for (const type of chain) {\n const storage = createByType(type, options);\n if (storage.isAvailable()) {\n return storage;\n }\n }\n\n return new MemoryQueueStorage();\n}\n\nexport function createQueueStorageFromConfig(\n config: PixelConfig\n): IQueueStorage {\n return createQueueStorage({\n preferred: config.storage.queue?.persistence,\n namespace: config.storage.namespace,\n prefix: config.storage.prefix,\n pixelId: config.identity.pixelId,\n });\n}\n\nexport function resolveQueueStorageAdapterName(\n preferred?: QueueStoragePersistence\n): string {\n const chain = resolveFallbackChain(preferred);\n\n for (const type of chain) {\n const storage = createByType(type, {\n preferred: type,\n namespace: 'probe',\n pixelId: 'probe',\n });\n if (storage.isAvailable()) {\n return storage.getAdapterName();\n }\n }\n\n return 'MemoryQueueStorage';\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { PersistentQueue } from '../queue/PersistentQueue';\n\nexport type ReplayTrigger =\n | 'init'\n | 'reload'\n | 'reconnect'\n | 'restart'\n | 'manual';\n\nexport type ReplayConfig = {\n readonly enabled: boolean;\n};\n\nexport type ReplayDebugState = {\n readonly enabled: boolean;\n readonly lastTrigger: ReplayTrigger | null;\n readonly lastReplayAt: number | null;\n readonly totalReplayed: number;\n readonly pendingCount: number;\n};\n\nexport class ReplayManager {\n private readonly config: ReplayConfig;\n\n private readonly queue: PersistentQueue;\n\n private lastTrigger: ReplayTrigger | null = null;\n\n private lastReplayAt: number | null = null;\n\n private totalReplayed = 0;\n\n private onReplay: (() => void) | null = null;\n\n constructor(config: ReplayConfig, queue: PersistentQueue) {\n this.config = config;\n this.queue = queue;\n }\n\n setReplayHandler(handler: () => void): void {\n this.onReplay = handler;\n }\n\n async replay(trigger: ReplayTrigger): Promise<number> {\n if (!this.config.enabled) return 0;\n\n await this.queue.reload();\n const count = this.queue.size();\n\n this.lastTrigger = trigger;\n this.lastReplayAt = Date.now();\n this.totalReplayed += count;\n\n if (count > 0) {\n this.onReplay?.();\n }\n\n return count;\n }\n\n getPendingEvents(): readonly PixelEvent[] {\n return this.queue.getAll();\n }\n\n getDebugState(): ReplayDebugState {\n return {\n enabled: this.config.enabled,\n lastTrigger: this.lastTrigger,\n lastReplayAt: this.lastReplayAt,\n totalReplayed: this.totalReplayed,\n pendingCount: this.queue.size(),\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nexport type BackpressurePolicy =\n | 'drop_oldest'\n | 'drop_newest'\n | 'reject_new'\n | 'sample'\n | 'none';\n\nexport type BackpressureConfig = {\n readonly enabled: boolean;\n readonly maxQueueSize: number;\n readonly policy: BackpressurePolicy;\n readonly sampleRate?: number;\n};\n\nexport type BackpressureDecision = {\n readonly accepted: boolean;\n readonly dropped: number;\n readonly policy: BackpressurePolicy;\n readonly reason?: string;\n};\n\nexport type BackpressureDebugState = {\n readonly enabled: boolean;\n readonly currentSize: number;\n readonly maxQueueSize: number;\n readonly policy: BackpressurePolicy;\n readonly totalDropped: number;\n readonly totalRejected: number;\n readonly totalSampled: number;\n};\n\nexport class BackpressureManager {\n private readonly config: BackpressureConfig;\n\n private totalDropped = 0;\n\n private totalRejected = 0;\n\n private totalSampled = 0;\n\n constructor(config: BackpressureConfig) {\n this.config = config;\n }\n\n evaluateEnqueue(currentSize: number): BackpressureDecision {\n if (!this.config.enabled || this.config.policy === 'none') {\n return { accepted: true, dropped: 0, policy: this.config.policy };\n }\n\n if (currentSize < this.config.maxQueueSize) {\n return { accepted: true, dropped: 0, policy: this.config.policy };\n }\n\n switch (this.config.policy) {\n case 'reject_new':\n this.totalRejected += 1;\n return {\n accepted: false,\n dropped: 0,\n policy: this.config.policy,\n reason: 'queue_full_reject_new',\n };\n case 'sample': {\n const rate = this.config.sampleRate ?? 0.5;\n const accept = Math.random() < rate;\n if (!accept) this.totalSampled += 1;\n return {\n accepted: accept,\n dropped: accept ? 0 : 1,\n policy: this.config.policy,\n reason: accept ? undefined : 'sampled_out',\n };\n }\n case 'drop_oldest':\n case 'drop_newest':\n return { accepted: true, dropped: 1, policy: this.config.policy };\n default:\n return { accepted: true, dropped: 0, policy: 'none' };\n }\n }\n\n applyPolicy<T>(items: T[], incoming: T): { items: T[]; dropped: number } {\n const decision = this.evaluateEnqueue(items.length);\n\n if (!decision.accepted) {\n return { items, dropped: decision.dropped };\n }\n\n if (items.length < this.config.maxQueueSize) {\n return { items: [...items, incoming], dropped: 0 };\n }\n\n if (this.config.policy === 'drop_oldest') {\n this.totalDropped += 1;\n return { items: [...items.slice(1), incoming], dropped: 1 };\n }\n\n if (this.config.policy === 'drop_newest') {\n this.totalDropped += 1;\n return { items, dropped: 1 };\n }\n\n return { items: [...items, incoming], dropped: 0 };\n }\n\n getDebugState(currentSize: number): BackpressureDebugState {\n return {\n enabled: this.config.enabled,\n currentSize,\n maxQueueSize: this.config.maxQueueSize,\n policy: this.config.policy,\n totalDropped: this.totalDropped,\n totalRejected: this.totalRejected,\n totalSampled: this.totalSampled,\n };\n }\n}\n\nexport type { PixelEvent };\n","export type CircuitBreakerState = 'closed' | 'open' | 'half_open';\n\nexport type CircuitBreakerConfig = {\n readonly enabled: boolean;\n readonly failureThreshold: number;\n readonly resetTimeoutMs: number;\n readonly halfOpenMaxAttempts: number;\n};\n\nexport type CircuitBreakerMetrics = {\n readonly state: CircuitBreakerState;\n readonly consecutiveFailures: number;\n readonly totalFailures: number;\n readonly totalSuccesses: number;\n readonly totalBlocked: number;\n readonly lastFailureAt: number | null;\n readonly lastSuccessAt: number | null;\n readonly openedAt: number | null;\n};\n\nexport class CircuitBreaker {\n private readonly config: CircuitBreakerConfig;\n\n private state: CircuitBreakerState = 'closed';\n\n private consecutiveFailures = 0;\n\n private totalFailures = 0;\n\n private totalSuccesses = 0;\n\n private totalBlocked = 0;\n\n private halfOpenAttempts = 0;\n\n private lastFailureAt: number | null = null;\n\n private lastSuccessAt: number | null = null;\n\n private openedAt: number | null = null;\n\n constructor(config: CircuitBreakerConfig) {\n this.config = config;\n }\n\n canExecute(): boolean {\n if (!this.config.enabled) return true;\n\n if (this.state === 'closed') return true;\n\n if (this.state === 'open') {\n if (\n this.openedAt !== null &&\n Date.now() - this.openedAt >= this.config.resetTimeoutMs\n ) {\n this.state = 'half_open';\n this.halfOpenAttempts = 0;\n return true;\n }\n\n this.totalBlocked += 1;\n return false;\n }\n\n return this.halfOpenAttempts < this.config.halfOpenMaxAttempts;\n }\n\n recordSuccess(): void {\n if (!this.config.enabled) return;\n\n this.totalSuccesses += 1;\n this.lastSuccessAt = Date.now();\n this.consecutiveFailures = 0;\n this.halfOpenAttempts = 0;\n this.state = 'closed';\n this.openedAt = null;\n }\n\n recordFailure(): void {\n if (!this.config.enabled) return;\n\n this.totalFailures += 1;\n this.lastFailureAt = Date.now();\n this.consecutiveFailures += 1;\n\n if (this.state === 'half_open') {\n this.halfOpenAttempts += 1;\n if (this.halfOpenAttempts >= this.config.halfOpenMaxAttempts) {\n this.open();\n }\n return;\n }\n\n if (this.consecutiveFailures >= this.config.failureThreshold) {\n this.open();\n }\n }\n\n forceOpen(): void {\n this.open();\n }\n\n forceClose(): void {\n this.state = 'closed';\n this.consecutiveFailures = 0;\n this.halfOpenAttempts = 0;\n this.openedAt = null;\n }\n\n getMetrics(): CircuitBreakerMetrics {\n return {\n state: this.state,\n consecutiveFailures: this.consecutiveFailures,\n totalFailures: this.totalFailures,\n totalSuccesses: this.totalSuccesses,\n totalBlocked: this.totalBlocked,\n lastFailureAt: this.lastFailureAt,\n lastSuccessAt: this.lastSuccessAt,\n openedAt: this.openedAt,\n };\n }\n\n private open(): void {\n this.state = 'open';\n this.openedAt = Date.now();\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { EventSender, SendOptions, SendResult } from '../sender/types';\nimport type { CircuitBreaker } from './CircuitBreaker';\n\nexport class CircuitBreakerSender implements EventSender {\n private readonly circuitBreaker: CircuitBreaker;\n\n private readonly inner: EventSender;\n\n constructor(circuitBreaker: CircuitBreaker, inner: EventSender) {\n this.circuitBreaker = circuitBreaker;\n this.inner = inner;\n }\n\n async send(events: PixelEvent[], options?: SendOptions): Promise<SendResult> {\n if (!this.circuitBreaker.canExecute()) {\n throw new Error('[CircuitBreakerSender] Circuit is open — send blocked');\n }\n\n try {\n const result = await this.inner.send(events, options);\n if (result.ack) {\n this.circuitBreaker.recordSuccess();\n } else {\n this.circuitBreaker.recordFailure();\n }\n return result;\n } catch (error) {\n this.circuitBreaker.recordFailure();\n throw error;\n }\n }\n\n getCircuitBreaker(): CircuitBreaker {\n return this.circuitBreaker;\n }\n}\n","export type RetryConfig = {\n readonly maxAttempts: number;\n readonly baseDelayMs: number;\n readonly maxDelayMs: number;\n readonly multiplier: number;\n};\n\nexport type RetryTask = () => Promise<void>;\n\nexport type RetryAttemptState = {\n readonly id: string;\n readonly attempt: number;\n readonly nextRetryAt: number | null;\n readonly status:\n | 'pending'\n | 'running'\n | 'scheduled'\n | 'completed'\n | 'failed'\n | 'cancelled';\n};\n\nexport type RetryDebugState = {\n readonly pendingCount: number;\n readonly attempts: readonly RetryAttemptState[];\n};\n\nexport interface IRetryEngine {\n retry(task: RetryTask, taskId?: string): Promise<void>;\n\n cancel(taskId: string): void;\n\n cancelAll(): void;\n\n getState(): RetryDebugState;\n}\n\nexport function calculateBackoffDelay(\n attempt: number,\n config: RetryConfig\n): number {\n const delay = config.baseDelayMs * config.multiplier ** (attempt - 1);\n return Math.min(delay, config.maxDelayMs);\n}\n","import type { PixelLogger } from '@/logger';\n\nimport { calculateBackoffDelay } from './types';\nimport type {\n IRetryEngine,\n RetryAttemptState,\n RetryConfig,\n RetryDebugState,\n RetryTask,\n} from './types';\n\ntype InternalRetryEntry = {\n readonly id: string;\n task: RetryTask;\n attempt: number;\n status: RetryAttemptState['status'];\n nextRetryAt: number | null;\n timer: ReturnType<typeof setTimeout> | null;\n abort: () => void;\n};\n\nexport class RetryEngine implements IRetryEngine {\n private readonly config: RetryConfig;\n\n private readonly logger: PixelLogger;\n\n private readonly entries = new Map<string, InternalRetryEntry>();\n\n private idCounter = 0;\n\n constructor(config: RetryConfig, logger: PixelLogger) {\n this.config = config;\n this.logger = logger;\n }\n\n async retry(task: RetryTask, taskId?: string): Promise<void> {\n const id = taskId ?? `retry-${++this.idCounter}`;\n\n return new Promise<void>((resolve, reject) => {\n let cancelled = false;\n\n const entry: InternalRetryEntry = {\n id,\n task,\n attempt: 0,\n status: 'pending',\n nextRetryAt: null,\n timer: null,\n abort: () => {\n cancelled = true;\n if (entry.timer) clearTimeout(entry.timer);\n entry.status = 'cancelled';\n entry.timer = null;\n this.entries.delete(id);\n resolve();\n },\n };\n\n this.entries.set(id, entry);\n\n const runAttempt = async (): Promise<void> => {\n if (cancelled) return;\n\n entry.attempt += 1;\n entry.status = 'running';\n entry.nextRetryAt = null;\n\n try {\n await task();\n entry.status = 'completed';\n this.entries.delete(id);\n resolve();\n } catch (error) {\n if (cancelled) return;\n\n if (entry.attempt >= this.config.maxAttempts) {\n entry.status = 'failed';\n this.entries.delete(id);\n reject(error);\n return;\n }\n\n const delay = calculateBackoffDelay(entry.attempt, this.config);\n entry.status = 'scheduled';\n entry.nextRetryAt = Date.now() + delay;\n\n this.logger.debug(\n `[RetryEngine] Attempt ${entry.attempt} failed, retry in ${delay}ms`\n );\n\n entry.timer = setTimeout(() => {\n entry.timer = null;\n void runAttempt();\n }, delay);\n }\n };\n\n void runAttempt();\n });\n }\n\n cancel(taskId: string): void {\n this.entries.get(taskId)?.abort();\n }\n\n cancelAll(): void {\n for (const entry of this.entries.values()) {\n entry.abort();\n }\n this.entries.clear();\n }\n\n getState(): RetryDebugState {\n return {\n pendingCount: this.entries.size,\n attempts: Array.from(this.entries.values()).map(entry => ({\n id: entry.id,\n attempt: entry.attempt,\n nextRetryAt: entry.nextRetryAt,\n status: entry.status,\n })),\n };\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { PixelEvent } from '@/events';\nimport type { AttributionIdentifiers } from '@/services/attribution/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport type {\n ApiBatchEventRequest,\n ApiEvent,\n ApiEventCategory,\n ApiEventIdentifiers,\n} from './api-types';\n\nfunction generateEventId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `evt_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction mapCategory(event: PixelEvent): ApiEventCategory {\n if ('category' in event && event.category) {\n if (event.category === 'ENGAGEMENT') return 'ENGAGEMENT';\n if (event.category === 'CONVERSION') return 'CONVERSION';\n }\n return 'OTHER';\n}\n\nfunction extractData(event: PixelEvent): Record<string, unknown> | undefined {\n if ('data' in event && event.data && typeof event.data === 'object') {\n return event.data as Record<string, unknown>;\n }\n\n const {\n type,\n timestamp,\n category,\n path,\n url,\n hostname,\n language,\n timezone,\n identifiers,\n queryParams,\n urlContext,\n ...rest\n } = event as unknown as Record<string, unknown>;\n\n void type;\n void timestamp;\n void category;\n void path;\n void url;\n void hostname;\n void language;\n void timezone;\n void identifiers;\n void queryParams;\n void urlContext;\n\n const keys = Object.keys(rest);\n if (keys.length === 0) return undefined;\n\n return rest;\n}\n\nfunction mapIdentifiers(\n identifiers: AttributionIdentifiers | undefined\n): ApiEventIdentifiers {\n const base = {\n fbp: identifiers?.fbp ?? '',\n fbc: identifiers?.fbc ?? '',\n ga: identifiers?.ga ?? '',\n gcl_au: identifiers?.gclAu ?? '',\n };\n\n if (!identifiers) return base;\n\n return {\n ...base,\n fbclid: identifiers.fbclid ?? '',\n gclid: identifiers.gclid ?? '',\n gbraid: identifiers.gbraid ?? '',\n wbraid: identifiers.wbraid ?? '',\n gid: identifiers.gid ?? '',\n ttclid: identifiers.ttclid ?? '',\n ttp: identifiers.ttp ?? '',\n msclkid: identifiers.msclkid ?? '',\n li_fat_id: identifiers.liFatId ?? '',\n epik: identifiers.epik ?? '',\n customClickIds: identifiers.customClickIds ?? {},\n landingUrl: identifiers.landingUrl ?? '',\n referrer: identifiers.referrer ?? '',\n firstCollectedAt: identifiers.firstCollectedAt ?? 0,\n lastCollectedAt: identifiers.lastCollectedAt ?? 0,\n };\n}\n\nexport class EventPayloadBuilder {\n private readonly context: PixelRuntimeContext;\n\n constructor(context: PixelRuntimeContext) {\n this.context = context;\n }\n\n buildApiEvent(event: PixelEvent, eventId?: string): ApiEvent {\n const config = this.context.config;\n const services = this.context.services;\n const metadata = services.browserMetadata.getMetadata();\n\n const visitorId =\n services.visitor.getVisitorId() ?? services.visitor.ensureVisitorId();\n\n const sessionId =\n services.session.getSessionId() ??\n `session_${config.identity.pixelId || 'anonymous'}_${Date.now()}`;\n\n const fingerprint =\n services.fingerprint.getFingerprint() ??\n services.fingerprint.ensureFingerprint();\n\n const identifiers =\n 'identifiers' in event && event.identifiers\n ? event.identifiers\n : services.attribution?.getSnapshot();\n\n return {\n id: eventId ?? generateEventId(),\n session_id: sessionId,\n visitor_id: visitorId,\n pixel_code: config.identity.pixelId,\n type: event.type as ApiEvent['type'],\n category: mapCategory(event),\n timestamp: String(event.timestamp ?? Date.now()),\n fingerprint,\n identifiers: mapIdentifiers(identifiers),\n page: {\n url: event.url ?? metadata.url ?? '',\n title: typeof document !== 'undefined' ? document.title : '',\n referrer: typeof document !== 'undefined' ? document.referrer : '',\n path: event.path ?? metadata.path ?? '',\n hostname: event.hostname ?? metadata.hostname ?? '',\n },\n device: {\n id: fingerprint,\n type: 'desktop',\n os: { name: 'Unknown', version: '' },\n browser: { name: 'Unknown', version: '' },\n engine: { name: 'Unknown', version: '' },\n userAgent: metadata.userAgent ?? '',\n language: event.language ?? metadata.language ?? '',\n screen: {\n width: metadata.screenWidth ?? 0,\n height: metadata.screenHeight ?? 0,\n pixel_ratio: 1,\n },\n },\n data: extractData(event),\n ...('queryParams' in event &&\n event.queryParams &&\n Object.keys(event.queryParams).length > 0\n ? { query_params: { ...event.queryParams } }\n : {}),\n ...('urlContext' in event && event.urlContext\n ? {\n url_context: {\n ...(event.urlContext.managed\n ? { managed: { ...event.urlContext.managed } }\n : {}),\n ...(event.urlContext.forwarded\n ? { forwarded: { ...event.urlContext.forwarded } }\n : {}),\n ...(event.urlContext.source\n ? { source: { ...event.urlContext.source } }\n : {}),\n },\n }\n : {}),\n meta: {\n version: '2.0.0',\n pixel_source: 'pixel-v2',\n environment: config.app.environment,\n script_url:\n typeof document !== 'undefined' && document.currentScript\n ? String((document.currentScript as HTMLScriptElement).src ?? '')\n : '',\n projectId: '',\n pageId: '',\n },\n };\n }\n\n buildBatchPayload(events: PixelEvent[]): ApiBatchEventRequest {\n const first = this.buildApiEvent(events[0] ?? ({} as PixelEvent));\n const apiEvents = events.map(event => this.buildApiEvent(event));\n\n return {\n pixel_code: this.context.config.identity.pixelId,\n visitor_id: first.visitor_id,\n session_id: first.session_id,\n batch_id: generateEventId(),\n sent_at: Date.now(),\n meta: first.meta,\n events: apiEvents,\n };\n }\n}\n\nexport type { PixelConfig };\n","/** fetch com AbortController e timeout configurável. */\n\nexport interface FetchWithTimeoutOptions extends RequestInit {\n timeoutMs?: number;\n}\n\nexport async function fetchWithTimeout(\n url: string,\n options: FetchWithTimeoutOptions = {}\n): Promise<Response> {\n const { timeoutMs = 10_000, signal: externalSignal, ...init } = options;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (externalSignal) {\n if (externalSignal.aborted) controller.abort();\n else\n externalSignal.addEventListener('abort', () => controller.abort(), {\n once: true,\n });\n }\n\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger';\nimport { fetchWithTimeout } from '../network/fetchWithTimeout';\n\nimport type { CompressionStrategy } from '../compression/types';\nimport type { EventPayloadBuilder } from './EventPayloadBuilder';\nimport type { EventSender, SendOptions, SenderDebugState } from './types';\n\nconst SINGLE_ENDPOINT = '/pixels/public/event';\nconst BATCH_ENDPOINT = '/pixels/public/event/batch';\n\nexport type HttpSenderConfig = {\n readonly apiEndpoint: string;\n readonly timeoutMs: number;\n};\n\nexport type HttpSenderResponseLog = {\n readonly at: number;\n readonly url: string;\n readonly status: number;\n readonly ack: boolean;\n readonly eventCount: number;\n readonly body?: unknown;\n readonly error?: string;\n};\n\nexport class HttpSender implements EventSender {\n private readonly config: HttpSenderConfig;\n\n private readonly payloadBuilder: EventPayloadBuilder;\n\n private readonly compression: CompressionStrategy;\n\n private readonly logger: PixelLogger;\n\n private sentCount = 0;\n\n private lastAck: boolean | null = null;\n\n private readonly responseLogs: HttpSenderResponseLog[] = [];\n\n private lastCompression: {\n originalSize: number;\n compressedSize: number;\n } | null = null;\n\n constructor(\n config: HttpSenderConfig,\n payloadBuilder: EventPayloadBuilder,\n compression: CompressionStrategy,\n logger: PixelLogger\n ) {\n this.config = config;\n this.payloadBuilder = payloadBuilder;\n this.compression = compression;\n this.logger = logger;\n }\n\n async send(\n events: PixelEvent[],\n options?: SendOptions\n ): Promise<{ ack: boolean; eventCount: number }> {\n if (events.length === 0) {\n return { ack: true, eventCount: 0 };\n }\n\n if (options?.signal?.aborted) {\n throw new DOMException('The operation was aborted.', 'AbortError');\n }\n\n const useBatch = events.length > 1;\n const url = `${this.config.apiEndpoint.replace(/\\/$/, '')}${useBatch ? BATCH_ENDPOINT : SINGLE_ENDPOINT}`;\n\n const rawBody = useBatch\n ? JSON.stringify(this.payloadBuilder.buildBatchPayload(events))\n : JSON.stringify(this.payloadBuilder.buildApiEvent(events[0]!));\n\n const compressed = this.compression.compress(rawBody);\n this.lastCompression = {\n originalSize: compressed.originalSize,\n compressedSize: compressed.compressedSize,\n };\n\n try {\n const response = await fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Encoding': compressed.encoding,\n },\n body: compressed.body,\n keepalive: true,\n timeoutMs: this.config.timeoutMs,\n signal: options?.signal,\n });\n\n const body = await response.json().catch(() => ({}));\n\n const ack = response.ok;\n this.lastAck = ack;\n\n if (ack) {\n this.sentCount += events.length;\n }\n\n this.responseLogs.push({\n at: Date.now(),\n url,\n status: response.status,\n ack,\n eventCount: events.length,\n body,\n });\n\n if (!ack) {\n throw new Error(`[HttpSender] HTTP ${response.status}`);\n }\n\n this.logger.debug(`[HttpSender] Sent ${events.length} event(s) — ACK`);\n\n return { ack: true, eventCount: events.length };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.lastAck = false;\n\n this.responseLogs.push({\n at: Date.now(),\n url,\n status: 0,\n ack: false,\n eventCount: events.length,\n error: message,\n });\n\n throw error;\n }\n }\n\n getState(): SenderDebugState & {\n responses: readonly HttpSenderResponseLog[];\n compression: { originalSize: number; compressedSize: number } | null;\n mode: 'http';\n } {\n return {\n sentCount: this.sentCount,\n logs: this.responseLogs.map(\n log =>\n `[HttpSender] ${log.status} ack=${log.ack} events=${log.eventCount}${log.error ? ` err=${log.error}` : ''}`\n ),\n lastAck: this.lastAck,\n responses: [...this.responseLogs],\n compression: this.lastCompression,\n mode: 'http',\n };\n }\n\n clear(): void {\n this.sentCount = 0;\n this.lastAck = null;\n this.responseLogs.length = 0;\n this.lastCompression = null;\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger';\n\nimport type { EventSender, SendOptions, SenderDebugState } from './types';\n\nexport type MockSenderOptions = {\n readonly delayMs?: number;\n readonly failUntilAttempt?: number;\n readonly simulateTimeout?: boolean;\n};\n\nexport class MockSender implements EventSender {\n private readonly logger: PixelLogger;\n\n private readonly options: MockSenderOptions;\n\n private readonly sentBatches: PixelEvent[][] = [];\n\n private sendAttempts = 0;\n\n private lastAck: boolean | null = null;\n\n constructor(logger: PixelLogger, options: MockSenderOptions = {}) {\n this.logger = logger;\n this.options = options;\n }\n\n async send(\n events: PixelEvent[],\n options?: SendOptions\n ): Promise<{ ack: boolean; eventCount: number }> {\n if (events.length === 0) {\n return { ack: true, eventCount: 0 };\n }\n\n if (options?.signal?.aborted) {\n throw new DOMException('The operation was aborted.', 'AbortError');\n }\n\n this.sendAttempts += 1;\n\n if (\n this.options.failUntilAttempt !== undefined &&\n this.sendAttempts < this.options.failUntilAttempt\n ) {\n throw new Error(\n `[MockSender] Simulated failure (attempt ${this.sendAttempts})`\n );\n }\n\n if (this.options.simulateTimeout) {\n throw new DOMException('The operation was aborted.', 'AbortError');\n }\n\n await this.waitWithAbort(options?.signal);\n\n this.sentBatches.push([...events]);\n this.lastAck = true;\n this.logger.debug(\n `[MockSender] Simulated send of ${events.length} event(s)`\n );\n\n return { ack: true, eventCount: events.length };\n }\n\n getSentBatches(): readonly (readonly PixelEvent[])[] {\n return this.sentBatches.map(batch => [...batch]);\n }\n\n getSentCount(): number {\n return this.sentBatches.reduce((total, batch) => total + batch.length, 0);\n }\n\n getLogs(): readonly string[] {\n return this.sentBatches.map(\n batch => `[MockSender] ${batch.map(event => event.type).join(', ')}`\n );\n }\n\n getState(): SenderDebugState {\n return {\n sentCount: this.getSentCount(),\n logs: this.getLogs(),\n lastAck: this.lastAck,\n };\n }\n\n clear(): void {\n this.sentBatches.length = 0;\n this.sendAttempts = 0;\n this.lastAck = null;\n }\n\n /** @internal Playground — reconfigura comportamento em runtime. */\n configure(options: Partial<MockSenderOptions>): void {\n if (options.delayMs !== undefined) {\n (this.options as { delayMs?: number }).delayMs = options.delayMs;\n }\n if ('failUntilAttempt' in options) {\n (this.options as { failUntilAttempt?: number }).failUntilAttempt =\n options.failUntilAttempt;\n }\n if (options.simulateTimeout !== undefined) {\n (this.options as { simulateTimeout?: boolean }).simulateTimeout =\n options.simulateTimeout;\n }\n }\n\n private waitWithAbort(signal?: AbortSignal): Promise<void> {\n const delayMs = this.options.delayMs ?? 0;\n if (delayMs <= 0) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = (): void => {\n cleanup();\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n };\n\n const cleanup = (): void => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n\n if (signal?.aborted) {\n cleanup();\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n return;\n }\n\n signal?.addEventListener('abort', onAbort);\n });\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { EventSender, SendOptions } from './types';\n\nexport type TimedSenderConfig = {\n readonly timeoutMs: number;\n};\n\nexport class TimedSender implements EventSender {\n private readonly inner: EventSender;\n\n private readonly timeoutMs: number;\n\n private abortController: AbortController | null = null;\n\n constructor(inner: EventSender, config: TimedSenderConfig) {\n this.inner = inner;\n this.timeoutMs = config.timeoutMs;\n }\n\n async send(\n events: PixelEvent[],\n options?: SendOptions\n ): Promise<{ ack: boolean; eventCount: number }> {\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const controller = this.abortController;\n const signals = [controller.signal, options?.signal].filter(\n Boolean\n ) as AbortSignal[];\n\n const combined = combineAbortSignals(signals);\n\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n return await this.inner.send(events, { signal: combined });\n } finally {\n clearTimeout(timeoutId);\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n }\n\n abortPending(): void {\n this.abortController?.abort();\n this.abortController = null;\n }\n}\n\nfunction combineAbortSignals(signals: AbortSignal[]): AbortSignal | undefined {\n if (signals.length === 0) return undefined;\n if (signals.length === 1) return signals[0];\n\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n return controller.signal;\n }\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n return controller.signal;\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { BatchManager } from './batch/BatchManager';\nimport {\n createCompressionStrategy,\n getCompressionDebugState,\n} from './compression';\nimport type { CompressionDebugState } from './compression';\nimport { CoordinationManager } from './coordination';\nimport type { CoordinationDebugState } from './coordination';\nimport { DeadLetterManager } from './dead-letter';\nimport type { DeadLetterDebugState } from './dead-letter';\nimport { TransportDelivery } from './delivery/TransportDelivery';\nimport { FlushManager } from './flush/FlushManager';\nimport { OfflineDetector } from './network/OfflineDetector';\nimport { OrderingManager } from './ordering';\nimport type { OrderingDebugState } from './ordering';\nimport { TransportPipeline } from './pipeline/TransportPipeline';\nimport { PersistentQueue } from './queue/PersistentQueue';\nimport type { IEventQueue } from './queue/types';\nimport { MemoryQueue } from './queue/MemoryQueue';\nimport { createQueueStorageFromConfig } from './queue/storage';\nimport { ReplayManager } from './replay';\nimport type { ReplayDebugState } from './replay';\nimport {\n BackpressureManager,\n CircuitBreaker,\n CircuitBreakerSender,\n} from './resilience';\nimport type {\n BackpressureDebugState,\n CircuitBreakerMetrics,\n} from './resilience';\nimport { RetryEngine } from './retry/RetryEngine';\nimport { EventPayloadBuilder } from './sender/EventPayloadBuilder';\nimport { HttpSender } from './sender/HttpSender';\nimport { MockSender } from './sender/MockSender';\nimport type { EventSender } from './sender/types';\nimport { TimedSender } from './sender/TimedSender';\n\nexport type TransportAdvancedDebugState = {\n readonly storage: {\n readonly adapter: string;\n readonly persistenceEnabled: boolean;\n readonly recordCount: number;\n };\n readonly replay: ReplayDebugState;\n readonly ordering: OrderingDebugState;\n readonly coordination: CoordinationDebugState;\n readonly circuitBreaker: CircuitBreakerMetrics;\n readonly backpressure: BackpressureDebugState;\n readonly deadLetter: DeadLetterDebugState;\n readonly compression: CompressionDebugState;\n readonly senderMode: 'mock' | 'http';\n};\n\nexport type TransportDebugState = {\n readonly queueSize: number;\n readonly queueContents: readonly PixelEvent[];\n readonly pipelineSteps: readonly string[];\n readonly senderLogs: readonly string[];\n readonly sentCount: number;\n readonly delivery: ReturnType<TransportDelivery['getDebugState']> | null;\n readonly sender: Record<string, unknown> | null;\n readonly advanced: TransportAdvancedDebugState | null;\n};\n\nexport class TransportEngine {\n private readonly context: PixelRuntimeContext;\n\n private readonly queue: IEventQueue;\n\n private readonly persistentQueue: PersistentQueue | null;\n\n private readonly pipeline: TransportPipeline;\n\n private readonly mockSender: MockSender | null;\n\n private readonly httpSender: HttpSender | null;\n\n private readonly delivery: TransportDelivery | null;\n\n private readonly timedSender: TimedSender | null;\n\n private readonly replayManager: ReplayManager | null;\n\n private readonly orderingManager: OrderingManager;\n\n private readonly coordinationManager: CoordinationManager;\n\n private readonly circuitBreaker: CircuitBreaker;\n\n private readonly backpressureManager: BackpressureManager;\n\n private readonly deadLetterManager: DeadLetterManager;\n\n private readonly senderMode: 'mock' | 'http';\n\n private active = false;\n\n constructor(\n context: PixelRuntimeContext,\n queue?: IEventQueue,\n sender?: EventSender\n ) {\n this.context = context;\n const moduleConfig = context.config.modules.transport;\n\n this.orderingManager = new OrderingManager({\n enabled: moduleConfig.ordering.enabled,\n });\n\n this.backpressureManager = new BackpressureManager({\n enabled: moduleConfig.backpressure.enabled,\n maxQueueSize: moduleConfig.backpressure.maxQueueSize,\n policy: moduleConfig.backpressure.policy,\n sampleRate: moduleConfig.backpressure.sampleRate,\n });\n\n this.deadLetterManager = new DeadLetterManager({\n enabled: moduleConfig.deadLetter.enabled,\n maxEntries: moduleConfig.deadLetter.maxEntries,\n });\n\n this.circuitBreaker = new CircuitBreaker({\n enabled: moduleConfig.circuitBreaker.enabled,\n failureThreshold: moduleConfig.circuitBreaker.failureThreshold,\n resetTimeoutMs: moduleConfig.circuitBreaker.resetTimeoutMs,\n halfOpenMaxAttempts: moduleConfig.circuitBreaker.halfOpenMaxAttempts,\n });\n\n this.coordinationManager = new CoordinationManager(\n { enabled: moduleConfig.coordination.enabled },\n context.config.identity.pixelId || 'pixel'\n );\n\n if (queue) {\n this.queue = queue;\n this.persistentQueue = null;\n } else if (moduleConfig.persistence.enabled) {\n const storage = createQueueStorageFromConfig(context.config);\n this.persistentQueue = new PersistentQueue(\n storage,\n this.orderingManager,\n this.backpressureManager\n );\n this.queue = this.persistentQueue;\n } else {\n this.persistentQueue = null;\n this.queue = new MemoryQueue();\n }\n\n this.pipeline = TransportPipeline.createDefault(this.queue);\n\n const compression = createCompressionStrategy(moduleConfig.compression);\n const payloadBuilder = new EventPayloadBuilder(context);\n\n const useHttp =\n sender === undefined &&\n (moduleConfig.sender?.mode === 'http' ||\n (!moduleConfig.mockSender.enabled &&\n moduleConfig.sender?.mode !== 'mock'));\n\n this.senderMode = sender instanceof HttpSender || useHttp ? 'http' : 'mock';\n\n const mockSender =\n sender instanceof MockSender ? sender : new MockSender(context.logger);\n this.mockSender =\n sender instanceof MockSender || !sender ? mockSender : null;\n\n this.httpSender =\n sender instanceof HttpSender\n ? sender\n : useHttp\n ? new HttpSender(\n {\n apiEndpoint: context.config.transport.apiEndpoint,\n timeoutMs: moduleConfig.timeout.timeoutMs,\n },\n payloadBuilder,\n compression,\n context.logger\n )\n : null;\n\n let eventSender: EventSender = sender ?? this.httpSender ?? mockSender;\n\n if (moduleConfig.circuitBreaker.enabled) {\n eventSender = new CircuitBreakerSender(this.circuitBreaker, eventSender);\n }\n\n let timedSender: TimedSender | null = null;\n\n if (moduleConfig.timeout.enabled) {\n timedSender = new TimedSender(eventSender, {\n timeoutMs: moduleConfig.timeout.timeoutMs,\n });\n eventSender = timedSender;\n }\n\n this.timedSender = timedSender;\n\n if (this.persistentQueue) {\n this.replayManager = new ReplayManager(\n { enabled: moduleConfig.replay.enabled },\n this.persistentQueue\n );\n this.replayManager.setReplayHandler(() => this.forwardQueuedEvents());\n } else {\n this.replayManager = null;\n }\n\n if (\n moduleConfig.retry.enabled ||\n moduleConfig.batch.enabled ||\n moduleConfig.offline.enabled ||\n moduleConfig.flush.enabled\n ) {\n const batchManager = new BatchManager();\n const flushManager = new FlushManager({\n flushIntervalMs: moduleConfig.flush.enabled\n ? moduleConfig.flush.flushIntervalMs\n : 0,\n flushOnDestroy: moduleConfig.flush.flushOnDestroy,\n prepareUnloadHooks: moduleConfig.flush.prepareUnloadHooks,\n });\n const retryEngine = new RetryEngine(\n {\n maxAttempts: moduleConfig.retry.maxAttempts,\n baseDelayMs: moduleConfig.retry.baseDelayMs,\n maxDelayMs: moduleConfig.retry.maxDelayMs,\n multiplier: moduleConfig.retry.multiplier,\n },\n context.logger\n );\n const offlineDetector = new OfflineDetector();\n\n this.delivery = new TransportDelivery({\n batchManager,\n flushManager,\n retryEngine,\n offlineDetector,\n sender: eventSender,\n config: {\n batch: {\n batchSize: moduleConfig.batch.batchSize,\n flushIntervalMs: moduleConfig.batch.flushIntervalMs,\n maxWaitMs: moduleConfig.batch.maxWaitMs,\n },\n timeoutMs: moduleConfig.timeout.timeoutMs,\n },\n logger: context.logger,\n abortPending: () => timedSender?.abortPending(),\n onPermanentFailure: moduleConfig.deadLetter.enabled\n ? (events, error) => {\n this.deadLetterManager.move(\n events,\n 'max_retries_exceeded',\n moduleConfig.retry.maxAttempts,\n error instanceof Error ? error.message : String(error)\n );\n }\n : undefined,\n });\n } else {\n this.delivery = null;\n }\n }\n\n async init(): Promise<void> {\n if (this.active) return;\n\n if (this.persistentQueue) {\n await this.persistentQueue.init();\n }\n\n this.coordinationManager.init(isLeader => {\n if (isLeader) {\n void this.replayManager?.replay('reconnect');\n this.forwardQueuedEvents();\n }\n });\n\n this.delivery?.init();\n\n if (this.replayManager) {\n await this.replayManager.replay('init');\n }\n\n this.active = true;\n this.context.logger.debug('[TransportEngine] Initialized');\n }\n\n destroy(): void {\n if (!this.active) return;\n\n this.timedSender?.abortPending();\n this.delivery?.destroy();\n this.coordinationManager.destroy();\n\n if (this.persistentQueue) {\n this.persistentQueue.destroy();\n } else {\n this.queue.clear();\n }\n\n this.mockSender?.clear();\n this.httpSender?.clear();\n this.active = false;\n this.context.logger.debug('[TransportEngine] Destroyed');\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n handleEvent(event: PixelEvent): void {\n if (!this.active) return;\n\n const result = this.pipeline.process(event);\n if (!result.event) {\n this.context.logger.debug('[TransportEngine] Event dropped by pipeline');\n return;\n }\n\n if (this.coordinationManager.shouldPersistOnly()) {\n return;\n }\n\n this.forwardQueuedEvents();\n }\n\n manualFlush(): void {\n this.delivery?.flush();\n }\n\n simulateOffline(offline: boolean): void {\n this.delivery?.getOfflineDetector().simulateOffline(offline);\n if (!offline) {\n void this.replayManager?.replay('reconnect');\n this.forwardQueuedEvents();\n }\n }\n\n configureMockSender(options: Parameters<MockSender['configure']>[0]): void {\n this.mockSender?.configure(options);\n }\n\n async simulateReload(): Promise<void> {\n await this.replayManager?.replay('reload');\n this.forwardQueuedEvents();\n }\n\n async simulateRestart(): Promise<void> {\n await this.replayManager?.replay('restart');\n this.forwardQueuedEvents();\n }\n\n forceCircuitOpen(): void {\n this.circuitBreaker.forceOpen();\n }\n\n forceCircuitClose(): void {\n this.circuitBreaker.forceClose();\n }\n\n async manualReplay(): Promise<number> {\n const count = (await this.replayManager?.replay('manual')) ?? 0;\n this.forwardQueuedEvents();\n return count;\n }\n\n replayDeadLetter(): PixelEvent[] {\n const events = this.deadLetterManager.replayAll();\n if (events.length > 0) {\n for (const event of events) {\n this.queue.enqueue(event);\n }\n this.forwardQueuedEvents();\n }\n return events;\n }\n\n clearDeadLetter(): void {\n this.deadLetterManager.clear();\n }\n\n exportQueue(): string {\n if (this.persistentQueue) {\n return JSON.stringify(this.persistentQueue.exportRecords(), null, 2);\n }\n return JSON.stringify(this.queue.getAll(), null, 2);\n }\n\n importQueue(raw: string): number {\n const parsed = JSON.parse(raw) as unknown;\n\n if (this.persistentQueue && Array.isArray(parsed) && parsed[0]?.event) {\n this.persistentQueue.importRecords(parsed);\n return parsed.length;\n }\n\n if (Array.isArray(parsed)) {\n this.queue.clear();\n for (const event of parsed as PixelEvent[]) {\n this.queue.enqueue(event);\n }\n return parsed.length;\n }\n\n return 0;\n }\n\n getQueue(): IEventQueue {\n return this.queue;\n }\n\n getPipelineSteps(): readonly string[] {\n return this.pipeline.getLastSteps();\n }\n\n getDebugState(): TransportDebugState {\n const senderState =\n this.httpSender?.getState() ?? this.mockSender?.getState() ?? null;\n\n return {\n queueSize: this.queue.size(),\n queueContents: this.queue.getAll(),\n pipelineSteps: this.pipeline.getLastSteps(),\n senderLogs: senderState?.logs ?? [],\n sentCount: senderState?.sentCount ?? 0,\n delivery: this.delivery?.getDebugState() ?? null,\n sender: senderState as Record<string, unknown> | null,\n advanced: {\n storage: {\n adapter:\n this.persistentQueue?.getStorageAdapterName() ?? 'MemoryQueue',\n persistenceEnabled: this.persistentQueue !== null,\n recordCount:\n this.persistentQueue?.getRecords().length ?? this.queue.size(),\n },\n replay: this.replayManager?.getDebugState() ?? {\n enabled: false,\n lastTrigger: null,\n lastReplayAt: null,\n totalReplayed: 0,\n pendingCount: 0,\n },\n ordering: this.orderingManager.getDebugState(this.queue.size()),\n coordination: this.coordinationManager.getDebugState(),\n circuitBreaker: this.circuitBreaker.getMetrics(),\n backpressure: this.backpressureManager.getDebugState(this.queue.size()),\n deadLetter: this.deadLetterManager.getDebugState(),\n compression: getCompressionDebugState(\n this.context.config.modules.transport.compression,\n createCompressionStrategy(\n this.context.config.modules.transport.compression\n ),\n this.httpSender?.getState().compression ?? null\n ),\n senderMode: this.senderMode,\n },\n };\n }\n\n private forwardQueuedEvents(): void {\n if (!this.coordinationManager.canSend()) return;\n\n const events: PixelEvent[] = [];\n\n while (!this.queue.isEmpty()) {\n const event = this.queue.dequeue();\n if (event) events.push(event);\n }\n\n if (events.length === 0) return;\n\n if (this.delivery) {\n this.delivery.ingest(events);\n return;\n }\n\n const sender = this.httpSender ?? this.mockSender;\n void sender?.send(events).catch(error => {\n for (const event of events) {\n this.queue.enqueue(event);\n }\n this.context.logger.error('[TransportEngine] Direct send failed', error);\n });\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelModule } from '@/runtime/types';\nimport type { PixelRuntimeContext } from '@/runtime/PixelRuntimeContext';\n\nimport { DispatcherSubscriber } from './subscriber/DispatcherSubscriber';\nimport type { TransportDebugState } from './transport.engine';\nimport { TransportEngine } from './transport.engine';\nimport type { MockSender } from './sender/MockSender';\n\nexport class TransportModule implements PixelModule {\n readonly name = 'transport' as const;\n\n private engine: TransportEngine | null = null;\n\n private subscriber: DispatcherSubscriber | null = null;\n\n private active = false;\n\n async init(context: PixelRuntimeContext): Promise<void> {\n if (this.active) {\n context.logger.debug('[Pixel] Transport module already initialized');\n return;\n }\n\n if (!context.config.modules.transport.enabled) {\n context.logger.debug('[Pixel] Transport module disabled');\n return;\n }\n\n context.logger.debug('[Pixel] Transport module initialized');\n\n this.engine = new TransportEngine(context);\n await this.engine.init();\n\n this.subscriber = new DispatcherSubscriber(\n context.services.dispatcher,\n event => this.engine?.handleEvent(event)\n );\n this.subscriber.subscribe();\n\n this.active = true;\n }\n\n async destroy(): Promise<void> {\n if (!this.active) return;\n\n this.subscriber?.unsubscribeAll();\n this.subscriber = null;\n\n this.engine?.destroy();\n this.engine = null;\n\n this.active = false;\n }\n\n getDebugState(): TransportDebugState | null {\n return this.engine?.getDebugState() ?? null;\n }\n\n isEngineActive(): boolean {\n return this.engine?.isActive() ?? false;\n }\n\n manualFlush(): void {\n this.engine?.manualFlush();\n }\n\n simulateOffline(offline: boolean): void {\n this.engine?.simulateOffline(offline);\n }\n\n configureMockSender(options: Parameters<MockSender['configure']>[0]): void {\n this.engine?.configureMockSender(options);\n }\n\n simulateReload(): Promise<void> {\n return this.engine?.simulateReload() ?? Promise.resolve();\n }\n\n simulateRestart(): Promise<void> {\n return this.engine?.simulateRestart() ?? Promise.resolve();\n }\n\n forceCircuitOpen(): void {\n this.engine?.forceCircuitOpen();\n }\n\n forceCircuitClose(): void {\n this.engine?.forceCircuitClose();\n }\n\n manualReplay(): Promise<number> {\n return this.engine?.manualReplay() ?? Promise.resolve(0);\n }\n\n replayDeadLetter(): PixelEvent[] {\n return this.engine?.replayDeadLetter() ?? [];\n }\n\n clearDeadLetter(): void {\n this.engine?.clearDeadLetter();\n }\n\n exportQueue(): string {\n return this.engine?.exportQueue() ?? '[]';\n }\n\n importQueue(raw: string): number {\n return this.engine?.importQueue(raw) ?? 0;\n }\n}\n","import type { PixelModule } from './types';\n\nexport class ModuleRegistry {\n private readonly modules: PixelModule[] = [];\n\n register(module: PixelModule): void {\n if (this.modules.some(existing => existing.name === module.name)) {\n throw new Error(`[Pixel] Module \"${module.name}\" is already registered`);\n }\n\n this.modules.push(module);\n }\n\n getAll(): readonly PixelModule[] {\n return this.modules;\n }\n\n size(): number {\n return this.modules.length;\n }\n}\n","import type { AttributionService } from '@/services/attribution/types';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { UrlContextService } from '@/modules/core/url-context';\n\nimport type { BasePixelEvent } from '../base';\n\nexport class BaseEventBuilder {\n private readonly metadataService: BrowserMetadataService;\n\n private readonly attribution: AttributionService | null;\n\n private readonly urlContext: UrlContextService | null;\n\n constructor(\n metadataService: BrowserMetadataService,\n attribution?: AttributionService | null,\n urlContext?: UrlContextService | null\n ) {\n this.metadataService = metadataService;\n this.attribution = attribution ?? null;\n this.urlContext = urlContext ?? null;\n }\n\n build<T extends { type: string }>(event: T): T & BasePixelEvent {\n const metadata = this.metadataService.getMetadata();\n const identifiers = this.attribution?.getSnapshot();\n const hasIdentifiers =\n identifiers !== undefined &&\n Object.keys(identifiers).some(key => {\n const value = identifiers[key as keyof typeof identifiers];\n return value !== undefined && value !== null && value !== '';\n });\n\n const urlSnapshot = this.urlContext?.isEnabled()\n ? this.urlContext.getSnapshot()\n : null;\n\n const hasQueryParams =\n urlSnapshot !== null && Object.keys(urlSnapshot.queryParams).length > 0;\n const hasUrlContext =\n urlSnapshot !== null &&\n ((urlSnapshot.urlContext.managed &&\n Object.keys(urlSnapshot.urlContext.managed).length > 0) ||\n (urlSnapshot.urlContext.forwarded &&\n Object.keys(urlSnapshot.urlContext.forwarded).length > 0) ||\n (urlSnapshot.urlContext.source &&\n Object.keys(urlSnapshot.urlContext.source).length > 0));\n\n return {\n ...event,\n timestamp: Date.now(),\n path: metadata.path,\n url: metadata.url,\n hostname: metadata.hostname,\n language: metadata.language,\n timezone: metadata.timezone,\n ...(hasIdentifiers ? { identifiers } : {}),\n ...(hasQueryParams\n ? { queryParams: { ...urlSnapshot!.queryParams } }\n : {}),\n ...(hasUrlContext\n ? {\n urlContext: {\n ...(urlSnapshot!.urlContext.managed\n ? { managed: { ...urlSnapshot!.urlContext.managed } }\n : {}),\n ...(urlSnapshot!.urlContext.forwarded\n ? { forwarded: { ...urlSnapshot!.urlContext.forwarded } }\n : {}),\n ...(urlSnapshot!.urlContext.source\n ? { source: { ...urlSnapshot!.urlContext.source } }\n : {}),\n },\n }\n : {}),\n };\n }\n}\n","import type { PixelLogger } from './PixelLogger';\n\nexport class ConsolePixelLogger implements PixelLogger {\n constructor(private readonly debugEnabled: boolean) {}\n\n debug(...args: unknown[]): void {\n if (!this.debugEnabled) return;\n if (typeof console === 'undefined') return;\n console.debug(...args);\n }\n\n info(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.info(...args);\n }\n\n warn(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.warn(...args);\n }\n\n error(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.error(...args);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(customParams: readonly string[] = []): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(\n this.storageKey\n );\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(\n storage: StorageService,\n config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG\n ) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger/PixelLogger';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nconst MAX_ERROR_MESSAGE_LENGTH = 200;\n\n/**\n * Hardening 18.1 — falha de um listener não interrompe os demais nem propaga\n * para o produtor (trackers/engines). Log sanitizado, sem payload/PII.\n */\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n private readonly logger: Pick<PixelLogger, 'warn'> | undefined;\n\n constructor(logger?: Pick<PixelLogger, 'warn'>) {\n this.logger = logger;\n }\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n // Snapshot: permite unsubscribe durante dispatch sem pular listeners.\n const snapshot = [...this.listeners];\n\n for (let index = 0; index < snapshot.length; index += 1) {\n const listener = snapshot[index];\n if (!listener) continue;\n\n try {\n listener(event);\n } catch (error) {\n this.logger?.warn(sanitizeDispatcherError(error, event.type, index));\n }\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n\nexport function sanitizeDispatcherError(\n error: unknown,\n eventType: string,\n listenerIndex: number\n): Record<string, unknown> {\n const name =\n error instanceof Error\n ? error.name\n : typeof error === 'object' && error !== null && 'name' in error\n ? String((error as { name: unknown }).name)\n : 'Error';\n\n let message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'unknown';\n\n message = message\n .replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, '[redacted]')\n .replace(/\\+?\\d[\\d\\s().-]{7,}\\d/g, '[redacted]');\n\n if (message.length > MAX_ERROR_MESSAGE_LENGTH) {\n message = `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}…`;\n }\n\n return {\n code: 'DISPATCHER_LISTENER_FAILED',\n eventType,\n listenerIndex,\n errorName: name,\n message,\n timestamp: Date.now(),\n };\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash =\n (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","/** Constantes default de UrlContext — denylist, domínios e selectors. */\n\nexport const DEFAULT_URL_CONTEXT_DENYLIST: readonly string[] = [\n 'token',\n 'access_token',\n 'refresh_token',\n 'id_token',\n 'password',\n 'pass',\n 'pwd',\n 'email',\n 'phone',\n 'cpf',\n 'cnpj',\n 'document',\n 'card',\n 'cc',\n 'credit_card',\n 'cvv',\n 'cvc',\n 'auth',\n 'code',\n 'sessionId',\n 'internalSessionId',\n 'pixelSessionId',\n];\n\nexport const DEFAULT_URL_CONTEXT_EXCLUDED_DOMAINS: readonly string[] = [\n 'facebook.com',\n 'google.com',\n 'youtube.com',\n 'instagram.com',\n 'wa.me',\n 'whatsapp.com',\n 't.me',\n 'telegram.me',\n];\n\nexport const DEFAULT_URL_CONTEXT_EXCLUDE_SELECTORS: readonly string[] = [\n '[data-no-url-context]',\n '[download]',\n];\n\nexport const SID_EXCLUDE_SELECTOR = '[data-no-sid]';\n\nexport const DEFAULT_URL_CONTEXT_SID_MAX_AGE_MS = 1000 * 60 * 60 * 24 * 30;\n","import {\n DEFAULT_URL_CONTEXT_DENYLIST,\n DEFAULT_URL_CONTEXT_EXCLUDED_DOMAINS,\n DEFAULT_URL_CONTEXT_EXCLUDE_SELECTORS,\n SID_EXCLUDE_SELECTOR,\n} from './constants';\n\nexport function normalizeParamKey(key: string): string {\n return key.trim().toLowerCase();\n}\n\n/** decodeURIComponent seguro — URI malformada não quebra o collector. */\nexport function safeDecodeURIComponent(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport function buildDenylistSet(\n userDenylist: readonly string[] | undefined,\n mergeDefault: boolean | undefined\n): Set<string> {\n const set = new Set<string>();\n if (mergeDefault !== false) {\n for (const key of DEFAULT_URL_CONTEXT_DENYLIST) {\n set.add(normalizeParamKey(key));\n }\n }\n for (const key of userDenylist ?? []) {\n if (typeof key === 'string' && key.trim()) {\n set.add(normalizeParamKey(key));\n }\n }\n return set;\n}\n\nexport function buildExcludedDomains(\n userExcluded: readonly string[] | undefined,\n mergeDefault: boolean | undefined\n): string[] {\n const list: string[] = [];\n if (mergeDefault !== false) {\n list.push(...DEFAULT_URL_CONTEXT_EXCLUDED_DOMAINS);\n }\n for (const domain of userExcluded ?? []) {\n if (typeof domain === 'string' && domain.trim()) {\n list.push(domain.trim().toLowerCase());\n }\n }\n return Array.from(new Set(list.map(d => d.toLowerCase())));\n}\n\nexport function buildExcludeSelectors(\n userSelectors: readonly string[] | undefined,\n mergeDefault: boolean | undefined,\n includeSidSelector: boolean\n): string[] {\n const list: string[] = [];\n if (mergeDefault !== false) {\n list.push(...DEFAULT_URL_CONTEXT_EXCLUDE_SELECTORS);\n }\n if (includeSidSelector) {\n list.push(SID_EXCLUDE_SELECTOR);\n }\n for (const sel of userSelectors ?? []) {\n if (typeof sel === 'string' && sel.trim()) {\n list.push(sel.trim());\n }\n }\n return Array.from(new Set(list));\n}\n\nexport function isDeniedKey(key: string, denylist: Set<string>): boolean {\n return denylist.has(normalizeParamKey(key));\n}\n\nexport function hostMatchesDomain(hostname: string, domain: string): boolean {\n const host = hostname.toLowerCase().replace(/\\.$/, '');\n // remove porta se vier colada por engano\n const hostNoPort = host.replace(/:\\d+$/, '');\n const target = domain.toLowerCase().replace(/^\\./, '').replace(/:\\d+$/, '');\n return hostNoPort === target || hostNoPort.endsWith(`.${target}`);\n}\n\nexport function isDomainAllowed(\n hostname: string,\n allowedDomains: '*' | string[] | undefined,\n excludedDomains: readonly string[]\n): boolean {\n /**\n * Hostname vazio (ex.: `file://` + link relativo / same-origin local).\n * Permitido apenas com sentinel `local` ou allow-all `*`.\n */\n if (!hostname) {\n if (allowedDomains === undefined || allowedDomains === '*') return true;\n return allowedDomains.some(\n domain => domain.trim().toLowerCase() === 'local'\n );\n }\n\n for (const excluded of excludedDomains) {\n if (hostMatchesDomain(hostname, excluded)) return false;\n }\n\n if (allowedDomains === undefined || allowedDomains === '*') return true;\n\n return allowedDomains.some(domain => {\n const normalized = domain.trim().toLowerCase();\n // Sentinel `local` não é hostname real\n if (normalized === 'local') return false;\n return hostMatchesDomain(hostname, domain);\n });\n}\n\n/** Gera ID público: `sid_<ts_base36>_<random>` — sem PII / session / visitor. */\nexport function generatePublicId(prefix = 'sid'): string {\n const safePrefix = (prefix || 'sid').replace(/[^a-zA-Z0-9_-]/g, '') || 'sid';\n const ts = Date.now().toString(36);\n const random = Math.random().toString(36).slice(2, 10);\n return `${safePrefix}_${ts}_${random}`;\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * replaceState silencioso — usa History.prototype para não disparar\n * NavigationObserver / SPA PAGE_VIEW do Core.\n */\nexport function silentReplaceState(url: string): void {\n if (!isBrowser()) return;\n try {\n History.prototype.replaceState.call(\n history,\n history.state,\n document.title,\n url\n );\n } catch {\n // ignore — SSR / environments sem History\n }\n}\n\n/**\n * Parse de query string.\n * - duplicados: último valor vence (payload simples / idempotente)\n * - encoding malformado: não lança\n * - `+` → espaço\n */\nexport function parseSearchParams(search: string): Record<string, string> {\n const result: Record<string, string> = {};\n if (!search || search === '?') return result;\n\n const raw = search.startsWith('?') ? search.slice(1) : search;\n if (!raw) return result;\n\n for (const part of raw.split('&')) {\n if (!part) continue;\n const eq = part.indexOf('=');\n const key = safeDecodeURIComponent(\n (eq >= 0 ? part.slice(0, eq) : part).replace(/\\+/g, ' ')\n ).trim();\n if (!key) continue;\n const value =\n eq >= 0\n ? safeDecodeURIComponent(part.slice(eq + 1).replace(/\\+/g, ' '))\n : '';\n result[key] = value;\n }\n\n return result;\n}\n\nexport function buildSearchString(params: Record<string, string>): string {\n const pairs: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (!key) continue;\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value ?? '')}`);\n }\n return pairs.length > 0 ? `?${pairs.join('&')}` : '';\n}\n\n/** Cópia rasa congelada — evita mutação externa do snapshot. */\nexport function freezeRecord(\n record: Record<string, string>\n): Readonly<Record<string, string>> {\n return Object.freeze({ ...record });\n}\n\n/**\n * Reformata href decorado preservando forma relativa quando possível.\n * Garante `path?query#hash` (nunca `path#hash?query`).\n */\nexport function formatDecoratedHref(originalHref: string, url: URL): string {\n const trimmed = originalHref.trim();\n const search = url.search || '';\n const hash = url.hash || '';\n\n if (trimmed.startsWith('//')) {\n return `//${url.host}${url.pathname}${search}${hash}`;\n }\n\n if (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(trimmed)) {\n // absolute com scheme (http, https, ...)\n return url.toString();\n }\n\n if (trimmed.startsWith('/')) {\n return `${url.pathname}${search}${hash}`;\n }\n\n if (trimmed.startsWith('#')) {\n return `${search}${hash}`;\n }\n\n // relativo: checkout, ./checkout, ../checkout\n const pathPart = trimmed.split(/[?#]/)[0] ?? trimmed;\n return `${pathPart}${search}${hash}`;\n}\n","import type { UrlQueryParamsConfig } from '@/config/shared/url-context';\n\nimport {\n buildDenylistSet,\n isBrowser,\n isDeniedKey,\n normalizeParamKey,\n parseSearchParams,\n} from './utils';\n\n/**\n * Lê `window.location.search`, aplica allow/deny e retorna snapshot sanitizado.\n */\nexport class QueryParamCollector {\n collect(config: UrlQueryParamsConfig | undefined): Record<string, string> {\n if (!config || config.enabled === false) return {};\n if (!isBrowser()) return {};\n\n const raw = parseSearchParams(window.location.search);\n const denylist = buildDenylistSet(\n config.denylist,\n config.mergeDefaultDenylist\n );\n const mode = config.mode ?? 'all_except';\n const allowlist = new Set(\n (config.allowlist ?? []).map(normalizeParamKey).filter(Boolean)\n );\n\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n if (isDeniedKey(key, denylist)) continue;\n if (mode === 'allowlist' && !allowlist.has(normalizeParamKey(key))) {\n continue;\n }\n // valores vazios: omitir (mantém payload limpo)\n if (value === '') continue;\n result[key] = value;\n }\n\n return result;\n }\n}\n","import type {\n UrlContextSource,\n UrlManagedParamConfig,\n} from '@/config/shared/url-context';\n\nimport type { UrlContextStore } from './UrlContextStore';\nimport {\n buildSearchString,\n generatePublicId,\n isBrowser,\n parseSearchParams,\n silentReplaceState,\n} from './utils';\n\nexport type ManagedParamResolution = {\n values: Record<string, string>;\n sources: Record<string, UrlContextSource>;\n decorateParams: Record<string, string>;\n};\n\n/**\n * Resolve managed params: URL → cookie → storage → generated.\n * Persiste e opcionalmente escreve na URL via replaceState silencioso.\n */\nexport class ManagedParamResolver {\n private readonly store: UrlContextStore;\n\n constructor(store: UrlContextStore) {\n this.store = store;\n }\n\n resolve(configs: readonly UrlManagedParamConfig[]): ManagedParamResolution {\n const values: Record<string, string> = {};\n const sources: Record<string, UrlContextSource> = {};\n const decorateParams: Record<string, string> = {};\n const urlWrites: Record<string, string> = {};\n\n const currentParams = isBrowser()\n ? parseSearchParams(window.location.search)\n : {};\n\n for (const config of configs) {\n const param = config.param?.trim();\n if (!param) continue;\n\n const mode = config.mode ?? 'read_write';\n const canRead = mode === 'read_only' || mode === 'read_write';\n const canWrite = mode === 'write_only' || mode === 'read_write';\n\n let value: string | null = null;\n let source: UrlContextSource | null = null;\n\n if (canRead) {\n const fromUrl = currentParams[param];\n if (fromUrl && fromUrl.length > 0) {\n value = fromUrl;\n source = 'url';\n }\n }\n\n if (!value && canRead && config.persistence?.enabled !== false) {\n const cookieName = config.persistence?.cookie?.name?.trim() || param;\n if (config.persistence?.cookie?.enabled !== false) {\n const fromCookie = this.store.getCookie(cookieName);\n if (fromCookie) {\n value = fromCookie;\n source = 'cookie';\n }\n }\n }\n\n if (!value && canRead && config.persistence?.enabled !== false) {\n const storageKey = config.persistence?.storageKey?.trim() || param;\n const fromStorage = this.store.getStorage(storageKey);\n if (fromStorage) {\n value = fromStorage;\n source = 'storage';\n }\n }\n\n if (!value && canWrite && config.generator?.type === 'public_id') {\n value = generatePublicId(config.generator.prefix ?? param);\n source = 'generated';\n }\n\n if (!value || !source) continue;\n\n values[param] = value;\n sources[param] = source;\n\n if (config.decorateLinks !== false) {\n decorateParams[param] = value;\n }\n\n // Persist always when we have a value and persistence enabled\n if (config.persistence?.enabled !== false) {\n this.persist(config, value);\n }\n\n // Write to URL if strategy allows and value missing/different on URL\n if (\n canWrite &&\n (config.writeStrategy ?? 'replaceState') === 'replaceState' &&\n isBrowser()\n ) {\n const existing = currentParams[param];\n if (existing !== value) {\n urlWrites[param] = value;\n }\n }\n }\n\n if (Object.keys(urlWrites).length > 0 && isBrowser()) {\n this.writeToUrl(urlWrites);\n }\n\n return { values, sources, decorateParams };\n }\n\n /**\n * Aplica valor externo após o resolve inicial (sem generator).\n * Persiste e opcionalmente escreve na URL.\n */\n applyExternalValue(config: UrlManagedParamConfig, value: string): void {\n const trimmed = value.trim();\n if (!trimmed) return;\n\n if (config.persistence?.enabled !== false) {\n this.persist(config, trimmed);\n }\n\n if (\n (config.writeStrategy ?? 'replaceState') === 'replaceState' &&\n isBrowser()\n ) {\n this.writeToUrl({ [config.param]: trimmed });\n }\n }\n\n private persist(config: UrlManagedParamConfig, value: string): void {\n const strategy = config.persistence?.strategy ?? 'localStorage_cookie';\n const storageKey = config.persistence?.storageKey?.trim() || config.param;\n const cookieCfg = config.persistence?.cookie;\n const cookieName = cookieCfg?.name?.trim() || config.param;\n\n if (strategy === 'storage' || strategy === 'localStorage_cookie') {\n this.store.setStorage(storageKey, value);\n }\n\n if (\n (strategy === 'cookie' || strategy === 'localStorage_cookie') &&\n cookieCfg?.enabled !== false\n ) {\n this.store.setCookie({\n name: cookieName,\n value,\n path: cookieCfg?.path ?? '/',\n domain: cookieCfg?.domain ?? 'auto',\n sameSite: cookieCfg?.sameSite ?? 'Lax',\n secure: cookieCfg?.secure ?? true,\n maxAgeMs: cookieCfg?.maxAgeMs,\n });\n }\n }\n\n private writeToUrl(writes: Record<string, string>): void {\n const current = parseSearchParams(window.location.search);\n const next = { ...current, ...writes };\n const search = buildSearchString(next);\n const hash = window.location.hash ?? '';\n const path = window.location.pathname + search + hash;\n silentReplaceState(path);\n }\n}\n","import type { UrlForwardParamsConfig } from '@/config/shared/url-context';\n\nimport { buildDenylistSet, isDeniedKey, normalizeParamKey } from './utils';\n\n/**\n * Decide quais params (não gerenciados) propagar em links.\n * Não gera nem persiste — só filtra.\n */\nexport class ForwardParamResolver {\n resolve(input: {\n queryParams: Record<string, string>;\n managedValues: Record<string, string>;\n config: UrlForwardParamsConfig | undefined;\n }): Record<string, string> {\n const { queryParams, managedValues, config } = input;\n if (!config || config.enabled === false) return {};\n\n const denylist = buildDenylistSet(\n config.denylist,\n config.mergeDefaultDenylist\n );\n const mode = config.mode ?? 'all_except';\n const allowlist = new Set(\n (config.allowlist ?? []).map(normalizeParamKey).filter(Boolean)\n );\n\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(queryParams)) {\n if (!value) continue;\n if (isDeniedKey(key, denylist)) continue;\n if (key in managedValues) continue; // managed tem prioridade\n if (mode === 'allowlist' && !allowlist.has(normalizeParamKey(key))) {\n continue;\n }\n result[key] = value;\n }\n\n return result;\n }\n}\n","import type { UrlLinkDecorationConfig } from '@/config/shared/url-context';\n\nimport {\n buildExcludeSelectors,\n buildExcludedDomains,\n buildSearchString,\n formatDecoratedHref,\n isBrowser,\n isDomainAllowed,\n parseSearchParams,\n} from './utils';\n\nconst BLOCKED_PROTOCOLS = [\n 'mailto:',\n 'tel:',\n 'javascript:',\n 'data:',\n 'blob:',\n] as const;\n\nexport type LinkDecoratorOptions = {\n forwardedParams?: Readonly<Record<string, string>>;\n managedParams?: Readonly<Record<string, string>>;\n config: UrlLinkDecorationConfig;\n /**\n * Quando true, inclui `[data-no-sid]` nos exclude selectors.\n * Semântica legada: exclusão remove toda a decoração do link.\n */\n includeSidExclude?: boolean;\n};\n\n/**\n * Decora links com forwarded + managed params (grupos separados).\n *\n * Ordem:\n * 1. query existente do link\n * 2. forwarded (respeita preserveExisting / overwriteExisting)\n * 3. managed (sempre autoritativo)\n * 4. dedupe / remontagem\n *\n * Strategies: on_click | on_init | both.\n */\nexport class LinkDecorator {\n private readonly forwardedParams: Readonly<Record<string, string>>;\n\n private managedParams: Readonly<Record<string, string>>;\n\n private readonly config: UrlLinkDecorationConfig;\n\n private readonly excludedDomains: readonly string[];\n\n private readonly excludeSelectors: readonly string[];\n\n private clickHandler: ((event: MouseEvent) => void) | null = null;\n\n private started = false;\n\n constructor(\n paramsOrOptions: Record<string, string> | LinkDecoratorOptions,\n config?: UrlLinkDecorationConfig,\n includeSidExclude?: boolean\n ) {\n if (isLinkDecoratorOptions(paramsOrOptions)) {\n this.forwardedParams = Object.freeze({\n ...(paramsOrOptions.forwardedParams ?? {}),\n });\n this.managedParams = Object.freeze({\n ...(paramsOrOptions.managedParams ?? {}),\n });\n this.config = paramsOrOptions.config;\n this.excludedDomains = buildExcludedDomains(\n paramsOrOptions.config.excludedDomains,\n paramsOrOptions.config.mergeDefaultExcludedDomains\n );\n this.excludeSelectors = buildExcludeSelectors(\n paramsOrOptions.config.excludeSelectors,\n paramsOrOptions.config.mergeDefaultExcludeSelectors,\n paramsOrOptions.includeSidExclude === true\n );\n return;\n }\n\n // Legado: params flat tratados como managed (autoritativos).\n const flat = paramsOrOptions;\n const resolvedConfig = config!;\n this.forwardedParams = Object.freeze({});\n this.managedParams = Object.freeze({ ...flat });\n this.config = resolvedConfig;\n this.excludedDomains = buildExcludedDomains(\n resolvedConfig.excludedDomains,\n resolvedConfig.mergeDefaultExcludedDomains\n );\n this.excludeSelectors = buildExcludeSelectors(\n resolvedConfig.excludeSelectors,\n resolvedConfig.mergeDefaultExcludeSelectors,\n includeSidExclude === true\n );\n }\n\n /**\n * Atualiza managed params após o start (ex.: `oid` registrado no checkout).\n * Reaplica decoração on_init/both nos links já presentes.\n */\n updateManagedParams(managedParams: Readonly<Record<string, string>>): void {\n this.managedParams = Object.freeze({ ...managedParams });\n if (!this.started || !isBrowser()) return;\n if (this.config.enabled === false) return;\n const strategy = this.config.strategy ?? 'on_click';\n if (strategy === 'on_init' || strategy === 'both') {\n this.decorateMatchingLinks();\n }\n }\n\n start(): void {\n if (this.started || !isBrowser()) return;\n if (this.config.enabled === false) return;\n if (\n Object.keys(this.forwardedParams).length === 0 &&\n Object.keys(this.managedParams).length === 0\n ) {\n return;\n }\n\n this.started = true;\n const strategy = this.config.strategy ?? 'on_click';\n\n if (strategy === 'on_init' || strategy === 'both') {\n this.decorateMatchingLinks();\n }\n\n if (strategy === 'on_click' || strategy === 'both') {\n this.clickHandler = (event: MouseEvent) => {\n const anchor = findAnchor(event.target);\n if (!anchor) return;\n if (this.isExcludedAnchor(anchor)) return;\n this.decorateAnchor(anchor);\n };\n document.addEventListener('click', this.clickHandler, true);\n }\n }\n\n destroy(): void {\n if (!this.started) return;\n if (this.clickHandler && typeof document !== 'undefined') {\n document.removeEventListener('click', this.clickHandler, true);\n }\n this.clickHandler = null;\n this.started = false;\n }\n\n /** Expõe para testes e uso interno. */\n decorateHref(href: string, baseHostname?: string): string | null {\n if (!href || href.trim() === '') return null;\n\n const trimmed = href.trim();\n const lower = trimmed.toLowerCase();\n\n for (const proto of BLOCKED_PROTOCOLS) {\n if (!lower.startsWith(proto)) continue;\n if (proto === 'mailto:' && this.config.decorateMailto === true) {\n return null;\n }\n if (proto === 'tel:' && this.config.decorateTel === true) {\n return null;\n }\n return null;\n }\n\n if (trimmed.startsWith('#') && this.config.decorateHashLinks !== true) {\n return null;\n }\n\n let url: URL;\n try {\n const base = isBrowser()\n ? window.location.href\n : `https://${baseHostname ?? 'example.com'}/`;\n url = new URL(trimmed, base);\n } catch {\n return null;\n }\n\n if (\n !isDomainAllowed(\n url.hostname,\n this.config.allowedDomains,\n this.excludedDomains\n )\n ) {\n return null;\n }\n\n const existing = parseSearchParams(url.search);\n const preserve = this.config.preserveExisting !== false;\n const overwrite = this.config.overwriteExisting === true;\n const next: Record<string, string> = { ...existing };\n let changed = false;\n\n // 1) Forwarded — respeitam preserveExisting / overwriteExisting\n for (const [key, value] of Object.entries(this.forwardedParams)) {\n if (key in next && preserve && !overwrite) {\n continue;\n }\n if (next[key] !== value) changed = true;\n next[key] = value;\n }\n\n // 2) Managed — sempre autoritativos\n for (const [key, value] of Object.entries(this.managedParams)) {\n if (next[key] !== value) changed = true;\n next[key] = value;\n }\n\n const originalParsed = parseSearchParams(\n trimmed.includes('?')\n ? (trimmed.slice(trimmed.indexOf('?')).split('#')[0] ?? '')\n : ''\n );\n const hadDuplicateKeys =\n countQueryKeys(trimmed) > Object.keys(originalParsed).length;\n\n if (!changed && !hadDuplicateKeys) {\n return trimmed;\n }\n\n const search = buildSearchString(next);\n url.search = search.startsWith('?') ? search.slice(1) : search;\n return formatDecoratedHref(trimmed, url);\n }\n\n private decorateMatchingLinks(): void {\n // Sem selector: todas as âncoras; filtro real é allowedDomains em decorateHref\n const selector = this.config.selector ?? 'a[href]';\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n return;\n }\n for (const node of nodes) {\n if (!(node instanceof HTMLAnchorElement)) continue;\n if (this.isExcludedAnchor(node)) continue;\n this.decorateAnchor(node);\n }\n }\n\n private isExcludedAnchor(anchor: HTMLAnchorElement): boolean {\n if (anchor.hasAttribute('download')) return true;\n\n for (const sel of this.excludeSelectors) {\n try {\n if (anchor.matches(sel)) return true;\n } catch {\n // selector inválido — ignorar\n }\n }\n\n return false;\n }\n\n private decorateAnchor(anchor: HTMLAnchorElement): void {\n const href = anchor.getAttribute('href');\n if (!href) return;\n const next = this.decorateHref(href);\n if (next != null && next !== href) {\n anchor.setAttribute('href', next);\n }\n }\n}\n\nfunction isLinkDecoratorOptions(\n value: Record<string, string> | LinkDecoratorOptions\n): value is LinkDecoratorOptions {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'config' in value &&\n typeof (value as LinkDecoratorOptions).config === 'object' &&\n (value as LinkDecoratorOptions).config !== null\n );\n}\n\nfunction findAnchor(target: EventTarget | null): HTMLAnchorElement | null {\n if (!(target instanceof Element)) return null;\n return target.closest('a[href]');\n}\n\n/** Conta chaves brutas na query (inclui duplicadas). */\nfunction countQueryKeys(href: string): number {\n const qIndex = href.indexOf('?');\n if (qIndex < 0) return 0;\n const hashIndex = href.indexOf('#', qIndex);\n const raw =\n hashIndex >= 0 ? href.slice(qIndex + 1, hashIndex) : href.slice(qIndex + 1);\n if (!raw) return 0;\n return raw.split('&').filter(Boolean).length;\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { isBrowser, safeDecodeURIComponent } from './utils';\n\nexport type CookieWriteOptions = {\n name: string;\n value: string;\n path?: string;\n domain?: 'auto' | string;\n sameSite?: 'Lax' | 'Strict' | 'None';\n secure?: boolean;\n maxAgeMs?: number;\n};\n\n/**\n * Persistência de managed params — storage + cookie SSR-safe.\n * Não acessa DOM/localStorage em import time.\n */\nexport class UrlContextStore {\n private readonly storage: StorageService | null;\n\n constructor(storage?: StorageService | null) {\n this.storage = storage ?? null;\n }\n\n getStorage(key: string): string | null {\n if (!this.storage) return null;\n try {\n const value = this.storage.get<string>(key);\n return typeof value === 'string' && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n }\n\n setStorage(key: string, value: string): void {\n if (!this.storage) return;\n try {\n this.storage.set(key, value);\n } catch {\n // quota / private mode\n }\n }\n\n getCookie(name: string): string | null {\n if (!isBrowser()) return null;\n try {\n const cookies = document.cookie ? document.cookie.split(';') : [];\n for (const part of cookies) {\n const idx = part.indexOf('=');\n const key = (idx >= 0 ? part.slice(0, idx) : part).trim();\n if (key !== name) continue;\n const raw = idx >= 0 ? part.slice(idx + 1).trim() : '';\n return safeDecodeURIComponent(raw);\n }\n } catch {\n return null;\n }\n return null;\n }\n\n setCookie(options: CookieWriteOptions): void {\n if (!isBrowser()) return;\n\n const parts = [\n `${encodeURIComponent(options.name)}=${encodeURIComponent(options.value)}`,\n ];\n\n parts.push(`path=${options.path ?? '/'}`);\n\n const domain = resolveCookieDomain(options.domain);\n if (domain) {\n parts.push(`domain=${domain}`);\n }\n\n if (\n typeof options.maxAgeMs === 'number' &&\n Number.isFinite(options.maxAgeMs)\n ) {\n parts.push(`max-age=${Math.max(0, Math.floor(options.maxAgeMs / 1000))}`);\n }\n\n const sameSite = options.sameSite ?? 'Lax';\n parts.push(`SameSite=${sameSite}`);\n\n const secure =\n options.secure === true ||\n (typeof location !== 'undefined' && location.protocol === 'https:');\n if (secure) {\n parts.push('Secure');\n }\n\n try {\n document.cookie = parts.join('; ');\n } catch {\n // ignore\n }\n }\n}\n\nfunction resolveCookieDomain(\n domain: 'auto' | string | undefined\n): string | null {\n if (!domain || domain === 'auto') {\n if (!isBrowser()) return null;\n const host = location.hostname;\n // localhost / IPs: não forçar domain\n if (\n host === 'localhost' ||\n host === '127.0.0.1' ||\n /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(host) ||\n !host.includes('.')\n ) {\n return null;\n }\n return host;\n }\n return domain;\n}\n","import type {\n UrlContextConfig,\n UrlForwardParamsConfig,\n UrlLinkDecorationConfig,\n UrlManagedParamConfig,\n UrlQueryParamsConfig,\n} from '@/config/shared/url-context';\n\nimport { DEFAULT_URL_CONTEXT_SID_MAX_AGE_MS } from './constants';\n\nexport const DEFAULT_SID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'public_session',\n param: 'sid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n generator: {\n type: 'public_id',\n prefix: 'sid',\n },\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'sid',\n cookie: {\n enabled: true,\n name: 'sid',\n domain: 'auto',\n path: '/',\n sameSite: 'Lax',\n secure: true,\n maxAgeMs: DEFAULT_URL_CONTEXT_SID_MAX_AGE_MS,\n },\n },\n decorateLinks: true,\n};\n\nexport const DEFAULT_QUERY_PARAMS_WHEN_ENABLED: Required<\n Pick<UrlQueryParamsConfig, 'enabled' | 'mode' | 'mergeDefaultDenylist'>\n> &\n UrlQueryParamsConfig = {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n};\n\nexport const DEFAULT_FORWARD_PARAMS_WHEN_ENABLED: Required<\n Pick<UrlForwardParamsConfig, 'enabled' | 'mode' | 'mergeDefaultDenylist'>\n> &\n UrlForwardParamsConfig = {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n};\n\nexport const DEFAULT_LINK_DECORATION_WHEN_ENABLED: UrlLinkDecorationConfig = {\n enabled: true,\n strategy: 'on_click',\n selector: 'a[href]',\n allowedDomains: '*',\n mergeDefaultExcludedDomains: true,\n mergeDefaultExcludeSelectors: true,\n preserveExisting: true,\n overwriteExisting: false,\n decorateHashLinks: false,\n decorateMailto: false,\n decorateTel: false,\n};\n\n/**\n * Resolve config parcial → efetiva.\n * - `enabled: false` → feature off\n * - `enabled: true` sem nested → aplica defaults úteis (inclui sid)\n * - `managedParams: []` → não cria sid\n */\nexport function resolveUrlContextConfig(\n raw: UrlContextConfig | undefined\n): Required<Pick<UrlContextConfig, 'enabled'>> & {\n queryParams: UrlQueryParamsConfig;\n managedParams: UrlManagedParamConfig[];\n forwardParams: UrlForwardParamsConfig;\n linkDecoration: UrlLinkDecorationConfig;\n} {\n if (!raw || raw.enabled !== true) {\n return {\n enabled: false,\n queryParams: { enabled: false },\n managedParams: [],\n forwardParams: { enabled: false },\n linkDecoration: { enabled: false },\n };\n }\n\n const managedParams =\n raw.managedParams !== undefined\n ? raw.managedParams.map(cloneManagedParam)\n : [cloneManagedParam(DEFAULT_SID_MANAGED_PARAM)];\n\n return {\n enabled: true,\n queryParams: {\n ...DEFAULT_QUERY_PARAMS_WHEN_ENABLED,\n ...raw.queryParams,\n ...(raw.queryParams?.allowlist\n ? { allowlist: [...raw.queryParams.allowlist] }\n : {}),\n ...(raw.queryParams?.denylist\n ? { denylist: [...raw.queryParams.denylist] }\n : {}),\n },\n managedParams,\n forwardParams: {\n ...DEFAULT_FORWARD_PARAMS_WHEN_ENABLED,\n ...raw.forwardParams,\n ...(raw.forwardParams?.allowlist\n ? { allowlist: [...raw.forwardParams.allowlist] }\n : {}),\n ...(raw.forwardParams?.denylist\n ? { denylist: [...raw.forwardParams.denylist] }\n : {}),\n },\n linkDecoration: {\n ...DEFAULT_LINK_DECORATION_WHEN_ENABLED,\n ...raw.linkDecoration,\n ...(raw.linkDecoration?.allowedDomains &&\n raw.linkDecoration.allowedDomains !== '*'\n ? { allowedDomains: [...raw.linkDecoration.allowedDomains] }\n : {}),\n ...(raw.linkDecoration?.excludedDomains\n ? { excludedDomains: [...raw.linkDecoration.excludedDomains] }\n : {}),\n ...(raw.linkDecoration?.excludeSelectors\n ? { excludeSelectors: [...raw.linkDecoration.excludeSelectors] }\n : {}),\n },\n };\n}\n\nfunction cloneManagedParam(\n param: UrlManagedParamConfig\n): UrlManagedParamConfig {\n return {\n ...param,\n ...(param.generator ? { generator: { ...param.generator } } : {}),\n ...(param.persistence\n ? {\n persistence: {\n ...param.persistence,\n ...(param.persistence.cookie\n ? { cookie: { ...param.persistence.cookie } }\n : {}),\n },\n }\n : {}),\n };\n}\n","import type {\n UrlContextConfig,\n UrlContextPayload,\n UrlContextSnapshot,\n UrlContextSource,\n UrlManagedParamConfig,\n} from '@/config/shared/url-context';\nimport type { StorageService } from '@/services/storage/types';\n\nimport { ForwardParamResolver } from './ForwardParamResolver';\nimport { LinkDecorator } from './LinkDecorator';\nimport { ManagedParamResolver } from './ManagedParamResolver';\nimport { QueryParamCollector } from './QueryParamCollector';\nimport { resolveUrlContextConfig } from './resolve-config';\nimport { UrlContextStore } from './UrlContextStore';\nimport { freezeRecord } from './utils';\n/**\n * Orquestra UrlContext: collect → manage → forward → decorate → snapshot.\n * SSR-safe; init/destroy idempotentes.\n */\nexport class UrlContextService {\n private readonly storage: StorageService | null;\n\n private readonly rawConfig: UrlContextConfig | undefined;\n\n private readonly collector = new QueryParamCollector();\n\n private readonly forwardResolver = new ForwardParamResolver();\n\n private store: UrlContextStore | null = null;\n\n private managedResolver: ManagedParamResolver | null = null;\n\n private decorator: LinkDecorator | null = null;\n\n private snapshot: UrlContextSnapshot = emptySnapshot();\n\n private managedConfigs: readonly UrlManagedParamConfig[] = [];\n\n private decorateManaged: Record<string, string> = {};\n\n private initialized = false;\n\n private enabled = false;\n\n constructor(\n config: UrlContextConfig | undefined,\n storage?: StorageService | null\n ) {\n this.rawConfig = config;\n this.storage = storage ?? null;\n }\n\n init(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n const resolved = resolveUrlContextConfig(this.rawConfig);\n this.enabled = resolved.enabled;\n this.managedConfigs = resolved.managedParams;\n\n if (!resolved.enabled) {\n this.snapshot = emptySnapshot();\n return;\n }\n\n this.store = new UrlContextStore(this.storage);\n this.managedResolver = new ManagedParamResolver(this.store);\n\n const queryParams = this.collector.collect(resolved.queryParams);\n const managed = this.managedResolver.resolve(resolved.managedParams);\n\n // Após replaceState, query params podem já incluir sid — re-coleta leve\n const queryAfter =\n Object.keys(managed.values).length > 0\n ? this.collector.collect(resolved.queryParams)\n : queryParams;\n\n const forwarded = this.forwardResolver.resolve({\n queryParams: queryAfter,\n managedValues: managed.values,\n config: resolved.forwardParams,\n });\n\n const source: Record<string, UrlContextSource> = {\n ...managed.sources,\n };\n for (const key of Object.keys(forwarded)) {\n if (!source[key]) {\n source[key] = 'url';\n }\n }\n\n const urlContext: UrlContextPayload = {\n ...(Object.keys(managed.values).length > 0\n ? { managed: freezeRecord(managed.values) }\n : {}),\n ...(Object.keys(forwarded).length > 0\n ? { forwarded: freezeRecord(forwarded) }\n : {}),\n ...(Object.keys(source).length > 0\n ? { source: Object.freeze({ ...source }) }\n : {}),\n };\n this.snapshot = {\n queryParams: freezeRecord(queryAfter),\n urlContext: Object.freeze(urlContext),\n };\n\n const decorateForwarded = freezeRecord(forwarded);\n this.decorateManaged = { ...managed.decorateParams };\n\n const hasSid = resolved.managedParams.some(\n p => p.param === 'sid' && p.decorateLinks !== false\n );\n\n this.decorator = new LinkDecorator({\n forwardedParams: decorateForwarded,\n managedParams: freezeRecord(this.decorateManaged),\n config: resolved.linkDecoration,\n includeSidExclude: hasSid,\n });\n this.decorator.start();\n }\n\n /**\n * Define ou substitui um managed param após o init (ex.: `oid` no checkout).\n * Idempotente para o mesmo valor. Persistência e decoração seguem a config do param.\n *\n * @returns false se UrlContext desabilitado, não inicializado ou param não configurado.\n */\n setManagedParam(param: string, value: string): boolean {\n if (!this.initialized || !this.enabled || !this.managedResolver) {\n return false;\n }\n\n const key = param.trim();\n const trimmed = value.trim();\n if (!key || !trimmed) {\n return false;\n }\n\n const config = this.managedConfigs.find(c => c.param === key);\n if (!config) {\n return false;\n }\n\n const current = this.snapshot.urlContext.managed?.[key];\n if (current === trimmed) {\n return true;\n }\n\n this.managedResolver.applyExternalValue(config, trimmed);\n\n const managed = {\n ...(this.snapshot.urlContext.managed ?? {}),\n [key]: trimmed,\n };\n const source = {\n ...(this.snapshot.urlContext.source ?? {}),\n [key]: 'manual' as const,\n };\n\n // Re-coleta query após possível replaceState\n const resolved = resolveUrlContextConfig(this.rawConfig);\n const queryAfter = this.collector.collect(resolved.queryParams);\n\n this.snapshot = {\n queryParams: freezeRecord(queryAfter),\n urlContext: Object.freeze({\n managed: freezeRecord(managed),\n ...(this.snapshot.urlContext.forwarded\n ? { forwarded: freezeRecord(this.snapshot.urlContext.forwarded) }\n : {}),\n source: Object.freeze({ ...source }),\n }),\n };\n\n if (config.decorateLinks !== false) {\n this.decorateManaged = { ...this.decorateManaged, [key]: trimmed };\n this.decorator?.updateManagedParams(this.decorateManaged);\n // Se decorator ainda não startou (sem params no init), cria agora\n if (!this.decorator && resolved.enabled) {\n const hasSid = this.managedConfigs.some(\n p => p.param === 'sid' && p.decorateLinks !== false\n );\n this.decorator = new LinkDecorator({\n forwardedParams: freezeRecord(\n this.snapshot.urlContext.forwarded ?? {}\n ),\n managedParams: freezeRecord(this.decorateManaged),\n config: resolved.linkDecoration,\n includeSidExclude: hasSid,\n });\n this.decorator.start();\n }\n }\n\n return true;\n }\n\n destroy(): void {\n this.decorator?.destroy();\n this.decorator = null;\n this.managedResolver = null;\n this.store = null;\n this.managedConfigs = [];\n this.decorateManaged = {};\n this.initialized = false;\n this.enabled = false;\n this.snapshot = emptySnapshot();\n }\n\n /** Alias de destroy — cleanup completo sem listeners/refs. */\n dispose(): void {\n this.destroy();\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getSnapshot(): UrlContextSnapshot {\n return {\n queryParams: freezeRecord(this.snapshot.queryParams),\n urlContext: {\n ...(this.snapshot.urlContext.managed\n ? { managed: freezeRecord(this.snapshot.urlContext.managed) }\n : {}),\n ...(this.snapshot.urlContext.forwarded\n ? { forwarded: freezeRecord(this.snapshot.urlContext.forwarded) }\n : {}),\n ...(this.snapshot.urlContext.source\n ? {\n source: Object.freeze({\n ...this.snapshot.urlContext.source,\n }),\n }\n : {}),\n },\n };\n }\n getQueryParams(): Record<string, string> {\n return { ...this.snapshot.queryParams };\n }\n\n getUrlContext(): UrlContextPayload {\n return this.getSnapshot().urlContext;\n }\n}\n\nfunction emptySnapshot(): UrlContextSnapshot {\n return {\n queryParams: freezeRecord({}),\n urlContext: Object.freeze({}),\n };\n}\n","import type {\n UrlContextConfig,\n UrlContextSnapshot,\n} from '@/config/shared/url-context';\nimport type { StorageService } from '@/services/storage/types';\n\nimport { UrlContextService } from './UrlContextService';\n\nexport type PreparedJourneyUrlContext = {\n readonly snapshot: UrlContextSnapshot;\n getManagedParam(param: string): string | null;\n setManagedParam(param: string, value: string): boolean;\n destroy(): void;\n};\n\n/**\n * Prepara UrlContext (sid/afid/oid/fid/fsid) sem inicializar o Pixel completo.\n * Usado pelo bootstrap Bemony Fase A — reutiliza o mesmo UrlContextService oficial.\n */\nexport function prepareJourneyUrlContext(\n config: UrlContextConfig,\n storage?: StorageService | null\n): PreparedJourneyUrlContext {\n const service = new UrlContextService(config, storage ?? null);\n service.init();\n\n return {\n get snapshot() {\n return service.getSnapshot();\n },\n getManagedParam(param: string): string | null {\n const key = param.trim();\n if (!key) return null;\n return service.getSnapshot().urlContext.managed?.[key] ?? null;\n },\n setManagedParam(param: string, value: string): boolean {\n return service.setManagedParam(param, value);\n },\n destroy(): void {\n service.destroy();\n },\n };\n}\n","import type { PixelConfig } from '@/config';\nimport { BaseEventBuilder } from '@/events/builder';\nimport { ConsolePixelLogger, type PixelLogger } from '@/logger';\nimport {\n AttributionServiceImpl,\n DEFAULT_ATTRIBUTION_CONFIG,\n} from '@/services/attribution';\nimport { BrowserMetadataServiceImpl } from '@/services/browser-metadata/BrowserMetadataService';\nimport { DispatcherServiceImpl } from '@/services/dispatcher/DispatcherService';\nimport { FingerprintServiceImpl } from '@/services/fingerprint/FingerprintService';\nimport { createStorageAdapter, StorageServiceImpl } from '@/services/storage';\nimport type { StoragePersistence } from '@/services/storage/StorageFactory';\nimport { CommerceService } from '@/services/commerce';\nimport { SessionServiceImpl } from '@/services/session/SessionService';\nimport type { PixelRuntimeServices } from '@/services/types';\nimport { VisitorServiceImpl } from '@/services/visitor/VisitorService';\nimport { UrlContextService } from '@/modules/core/url-context';\n\nimport { ModuleRegistry } from './ModuleRegistry';\nimport type { PixelRuntimeContext } from './PixelRuntimeContext';\nimport type { ModuleName } from './shared/module';\nimport type { PixelModule } from './types';\n\nexport class PixelRuntime {\n private initialized = false;\n\n private readonly initializedModules: PixelModule[] = [];\n\n private readonly registry: ModuleRegistry;\n\n private readonly config: PixelConfig;\n\n private readonly fallbackLogger: ConsolePixelLogger;\n\n private context: PixelRuntimeContext | null = null;\n\n constructor(config: PixelConfig) {\n this.config = config;\n this.registry = new ModuleRegistry();\n this.fallbackLogger = new ConsolePixelLogger(config.app.debug === true);\n }\n\n register(module: PixelModule): void {\n this.registry.register(module);\n }\n\n async init(): Promise<void> {\n if (this.initialized) {\n this.getLogger().debug('[PixelRuntime] Runtime already initialized');\n return;\n }\n\n this.fallbackLogger.debug('[PixelRuntime] Initializing runtime');\n\n this.context = this.createContext();\n this.context.services.attribution.init();\n\n for (const module of this.registry.getAll()) {\n if (!this.isModuleEnabled(module)) {\n this.fallbackLogger.debug(\n `[PixelRuntime] Skipping disabled module: ${module.name}`\n );\n continue;\n }\n\n this.fallbackLogger.debug(\n `[PixelRuntime] Initializing module: ${module.name}`\n );\n\n try {\n await module.init(this.context);\n this.initializedModules.push(module);\n } catch (error) {\n this.fallbackLogger.error(\n `[Pixel] Failed to initialize module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.initialized = true;\n }\n\n async destroy(): Promise<void> {\n if (!this.initialized) return;\n\n const logger = this.getLogger();\n\n for (let index = this.initializedModules.length - 1; index >= 0; index--) {\n const module = this.initializedModules[index];\n\n logger.debug(`[PixelRuntime] Destroying module: ${module.name}`);\n\n try {\n await module.destroy?.();\n } catch (error) {\n logger.error(\n `[Pixel] Failed to destroy module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.context?.services.attribution.destroy();\n this.context?.services.dispatcher.clear();\n\n this.initialized = false;\n this.initializedModules.length = 0;\n this.context = null;\n\n this.fallbackLogger.debug('[PixelRuntime] Runtime destroyed');\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /** @internal For playground and development only. Not part of the stable public API. */\n getDebugServices(): PixelRuntimeServices | null {\n return this.context?.services ?? null;\n }\n\n /** @internal Read-only diagnostics — names of modules that completed init. */\n getInitializedModuleNames(): readonly string[] {\n return this.initializedModules.map(m => m.name);\n }\n\n /** @internal Registered module names (all registered, regardless of enabled). */\n getRegisteredModuleNames(): readonly string[] {\n return this.registry.getAll().map(m => m.name);\n }\n\n private createServices(logger: PixelLogger): PixelRuntimeServices {\n const { namespace, prefix, persistence } = this.config.storage;\n\n const visitorStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.visitor\n );\n const sessionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.session\n );\n const fingerprintStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution\n );\n const attributionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution ?? 'localStorage'\n );\n const storage = this.createStorageService(namespace, prefix, 'memory');\n const browserMetadata = new BrowserMetadataServiceImpl();\n\n const attribution = new AttributionServiceImpl(\n attributionStorage,\n this.config.attribution ?? DEFAULT_ATTRIBUTION_CONFIG\n );\n\n const urlContextStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution ?? 'localStorage'\n );\n const urlContext = new UrlContextService(\n this.config.modules.core.urlContext,\n urlContextStorage\n );\n\n const eventBuilder = new BaseEventBuilder(\n browserMetadata,\n attribution,\n urlContext\n );\n\n const visitor = new VisitorServiceImpl(visitorStorage, this.config);\n const session = new SessionServiceImpl(sessionStorage, this.config);\n const fingerprint = new FingerprintServiceImpl(\n fingerprintStorage,\n this.config,\n browserMetadata\n );\n const dispatcher = new DispatcherServiceImpl(logger);\n const commerce = new CommerceService(this.config.commerce);\n\n return {\n storage,\n visitor,\n session,\n fingerprint,\n dispatcher,\n browserMetadata,\n eventBuilder,\n attribution,\n commerce,\n urlContext,\n };\n }\n\n private createStorageService(\n namespace: string,\n prefix: string | undefined,\n persistence: StoragePersistence | undefined\n ): StorageServiceImpl {\n return new StorageServiceImpl(\n createStorageAdapter(persistence),\n namespace,\n prefix\n );\n }\n\n private createContext(): PixelRuntimeContext {\n return {\n config: this.config,\n logger: this.fallbackLogger,\n services: this.createServices(this.fallbackLogger),\n };\n }\n\n private getLogger(): PixelLogger {\n return this.context?.logger ?? this.fallbackLogger;\n }\n\n private isModuleEnabled(module: PixelModule): boolean {\n if (module.name === 'diagnostics') return true;\n\n const enabledModules: Record<\n Exclude<ModuleName, 'diagnostics'>,\n boolean\n > = {\n privacy: this.config.modules.privacy.enabled,\n core: this.config.modules.core.enabled,\n behavior: this.config.modules.behavior.enabled,\n conversion: this.config.modules.conversion.enabled,\n transport: this.config.modules.transport.enabled,\n integrations: this.config.modules.integrations.enabled,\n };\n\n return enabledModules[module.name];\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { PixelEvent } from '@/events';\nimport type {\n AddPaymentInfoData,\n AddToCartData,\n InitiateCheckoutData,\n LeadData,\n PurchaseData,\n RemoveFromCartData,\n SearchData,\n ViewContentData,\n} from '@/events/conversion';\nimport type { PixelRuntimeServices } from '@/services/types';\nimport {\n DebugSnapshotService,\n RuntimeDiagnosticsModule,\n type PixelDebugSnapshot,\n} from '@/diagnostics';\nimport {\n BehaviorModule,\n ConversionModule,\n CoreModule,\n IntegrationsModule,\n PrivacyModule,\n TransportModule,\n} from '@/modules';\nimport { PixelRuntime } from '@/runtime';\n\nconst SDK_VERSION = '0.1.0-rc.6';\n\nexport class Pixel {\n private readonly runtime: PixelRuntime;\n\n private readonly config: PixelConfig;\n\n private readonly conversionModule: ConversionModule;\n\n private readonly transportModule: TransportModule;\n\n private readonly integrationsModule: IntegrationsModule;\n\n private readonly behaviorModule: BehaviorModule;\n\n private readonly snapshotService: DebugSnapshotService;\n\n private readonly diagnosticsModule: RuntimeDiagnosticsModule;\n\n constructor(config: PixelConfig) {\n this.config = config;\n this.runtime = new PixelRuntime(config);\n this.conversionModule = new ConversionModule();\n this.transportModule = new TransportModule();\n this.integrationsModule = new IntegrationsModule();\n this.behaviorModule = new BehaviorModule();\n\n this.snapshotService = new DebugSnapshotService({\n getSdkVersion: () => SDK_VERSION,\n getRuntime: () => this.runtime,\n getTransportModule: () => this.transportModule,\n getConversionModule: () => this.conversionModule,\n getIntegrationsModule: () => this.integrationsModule,\n getBehaviorModule: () => this.behaviorModule,\n getConfig: () => this.config,\n getRegisteredModules: () => [\n {\n name: 'privacy',\n configuredEnabled: config.modules.privacy.enabled === true,\n },\n {\n name: 'transport',\n configuredEnabled: config.modules.transport.enabled === true,\n },\n {\n name: 'integrations',\n configuredEnabled: config.modules.integrations.enabled === true,\n },\n {\n name: 'core',\n configuredEnabled: config.modules.core.enabled === true,\n },\n {\n name: 'behavior',\n configuredEnabled: config.modules.behavior.enabled === true,\n },\n {\n name: 'conversion',\n configuredEnabled: config.modules.conversion.enabled === true,\n },\n { name: 'diagnostics', configuredEnabled: true },\n ],\n });\n this.diagnosticsModule = new RuntimeDiagnosticsModule(this.snapshotService);\n\n // Ordem crítica: Transport + Integrations assinam Dispatcher\n // ANTES do Core emitir PAGE_VIEW.\n this.runtime.register(new PrivacyModule());\n this.runtime.register(this.transportModule);\n this.runtime.register(this.integrationsModule);\n this.runtime.register(new CoreModule());\n this.runtime.register(this.behaviorModule);\n this.runtime.register(this.conversionModule);\n this.runtime.register(this.diagnosticsModule);\n }\n\n init(): Promise<void> {\n this.snapshotService.markAlive();\n return this.runtime.init();\n }\n\n destroy(): Promise<void> {\n return this.runtime.destroy().then(() => {\n this.snapshotService.markDestroyed();\n });\n }\n\n isInitialized(): boolean {\n return this.runtime.isInitialized();\n }\n\n /**\n * Snapshot oficial read-only do Runtime (Etapa 16).\n * Seguro antes/depois do init e após destroy. Retorno congelado e sanitizado.\n */\n getDebugSnapshot(): Readonly<PixelDebugSnapshot> {\n return this.snapshotService.getSnapshot();\n }\n\n /**\n * Define ou substitui um managed param do UrlContext após o init\n * (ex.: `oid` quando a Order é criada no checkout).\n * No-op se UrlContext desabilitado ou o param não estiver na config.\n */\n setManagedUrlParam(param: string, value: string): boolean {\n const services = this.runtime.getDebugServices();\n if (!services?.urlContext) {\n return false;\n }\n return services.urlContext.setManagedParam(param, value);\n }\n\n purchase(data?: PurchaseData): void {\n this.conversionModule.purchase(data);\n }\n\n lead(data: LeadData): void {\n this.conversionModule.lead(data);\n }\n\n addToCart(data?: AddToCartData): void {\n this.conversionModule.addToCart(data);\n }\n\n removeFromCart(data?: RemoveFromCartData): void {\n this.conversionModule.removeFromCart(data);\n }\n\n initiateCheckout(data?: InitiateCheckoutData): void {\n this.conversionModule.initiateCheckout(data);\n }\n\n addPaymentInfo(data?: AddPaymentInfoData): void {\n this.conversionModule.addPaymentInfo(data);\n }\n\n viewContent(data?: ViewContentData): void {\n this.conversionModule.viewContent(data);\n }\n\n search(data: SearchData): void {\n this.conversionModule.search(data);\n }\n\n /** @internal For playground and development only. */\n getDebugDedupeKeys(): readonly string[] {\n return this.conversionModule.getDebugDedupeKeys();\n }\n\n /** @internal For playground and development only. */\n getDebugActiveDetectors(): readonly string[] {\n return this.conversionModule.getDebugActiveDetectors();\n }\n\n /** @internal For playground and development only. */\n getDebugTransportState() {\n return this.transportModule.getDebugState();\n }\n\n /** @internal For playground — flush manual do transport. */\n flushTransport(): void {\n this.transportModule.manualFlush?.();\n }\n\n /** @internal For playground — simular offline. */\n simulateTransportOffline(offline: boolean): void {\n this.transportModule.simulateOffline?.(offline);\n }\n\n /** @internal For playground — forçar falhas no MockSender (retry). */\n configureTransportMockSender(options: {\n delayMs?: number;\n failUntilAttempt?: number;\n simulateTimeout?: boolean;\n }): void {\n this.transportModule.configureMockSender?.(options);\n }\n\n /** @internal For playground — simular reload da página. */\n simulateTransportReload(): Promise<void> {\n return this.transportModule.simulateReload();\n }\n\n /** @internal For playground — simular restart do transport. */\n simulateTransportRestart(): Promise<void> {\n return this.transportModule.simulateRestart();\n }\n\n /** @internal For playground — abrir circuit breaker. */\n forceTransportCircuitOpen(): void {\n this.transportModule.forceCircuitOpen();\n }\n\n /** @internal For playground — fechar circuit breaker. */\n forceTransportCircuitClose(): void {\n this.transportModule.forceCircuitClose();\n }\n\n /** @internal For playground — replay manual da fila persistida. */\n manualTransportReplay(): Promise<number> {\n return this.transportModule.manualReplay();\n }\n\n /** @internal For playground — replay dead letter. */\n replayTransportDeadLetter(): PixelEvent[] {\n return this.transportModule.replayDeadLetter();\n }\n\n /** @internal For playground — limpar dead letter. */\n clearTransportDeadLetter(): void {\n this.transportModule.clearDeadLetter();\n }\n\n /** @internal For playground — exportar fila. */\n exportTransportQueue(): string {\n return this.transportModule.exportQueue();\n }\n\n /** @internal For playground — importar fila. */\n importTransportQueue(raw: string): number {\n return this.transportModule.importQueue(raw);\n }\n\n /** @internal For playground — Integration Engine debug state. */\n getDebugIntegrationState() {\n return this.integrationsModule.getDebugState();\n }\n\n /** @internal For playground — MemoryDestination records. */\n getDebugIntegrationMemoryRecords() {\n return this.integrationsModule.getMemoryRecords();\n }\n\n /** @internal For playground — Attribution snapshot. */\n getDebugAttributionSnapshot() {\n return this.runtime.getDebugServices()?.attribution.getSnapshot() ?? null;\n }\n\n /** @internal For playground — recolher attribution. */\n collectAttribution() {\n return this.runtime.getDebugServices()?.attribution.collect() ?? null;\n }\n\n /** @internal For playground — limpar attribution. */\n clearAttribution(): void {\n this.runtime.getDebugServices()?.attribution.clear();\n }\n\n /** @internal For playground and development only. Not part of the stable public API. */\n getDebugServices(): PixelRuntimeServices | null {\n return this.runtime.getDebugServices();\n }\n\n /** @internal For playground — força avaliação de engagement. */\n evaluateEngagement(): void {\n this.behaviorModule.evaluateEngagementNow();\n }\n\n /** @internal For playground — publica sinal interno de comportamento. */\n debugPublishBehaviorSignal(\n type: Parameters<BehaviorModule['debugPublishSignal']>[0],\n data?: Parameters<BehaviorModule['debugPublishSignal']>[1]\n ): void {\n this.behaviorModule.debugPublishSignal(type, data);\n }\n\n /** @internal For playground — flush manual do behavior buffer. */\n flushBehaviorBuffer(): void {\n this.behaviorModule.flushBufferNow();\n }\n\n /** @internal For playground — emite BEHAVIOR_SESSION_SUMMARY manualmente. */\n emitBehaviorSessionSummary(\n reason?: Parameters<BehaviorModule['emitSessionSummaryNow']>[0]\n ): boolean {\n return this.behaviorModule.emitSessionSummaryNow(reason);\n }\n}\n\nexport type { PixelDebugSnapshot };\n","import type { AttributionConfig } from '../types/attribution';\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n","import type { BehaviorModuleConfig } from '../../types/modules/behavior';\n\nexport const DEFAULT_BEHAVIOR_MODULE_CONFIG: BehaviorModuleConfig = {\n enabled: false,\n\n heartbeat: {\n enabled: false,\n intervalMs: 15_000,\n hiddenIntervalMs: 60_000,\n emitWhenHidden: false,\n emitWhenIdle: true,\n includeSnapshot: true,\n fireImmediately: false,\n },\n\n engagement: {\n enabled: false,\n evaluationIntervalMs: 5_000,\n emitOnChange: true,\n minScoreDelta: 5,\n emitSummaryOnDestroy: true,\n\n weights: {\n activeTime: 0.25,\n scroll: 0.2,\n click: 0.15,\n viewport: 0.2,\n visibility: 0.1,\n heartbeat: 0.1,\n },\n\n penalties: {\n idle: 0.2,\n rageClick: 0.1,\n },\n\n thresholds: {\n lowMax: 29,\n mediumMax: 69,\n },\n },\n\n rateLimit: {\n enabled: false,\n windowMs: 1_000,\n maxSignalsPerWindow: 50,\n criticalBypass: true,\n },\n\n buffer: {\n enabled: false,\n maxSize: 200,\n maxAgeMs: 30_000,\n flushSize: 50,\n dropStrategy: 'compress_similar',\n flushOnHidden: true,\n },\n\n stateMachine: {\n enabled: false,\n historyLimit: 50,\n },\n\n sessionSummary: {\n enabled: false,\n emitOnHidden: false,\n emitOnDestroy: true,\n minimumSessionMs: 0,\n },\n\n trackers: {\n scroll: {\n enabled: false,\n thresholds: [25, 50, 75, 100],\n debounceMs: 100,\n },\n\n click: {\n enabled: false,\n rageClick: {\n enabled: true,\n threshold: 3,\n windowMs: 500,\n },\n },\n\n idle: {\n enabled: false,\n thresholdMs: 60_000,\n },\n\n visibility: {\n enabled: false,\n },\n\n exitIntent: {\n enabled: false,\n },\n\n viewport: {\n enabled: false,\n targets: [],\n rootMargin: '0px',\n observeMutations: true,\n mutationDebounceMs: 100,\n maxObservedElements: 500,\n },\n },\n};\n","import type { ConversionModuleConfig } from '../../types/modules/conversion';\n\nconst EMPTY_DETECTOR = { enabled: false, sources: [] as const };\n\nexport const DEFAULT_CONVERSION_MODULE_CONFIG: ConversionModuleConfig = {\n enabled: false,\n\n manual: {\n pageView: {\n enabled: false,\n },\n purchase: {\n enabled: false,\n },\n lead: {\n enabled: false,\n },\n addToCart: {\n enabled: false,\n },\n removeFromCart: {\n enabled: false,\n },\n initiateCheckout: {\n enabled: false,\n },\n addPaymentInfo: {\n enabled: false,\n },\n search: {\n enabled: false,\n },\n viewContent: {\n enabled: false,\n },\n },\n\n auto: {\n enabled: false,\n\n detectors: {\n lead: { ...EMPTY_DETECTOR, sources: [] },\n addToCart: { ...EMPTY_DETECTOR, sources: [] },\n removeFromCart: { ...EMPTY_DETECTOR, sources: [] },\n initiateCheckout: { ...EMPTY_DETECTOR, sources: [] },\n purchase: { ...EMPTY_DETECTOR, sources: [] },\n addPaymentInfo: { ...EMPTY_DETECTOR, sources: [] },\n search: { ...EMPTY_DETECTOR, sources: [] },\n viewContent: { ...EMPTY_DETECTOR, sources: [] },\n },\n },\n\n rules: {\n enabled: false,\n selectors: ['[data-track]'],\n texts: ['Comprar', 'Comprar Agora', 'Finalizar Compra', 'Checkout'],\n urlPatterns: ['thank-you', 'purchase', 'success', 'order', 'checkout'],\n checkout: {\n enabled: false,\n },\n card: {\n enabled: false,\n },\n },\n};\n","import type { CoreModuleConfig } from '../../types/modules/core';\n\nexport const DEFAULT_CORE_MODULE_CONFIG: CoreModuleConfig = {\n enabled: true,\n\n pageView: {\n enabled: true,\n trackInitialPageView: true,\n spa: true,\n dedupeMs: 2000,\n },\n\n visitor: {\n enabled: true,\n persistence: 'cookie_localStorage',\n renew: false,\n },\n\n session: {\n enabled: true,\n ttlMs: 10800000,\n renewOnActivity: true,\n renewOnPageView: true,\n },\n\n fingerprint: {\n enabled: true,\n mode: 'light',\n cache: true,\n },\n\n consent: {\n enabled: false,\n required: false,\n waitForConsent: false,\n },\n\n dedupe: {\n enabled: true,\n windowMs: 2000,\n },\n\n coordination: {\n enabled: true,\n leaderElection: true,\n broadcastChannel: true,\n },\n\n ordering: {\n enabled: true,\n preserveOrder: true,\n },\n\n urlContext: {\n enabled: false,\n },\n};\n","import type { IntegrationsModuleConfig } from '../../types/modules/integrations';\n\nexport const DEFAULT_INTEGRATIONS_MODULE_CONFIG: IntegrationsModuleConfig = {\n enabled: false,\n debug: false,\n concurrency: 3,\n timeoutMs: 5000,\n continueOnError: true,\n\n destinations: {\n console: { enabled: false },\n memory: { enabled: false },\n mock: { enabled: false },\n meta: {\n enabled: false,\n pixelIds: [],\n autoPageView: true,\n loadScript: true,\n },\n google: {\n enabled: false,\n tagIds: [],\n autoPageView: true,\n loadScript: true,\n },\n tiktok: {\n enabled: false,\n pixelIds: [],\n autoPageView: true,\n loadScript: true,\n },\n },\n};\n","import type { PrivacyModuleConfig } from '../../types/modules/privacy';\n\nexport const DEFAULT_PRIVACY_MODULE_CONFIG: PrivacyModuleConfig = {\n enabled: false,\n\n consent: {\n enabled: false,\n required: false,\n },\n\n pii: {\n enabled: false,\n hashEmail: true,\n hashPhone: true,\n },\n\n anonymization: {\n enabled: false,\n anonymizeIp: true,\n },\n};\n","import type { TransportModuleConfig } from '../../types/modules/transport';\n\nexport const DEFAULT_TRANSPORT_MODULE_CONFIG: TransportModuleConfig = {\n enabled: false,\n\n mockSender: {\n enabled: true,\n },\n\n sender: {\n mode: 'mock',\n },\n\n persistence: {\n enabled: true,\n },\n\n replay: {\n enabled: true,\n },\n\n ordering: {\n enabled: true,\n },\n\n coordination: {\n enabled: true,\n },\n\n circuitBreaker: {\n enabled: true,\n failureThreshold: 5,\n resetTimeoutMs: 30_000,\n halfOpenMaxAttempts: 2,\n },\n\n backpressure: {\n enabled: true,\n maxQueueSize: 500,\n policy: 'drop_oldest',\n sampleRate: 0.5,\n },\n\n deadLetter: {\n enabled: true,\n maxEntries: 200,\n },\n\n compression: {\n enabled: true,\n strategy: 'identity',\n },\n\n retry: {\n enabled: true,\n maxAttempts: 4,\n baseDelayMs: 500,\n maxDelayMs: 4000,\n multiplier: 2,\n },\n\n batch: {\n enabled: true,\n batchSize: 10,\n flushIntervalMs: 2000,\n maxWaitMs: 5000,\n },\n\n timeout: {\n enabled: true,\n timeoutMs: 10000,\n },\n\n offline: {\n enabled: true,\n },\n\n flush: {\n enabled: true,\n flushIntervalMs: 2000,\n flushOnDestroy: true,\n prepareUnloadHooks: true,\n },\n};\n","import type { PixelConfig } from '../types/pixel';\nimport { DEFAULT_ATTRIBUTION_CONFIG } from './attribution';\nimport { DEFAULT_BEHAVIOR_MODULE_CONFIG } from './modules/behavior';\nimport { DEFAULT_CONVERSION_MODULE_CONFIG } from './modules/conversion';\nimport { DEFAULT_CORE_MODULE_CONFIG } from './modules/core';\nimport { DEFAULT_INTEGRATIONS_MODULE_CONFIG } from './modules/integrations';\nimport { DEFAULT_PRIVACY_MODULE_CONFIG } from './modules/privacy';\nimport { DEFAULT_TRANSPORT_MODULE_CONFIG } from './modules/transport';\nimport { DEFAULT_COMMERCE_CONFIG } from '../shared/commerce';\n\nexport const DEFAULT_PIXEL_CONFIG: PixelConfig = {\n app: {\n source: 'custom',\n target: 'custom',\n environment: 'production',\n debug: false,\n },\n\n identity: {\n pixelId: '',\n },\n\n transport: {\n apiEndpoint: '',\n timeoutMs: 10000,\n },\n\n storage: {\n prefix: '__gmk',\n namespace: 'pixel',\n\n queue: {\n enabled: true,\n persistence: 'memory',\n index: true,\n },\n },\n\n attribution: { ...DEFAULT_ATTRIBUTION_CONFIG },\n\n commerce: {\n ...DEFAULT_COMMERCE_CONFIG,\n catalog: { products: [] },\n cart: {\n mode: 'custom',\n initialItems: [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: { attributes: {}, fields: {} },\n enrichment: { ...DEFAULT_COMMERCE_CONFIG.enrichment },\n },\n\n modules: {\n core: DEFAULT_CORE_MODULE_CONFIG,\n behavior: DEFAULT_BEHAVIOR_MODULE_CONFIG,\n conversion: DEFAULT_CONVERSION_MODULE_CONFIG,\n transport: DEFAULT_TRANSPORT_MODULE_CONFIG,\n integrations: DEFAULT_INTEGRATIONS_MODULE_CONFIG,\n privacy: DEFAULT_PRIVACY_MODULE_CONFIG,\n },\n};\n","import type { PixelEvent } from '@/events';\nimport type { PixelLogger } from '@/logger/PixelLogger';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nconst MAX_ERROR_MESSAGE_LENGTH = 200;\n\n/**\n * Hardening 18.1 — falha de um listener não interrompe os demais nem propaga\n * para o produtor (trackers/engines). Log sanitizado, sem payload/PII.\n */\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n private readonly logger: Pick<PixelLogger, 'warn'> | undefined;\n\n constructor(logger?: Pick<PixelLogger, 'warn'>) {\n this.logger = logger;\n }\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n // Snapshot: permite unsubscribe durante dispatch sem pular listeners.\n const snapshot = [...this.listeners];\n\n for (let index = 0; index < snapshot.length; index += 1) {\n const listener = snapshot[index];\n if (!listener) continue;\n\n try {\n listener(event);\n } catch (error) {\n this.logger?.warn(sanitizeDispatcherError(error, event.type, index));\n }\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n\nexport function sanitizeDispatcherError(\n error: unknown,\n eventType: string,\n listenerIndex: number\n): Record<string, unknown> {\n const name =\n error instanceof Error\n ? error.name\n : typeof error === 'object' && error !== null && 'name' in error\n ? String((error as { name: unknown }).name)\n : 'Error';\n\n let message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'unknown';\n\n message = message\n .replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, '[redacted]')\n .replace(/\\+?\\d[\\d\\s().-]{7,}\\d/g, '[redacted]');\n\n if (message.length > MAX_ERROR_MESSAGE_LENGTH) {\n message = `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}…`;\n }\n\n return {\n code: 'DISPATCHER_LISTENER_FAILED',\n eventType,\n listenerIndex,\n errorName: name,\n message,\n timestamp: Date.now(),\n };\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash =\n (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(customParams: readonly string[] = []): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(\n this.storageKey\n );\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(\n storage: StorageService,\n config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG\n ) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n","import type { CommerceProduct } from '@/config/shared/commerce';\n\nexport type ProductCatalogOptions = {\n readonly defaultCurrency?: string;\n};\n\nexport type ProductCatalogSnapshot = {\n readonly products: CommerceProduct[];\n readonly count: number;\n};\n\n/**\n * Catálogo de produtos configurados em `config.commerce.catalog`.\n * Isolado por instância — sem estado global / module-level.\n * Não acessa DOM, Transport nem altera payloads de eventos.\n */\nexport class ProductCatalog {\n private readonly productsById = new Map<string, CommerceProduct>();\n\n private readonly productsBySku = new Map<string, CommerceProduct>();\n\n private readonly orderedIds: string[] = [];\n\n constructor(\n products: readonly CommerceProduct[] | undefined = [],\n options: ProductCatalogOptions = {}\n ) {\n this.indexProducts(products ?? [], options.defaultCurrency);\n }\n\n list(): CommerceProduct[] {\n return this.orderedIds.map(id =>\n this.cloneProduct(this.productsById.get(id)!)\n );\n }\n\n getById(id: string): CommerceProduct | null {\n if (!id) return null;\n const product = this.productsById.get(id);\n return product ? this.cloneProduct(product) : null;\n }\n\n getBySku(sku: string): CommerceProduct | null {\n if (!sku) return null;\n const product = this.productsBySku.get(sku);\n return product ? this.cloneProduct(product) : null;\n }\n\n hasProduct(id: string): boolean {\n return Boolean(id) && this.productsById.has(id);\n }\n\n getSnapshot(): ProductCatalogSnapshot {\n const products = this.list();\n return { products, count: products.length };\n }\n\n private indexProducts(\n products: readonly CommerceProduct[],\n defaultCurrency?: string\n ): void {\n for (const raw of products) {\n if (!raw || typeof raw !== 'object') continue;\n\n const id = typeof raw.id === 'string' ? raw.id.trim() : '';\n if (!id) continue;\n\n // Duplicado por id: mantém o primeiro (determinístico).\n if (this.productsById.has(id)) continue;\n\n const product = this.normalizeProduct(raw, id, defaultCurrency);\n this.productsById.set(id, product);\n this.orderedIds.push(id);\n\n const sku = typeof product.sku === 'string' ? product.sku.trim() : '';\n if (sku && !this.productsBySku.has(sku)) {\n this.productsBySku.set(sku, product);\n }\n }\n }\n\n private normalizeProduct(\n raw: CommerceProduct,\n id: string,\n defaultCurrency?: string\n ): CommerceProduct {\n const sku =\n typeof raw.sku === 'string' && raw.sku.trim()\n ? raw.sku.trim()\n : undefined;\n\n const currency =\n typeof raw.currency === 'string' && raw.currency.trim()\n ? raw.currency.trim()\n : defaultCurrency;\n\n const quantity =\n typeof raw.quantity === 'number' && Number.isFinite(raw.quantity)\n ? raw.quantity\n : undefined;\n\n return {\n ...raw,\n id,\n ...(sku !== undefined ? { sku } : {}),\n ...(currency !== undefined ? { currency } : {}),\n ...(quantity !== undefined ? { quantity } : {}),\n ...(raw.metadata ? { metadata: { ...raw.metadata } } : {}),\n };\n }\n\n private cloneProduct(product: CommerceProduct): CommerceProduct {\n return {\n ...product,\n ...(product.metadata ? { metadata: { ...product.metadata } } : {}),\n };\n }\n}\n","import type { CommerceCartItem } from '@/config/shared/commerce';\n\nexport type CommerceStateOptions = {\n /**\n * Quando `false`, `upsertItem` só atualiza itens já presentes\n * (não adiciona novos productIds). Default: `true`.\n */\n readonly allowDynamicItems?: boolean;\n};\n\nexport type CommerceStateSnapshot = {\n /**\n * Estado vivo do carrinho (runtime).\n * Não confundir com `commerce.cart.initialItems` da config.\n */\n readonly selectedItems: CommerceCartItem[];\n readonly count: number;\n};\n\n/**\n * Estado em memória do cart da instância.\n * Inicializado com `config.commerce.cart.initialItems`.\n * Não persiste, não acessa DOM/Transport e não dispara eventos.\n */\nexport class CommerceState {\n private readonly itemsByProductId = new Map<string, CommerceCartItem>();\n\n private readonly allowDynamicItems: boolean;\n\n constructor(\n initialItems: readonly CommerceCartItem[] | undefined = [],\n options: CommerceStateOptions = {}\n ) {\n this.allowDynamicItems = options.allowDynamicItems !== false;\n this.seed(initialItems ?? []);\n }\n\n getSelectedItems(): CommerceCartItem[] {\n return Array.from(this.itemsByProductId.values()).map(item =>\n this.cloneItem(item)\n );\n }\n\n hasItem(productId: string): boolean {\n return Boolean(productId) && this.itemsByProductId.has(productId);\n }\n\n getItem(productId: string): CommerceCartItem | null {\n if (!productId) return null;\n const item = this.itemsByProductId.get(productId);\n return item ? this.cloneItem(item) : null;\n }\n\n /**\n * Insere ou atualiza item.\n * - Sem `productId` → no-op\n * - `selected === false` → remove se existir / não adiciona\n * - `quantity <= 0` → remove\n * - `allowDynamicItems === false` e item novo → no-op\n */\n upsertItem(item: CommerceCartItem): void {\n if (!item || typeof item !== 'object') return;\n\n const productId =\n typeof item.productId === 'string' ? item.productId.trim() : '';\n if (!productId) return;\n\n if (item.selected === false) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const quantity = this.normalizeQuantity(item.quantity);\n if (quantity <= 0) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const exists = this.itemsByProductId.has(productId);\n if (!exists && !this.allowDynamicItems) return;\n\n const previous = this.itemsByProductId.get(productId);\n const metadata = item.metadata\n ? { ...item.metadata }\n : previous?.metadata\n ? { ...previous.metadata }\n : undefined;\n\n const next: CommerceCartItem = {\n ...previous,\n ...item,\n productId,\n quantity,\n selected: true,\n ...(metadata ? { metadata } : {}),\n };\n\n this.itemsByProductId.set(productId, next);\n }\n\n removeItem(productId: string): void {\n if (!productId) return;\n this.itemsByProductId.delete(productId);\n }\n\n /**\n * Atualiza quantidade. `quantity <= 0` remove o item.\n */\n updateQuantity(productId: string, quantity: number): void {\n if (!productId || !this.itemsByProductId.has(productId)) return;\n\n const normalized = this.normalizeQuantity(quantity);\n if (normalized <= 0) {\n this.itemsByProductId.delete(productId);\n return;\n }\n\n const current = this.itemsByProductId.get(productId)!;\n this.itemsByProductId.set(productId, {\n ...current,\n quantity: normalized,\n });\n }\n\n clear(): void {\n this.itemsByProductId.clear();\n }\n\n getSnapshot(): CommerceStateSnapshot {\n const selectedItems = this.getSelectedItems();\n return { selectedItems, count: selectedItems.length };\n }\n\n private seed(initialItems: readonly CommerceCartItem[]): void {\n for (const item of initialItems) {\n // Seed ignora allowDynamicItems — itens da config sempre entram\n // (exceto selected:false / inválidos / quantity<=0).\n this.seedItem(item);\n }\n }\n\n private seedItem(item: CommerceCartItem): void {\n if (!item || typeof item !== 'object') return;\n\n const productId =\n typeof item.productId === 'string' ? item.productId.trim() : '';\n if (!productId) return;\n if (item.selected === false) return;\n\n const quantity = this.normalizeQuantity(item.quantity);\n if (quantity <= 0) return;\n\n // Duplicado por productId no seed: mantém o primeiro.\n if (this.itemsByProductId.has(productId)) return;\n\n this.itemsByProductId.set(productId, {\n ...item,\n productId,\n quantity,\n selected: true,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n });\n }\n\n private normalizeQuantity(quantity: number | undefined): number {\n if (quantity === undefined || quantity === null) return 1;\n if (typeof quantity !== 'number' || !Number.isFinite(quantity)) return 1;\n return quantity;\n }\n\n private cloneItem(item: CommerceCartItem): CommerceCartItem {\n return {\n ...item,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n };\n }\n}\n","/**\n * Calcula value/currency a partir de items resolvidos.\n * Não conhece DOM, detectors, Transport nem Dispatcher.\n * Não muta o input.\n */\n\nexport type ResolvedCommerceItem = {\n productId?: string;\n sku?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n brand?: string;\n type?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type OrderCalculationInput = {\n items?: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n defaultCurrency?: string;\n};\n\nexport type OrderCalculationResult = {\n items: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n};\n\nexport class OrderCalculator {\n calculate(input: OrderCalculationInput): OrderCalculationResult {\n const sourceItems = Array.isArray(input.items) ? input.items : [];\n const items = sourceItems.map(item => this.cloneItem(item));\n\n for (const item of items) {\n if (item.quantity == null || !Number.isFinite(item.quantity)) {\n item.quantity = 1;\n }\n }\n\n const value =\n typeof input.value === 'number' && Number.isFinite(input.value)\n ? input.value\n : this.sumValue(items);\n\n const currency = this.resolveCurrency(input, items);\n\n return {\n items,\n ...(value !== undefined ? { value } : {}),\n ...(currency !== undefined ? { currency } : {}),\n };\n }\n\n private sumValue(items: ResolvedCommerceItem[]): number | undefined {\n let total = 0;\n let hasPriced = false;\n\n for (const item of items) {\n if (typeof item.price !== 'number' || !Number.isFinite(item.price)) {\n continue;\n }\n const qty =\n typeof item.quantity === 'number' && Number.isFinite(item.quantity)\n ? item.quantity\n : 1;\n total += item.price * qty;\n hasPriced = true;\n }\n\n return hasPriced ? total : undefined;\n }\n\n /**\n * Ordem: currency manual → primeiro item com currency → defaultCurrency.\n * Multi-currency: determinístico — usa o primeiro item com currency\n * (não normaliza conversão entre moedas nesta etapa).\n */\n private resolveCurrency(\n input: OrderCalculationInput,\n items: ResolvedCommerceItem[]\n ): string | undefined {\n if (typeof input.currency === 'string' && input.currency.trim()) {\n return input.currency.trim();\n }\n\n for (const item of items) {\n if (typeof item.currency === 'string' && item.currency.trim()) {\n return item.currency.trim();\n }\n }\n\n if (\n typeof input.defaultCurrency === 'string' &&\n input.defaultCurrency.trim()\n ) {\n return input.defaultCurrency.trim();\n }\n\n return undefined;\n }\n\n private cloneItem(item: ResolvedCommerceItem): ResolvedCommerceItem {\n return {\n ...item,\n ...(item.metadata ? { metadata: { ...item.metadata } } : {}),\n };\n }\n}\n","/**\n * Contratos globais de commerce (root `PixelConfig.commerce`).\n * Não pertencem a conversion — representam o contexto comercial da página/fluxo.\n */\n\nexport type ProductType =\n | 'main'\n | 'order_bump'\n | 'upsell'\n | 'downsell'\n | 'cross_sell'\n | 'addon'\n | 'subscription'\n | 'custom'\n | 'other';\n\nexport type CommerceProduct = {\n id: string;\n name?: string;\n sku?: string;\n type?: ProductType;\n price?: number;\n currency?: string;\n quantity?: number;\n category?: string;\n variant?: string;\n brand?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceCartItem = {\n productId: string;\n quantity?: number;\n price?: number;\n currency?: string;\n selected?: boolean;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceCartMode =\n | 'landing_page'\n | 'single_product'\n | 'multi_product'\n | 'checkout'\n | 'upsell'\n | 'custom'\n | 'cart'\n | 'funnel';\n\nexport type CommerceCalculateValueFrom =\n | 'cart'\n | 'event'\n | 'manual'\n | 'catalog';\n\nexport type CommerceEnrichmentSource =\n | 'cart'\n | 'event'\n | 'event_or_cart'\n | 'catalog';\n\nexport type CommerceEventEnrichmentConfig = {\n enabled: boolean;\n source?: CommerceEnrichmentSource;\n};\n\nexport type CommerceEnrichmentConfig = {\n pageView?: CommerceEventEnrichmentConfig;\n viewContent?: CommerceEventEnrichmentConfig;\n lead?: CommerceEventEnrichmentConfig;\n addToCart?: CommerceEventEnrichmentConfig;\n removeFromCart?: CommerceEventEnrichmentConfig;\n initiateCheckout?: CommerceEventEnrichmentConfig;\n addPaymentInfo?: CommerceEventEnrichmentConfig;\n purchase?: CommerceEventEnrichmentConfig;\n};\n\nexport type ProductCatalogConfig = {\n products?: CommerceProduct[];\n};\n\nexport type CommerceCartConfig = {\n mode?: CommerceCartMode;\n /** Seed inicial do carrinho — não é estado vivo. */\n initialItems?: CommerceCartItem[];\n allowDynamicItems?: boolean;\n calculateValueFrom?: CommerceCalculateValueFrom;\n metadata?: Record<string, unknown>;\n};\n\nexport type CommerceMappingsConfig = {\n attributes?: Record<string, string[]>;\n fields?: Record<string, string[]>;\n};\n\nexport type CommerceConfig = {\n enabled?: boolean;\n currency?: string;\n catalog?: ProductCatalogConfig;\n cart?: CommerceCartConfig;\n mappings?: CommerceMappingsConfig;\n enrichment?: CommerceEnrichmentConfig;\n};\n\nexport const DEFAULT_COMMERCE_ENRICHMENT: Required<CommerceEnrichmentConfig> = {\n pageView: { enabled: false, source: 'cart' },\n viewContent: { enabled: true, source: 'event_or_cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n removeFromCart: { enabled: true, source: 'event_or_cart' },\n initiateCheckout: { enabled: true, source: 'cart' },\n addPaymentInfo: { enabled: true, source: 'cart' },\n purchase: { enabled: true, source: 'cart' },\n};\n\n/** Default seguro: commerce off, sem produtos, sem itens. */\nexport const DEFAULT_COMMERCE_CONFIG: CommerceConfig = {\n enabled: false,\n currency: 'BRL',\n catalog: {\n products: [],\n },\n cart: {\n mode: 'custom',\n initialItems: [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: {},\n fields: {},\n },\n enrichment: { ...DEFAULT_COMMERCE_ENRICHMENT },\n};\n\n/** Normaliza calculateValueFrom (inclui aliases legado em runtime). */\nexport function normalizeCalculateValueFrom(\n value: CommerceCalculateValueFrom | string | undefined\n): 'cart' | 'event' | 'manual' | 'catalog' {\n switch (value) {\n case 'event':\n case 'event_items':\n return 'event';\n case 'manual':\n return 'manual';\n case 'catalog':\n return 'catalog';\n case 'cart':\n case 'selected_items':\n default:\n return 'cart';\n }\n}\n","import type { CommerceCalculateValueFrom } from '@/config/shared/commerce';\nimport { normalizeCalculateValueFrom } from '@/config/shared/commerce';\nimport type { PixelItem } from '@/events/conversion';\n\nimport type { CommerceState } from './CommerceState';\nimport type { ProductCatalog } from './ProductCatalog';\nimport type { OrderCalculator, ResolvedCommerceItem } from './OrderCalculator';\n\nexport type CommerceEventType =\n | 'ADD_TO_CART'\n | 'REMOVE_FROM_CART'\n | 'INITIATE_CHECKOUT'\n | 'PURCHASE'\n | 'VIEW_CONTENT'\n | 'ADD_PAYMENT_INFO';\n\nexport type ExtractedProductInput = {\n productId?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n sku?: string;\n};\n\nexport type CommerceResolverInput = {\n eventType: CommerceEventType;\n payload?: Record<string, unknown>;\n extractedProduct?: ExtractedProductInput;\n enrichmentSource?: import('@/config/shared/commerce').CommerceEnrichmentSource;\n items?: Array<{\n productId?: string;\n id?: string;\n sku?: string;\n name?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n }>;\n};\n\nexport type CommerceResolverResult = {\n data: Record<string, unknown>;\n items?: ResolvedCommerceItem[];\n value?: number;\n currency?: string;\n};\n\nexport type CommerceResolverOptions = {\n catalog: ProductCatalog;\n state: CommerceState;\n calculator: OrderCalculator;\n defaultCurrency?: string;\n calculateValueFrom?: CommerceCalculateValueFrom;\n};\n\n/**\n * Combina payload + extracted + state + catalog + defaults.\n * Não dispara eventos, não escreve em CommerceState, não conhece DOM/Transport.\n *\n * Prioridade de merge por campo:\n * manual payload > extractedProduct > commerce state > catalog > defaults\n */\nexport class CommerceResolver {\n private readonly catalog: ProductCatalog;\n\n private readonly state: CommerceState;\n\n private readonly calculator: OrderCalculator;\n\n private readonly defaultCurrency?: string;\n\n private readonly calculateValueFrom: ReturnType<\n typeof normalizeCalculateValueFrom\n >;\n\n constructor(options: CommerceResolverOptions) {\n this.catalog = options.catalog;\n this.state = options.state;\n this.calculator = options.calculator;\n this.defaultCurrency = trim(options.defaultCurrency);\n this.calculateValueFrom = normalizeCalculateValueFrom(\n options.calculateValueFrom\n );\n }\n\n resolve(input: CommerceResolverInput): CommerceResolverResult {\n const source = input.enrichmentSource;\n\n // source: 'event' — não completa via cart/catalog\n if (source === 'event') {\n return { data: { ...(input.payload ?? {}) } };\n }\n\n switch (input.eventType) {\n case 'ADD_TO_CART':\n return this.resolveAddToCart(input);\n case 'REMOVE_FROM_CART':\n return this.resolveRemoveFromCart(input);\n case 'INITIATE_CHECKOUT':\n return this.resolveCheckoutLike(input, false);\n case 'PURCHASE':\n return this.resolveCheckoutLike(input, true);\n case 'VIEW_CONTENT':\n return this.resolveViewContent(input);\n case 'ADD_PAYMENT_INFO':\n return this.resolveCheckoutLike(input, false);\n default:\n return { data: { ...(input.payload ?? {}) } };\n }\n }\n\n private resolveAddToCart(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = input.payload ?? {};\n const extracted = input.extractedProduct ?? {};\n const source = input.enrichmentSource ?? 'event_or_cart';\n const useCart = source === 'cart' || source === 'event_or_cart';\n const useCatalog =\n source === 'catalog' || source === 'cart' || source === 'event_or_cart';\n\n let productId =\n asString(payload.priceId) ??\n asString(payload.productId) ??\n asString(extracted.productId) ??\n (useCatalog\n ? this.lookupIdBySku(asString(payload.sku) ?? asString(extracted.sku))\n : undefined);\n\n // Fallback: sem productId/sku no evento → item principal do cart\n const cartFallback =\n !productId && useCart ? this.resolvePrimaryCartItem() : null;\n if (!productId && cartFallback) {\n productId = cartFallback.productId;\n }\n\n const catalogProduct =\n useCatalog && productId\n ? this.catalog.getById(productId)\n : useCatalog\n ? this.lookupProductBySku(\n asString(payload.sku) ?? asString(extracted.sku)\n )\n : null;\n\n const resolvedId = productId ?? catalogProduct?.id;\n const stateItem =\n useCart && resolvedId\n ? (this.state.getItem(resolvedId) ?? cartFallback)\n : null;\n\n // source: 'catalog' sem productId/sku → não injeta cart\n if (source === 'catalog' && !resolvedId && !catalogProduct) {\n return { data: { ...payload } };\n }\n\n const productName =\n asString(payload.productName) ??\n asString(extracted.productName) ??\n catalogProduct?.name;\n\n const price =\n asNumber(payload.price) ??\n asNumber(extracted.price) ??\n (useCart ? asNumber(stateItem?.price) : undefined) ??\n catalogProduct?.price;\n\n const quantity =\n asNumber(payload.quantity) ??\n asNumber(extracted.quantity) ??\n (useCart ? asNumber(stateItem?.quantity) : undefined) ??\n catalogProduct?.quantity ??\n 1;\n\n const currency =\n asString(payload.currency) ??\n asString(extracted.currency) ??\n (useCart ? asString(stateItem?.currency) : undefined) ??\n catalogProduct?.currency ??\n this.defaultCurrency;\n\n const identity = resolveCatalogItemIdentity(catalogProduct, {\n priceId: asString(payload.priceId),\n productId: resolvedId,\n offerId: asString(payload.offerId),\n id: asString(payload.id),\n });\n\n const data: Record<string, unknown> = {};\n if (identity.id) data.id = identity.id;\n if (identity.priceId) data.priceId = identity.priceId;\n if (identity.productId) data.productId = identity.productId;\n if (identity.offerId) data.offerId = identity.offerId;\n if (productName) data.productName = productName;\n if (price !== undefined) data.price = price;\n if (currency) data.currency = currency;\n if (quantity !== undefined) data.quantity = quantity;\n\n // Preserva campos extras do payload (sem sobrescrever resolvidos).\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) continue;\n if (!(key in data)) data[key] = value;\n }\n\n return { data };\n }\n\n /**\n * Escolhe o item principal do cart runtime:\n * 1. único item → esse\n * 2. múltiplos → preferir catalog.type === 'main'\n * 3. senão → primeiro do cart\n * 4. cart vazio → null\n */\n private resolvePrimaryCartItem(): {\n productId: string;\n quantity?: number;\n price?: number;\n currency?: string;\n } | null {\n const items = this.state.getSelectedItems();\n if (items.length === 0) return null;\n if (items.length === 1) return items[0] ?? null;\n\n const main = items.find(item => {\n const product = this.catalog.getById(item.productId);\n return product?.type === 'main';\n });\n return main ?? items[0] ?? null;\n }\n\n private resolveRemoveFromCart(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = input.payload ?? {};\n const extracted = input.extractedProduct ?? {};\n\n const productId =\n asString(payload.productId) ??\n asString(extracted.productId) ??\n this.lookupIdBySku(asString(payload.sku) ?? asString(extracted.sku));\n\n const catalogProduct = productId ? this.catalog.getById(productId) : null;\n\n const resolvedId = productId ?? catalogProduct?.id;\n const stateItem = resolvedId ? this.state.getItem(resolvedId) : null;\n\n const quantity =\n asNumber(payload.quantity) ??\n asNumber(extracted.quantity) ??\n asNumber(stateItem?.quantity) ??\n 1;\n\n const data: Record<string, unknown> = {};\n if (resolvedId) data.productId = resolvedId;\n if (quantity !== undefined) data.quantity = quantity;\n\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined) continue;\n if (!(key in data)) data[key] = value;\n }\n\n return { data };\n }\n\n private resolveCheckoutLike(\n input: CommerceResolverInput,\n isPurchase: boolean\n ): CommerceResolverResult {\n const payload = { ...(input.payload ?? {}) };\n const manualValue = asNumber(payload.value);\n const manualCurrency = asString(payload.currency);\n const manualItems = this.readPayloadItems(input);\n const source = input.enrichmentSource;\n\n const resolvedItems = this.resolveItemsSource(manualItems, source);\n const pixelItems = resolvedItems.map(item => this.toPixelItem(item));\n\n const allowCalculatedValue =\n source !== 'catalog' && this.calculateValueFrom !== 'manual';\n\n const shouldCalculateValue =\n manualValue === undefined && allowCalculatedValue;\n\n const calc = this.calculator.calculate({\n items: resolvedItems,\n value: shouldCalculateValue ? undefined : manualValue,\n currency: manualCurrency,\n defaultCurrency: this.defaultCurrency,\n });\n\n const value =\n manualValue !== undefined\n ? manualValue\n : allowCalculatedValue\n ? calc.value\n : undefined;\n\n const currency = manualCurrency ?? calc.currency ?? this.defaultCurrency;\n\n const data: Record<string, unknown> = { ...payload };\n\n if (pixelItems.length > 0) {\n data.items = pixelItems;\n } else if (manualItems === null) {\n delete data.items;\n }\n\n if (value !== undefined) {\n data.value = value;\n } else {\n delete data.value;\n }\n\n if (currency) {\n data.currency = currency;\n }\n\n if (isPurchase) {\n // orderId e demais campos do payload já estão em data via spread.\n }\n\n return {\n data,\n items: calc.items,\n ...(value !== undefined ? { value } : {}),\n ...(currency ? { currency } : {}),\n };\n }\n\n private resolveViewContent(\n input: CommerceResolverInput\n ): CommerceResolverResult {\n const payload = { ...(input.payload ?? {}) };\n const source = input.enrichmentSource ?? 'event_or_cart';\n\n // Tenta completar productId/name/price a partir de payload + cart/catalog\n if (source === 'cart' || source === 'event_or_cart') {\n const atc = this.resolveAddToCart({\n ...input,\n eventType: 'ADD_TO_CART',\n enrichmentSource: source,\n });\n\n const checkout = this.resolveCheckoutLike(\n { ...input, eventType: 'INITIATE_CHECKOUT', enrichmentSource: source },\n false\n );\n\n const data: Record<string, unknown> = { ...payload };\n\n const contentId =\n asString(payload.contentId) ??\n asString(atc.data.productId as string | undefined) ??\n (Array.isArray(checkout.data.items) &&\n checkout.data.items[0] &&\n typeof (checkout.data.items[0] as { id?: unknown }).id === 'string'\n ? (checkout.data.items[0] as { id: string }).id\n : undefined);\n\n const contentName =\n asString(payload.contentName) ??\n asString(atc.data.productName as string | undefined) ??\n (Array.isArray(checkout.data.items) &&\n checkout.data.items[0] &&\n typeof (checkout.data.items[0] as { name?: unknown }).name === 'string'\n ? (checkout.data.items[0] as { name: string }).name\n : undefined);\n\n if (contentId) data.contentId = contentId;\n if (contentName) data.contentName = contentName;\n\n if (\n asNumber(payload.value) === undefined &&\n checkout.value !== undefined\n ) {\n data.value = checkout.value;\n }\n if (!asString(payload.currency) && checkout.currency) {\n data.currency = checkout.currency;\n }\n if (payload.items === undefined && Array.isArray(checkout.data.items)) {\n data.items = checkout.data.items;\n }\n\n return {\n data,\n ...(checkout.value !== undefined ? { value: checkout.value } : {}),\n ...(checkout.currency ? { currency: checkout.currency } : {}),\n items: checkout.items,\n };\n }\n\n if (source === 'catalog') {\n const atc = this.resolveAddToCart({\n ...input,\n eventType: 'ADD_TO_CART',\n enrichmentSource: 'catalog',\n });\n const data: Record<string, unknown> = { ...payload };\n if (atc.data.productId && !asString(payload.contentId)) {\n data.contentId = atc.data.productId;\n }\n if (atc.data.productName && !asString(payload.contentName)) {\n data.contentName = atc.data.productName;\n }\n if (\n atc.data.price !== undefined &&\n asNumber(payload.value) === undefined\n ) {\n data.value = atc.data.price;\n }\n if (atc.data.currency && !asString(payload.currency)) {\n data.currency = atc.data.currency;\n }\n return { data };\n }\n\n return { data: payload };\n }\n\n /**\n * null = payload não trouxe items (usar state conforme calculateValueFrom)\n * [] = payload trouxe items vazios\n */\n private readPayloadItems(\n input: CommerceResolverInput\n ): ResolvedCommerceItem[] | null {\n if (input.items) {\n return input.items.map(item => this.normalizeLooseItem(item));\n }\n\n const raw = input.payload?.items;\n if (raw === undefined) return null;\n if (!Array.isArray(raw)) return null;\n return raw.map(item =>\n this.normalizeLooseItem(\n (item && typeof item === 'object' ? item : {}) as Record<\n string,\n unknown\n >\n )\n );\n }\n\n private resolveItemsSource(\n manualItems: ResolvedCommerceItem[] | null,\n enrichmentSource?: import('@/config/shared/commerce').CommerceEnrichmentSource\n ): ResolvedCommerceItem[] {\n // Items manuais sempre vencem state.\n if (manualItems !== null) {\n return manualItems.map(item => this.enrichItem(item));\n }\n\n // source: 'catalog' — não injeta cart inteiro\n if (enrichmentSource === 'catalog') {\n return [];\n }\n\n // source: 'cart' força fallback do carrinho (independente de calculateValueFrom),\n // exceto quando calculateValueFrom === 'manual' (value/items só do payload).\n if (\n enrichmentSource === 'cart' &&\n this.calculateValueFrom !== 'manual' &&\n this.calculateValueFrom !== 'event'\n ) {\n return this.state.getSelectedItems().map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n\n if (this.calculateValueFrom === 'cart') {\n return this.state.getSelectedItems().map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n\n if (this.calculateValueFrom === 'catalog') {\n const fromState = this.state.getSelectedItems();\n if (fromState.length > 0) {\n return fromState.map(stateItem =>\n this.enrichItem({\n productId: stateItem.productId,\n price: stateItem.price,\n quantity: stateItem.quantity,\n currency: stateItem.currency,\n })\n );\n }\n return this.catalog.list().map(product =>\n this.enrichItem({\n productId: product.id,\n price: product.price,\n quantity: product.quantity ?? 1,\n currency: product.currency,\n productName: product.name,\n sku: product.sku,\n category: product.category,\n })\n );\n }\n\n // event / manual sem items no payload → sem items\n return [];\n }\n\n private enrichItem(item: ResolvedCommerceItem): ResolvedCommerceItem {\n const productId =\n item.productId ?? this.lookupIdBySku(item.sku) ?? undefined;\n const catalog = productId\n ? this.catalog.getById(productId)\n : this.lookupProductBySku(item.sku);\n\n const resolvedId = productId ?? catalog?.id;\n\n return {\n ...item,\n ...(resolvedId ? { productId: resolvedId } : {}),\n productName: item.productName ?? catalog?.name,\n sku: item.sku ?? catalog?.sku,\n price: item.price ?? catalog?.price,\n quantity: item.quantity ?? catalog?.quantity ?? 1,\n currency: item.currency ?? catalog?.currency ?? this.defaultCurrency,\n category: item.category ?? catalog?.category,\n variant: item.variant ?? catalog?.variant,\n brand: item.brand ?? catalog?.brand,\n type: item.type ?? catalog?.type,\n metadata: item.metadata ?? catalog?.metadata,\n };\n }\n\n private toPixelItem(item: ResolvedCommerceItem): PixelItem {\n const pixel: PixelItem = {\n ...(item.productId ? { id: item.productId } : {}),\n ...(item.productName ? { name: item.productName } : {}),\n ...(item.category ? { category: item.category } : {}),\n ...(item.price !== undefined ? { price: item.price } : {}),\n ...(item.quantity !== undefined ? { quantity: item.quantity } : {}),\n };\n return pixel;\n }\n\n private normalizeLooseItem(\n item:\n | Record<string, unknown>\n | {\n productId?: string;\n id?: string;\n sku?: string;\n name?: string;\n productName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n }\n ): ResolvedCommerceItem {\n return {\n productId:\n asString((item as { productId?: unknown }).productId) ??\n asString((item as { id?: unknown }).id),\n sku: asString((item as { sku?: unknown }).sku),\n productName:\n asString((item as { productName?: unknown }).productName) ??\n asString((item as { name?: unknown }).name),\n price: asNumber((item as { price?: unknown }).price),\n quantity: asNumber((item as { quantity?: unknown }).quantity),\n currency: asString((item as { currency?: unknown }).currency),\n category: asString((item as { category?: unknown }).category),\n };\n }\n\n private lookupIdBySku(sku: string | undefined): string | undefined {\n if (!sku) return undefined;\n return this.catalog.getBySku(sku)?.id;\n }\n\n private lookupProductBySku(sku: string | undefined) {\n if (!sku) return null;\n return this.catalog.getBySku(sku);\n }\n}\n\nfunction resolveCatalogItemIdentity(\n catalogProduct: import('@/config/shared/commerce').CommerceProduct | null,\n incoming: {\n id?: string;\n priceId?: string;\n productId?: string;\n offerId?: string;\n }\n): {\n id?: string;\n priceId?: string;\n productId?: string;\n offerId?: string;\n} {\n const meta = catalogProduct?.metadata ?? {};\n const metaPriceId = asString(meta.priceId);\n const metaProductId = asString(meta.productId);\n const metaOfferId = asString(meta.offerId);\n\n // Identidade Bemony (id/priceId/offerId) só quando priceId explícito ou metadata.\n // Catálogo genérico do Core continua só com productId.\n const priceId = incoming.priceId ?? metaPriceId;\n if (!priceId) {\n const productId = incoming.productId ?? catalogProduct?.id;\n return {\n ...(incoming.id ? { id: incoming.id } : {}),\n ...(productId ? { productId } : {}),\n ...(incoming.offerId ? { offerId: incoming.offerId } : {}),\n };\n }\n\n return {\n id: incoming.id ?? priceId,\n priceId,\n productId: metaProductId ?? incoming.productId ?? priceId,\n offerId: metaOfferId ?? incoming.offerId ?? priceId,\n };\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value)) return undefined;\n return value;\n}\n\nfunction trim(value: string | undefined): string | undefined {\n if (typeof value !== 'string') return undefined;\n const t = value.trim();\n return t.length > 0 ? t : undefined;\n}\n","import type {\n CommerceConfig,\n CommerceEnrichmentSource,\n CommerceEventEnrichmentConfig,\n} from '@/config/shared/commerce';\nimport {\n DEFAULT_COMMERCE_CONFIG,\n DEFAULT_COMMERCE_ENRICHMENT,\n normalizeCalculateValueFrom,\n} from '@/config/shared/commerce';\nimport type { PixelItem } from '@/events/conversion';\n\nimport { CommerceResolver } from './CommerceResolver';\nimport { CommerceState } from './CommerceState';\nimport { OrderCalculator } from './OrderCalculator';\nimport { ProductCatalog } from './ProductCatalog';\n\nexport type CommerceEnrichmentEvent =\n | 'pageView'\n | 'viewContent'\n | 'lead'\n | 'addToCart'\n | 'removeFromCart'\n | 'initiateCheckout'\n | 'addPaymentInfo'\n | 'purchase';\n\nexport type PageViewCommercePayload = {\n readonly value?: number;\n readonly currency?: string;\n readonly items?: PixelItem[];\n readonly contentId?: string;\n readonly contentName?: string;\n};\n\n/**\n * Serviço compartilhado de commerce (root config).\n * Usado por Core (PAGE_VIEW) e Conversion sem dependência circular\n * entre os módulos.\n */\nexport class CommerceService {\n readonly enabled: boolean;\n\n readonly config: CommerceConfig;\n\n readonly catalog: ProductCatalog;\n\n readonly state: CommerceState;\n\n private readonly resolver: CommerceResolver;\n\n constructor(config: CommerceConfig | undefined) {\n this.config = {\n ...DEFAULT_COMMERCE_CONFIG,\n ...config,\n catalog: {\n products: config?.catalog?.products ?? [],\n },\n cart: {\n ...DEFAULT_COMMERCE_CONFIG.cart,\n ...config?.cart,\n initialItems: config?.cart?.initialItems\n ? config.cart.initialItems.map(item => ({ ...item }))\n : [],\n },\n mappings: {\n attributes: { ...(config?.mappings?.attributes ?? {}) },\n fields: { ...(config?.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...DEFAULT_COMMERCE_ENRICHMENT,\n ...config?.enrichment,\n },\n };\n\n this.enabled = this.config.enabled === true;\n\n this.catalog = new ProductCatalog(this.config.catalog?.products, {\n defaultCurrency: this.config.currency,\n });\n\n this.state = new CommerceState(this.config.cart?.initialItems, {\n allowDynamicItems: this.config.cart?.allowDynamicItems !== false,\n });\n\n this.resolver = new CommerceResolver({\n catalog: this.catalog,\n state: this.state,\n calculator: new OrderCalculator(),\n defaultCurrency: this.config.currency,\n calculateValueFrom: normalizeCalculateValueFrom(\n this.config.cart?.calculateValueFrom\n ),\n });\n }\n\n getEnrichment(event: CommerceEnrichmentEvent): CommerceEventEnrichmentConfig {\n const fromConfig = this.config.enrichment?.[event];\n const fallback = DEFAULT_COMMERCE_ENRICHMENT[event];\n return {\n enabled: fromConfig?.enabled ?? fallback.enabled,\n source: fromConfig?.source ?? fallback.source,\n };\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n isEnrichmentEnabled(event: CommerceEnrichmentEvent): boolean {\n return this.enabled && this.getEnrichment(event).enabled === true;\n }\n\n getEnrichmentSource(\n event: CommerceEnrichmentEvent\n ): CommerceEnrichmentSource {\n return this.getEnrichment(event).source ?? 'event_or_cart';\n }\n\n /**\n * Resolve payload de commerce para um evento conversion.\n * Retorna null quando enrichment está desabilitado (caller usa payload original).\n */\n resolveForEvent(\n event: CommerceEnrichmentEvent,\n eventType:\n | 'ADD_TO_CART'\n | 'REMOVE_FROM_CART'\n | 'INITIATE_CHECKOUT'\n | 'PURCHASE'\n | 'VIEW_CONTENT'\n | 'ADD_PAYMENT_INFO',\n payload: Record<string, unknown> = {}\n ): Record<string, unknown> | null {\n if (!this.isEnrichmentEnabled(event)) return null;\n\n const result = this.resolver.resolve({\n eventType,\n payload,\n enrichmentSource: this.getEnrichmentSource(event),\n });\n\n return result.data;\n }\n\n /**\n * Payload de commerce para PAGE_VIEW quando enrichment.pageView.enabled.\n * Não depende de ConversionEngine.\n */\n resolvePageViewEnrichment(): PageViewCommercePayload | null {\n if (!this.isEnrichmentEnabled('pageView')) return null;\n\n const source = this.getEnrichment('pageView').source ?? 'cart';\n if (source === 'event') return null;\n\n const resolved = this.resolver.resolve({\n eventType: 'INITIATE_CHECKOUT',\n payload: {},\n });\n\n const items = (resolved.data.items as PixelItem[] | undefined) ?? [];\n const first = items[0];\n const contentId =\n first && typeof first.id === 'string' ? first.id : undefined;\n const contentName =\n first && typeof first.name === 'string' ? first.name : undefined;\n\n if (\n resolved.value === undefined &&\n !resolved.currency &&\n items.length === 0\n ) {\n return null;\n }\n\n return {\n ...(resolved.value !== undefined ? { value: resolved.value } : {}),\n ...(resolved.currency ? { currency: resolved.currency } : {}),\n ...(items.length > 0 ? { items } : {}),\n ...(contentId ? { contentId } : {}),\n ...(contentName ? { contentName } : {}),\n };\n }\n\n getResolver(): CommerceResolver {\n return this.resolver;\n }\n\n getCalculateValueFrom(): ReturnType<typeof normalizeCalculateValueFrom> {\n return normalizeCalculateValueFrom(this.config.cart?.calculateValueFrom);\n }\n\n getMappings() {\n return this.config.mappings;\n }\n}\n","/**\n * Input de lead para `captureLead` → `Pixel.lead()`.\n * Não dispara ADD_TO_CART.\n */\nexport interface BemonyLeadInput {\n email?: string;\n phone?: string;\n name?: string;\n fields?: Record<string, unknown>;\n}\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst BLOCKED_FIELD_KEY =\n /^(card|cvv|cvc|pan|number|expiry|expiration|password|token|cvv2)/i;\n\n/**\n * Validação mínima: email válido e/ou telefone com ao menos 8 dígitos.\n */\nexport function isValidBemonyLead(input: BemonyLeadInput): boolean {\n const email = input.email?.trim();\n const phone = input.phone?.trim();\n const emailOk = Boolean(email && EMAIL_PATTERN.test(email));\n const phoneDigits = phone ? phone.replace(/\\D/g, '') : '';\n const phoneOk = phoneDigits.length >= 8;\n return emailOk || phoneOk;\n}\n\nexport function leadFingerprint(input: BemonyLeadInput): string {\n const email = input.email?.trim().toLowerCase() ?? '';\n const phone = input.phone?.replace(/\\D/g, '') ?? '';\n const name = input.name?.trim().toLowerCase() ?? '';\n return `${email}|${phone}|${name}`;\n}\n\n/**\n * Remove campos sensíveis (cartão etc.) de `fields` antes de enviar ao Core.\n */\nexport function sanitizeLeadFields(\n fields: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!fields) {\n return undefined;\n }\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n if (BLOCKED_FIELD_KEY.test(key)) {\n continue;\n }\n result[key] = value;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Métodos de pagamento alinhados ao Core (`AddPaymentInfoData.paymentMethod`).\n * `PaymentMethod` não é reexportado por `@beworke/pixel/events` — espelhamos o union.\n */\nexport type BemonyPaymentMethod =\n | 'CREDIT_CARD'\n | 'PIX'\n | 'BOLETO'\n | 'PAYPAL'\n // TODO : Add Google Pay and Apple Pay in pixel core\n // | 'GOOGLE_PAY'\n // | 'APPLE_PAY'\n | 'OTHER';\n\n/**\n * Input de método de pagamento — somente enum, sem dados de cartão.\n */\nexport interface BemonyPaymentMethodInput {\n paymentMethod: BemonyPaymentMethod;\n}\n\nexport const BEMONY_PAYMENT_METHODS: readonly BemonyPaymentMethod[] = [\n 'CREDIT_CARD',\n 'PIX',\n 'BOLETO',\n 'PAYPAL',\n // 'GOOGLE_PAY',\n // 'APPLE_PAY',\n 'OTHER',\n] as const;\n\nexport function isValidBemonyPaymentMethod(\n input: BemonyPaymentMethodInput | null | undefined\n): input is BemonyPaymentMethodInput {\n if (!input) {\n return false;\n }\n return (BEMONY_PAYMENT_METHODS as readonly string[]).includes(\n input.paymentMethod\n );\n}\n","/**\n * Normaliza a identidade comercial pública Bemony (`priceCode`).\n *\n * `priceId` permanece como alias deprecated de compatibilidade.\n * Não inventa valor a partir de offerId/productId.\n */\nexport type BemonyCommerceIdentityInput = {\n priceCode?: string;\n /** @deprecated Use priceCode. */\n priceId?: string;\n};\n\nexport type ResolvePriceCodeResult = {\n priceCode: string | null;\n /** True quando priceCode e priceId divergem (usa priceCode). */\n conflict: boolean;\n};\n\n/**\n * Resolve o priceCode canônico.\n *\n * 1. `priceCode` tem prioridade\n * 2. `priceId` é fallback de compatibilidade\n * 3. trim; vazio → null\n * 4. conflito → preferir priceCode e sinalizar `conflict`\n */\nexport function resolvePriceCode(\n input: BemonyCommerceIdentityInput | null | undefined\n): ResolvePriceCodeResult {\n if (!input) {\n return { priceCode: null, conflict: false };\n }\n\n const fromCode = input.priceCode?.trim() || null;\n const fromLegacy = input.priceId?.trim() || null;\n\n if (fromCode && fromLegacy && fromCode !== fromLegacy) {\n return { priceCode: fromCode, conflict: true };\n }\n\n return {\n priceCode: fromCode ?? fromLegacy,\n conflict: false,\n };\n}\n","import {\n Pixel,\n type PixelConfig,\n type PixelDebugSnapshot,\n} from '@beworke/pixel';\nimport type {\n AddPaymentInfoData,\n AddToCartData,\n InitiateCheckoutData,\n LeadData,\n RemoveFromCartData,\n ViewContentData,\n} from '@beworke/pixel/events';\nimport type { BemonyCheckoutInput } from './domain/BemonyCheckoutInput';\nimport type { BemonyDeclineUpsellOptions } from './domain/BemonyDeclineUpsellOptions';\nimport type { BemonyOneClickConfirmationInput } from './domain/BemonyOneClickInput';\nimport { type BemonyOfferInput } from './domain/BemonyOfferInput';\nimport {\n isValidBemonyLead,\n leadFingerprint,\n sanitizeLeadFields,\n type BemonyLeadInput,\n} from './domain/BemonyLeadInput';\nimport {\n isValidBemonyPaymentMethod,\n type BemonyPaymentMethodInput,\n} from './domain/BemonyPaymentMethodInput';\nimport type { BemonyPublicPageContext } from './domain/BemonyPageContext';\nimport { resolvePriceCode } from './domain/resolvePriceCode';\nimport { extractPriceCodeFromUrl } from './navigation/extractPriceCodeFromUrl';\nimport type { BemonyScenario } from './scenarios/types';\n\nexport type BemonyPixelState =\n | 'created'\n | 'initializing'\n | 'ready'\n | 'destroying'\n | 'destroyed'\n | 'failed';\n\nconst SAFE_PUBLIC_ORDER_ID = /^[a-zA-Z0-9_.:-]+$/;\nconst MAX_PUBLIC_ORDER_ID_LENGTH = 128;\n\n/**\n * Superfície pública do Core usada pelo wrapper.\n * Não inclui métodos @internal nem purchase (fora do fluxo browser Bemony).\n */\nexport type BemonyCorePixel = {\n init(): Promise<void>;\n destroy(): Promise<void>;\n isInitialized(): boolean;\n getDebugSnapshot(): Readonly<PixelDebugSnapshot>;\n viewContent(data?: ViewContentData): void;\n addToCart(data?: AddToCartData): void;\n removeFromCart(data?: RemoveFromCartData): void;\n lead(data: LeadData): void;\n initiateCheckout(data?: InitiateCheckoutData): void;\n addPaymentInfo(data?: AddPaymentInfoData): void;\n setManagedUrlParam?(param: string, value: string): boolean;\n};\n\nexport type BemonyPixelConstructOptions = {\n config: PixelConfig;\n scenario: BemonyScenario;\n createCorePixel?: (config: PixelConfig) => BemonyCorePixel;\n /** Default true no cenário checkout / one-click. */\n autoInitiateCheckout?: boolean;\n publicOrderId?: string;\n publicContext?: BemonyPublicPageContext;\n /**\n * URL de “No Thanks” (`data-no-thanks` no script).\n * O link de recusa é o `<a href>` que coincide com esta URL.\n */\n noThanksUrl?: string;\n};\n\nexport type BemonyLifecycleErrorCode =\n | 'INIT_FAILED'\n | 'INVALID_STATE'\n | 'DESTROY_FAILED';\n\nexport class BemonyLifecycleError extends Error {\n readonly code: BemonyLifecycleErrorCode;\n readonly state: BemonyPixelState;\n readonly cause?: unknown;\n\n constructor(options: {\n code: BemonyLifecycleErrorCode;\n message: string;\n state: BemonyPixelState;\n cause?: unknown;\n }) {\n super(options.message);\n this.name = 'BemonyLifecycleError';\n this.code = options.code;\n this.state = options.state;\n if (options.cause !== undefined) {\n this.cause = options.cause;\n }\n }\n}\n\nfunction requirePriceCode(\n input: BemonyOfferInput,\n method: string,\n state: BemonyPixelState\n): string {\n const { priceCode, conflict } = resolvePriceCode(input);\n if (!priceCode) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires priceCode.`,\n state,\n });\n }\n if (conflict && typeof console !== 'undefined' && console.debug) {\n console.debug('[BemonyPixel] priceCode/priceId conflict; using priceCode', {\n code: 'BEMONY_PRICE_CODE_CONFLICT',\n method,\n });\n }\n return priceCode;\n}\n\nfunction toViewContentData(input: BemonyOfferInput): ViewContentData {\n const priceCode = resolvePriceCode(input).priceCode!;\n const contentType =\n input.productType === 'downsell'\n ? 'downsell'\n : input.productType === 'upsell'\n ? 'upsell'\n : 'offer';\n const observedValue = input.observedValue ?? input.price;\n const observedCurrency = input.observedCurrency ?? input.currency;\n\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n // O productId real será resolvido pelo backend de ingestão.\n return {\n contentId: priceCode,\n contentType,\n productId: priceCode,\n ...(observedValue !== undefined ? { value: observedValue } : {}),\n ...(observedCurrency !== undefined ? { currency: observedCurrency } : {}),\n };\n}\n\nfunction toAddToCartData(input: BemonyOfferInput): AddToCartData {\n const priceCode = resolvePriceCode(input).priceCode!;\n const observedValue = input.observedValue ?? input.price;\n const observedCurrency = input.observedCurrency ?? input.currency;\n\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n // O productId real será resolvido pelo backend de ingestão.\n return {\n productId: priceCode,\n quantity: input.quantity ?? 1,\n ...(observedValue !== undefined ? { price: observedValue } : {}),\n ...(observedCurrency !== undefined ? { currency: observedCurrency } : {}),\n };\n}\n\nfunction toLeadData(input: BemonyLeadInput): LeadData {\n const fields = sanitizeLeadFields(input.fields);\n return {\n ...(input.email !== undefined ? { email: input.email.trim() } : {}),\n ...(input.phone !== undefined ? { phone: input.phone.trim() } : {}),\n ...(input.name !== undefined ? { name: input.name.trim() } : {}),\n ...(fields !== undefined ? { fields } : {}),\n };\n}\n\n/**\n * Identidade comercial do CTA de aceite: pathname do href (`/pri*`).\n * Útil para hosts que resolvem o CTA manualmente; o cenário upsell usa LinkAuto.\n */\nexport function resolvePriceCodeFromAcceptElement(el: Element): string | null {\n if (el instanceof HTMLAnchorElement && el.href) {\n const fromHref = extractPriceCodeFromUrl(el.href);\n if (fromHref) {\n return fromHref;\n }\n }\n const href = el.getAttribute('href');\n if (!href) {\n return null;\n }\n try {\n const base =\n typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/';\n return extractPriceCodeFromUrl(new URL(href, base));\n } catch {\n return null;\n }\n}\n\n/**\n * Wrapper de lifecycle e domínio Bemony sobre `Pixel`.\n *\n * Sem consulta de catálogo. Sem auto VIEW_CONTENT.\n * Identidade comercial no browser: priceCode observado.\n */\nexport class BemonyPixel {\n private state: BemonyPixelState = 'created';\n private readonly scenario: BemonyScenario;\n private readonly config: PixelConfig;\n private readonly core: BemonyCorePixel;\n private initPromise: Promise<void> | null = null;\n private destroyPromise: Promise<void> | null = null;\n private readonly wrapperListeners = new Set<() => void>();\n private readonly autoInitiateCheckoutEnabled: boolean;\n private publicOrderId: string | undefined;\n private readonly publicContext: BemonyPublicPageContext;\n private readonly noThanksUrl: string | undefined;\n private checkoutStarted = false;\n private lastLeadFingerprint: string | null = null;\n private readonly selectedBumpIds = new Set<string>();\n\n constructor(options: BemonyPixelConstructOptions) {\n this.config = options.config;\n this.scenario = options.scenario;\n this.publicOrderId = options.publicOrderId?.trim() || undefined;\n this.publicContext = options.publicContext\n ? { ...options.publicContext }\n : {};\n this.autoInitiateCheckoutEnabled = options.autoInitiateCheckout !== false;\n this.noThanksUrl = options.noThanksUrl?.trim() || undefined;\n\n const createCore =\n options.createCorePixel ??\n ((config: PixelConfig) => new Pixel(config) as BemonyCorePixel);\n this.core = createCore(options.config);\n }\n\n getScenario(): BemonyScenario {\n return this.scenario;\n }\n\n getConfig(): Readonly<PixelConfig> {\n return this.config;\n }\n\n getState(): BemonyPixelState {\n return this.state;\n }\n\n isInitialized(): boolean {\n return this.state === 'ready' && this.core.isInitialized();\n }\n\n getDebugSnapshot(): Readonly<PixelDebugSnapshot> {\n return this.core.getDebugSnapshot();\n }\n\n /**\n * `publicOrderId` do domínio do app (não mapeado para identity do Core).\n * Fallback opcional: param `oid` da URL atual.\n */\n getPublicOrderId(): string | null {\n if (this.publicOrderId) {\n return this.publicOrderId;\n }\n if (\n typeof window === 'undefined' ||\n typeof window.location === 'undefined'\n ) {\n return null;\n }\n try {\n return new URL(window.location.href).searchParams.get('oid');\n } catch {\n return null;\n }\n }\n\n /**\n * Define `publicOrderId` e propaga para managed param `oid` quando suportado.\n */\n setPublicOrderId(orderId: string): void {\n const trimmed = orderId.trim();\n if (!trimmed || trimmed.length > MAX_PUBLIC_ORDER_ID_LENGTH) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message:\n 'setPublicOrderId requires a non-empty orderId within max length.',\n state: this.state,\n });\n }\n if (!SAFE_PUBLIC_ORDER_ID.test(trimmed)) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: 'setPublicOrderId orderId contains invalid characters.',\n state: this.state,\n });\n }\n if (this.publicOrderId === trimmed) {\n return;\n }\n this.publicOrderId = trimmed;\n this.applyPublicOrderIdToManagedParam();\n }\n\n getPublicSessionId(): string | null {\n if (\n typeof window === 'undefined' ||\n typeof window.location === 'undefined'\n ) {\n return null;\n }\n try {\n return new URL(window.location.href).searchParams.get('sid');\n } catch {\n return null;\n }\n }\n\n selectOffer(input: BemonyOfferInput): void {\n this.assertReady('selectOffer');\n requirePriceCode(input, 'selectOffer', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n /**\n * Inicia checkout → `Pixel.initiateCheckout()`.\n * Idempotente: no máximo uma vez por lifecycle da instância.\n */\n startCheckout(input?: BemonyCheckoutInput): void {\n this.assertReady('startCheckout');\n if (this.checkoutStarted) {\n return;\n }\n const data: InitiateCheckoutData | undefined = input\n ? {\n ...(input.value !== undefined ? { value: input.value } : {}),\n ...(input.currency !== undefined ? { currency: input.currency } : {}),\n }\n : undefined;\n this.core.initiateCheckout(data);\n this.checkoutStarted = true;\n }\n\n /**\n * Captura lead → `Pixel.lead()`.\n * Campos incompletos não disparam. Mesmo fingerprint não reenvia (debounce).\n */\n captureLead(input: BemonyLeadInput): boolean {\n this.assertReady('captureLead');\n if (!isValidBemonyLead(input)) {\n return false;\n }\n const fingerprint = leadFingerprint(input);\n if (this.lastLeadFingerprint === fingerprint) {\n return false;\n }\n this.core.lead(toLeadData(input));\n this.lastLeadFingerprint = fingerprint;\n return true;\n }\n\n selectOrderBump(input: BemonyOfferInput): void {\n this.assertReady('selectOrderBump');\n const priceCode = requirePriceCode(input, 'selectOrderBump', this.state);\n this.core.addToCart(toAddToCartData(input));\n this.selectedBumpIds.add(priceCode);\n }\n\n removeOrderBump(input: BemonyOfferInput): void {\n this.assertReady('removeOrderBump');\n const priceCode = requirePriceCode(input, 'removeOrderBump', this.state);\n if (!this.selectedBumpIds.has(priceCode)) {\n return;\n }\n this.core.removeFromCart({\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n productId: priceCode,\n ...(input.quantity !== undefined ? { quantity: input.quantity } : {}),\n });\n this.selectedBumpIds.delete(priceCode);\n }\n\n trackPaymentMethod(input: BemonyPaymentMethodInput): void {\n this.assertReady('trackPaymentMethod');\n if (!isValidBemonyPaymentMethod(input)) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: 'trackPaymentMethod requires a valid paymentMethod enum.',\n state: this.state,\n });\n }\n this.core.addPaymentInfo({ paymentMethod: input.paymentMethod });\n }\n\n viewUpsell(input: BemonyOfferInput): void {\n this.assertReady('viewUpsell');\n requirePriceCode(input, 'viewUpsell', this.state);\n this.core.viewContent(toViewContentData(input));\n }\n\n acceptUpsell(input: BemonyOfferInput): void {\n this.assertReady('acceptUpsell');\n requirePriceCode(input, 'acceptUpsell', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n /**\n * Recusa de upsell/downsell — callback/navegação apenas.\n * Destino: `navigateTo` explícito, senão `noThanksUrl` (data-no-thanks).\n */\n declineUpsell(options?: BemonyDeclineUpsellOptions): void {\n this.assertReady('declineUpsell');\n try {\n options?.onDecline?.();\n } finally {\n const explicitTarget =\n options?.navigateTo?.trim() || this.noThanksUrl || undefined;\n const target = explicitTarget\n ? this.decorateNavigateUrl(explicitTarget)\n : undefined;\n if (\n target &&\n typeof window !== 'undefined' &&\n typeof window.location?.assign === 'function'\n ) {\n window.location.assign(target);\n }\n }\n }\n\n /**\n * Intenção de confirmação one-click → `Pixel.addToCart()`.\n * Não processa pagamento e **não** emite PURCHASE.\n */\n trackOneClickConfirmation(input: BemonyOneClickConfirmationInput): void {\n this.assertReady('trackOneClickConfirmation');\n this.assertOneClickReady('trackOneClickConfirmation');\n requirePriceCode(input, 'trackOneClickConfirmation', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n init(): Promise<void> {\n if (this.state === 'ready') {\n return Promise.resolve();\n }\n\n if (this.state === 'initializing' && this.initPromise) {\n return this.initPromise;\n }\n\n if (this.state === 'destroying' && this.destroyPromise) {\n this.initPromise = this.destroyPromise\n .catch(() => undefined)\n .then(() => this.startInit());\n return this.initPromise;\n }\n\n this.initPromise = this.startInit();\n return this.initPromise;\n }\n\n destroy(): Promise<void> {\n if (this.state === 'destroyed') {\n return Promise.resolve();\n }\n\n if (this.state === 'destroying' && this.destroyPromise) {\n return this.destroyPromise;\n }\n\n if (this.state === 'initializing' && this.initPromise) {\n this.destroyPromise = this.initPromise\n .catch(() => undefined)\n .then(() => this.startDestroy());\n return this.destroyPromise;\n }\n\n this.destroyPromise = this.startDestroy();\n return this.destroyPromise;\n }\n\n addWrapperListener(cleanup: () => void): () => void {\n this.wrapperListeners.add(cleanup);\n return () => {\n this.wrapperListeners.delete(cleanup);\n };\n }\n\n private assertReady(method: string): void {\n if (this.state !== 'ready') {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires state \"ready\" (current: \"${this.state}\").`,\n state: this.state,\n });\n }\n }\n\n private assertOneClickReady(method: string): void {\n if (!this.getPublicOrderId()) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires publicOrderId.`,\n state: this.state,\n });\n }\n }\n\n private applyPublicOrderIdToManagedParam(): void {\n if (!this.publicOrderId || !this.core.setManagedUrlParam) {\n return;\n }\n this.core.setManagedUrlParam('oid', this.publicOrderId);\n }\n\n private decorateNavigateUrl(rawUrl: string): string {\n try {\n const base =\n typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/';\n const url = new URL(rawUrl, base);\n const sid = this.getPublicSessionId();\n const oid = this.getPublicOrderId();\n const fid = this.publicContext.funnelId;\n const fsid = this.publicContext.funnelStepId;\n const afid = this.publicContext.affiliateId;\n if (sid && !url.searchParams.has('sid')) {\n url.searchParams.set('sid', sid);\n }\n if (oid && !url.searchParams.has('oid')) {\n url.searchParams.set('oid', oid);\n }\n if (fid && !url.searchParams.has('fid')) {\n url.searchParams.set('fid', fid);\n }\n if (fsid && !url.searchParams.has('fsid')) {\n url.searchParams.set('fsid', fsid);\n }\n if (afid && !url.searchParams.has('afid')) {\n url.searchParams.set('afid', afid);\n }\n return url.toString();\n } catch {\n return rawUrl;\n }\n }\n\n private maybeAutoInitiateCheckout(): void {\n if (\n this.scenario !== 'checkout' &&\n this.scenario !== 'one-click-checkout'\n ) {\n return;\n }\n if (!this.autoInitiateCheckoutEnabled || this.checkoutStarted) {\n return;\n }\n this.core.initiateCheckout();\n this.checkoutStarted = true;\n }\n\n private resetDomainState(): void {\n this.checkoutStarted = false;\n this.lastLeadFingerprint = null;\n this.selectedBumpIds.clear();\n this.publicOrderId = undefined;\n }\n\n private startInit(): Promise<void> {\n this.state = 'initializing';\n\n return this.core\n .init()\n .then(() => {\n if (this.publicOrderId) {\n this.applyPublicOrderIdToManagedParam();\n }\n })\n .then(() => {\n this.state = 'ready';\n this.maybeAutoInitiateCheckout();\n })\n .catch((error: unknown) => {\n this.state = 'failed';\n return this.safeCoreDestroy().then(() => {\n throw new BemonyLifecycleError({\n code: 'INIT_FAILED',\n message: 'BemonyPixel init failed.',\n state: this.state,\n cause: error,\n });\n });\n })\n .finally(() => {\n this.initPromise = null;\n });\n }\n\n private startDestroy(): Promise<void> {\n this.state = 'destroying';\n\n return this.safeCoreDestroy()\n .then(() => {\n this.clearWrapperListeners();\n this.resetDomainState();\n this.state = 'destroyed';\n })\n .catch((error: unknown) => {\n this.clearWrapperListeners();\n this.resetDomainState();\n this.state = 'destroyed';\n throw new BemonyLifecycleError({\n code: 'DESTROY_FAILED',\n message: 'BemonyPixel destroy failed.',\n state: this.state,\n cause: error,\n });\n })\n .finally(() => {\n this.destroyPromise = null;\n });\n }\n\n private async safeCoreDestroy(): Promise<void> {\n await this.core.destroy();\n }\n\n private clearWrapperListeners(): void {\n for (const cleanup of this.wrapperListeners) {\n try {\n cleanup();\n } catch {\n // cleanup isolado\n }\n }\n this.wrapperListeners.clear();\n }\n}\n","/**\n * Contexto público da página — pode ir para identity/navigation.\n * Nunca inclui segredos (token one-click, cartão, etc.).\n */\nexport interface BemonyPublicPageContext {\n pageId?: string;\n funnelId?: string;\n funnelStepId?: string;\n offerId?: string;\n productId?: string;\n /** Código público do price (`pri*`). Identidade comercial canônica. */\n priceCode?: string;\n /**\n * @deprecated Use priceCode.\n */\n priceId?: string;\n checkoutId?: string;\n affiliateId?: string;\n /** Correlação app/backend; sem campo dedicado no Core identity. */\n publicOrderId?: string;\n}\n\n/**\n * Input completo de contexto público da página.\n */\nexport interface BemonyPageContextInput {\n public: BemonyPublicPageContext;\n}\n\n/**\n * Commerce mínimo para a factory de config (sem checkout completo).\n * Opcional — Bemony não exige catálogo para emitir eventos com priceCode.\n */\nexport interface BemonyCommerceInput {\n currency?: string;\n cartMode?:\n | 'landing_page'\n | 'single_product'\n | 'checkout'\n | 'upsell'\n | 'custom';\n products?: ReadonlyArray<{\n id: string;\n name?: string;\n type?: string;\n price?: number;\n currency?: string;\n quantity?: number;\n }>;\n}\n\nexport type BemonyValidationErrorCode =\n | 'MISSING_REQUIRED_FIELD'\n | 'MISSING_ENDPOINT'\n | 'INVALID_FIELD'\n | 'INVALID_ENVIRONMENT';\n\nexport type BemonyValidationErrorOptions = {\n code: BemonyValidationErrorCode;\n message: string;\n field?: string;\n scenario?: string;\n};\n\n/**\n * Erro tipado de validação. Mensagens nunca devem incluir valores sensíveis.\n */\nexport class BemonyValidationError extends Error {\n readonly code: BemonyValidationErrorCode;\n readonly field?: string;\n readonly scenario?: string;\n\n constructor(options: BemonyValidationErrorOptions) {\n super(options.message);\n this.name = 'BemonyValidationError';\n this.code = options.code;\n this.field = options.field;\n this.scenario = options.scenario;\n }\n}\n\nexport function isBemonyPageContextInput(\n value: unknown\n): value is BemonyPageContextInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'public' in value &&\n typeof (value as BemonyPageContextInput).public === 'object' &&\n (value as BemonyPageContextInput).public !== null\n );\n}\n\n/**\n * Normaliza aliases: `priceId` legado → `priceCode` canônico.\n */\nfunction normalizePublicPriceFields(\n publicContext: BemonyPublicPageContext\n): BemonyPublicPageContext {\n const priceCode = publicContext.priceCode?.trim() || undefined;\n const priceId = publicContext.priceId?.trim() || undefined;\n const { priceId: _legacy, ...rest } = publicContext;\n if (priceCode) {\n return { ...rest, priceCode };\n }\n if (priceId) {\n return { ...rest, priceCode: priceId };\n }\n return { ...rest };\n}\n\nexport function normalizeBemonyPageContextInput(\n page?: BemonyPageContextInput | BemonyPublicPageContext\n): BemonyPageContextInput {\n if (!page) {\n return { public: {} };\n }\n if (isBemonyPageContextInput(page)) {\n return {\n public: normalizePublicPriceFields({ ...page.public }),\n };\n }\n return {\n public: normalizePublicPriceFields({ ...page }),\n };\n}\n","import type { BemonyPublicPageContext } from './BemonyPageContext';\n\n/**\n * Mapeamento de query params públicos permitidos → campos do contexto.\n * Token one-click e demais segredos não entram neste mapa.\n */\nconst PUBLIC_URL_PARAM_TO_FIELD: Record<string, keyof BemonyPublicPageContext> =\n {\n page_id: 'pageId',\n funnel_id: 'funnelId',\n funnel_step_id: 'funnelStepId',\n offer_id: 'offerId',\n product_id: 'productId',\n price_code: 'priceCode',\n price_id: 'priceCode',\n checkout_id: 'checkoutId',\n afid: 'affiliateId',\n fid: 'funnelId',\n fsid: 'funnelStepId',\n oid: 'publicOrderId',\n };\n\nexport type ResolveBemonyPageContextSources = {\n /** Precedência 1 — input explícito do app. */\n input?: BemonyPublicPageContext;\n /** Precedência 2 — params públicos já filtrados da URL. */\n urlParams?: Readonly<Record<string, string>>;\n /** Precedência 3 — metadata declarativa da página. */\n pageMetadata?: BemonyPublicPageContext;\n /** Precedência 4 — defaults do cenário. */\n scenarioDefaults?: BemonyPublicPageContext;\n};\n\nfunction pickDefined(\n source: BemonyPublicPageContext | undefined\n): BemonyPublicPageContext {\n if (!source) {\n return {};\n }\n const result: BemonyPublicPageContext = {};\n for (const key of Object.keys(source) as (keyof BemonyPublicPageContext)[]) {\n const value = source[key];\n if (value !== undefined && value !== '') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction publicContextFromUrlParams(\n urlParams: Readonly<Record<string, string>> | undefined\n): BemonyPublicPageContext {\n if (!urlParams) {\n return {};\n }\n const result: BemonyPublicPageContext = {};\n for (const [rawKey, rawValue] of Object.entries(urlParams)) {\n const field = PUBLIC_URL_PARAM_TO_FIELD[rawKey];\n if (!field) {\n continue;\n }\n if (rawValue === undefined || rawValue === '') {\n continue;\n }\n result[field] = rawValue;\n }\n return result;\n}\n\n/**\n * Resolve contexto público com precedência:\n * input explícito → URL permitida → metadata da página → default do cenário.\n *\n * Não gerencia sid, attribution, storage nem token efêmero.\n */\nexport function resolveBemonyPageContext(\n sources: ResolveBemonyPageContextSources = {}\n): BemonyPublicPageContext {\n const fromScenario = pickDefined(sources.scenarioDefaults);\n const fromMetadata = pickDefined(sources.pageMetadata);\n const fromUrl = publicContextFromUrlParams(sources.urlParams);\n const fromInput = pickDefined(sources.input);\n\n return {\n ...fromScenario,\n ...fromMetadata,\n ...fromUrl,\n ...fromInput,\n };\n}\n","import type { BemonyScenario } from '../scenarios/types';\nimport {\n BemonyValidationError,\n type BemonyPublicPageContext,\n} from './BemonyPageContext';\n\nconst MAX_ID_LENGTH = 128;\nconst SAFE_ID_PATTERN = /^[a-zA-Z0-9_.:-]+$/;\n\n/** Campos públicos obrigatórios por cenário (contrato B1). */\nexport const REQUIRED_PUBLIC_FIELDS: Record<\n BemonyScenario,\n readonly (keyof BemonyPublicPageContext)[]\n> = {\n 'offer-page': [],\n checkout: [],\n 'upsell-offer': [],\n 'one-click-checkout': [\n 'publicOrderId',\n 'funnelId',\n 'funnelStepId',\n 'priceCode',\n ],\n 'thank-you': [],\n};\n\nexport type ValidateBemonyPageContextOptions = {\n scenario: BemonyScenario;\n publicContext: BemonyPublicPageContext;\n /** Quando true, aplica trim/charset aos IDs públicos. Default: true. */\n sanitize?: boolean;\n};\n\nfunction assertSafePublicId(\n field: keyof BemonyPublicPageContext,\n value: string,\n scenario: BemonyScenario\n): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" cannot be empty for scenario \"${scenario}\".`,\n });\n }\n if (trimmed.length > MAX_ID_LENGTH) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" exceeds maximum length of ${MAX_ID_LENGTH}.`,\n });\n }\n if (!SAFE_ID_PATTERN.test(trimmed)) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" contains invalid characters.`,\n });\n }\n return trimmed;\n}\n\n/**\n * Valida obrigatoriedade por cenário e rejeita IDs públicos inválidos.\n */\nexport function validateBemonyPageContext(\n options: ValidateBemonyPageContextOptions\n): BemonyPublicPageContext {\n const { scenario } = options;\n const sanitize = options.sanitize !== false;\n const required = REQUIRED_PUBLIC_FIELDS[scenario];\n const source = options.publicContext;\n const result: BemonyPublicPageContext = {};\n\n for (const field of Object.keys(\n source\n ) as (keyof BemonyPublicPageContext)[]) {\n const value = source[field];\n if (value === undefined) {\n continue;\n }\n result[field] = sanitize\n ? assertSafePublicId(field, value, scenario)\n : value;\n }\n\n for (const field of required) {\n if (!result[field]) {\n throw new BemonyValidationError({\n code: 'MISSING_REQUIRED_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" is required for scenario \"${scenario}\".`,\n });\n }\n }\n\n return result;\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { BemonyEnvironment } from './environments';\nimport type { BemonyScenario } from '../scenarios/types';\n\n/**\n * Defaults estáveis da plataforma Bemony (sem dados dinâmicos de página).\n * Composição: DEFAULT_PIXEL_CONFIG → estes defaults → environment → scenario → page.\n */\nexport const BEMONY_STORAGE_PREFIX = '__bemony_pixel';\nexport const BEMONY_DEFAULT_NAMESPACE = 'bemony-web' as const;\n\n/**\n * Endpoint público padrão da API Pixel Bemony (infraestrutura, não credencial).\n * O Core acrescenta `/pixels/public/event` e `/pixels/public/event/batch`.\n */\nexport const BEMONY_DEFAULT_API_ENDPOINT =\n 'https://micro-service-pixel-production-4826.up.railway.app' as const;\n\nexport const BEMONY_DEFAULT_PIXEL_ID = 'pix_7704308' as const;\n\n/** Domínios Bemony permitidos por default para decoração de links. */\nexport const BEMONY_DEFAULT_ALLOWED_DOMAINS = [\n 'security.bemony.com',\n /** Serve HTTP local (`pnpm dlx serve`). */\n 'localhost',\n '127.0.0.1',\n /**\n * Sentinel interno: permite links relativos / `file://` (hostname vazio)\n * no LinkDecorator — só para simulação local dos examples.\n */\n 'local',\n] as const;\n\n/** Ambiente padrão do auto-init do bundle global IIFE (não da factory programática). */\nexport const BEMONY_DEFAULT_BROWSER_ENVIRONMENT =\n 'production' as const satisfies BemonyEnvironment;\n\n/** Cenário padrão do auto-init do bundle global IIFE. */\nexport const BEMONY_DEFAULT_BROWSER_SCENARIO =\n 'offer-page' as const satisfies BemonyScenario;\n\n/**\n * Defaults oficiais do auto-init browser (IIFE global).\n * Imutável — merge deve clonar, nunca mutar.\n */\nexport const BEMONY_BROWSER_AUTO_INIT_DEFAULTS = Object.freeze({\n environment: BEMONY_DEFAULT_BROWSER_ENVIRONMENT,\n scenario: BEMONY_DEFAULT_BROWSER_SCENARIO,\n platform: Object.freeze({\n pixelId: BEMONY_DEFAULT_PIXEL_ID,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n allowedDomains: Object.freeze([...BEMONY_DEFAULT_ALLOWED_DOMAINS]),\n }),\n});\n\nexport type BemonyPlatformDefaults = {\n app: {\n source: 'bemony';\n };\n storage: {\n prefix: typeof BEMONY_STORAGE_PREFIX;\n namespace: typeof BEMONY_DEFAULT_NAMESPACE;\n persistence: {\n visitor: 'localStorage';\n session: 'sessionStorage';\n attribution: 'localStorage';\n };\n };\n attribution: {\n enabled: true;\n persist: true;\n captureUrlParams: true;\n captureCookies: true;\n };\n};\n\nexport const BEMONY_PLATFORM_DEFAULTS: BemonyPlatformDefaults = {\n app: {\n source: 'bemony',\n },\n storage: {\n prefix: BEMONY_STORAGE_PREFIX,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n persistence: {\n visitor: 'localStorage',\n session: 'sessionStorage',\n attribution: 'localStorage',\n },\n },\n attribution: {\n enabled: true,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n },\n};\n\n/**\n * Opções de plataforma injetadas pelo app (sem hardcode de credenciais/endpoints).\n */\nexport type BemonyPlatformOptions = {\n /** Identidade obrigatória do pixel. */\n pixelId: string;\n /**\n * Endpoint base da API Pixel.\n * Obrigatório em staging/production; opcional em development (mock).\n * Não inventar URL — injetar valor aprovado (env/provider).\n */\n apiEndpoint?: string;\n /** Namespace estável por aplicação (não por página/oferta). */\n namespace?: string;\n /** Domínios aprovados para link decoration. */\n allowedDomains?: readonly string[];\n /** Override explícito de debug (senão segue o ambiente). */\n debug?: boolean;\n};\n\n/**\n * Aplica defaults de plataforma sobre um PixelConfig base (mutação controlada via retorno novo).\n */\nexport function applyBemonyPlatformDefaults(\n base: PixelConfig,\n platform: BemonyPlatformOptions\n): PixelConfig {\n const namespace = platform.namespace ?? BEMONY_DEFAULT_NAMESPACE;\n\n return {\n ...base,\n app: {\n ...base.app,\n source: BEMONY_PLATFORM_DEFAULTS.app.source,\n },\n identity: {\n ...base.identity,\n pixelId: platform.pixelId,\n },\n storage: {\n ...base.storage,\n prefix: BEMONY_PLATFORM_DEFAULTS.storage.prefix,\n namespace,\n persistence: {\n ...base.storage.persistence,\n ...BEMONY_PLATFORM_DEFAULTS.storage.persistence,\n },\n },\n attribution: {\n ...base.attribution,\n ...BEMONY_PLATFORM_DEFAULTS.attribution,\n customClickIdParams: base.attribution.customClickIdParams\n ? [...base.attribution.customClickIdParams]\n : [],\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { UrlLinkDecorationConfig } from '@beworke/pixel/config';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\n/**\n * Política de decoração de links Bemony.\n * `allowedDomains` filtra destinos; `selector` opcional restringe quais âncoras.\n */\nexport type BemonyLinkPolicy = {\n /** Domínios aprovados para decoração (`sid`, `afid`, forwards). */\n allowedDomains: string[];\n /**\n * CSS selector de CTAs (ex.: upsell accept/decline).\n * Sem selector, o Core usa `a[href]` e filtra só por domínio.\n */\n selector?: string;\n strategy: NonNullable<UrlLinkDecorationConfig['strategy']>;\n preserveExisting: boolean;\n overwriteExisting: boolean;\n decorateMailto: boolean;\n decorateTel: boolean;\n decorateHashLinks: boolean;\n mergeDefaultExcludedDomains: boolean;\n mergeDefaultExcludeSelectors: boolean;\n excludeSelectors?: string[];\n};\n\n/** Selector legado de offer-page (export estável). */\nexport const DEFAULT_BEMONY_LINK_SELECTOR = '[data-bemony-offer][href]';\n\nexport type CreateBemonyLinkPolicyOptions = {\n allowedDomains?: readonly string[];\n /** Restringe decoração a CTAs (ex.: `BEMONY_UPSELL_LINK_SELECTOR`). */\n selector?: string;\n strategy?: BemonyLinkPolicy['strategy'];\n preserveExisting?: boolean;\n overwriteExisting?: boolean;\n excludeSelectors?: readonly string[];\n};\n\n/**\n * Normaliza domínio: lowercase, sem protocolo/path/query/hash/porta.\n */\nexport function normalizeAllowedDomain(domain: string): string {\n let value = domain.trim().toLowerCase();\n value = value.replace(/^https?:\\/\\//, '');\n value = value.split('/')[0] ?? value;\n value = value.split('?')[0] ?? value;\n value = value.split('#')[0] ?? value;\n // remove porta explícita se presente (ex.: host:443)\n const withoutPort = value.replace(/:\\d+$/, '');\n return withoutPort;\n}\n\n/**\n * Normaliza, deduplica e remove entradas vazias.\n */\nexport function normalizeAllowedDomains(domains: readonly string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const raw of domains) {\n const normalized = normalizeAllowedDomain(raw);\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nexport function createBemonyLinkPolicy(\n options: CreateBemonyLinkPolicyOptions = {}\n): BemonyLinkPolicy {\n const sourceDomains =\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? options.allowedDomains\n : BEMONY_DEFAULT_ALLOWED_DOMAINS;\n\n const allowedDomains = normalizeAllowedDomains([...sourceDomains]);\n\n const selector = options.selector?.trim();\n\n return {\n allowedDomains,\n ...(selector ? { selector } : {}),\n strategy: options.strategy ?? 'both',\n preserveExisting: options.preserveExisting ?? true,\n overwriteExisting: options.overwriteExisting ?? false,\n decorateMailto: false,\n decorateTel: false,\n decorateHashLinks: false,\n mergeDefaultExcludedDomains: true,\n mergeDefaultExcludeSelectors: true,\n excludeSelectors: options.excludeSelectors\n ? [...options.excludeSelectors]\n : undefined,\n };\n}\n\n/**\n * Converte política em config do Core (`selector` só se definido na policy).\n */\nexport function linkPolicyToDecorationConfig(\n policy: BemonyLinkPolicy\n): UrlLinkDecorationConfig {\n return {\n enabled: true,\n strategy: policy.strategy,\n allowedDomains: [...policy.allowedDomains],\n ...(policy.selector ? { selector: policy.selector } : {}),\n preserveExisting: policy.preserveExisting,\n overwriteExisting: policy.overwriteExisting,\n decorateMailto: policy.decorateMailto,\n decorateTel: policy.decorateTel,\n decorateHashLinks: policy.decorateHashLinks,\n mergeDefaultExcludedDomains: policy.mergeDefaultExcludedDomains,\n mergeDefaultExcludeSelectors: policy.mergeDefaultExcludeSelectors,\n ...(policy.excludeSelectors\n ? { excludeSelectors: [...policy.excludeSelectors] }\n : {}),\n };\n}\n\n/**\n * Extrai a política efetiva a partir de um PixelConfig já composto.\n */\nexport function readLinkPolicyFromConfig(\n config: PixelConfig\n): UrlLinkDecorationConfig | undefined {\n return config.modules.core.urlContext?.linkDecoration;\n}\n","import type {\n UrlContextConfig,\n UrlManagedParamConfig,\n} from '@beworke/pixel/config';\nimport {\n createBemonyLinkPolicy,\n linkPolicyToDecorationConfig,\n type CreateBemonyLinkPolicyOptions,\n} from './BemonyLinkPolicy';\n\n/** Managed param oficial do sid público (≠ session_id interno). */\nexport const BEMONY_SID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'public_session',\n param: 'sid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n generator: { type: 'public_id', prefix: 'sid' },\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'sid',\n },\n decorateLinks: true,\n};\n\n/**\n * Managed param oficial do afiliado (`afid`).\n * Nunca possui generator — o Pixel não cria afiliado.\n */\nexport const BEMONY_AFID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'affiliate',\n param: 'afid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'afid',\n },\n decorateLinks: true,\n};\n\n/**\n * Managed param oficial da Order pública (`oid`).\n * Sem generator — Order é criada pelo checkout/backend; Pixel só persiste/propaga\n * via setPublicOrderId ou params públicos já presentes na URL.\n */\nexport const BEMONY_OID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'order_id',\n param: 'oid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'oid',\n },\n decorateLinks: true,\n};\n\n/** Funnel id público (`fid`). Sem generator. */\nexport const BEMONY_FID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'funnel_id',\n param: 'fid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'fid',\n },\n decorateLinks: true,\n};\n\n/** Funnel step id público (`fsid`). Sem generator. */\nexport const BEMONY_FSID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'funnel_step_id',\n param: 'fsid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'fsid',\n },\n decorateLinks: true,\n};\n\n/**\n * Params que nunca devem ser capturados/encaminhados pelo UrlContext.\n */\nexport const BEMONY_FORWARD_DENYLIST: readonly string[] = [\n 'token',\n 'one_click_token',\n 'oneclicktoken',\n 'oneClickToken',\n 'ephemeral_token',\n 'payment_token',\n 'access_token',\n 'refresh_token',\n 'id_token',\n 'auth_token',\n 'secret',\n 'password',\n 'pass',\n 'pwd',\n 'email',\n 'phone',\n 'cpf',\n 'cnpj',\n 'document',\n 'card',\n 'cc',\n 'credit_card',\n 'pan',\n 'cvv',\n 'cvc',\n 'auth',\n 'code',\n 'sessionid',\n 'internalsessionid',\n 'pixelsessionid',\n] as const;\n\nexport type ConfigureBemonyLinksOptions = CreateBemonyLinkPolicyOptions & {\n /** Quando false, não inclui o managed param `sid`. Default: true. */\n includeSidManagedParam?: boolean;\n /** Quando false, não inclui o managed param `afid`. Default: true. */\n includeAfidManagedParam?: boolean;\n /** Quando false, não inclui o managed param `oid`. Default: true (todos os scenarios). */\n includeOidManagedParam?: boolean;\n /** Quando false, não inclui `fid`/`fsid`. Default: true. */\n includeFunnelManagedParams?: boolean;\n};\n\nfunction cloneManagedParam(\n param: UrlManagedParamConfig\n): UrlManagedParamConfig {\n return {\n ...param,\n ...(param.generator ? { generator: { ...param.generator } } : {}),\n ...(param.persistence\n ? {\n persistence: {\n ...param.persistence,\n ...(param.persistence.cookie\n ? { cookie: { ...param.persistence.cookie } }\n : {}),\n },\n }\n : {}),\n };\n}\n\n/**\n * Produz `PixelConfig.modules.core.urlContext` para cenários Bemony.\n */\nexport function configureBemonyLinks(\n options: ConfigureBemonyLinksOptions = {}\n): UrlContextConfig {\n const policy = createBemonyLinkPolicy(options);\n const includeSid = options.includeSidManagedParam !== false;\n const includeAfid = options.includeAfidManagedParam !== false;\n const includeOid = options.includeOidManagedParam !== false;\n const includeFunnel = options.includeFunnelManagedParams !== false;\n const managedParams: UrlManagedParamConfig[] = [];\n if (includeSid) {\n managedParams.push(cloneManagedParam(BEMONY_SID_MANAGED_PARAM));\n }\n if (includeAfid) {\n managedParams.push(cloneManagedParam(BEMONY_AFID_MANAGED_PARAM));\n }\n if (includeOid) {\n managedParams.push(cloneManagedParam(BEMONY_OID_MANAGED_PARAM));\n }\n if (includeFunnel) {\n managedParams.push(cloneManagedParam(BEMONY_FID_MANAGED_PARAM));\n managedParams.push(cloneManagedParam(BEMONY_FSID_MANAGED_PARAM));\n }\n\n const denylist = [...BEMONY_FORWARD_DENYLIST];\n\n return {\n enabled: true,\n queryParams: {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n denylist: [...denylist],\n },\n managedParams,\n forwardParams: {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n denylist: [...denylist],\n },\n linkDecoration: linkPolicyToDecorationConfig(policy),\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { BemonyValidationError } from '../domain/BemonyPageContext';\n\nexport type BemonyEnvironment = 'development' | 'staging' | 'production';\n\nexport const BEMONY_ENVIRONMENTS: readonly BemonyEnvironment[] = [\n 'development',\n 'staging',\n 'production',\n] as const;\n\nexport type BemonyEnvironmentResolution = {\n environment: BemonyEnvironment;\n debug: boolean;\n /** Endpoint efetivo (pode ser '' em development com mock). */\n apiEndpoint: string;\n transportEnabled: boolean;\n senderMode: 'mock' | 'http';\n};\n\nexport type ResolveBemonyEnvironmentOptions = {\n environment: BemonyEnvironment;\n apiEndpoint?: string;\n debugOverride?: boolean;\n};\n\nfunction isNonEmptyEndpoint(value: string | undefined): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Resolve comportamento por ambiente.\n * Staging/production exigem endpoint injetado — nenhum URL inventado.\n */\nexport function resolveBemonyEnvironment(\n options: ResolveBemonyEnvironmentOptions\n): BemonyEnvironmentResolution {\n const { environment } = options;\n\n if (environment === 'development') {\n return {\n environment,\n debug: options.debugOverride ?? true,\n apiEndpoint: isNonEmptyEndpoint(options.apiEndpoint)\n ? options.apiEndpoint.trim()\n : '',\n transportEnabled: false,\n senderMode: 'mock',\n };\n }\n\n if (environment === 'staging' || environment === 'production') {\n if (!isNonEmptyEndpoint(options.apiEndpoint)) {\n throw new BemonyValidationError({\n code: 'MISSING_ENDPOINT',\n field: 'apiEndpoint',\n message: `apiEndpoint is required for environment \"${environment}\". Inject an approved endpoint; do not hardcode credentials.`,\n });\n }\n\n return {\n environment,\n debug: options.debugOverride ?? false,\n apiEndpoint: options.apiEndpoint.trim(),\n transportEnabled: true,\n senderMode: 'http',\n };\n }\n\n throw new BemonyValidationError({\n code: 'INVALID_ENVIRONMENT',\n field: 'environment',\n message: 'Unsupported Bemony environment.',\n });\n}\n\n/**\n * Aplica resolução de ambiente sobre um PixelConfig (retorno novo).\n */\nexport function applyBemonyEnvironment(\n base: PixelConfig,\n resolution: BemonyEnvironmentResolution\n): PixelConfig {\n return {\n ...base,\n app: {\n ...base.app,\n environment: resolution.environment,\n debug: resolution.debug,\n },\n transport: {\n ...base.transport,\n apiEndpoint: resolution.apiEndpoint,\n },\n modules: {\n ...base.modules,\n transport: {\n ...base.modules.transport,\n enabled: resolution.transportEnabled,\n sender: {\n ...base.modules.transport.sender,\n mode: resolution.senderMode,\n },\n mockSender: {\n ...base.modules.transport.mockSender,\n enabled: resolution.senderMode === 'mock',\n },\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\nexport type ApplyCheckoutScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n /**\n * Quando false, não registra o detector lifecycle de INITIATE_CHECKOUT.\n * O wrapper também respeita a mesma flag em `maybeAutoInitiateCheckout`.\n * Default: true.\n */\n autoInitiateCheckout?: boolean;\n /**\n * Quando false, não inclui o managed param `oid`. Default: true.\n */\n includeOidManagedParam?: boolean;\n};\n\nfunction resolveMainProductId(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): string | undefined {\n if (!products || products.length === 0) {\n return undefined;\n }\n const main = products.find(product => product.type === 'main');\n return (main ?? products[0])?.id;\n}\n\n/**\n * Preset do cenário `checkout` (domínio Bemony).\n *\n * - target `checkout`\n * - commerce mode `checkout`\n * - PAGE_VIEW pelo Core\n * - INITIATE_CHECKOUT via wrapper (auto pós-init, idempotente)\n * - manual: lead, addToCart, removeFromCart, addPaymentInfo\n * - purchase manual desabilitado (browser não emite purchase)\n */\nexport function applyCheckoutScenario(\n base: PixelConfig,\n options: ApplyCheckoutScenarioOptions = {\n autoInitiateCheckout: true,\n includeOidManagedParam: true,\n }\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const mainProductId = resolveMainProductId(products);\n const autoInitiateCheckout = options.autoInitiateCheckout !== false;\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({\n allowedDomains,\n includeOidManagedParam: options.includeOidManagedParam ?? true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n lead: { enabled: true },\n addToCart: { enabled: true },\n removeFromCart: { enabled: true },\n initiateCheckout: { enabled: true },\n addPaymentInfo: { enabled: true },\n viewContent: { enabled: false },\n pageView: { enabled: false },\n purchase: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'checkout',\n source: 'bemony',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: 'checkout',\n initialItems: mainProductId\n ? [{ productId: mainProductId, quantity: 1 }]\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n initiateCheckout: { enabled: true, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n removeFromCart: { enabled: true, source: 'event_or_cart' },\n addPaymentInfo: { enabled: true, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n viewContent: { enabled: false, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [\n {\n name: 'main-product-after-contact',\n type: 'form',\n selectorForm: {\n fields: ['email', 'phone'],\n mode: 'all',\n formSelector: '#checkout-form',\n trigger: 'input',\n debounceMs: 300,\n fireOnce: true,\n },\n },\n {\n name: 'product-or-bump-click',\n type: 'selector',\n selector: 'add_to_cart',\n selectorType: 'attribute',\n trigger: 'click',\n fireOnce: false,\n },\n ],\n },\n removeFromCart: {\n enabled: true,\n sources: [\n {\n name: 'remove-product-click',\n type: 'selector',\n selector: 'remove_from_cart',\n selectorType: 'attribute',\n trigger: 'click',\n },\n ],\n },\n initiateCheckout: {\n enabled: autoInitiateCheckout,\n sources: autoInitiateCheckout\n ? [\n {\n name: 'checkout-loaded',\n type: 'lifecycle',\n trigger: 'ready',\n fireOnce: true,\n },\n ]\n : [],\n },\n addPaymentInfo: {\n enabled: true,\n sources: [\n {\n name: 'credit-card-detection',\n type: 'payment',\n paymentMethod: 'CREDIT_CARD',\n cardDetection: true,\n autoDispatch: true,\n formSelector: '#checkout-form',\n fireOnce: true,\n },\n {\n name: 'payment-button-click',\n type: 'selector',\n selector: '[data-track=\"add_payment_info\"]',\n selectorType: 'css',\n trigger: 'click',\n fireOnce: false,\n },\n ],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\n\nexport type ApplyOneClickCheckoutScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n};\n\nfunction resolveCartMode(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): 'checkout' | 'upsell' {\n const list = products ?? [];\n const isUpsellLike = list.some(\n product => product.type === 'upsell' || product.type === 'downsell'\n );\n return isUpsellLike ? 'upsell' : 'checkout';\n}\n\nfunction resolvePrimaryProductId(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): string | undefined {\n if (!products || products.length === 0) {\n return undefined;\n }\n const preferred = products.find(\n product =>\n product.type === 'upsell' ||\n product.type === 'downsell' ||\n product.type === 'main'\n );\n return (preferred ?? products[0])?.id;\n}\n\n/**\n * Preset do cenário `one-click-checkout`.\n *\n * Tracking apenas: PAGE_VIEW + INITIATE_CHECKOUT.\n * Pagamento e PURCHASE ficam no backend/app — o Pixel não é SDK de pagamentos.\n */\nexport function applyOneClickCheckoutScenario(\n base: PixelConfig,\n options: ApplyOneClickCheckoutScenarioOptions = {}\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const cartMode = resolveCartMode(products);\n const primaryId = resolvePrimaryProductId(products);\n const urlContext = configureBemonyLinks({\n allowedDomains: options.allowedDomains ? [...options.allowedDomains] : [],\n includeOidManagedParam: true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n initiateCheckout: { enabled: true },\n addToCart: { enabled: true },\n viewContent: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n addPaymentInfo: { enabled: false },\n pageView: { enabled: false },\n purchase: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'checkout',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: cartMode,\n initialItems: primaryId ? [{ productId: primaryId, quantity: 1 }] : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n initiateCheckout: { enabled: true, source: 'cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n viewContent: { enabled: false, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: false,\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { LinkAutoSource } from '@beworke/pixel/config';\nimport { normalizeAllowedDomains } from './BemonyLinkPolicy';\n\n/**\n * Cria a `LinkAutoSource` oficial de ofertas Bemony.\n *\n * - Match por hostname permitido + segmento de path `pri*`\n * - Extrai `priceCode` do último segmento do path\n * - Sem catálogo: o Core recebe priceCode via binding; o mapper usa-o como identidade\n */\nexport function createBemonyOfferLinkSource(\n allowedDomains: readonly string[]\n): LinkAutoSource {\n const hostnames = normalizeAllowedDomains([...allowedDomains]).filter(\n host => host !== 'local'\n );\n\n return {\n name: 'bemony-offer-link',\n type: 'link',\n enabled: true,\n trigger: 'click',\n fireOnce: false,\n match: {\n protocols: ['https:', 'http:'],\n hostnames,\n path: {\n segmentPrefixes: ['pri'],\n },\n },\n bindings: {\n // Core LinkAuto reconhece priceCode; productId no evento = priceCode observado.\n priceCode: {\n from: {\n source: 'pathSegment',\n index: -1,\n },\n required: true,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { CommerceCartMode } from '@beworke/pixel/config';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { createBemonyOfferLinkSource } from '../navigation/createBemonyOfferLinkSource';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\n\nexport type OfferPageCartMode = Extract<\n CommerceCartMode,\n 'landing_page' | 'single_product'\n>;\n\nexport type ApplyOfferPageScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n cartMode?: OfferPageCartMode;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n};\n\n/**\n * Preset do cenário `offer-page` (domínio do cliente / VSL).\n *\n * - target `landing`\n * - commerce `landing_page` | `single_product`\n * - PAGE_VIEW pelo Core\n * - conversion manual: viewContent + addToCart\n * - UrlContext (sid + afid) por allowedDomains\n * - LinkAutoSource: ADD_TO_CART em segmentos `pri*` sem data attributes\n */\nexport function applyOfferPageScenario(\n base: PixelConfig,\n options: ApplyOfferPageScenarioOptions = {}\n): PixelConfig {\n const cartMode: OfferPageCartMode = options.cartMode ?? 'landing_page';\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({ allowedDomains });\n const offerLinkSource = createBemonyOfferLinkSource(allowedDomains);\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n viewContent: { enabled: true },\n addToCart: { enabled: true },\n // Offer page não emite estes manualmente nesta etapa.\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'landing',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: cartMode,\n initialItems: base.commerce.cart?.initialItems\n ? base.commerce.cart.initialItems.map(item => ({ ...item }))\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n viewContent: { enabled: true, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [offerLinkSource],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\n\nexport type ApplyThankYouScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n};\n\n/**\n * Preset do cenário `thank-you`.\n *\n * - target `custom`\n * - PAGE_VIEW no init (Core)\n * - sem PURCHASE browser\n * - sem auto checkout / conversion manual\n * - contexto público mínimo (pageId; publicOrderId só no domínio do app)\n */\nexport function applyThankYouScenario(\n base: PixelConfig,\n options: ApplyThankYouScenarioOptions = {}\n): PixelConfig {\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const urlContext = configureBemonyLinks({\n allowedDomains: options.allowedDomains ? [...options.allowedDomains] : [],\n includeOidManagedParam: true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n addToCart: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n viewContent: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'custom',\n },\n commerce: {\n ...base.commerce,\n enabled: false,\n currency,\n catalog: { products: [] },\n cart: {\n ...base.commerce.cart,\n mode: 'custom',\n initialItems: [],\n allowDynamicItems: false,\n calculateValueFrom: 'cart',\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n purchase: { enabled: false, source: 'cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: false,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: false,\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { createBemonyOfferLinkSource } from '../navigation/createBemonyOfferLinkSource';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\n/** Base: buy `/pri*` + offer-page legado. No-thanks entra via `buildUpsellLinkSelector`. */\nexport const BEMONY_UPSELL_BUY_LINK_SELECTOR =\n 'a[href*=\"pri\"], [data-bemony-offer][href]';\n\n/**\n * Selector estático sem no-thanks (compat / testes sem URL).\n * Preferir `buildUpsellLinkSelector(noThanksUrl)` quando `data-no-thanks` existir no script.\n */\nexport const BEMONY_UPSELL_LINK_SELECTOR = BEMONY_UPSELL_BUY_LINK_SELECTOR;\n\n/** Escapa valor para uso em seletor CSS `attr=\"…\"`. */\nexport function escapeCssAttributeValue(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Política de decoração upsell/downsell.\n * - buy: `href` com `pri*`\n * - no-thanks: âncora cujo `href` coincide com `data-no-thanks` do script\n */\nexport function buildUpsellLinkSelector(noThanksUrl?: string): string {\n const raw = noThanksUrl?.trim();\n if (!raw) {\n return BEMONY_UPSELL_BUY_LINK_SELECTOR;\n }\n return `${BEMONY_UPSELL_BUY_LINK_SELECTOR}, a[href=\"${escapeCssAttributeValue(raw)}\"]`;\n}\n\n/**\n * Compara href do link com a URL do script (`data-no-thanks`),\n * resolvendo relativos contra a página atual.\n */\nexport function hrefMatchesNoThanksUrl(\n href: string | null | undefined,\n noThanksUrl: string,\n baseHref?: string\n): boolean {\n const linkHref = href?.trim();\n const targetRaw = noThanksUrl.trim();\n if (!linkHref || linkHref === '#' || !targetRaw) {\n return false;\n }\n if (linkHref === targetRaw) {\n return true;\n }\n try {\n const base =\n baseHref ??\n (typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/');\n const left = new URL(linkHref, base);\n const right = new URL(targetRaw, base);\n left.hash = '';\n right.hash = '';\n return left.href === right.href;\n } catch {\n return false;\n }\n}\n\nexport type ApplyUpsellOfferScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n includeOidManagedParam?: boolean;\n /** URL de recusa (`data-no-thanks` no script) — entra no selector de decoração. */\n noThanksUrl?: string;\n};\n\n/**\n * Preset do cenário `upsell-offer` (domínio do cliente, pós-compra).\n *\n * - target `custom`\n * - commerce mode `upsell` (sem catálogo obrigatório; priceCode via URL)\n * - PAGE_VIEW pelo Core\n * - conversion: ADD_TO_CART automático em links `/pri*` (mesmo source do offer-page)\n * - UrlContext decora buy `/pri*` + no-thanks (href = script data-no-thanks)\n *\n * GAP: sem evento de decline no Core — `declineUpsell` não emite conversion.\n */\nexport function applyUpsellOfferScenario(\n base: PixelConfig,\n options: ApplyUpsellOfferScenarioOptions = {}\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({\n allowedDomains,\n selector: buildUpsellLinkSelector(options.noThanksUrl),\n includeOidManagedParam: options.includeOidManagedParam ?? true,\n });\n const offerLinkSource = createBemonyOfferLinkSource(allowedDomains);\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n viewContent: { enabled: true },\n addToCart: { enabled: true },\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'custom',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: 'upsell',\n initialItems: [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n viewContent: { enabled: true, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n initiateCheckout: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [offerLinkSource],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import { DEFAULT_PIXEL_CONFIG, type PixelConfig } from '@beworke/pixel';\nimport type {\n CommerceCartMode,\n CommerceProduct,\n PixelTarget,\n ProductType,\n} from '@beworke/pixel/config';\nimport {\n normalizeBemonyPageContextInput,\n type BemonyCommerceInput,\n type BemonyPageContextInput,\n type BemonyPublicPageContext,\n} from './domain/BemonyPageContext';\nimport { resolveBemonyPageContext } from './domain/resolveBemonyPageContext';\nimport { validateBemonyPageContext } from './domain/validateBemonyPageContext';\nimport { configureBemonyLinks } from './navigation/configureBemonyLinks';\nimport {\n applyBemonyPlatformDefaults,\n type BemonyPlatformOptions,\n} from './platform/defaults';\nimport {\n applyBemonyEnvironment,\n resolveBemonyEnvironment,\n type BemonyEnvironment,\n} from './platform/environments';\nimport { applyCheckoutScenario } from './scenarios/checkout';\nimport { applyOneClickCheckoutScenario } from './scenarios/one-click-checkout';\nimport {\n applyOfferPageScenario,\n type OfferPageCartMode,\n} from './scenarios/offer-page';\nimport { applyThankYouScenario } from './scenarios/thank-you';\nimport { applyUpsellOfferScenario } from './scenarios/upsell-offer';\nimport type { BemonyScenario } from './scenarios/types';\n\n/**\n * Overrides restritos e tipados (não expor Partial<PixelConfig>).\n */\nexport type BemonyConfigOverrides = {\n debug?: boolean;\n apiEndpoint?: string;\n allowedDomains?: readonly string[];\n};\n\nexport type CreateBemonyPixelConfigOptions = {\n environment: BemonyEnvironment;\n scenario: BemonyScenario;\n platform: BemonyPlatformOptions;\n page?: BemonyPageContextInput | BemonyPublicPageContext;\n commerce?: BemonyCommerceInput;\n /** Params públicos já filtrados da URL (sem token). */\n urlParams?: Readonly<Record<string, string>>;\n pageMetadata?: BemonyPublicPageContext;\n scenarioDefaults?: BemonyPublicPageContext;\n overrides?: BemonyConfigOverrides;\n /**\n * Quando false, desativa auto `startCheckout` no init (checkout).\n * Default: true no cenário checkout.\n */\n autoInitiateCheckout?: boolean;\n /**\n * URL de “No Thanks” para upsell/downsell (`data-no-thanks` no script).\n */\n noThanksUrl?: string;\n};\n\nconst SCENARIO_TARGET: Record<BemonyScenario, PixelTarget> = {\n 'offer-page': 'landing',\n checkout: 'checkout',\n 'upsell-offer': 'custom',\n 'one-click-checkout': 'checkout',\n 'thank-you': 'custom',\n};\n\nconst SCENARIO_CART_MODE: Record<BemonyScenario, CommerceCartMode> = {\n 'offer-page': 'landing_page',\n checkout: 'checkout',\n 'upsell-offer': 'upsell',\n 'one-click-checkout': 'checkout',\n 'thank-you': 'custom',\n};\n\nconst PRODUCT_TYPES: ReadonlySet<string> = new Set([\n 'main',\n 'order_bump',\n 'upsell',\n 'downsell',\n 'cross_sell',\n 'addon',\n 'subscription',\n 'custom',\n 'other',\n]);\n\nfunction cloneProducts(\n products: BemonyCommerceInput['products']\n): CommerceProduct[] {\n if (!products) {\n return [];\n }\n return products.map(product => {\n const type =\n product.type && PRODUCT_TYPES.has(product.type)\n ? (product.type as ProductType)\n : undefined;\n return {\n id: product.id,\n ...(product.name !== undefined ? { name: product.name } : {}),\n ...(type !== undefined ? { type } : {}),\n ...(product.price !== undefined ? { price: product.price } : {}),\n ...(product.currency !== undefined ? { currency: product.currency } : {}),\n ...(product.quantity !== undefined ? { quantity: product.quantity } : {}),\n };\n });\n}\n\nfunction resolveOfferPageCartMode(\n commerce: BemonyCommerceInput | undefined\n): OfferPageCartMode {\n if (commerce?.cartMode === 'single_product') {\n return 'single_product';\n }\n return 'landing_page';\n}\n\nfunction mapPublicContextToIdentity(\n base: PixelConfig['identity'],\n publicContext: BemonyPublicPageContext\n): PixelConfig['identity'] {\n return {\n ...base,\n ...(publicContext.pageId !== undefined\n ? { pageId: publicContext.pageId }\n : {}),\n ...(publicContext.funnelId !== undefined\n ? { funnelId: publicContext.funnelId }\n : {}),\n ...(publicContext.funnelStepId !== undefined\n ? { funnelStepId: publicContext.funnelStepId }\n : {}),\n ...(publicContext.offerId !== undefined\n ? { offerId: publicContext.offerId }\n : {}),\n ...(publicContext.affiliateId !== undefined\n ? { affiliateId: publicContext.affiliateId }\n : {}),\n ...(publicContext.checkoutId !== undefined\n ? { checkoutId: publicContext.checkoutId }\n : {}),\n };\n}\n\n/**\n * Preset mínimo para cenários ainda sem implementação dedicada (B4+).\n */\nfunction applyMinimalScenarioPreset(\n base: PixelConfig,\n scenario: BemonyScenario,\n commerce: BemonyCommerceInput | undefined,\n allowedDomains: readonly string[] | undefined\n): PixelConfig {\n const products = cloneProducts(commerce?.products);\n const currency = commerce?.currency ?? base.commerce.currency ?? 'BRL';\n const urlContext = configureBemonyLinks({\n allowedDomains: allowedDomains ? [...allowedDomains] : [],\n });\n\n return {\n ...base,\n app: {\n ...base.app,\n target: SCENARIO_TARGET[scenario],\n debug: true,\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: {\n products,\n },\n cart: {\n ...base.commerce.cart,\n mode: SCENARIO_CART_MODE[scenario],\n initialItems: base.commerce.cart?.initialItems\n ? base.commerce.cart.initialItems.map(item => ({ ...item }))\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: false,\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n\nfunction applyScenarioPreset(\n base: PixelConfig,\n scenario: BemonyScenario,\n commerce: BemonyCommerceInput | undefined,\n allowedDomains: readonly string[] | undefined,\n autoInitiateCheckout?: boolean,\n noThanksUrl?: string\n): PixelConfig {\n if (scenario === 'offer-page') {\n return applyOfferPageScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n cartMode: resolveOfferPageCartMode(commerce),\n products: cloneProducts(commerce?.products),\n });\n }\n\n if (scenario === 'checkout') {\n return applyCheckoutScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n autoInitiateCheckout,\n });\n }\n\n if (scenario === 'upsell-offer') {\n return applyUpsellOfferScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n ...(noThanksUrl ? { noThanksUrl } : {}),\n });\n }\n\n if (scenario === 'one-click-checkout') {\n return applyOneClickCheckoutScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n });\n }\n\n if (scenario === 'thank-you') {\n return applyThankYouScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n });\n }\n\n return applyMinimalScenarioPreset(base, scenario, commerce, allowedDomains);\n}\n\n/**\n * Compõe um PixelConfig válido para Bemony.\n *\n * Ordem: DEFAULT_PIXEL_CONFIG → platform → environment → scenario → page → overrides.\n * Nunca inclui token efêmero. Não muta o input. Clona arrays.\n */\nexport function createBemonyPixelConfig(\n options: CreateBemonyPixelConfigOptions\n): PixelConfig {\n const pageInput = normalizeBemonyPageContextInput(options.page);\n const resolvedPublic = resolveBemonyPageContext({\n input: pageInput.public,\n urlParams: options.urlParams,\n pageMetadata: options.pageMetadata,\n scenarioDefaults: options.scenarioDefaults,\n });\n\n const validatedPublic = validateBemonyPageContext({\n scenario: options.scenario,\n publicContext: resolvedPublic,\n });\n\n const apiEndpoint =\n options.overrides?.apiEndpoint ?? options.platform.apiEndpoint;\n const debugOverride = options.overrides?.debug ?? options.platform.debug;\n const allowedDomains =\n options.overrides?.allowedDomains ?? options.platform.allowedDomains;\n\n const envResolution = resolveBemonyEnvironment({\n environment: options.environment,\n apiEndpoint,\n debugOverride,\n });\n\n let config: PixelConfig = {\n ...DEFAULT_PIXEL_CONFIG,\n app: { ...DEFAULT_PIXEL_CONFIG.app },\n identity: { ...DEFAULT_PIXEL_CONFIG.identity },\n transport: { ...DEFAULT_PIXEL_CONFIG.transport },\n storage: {\n ...DEFAULT_PIXEL_CONFIG.storage,\n queue: DEFAULT_PIXEL_CONFIG.storage.queue\n ? { ...DEFAULT_PIXEL_CONFIG.storage.queue }\n : undefined,\n keys: DEFAULT_PIXEL_CONFIG.storage.keys\n ? { ...DEFAULT_PIXEL_CONFIG.storage.keys }\n : undefined,\n persistence: DEFAULT_PIXEL_CONFIG.storage.persistence\n ? { ...DEFAULT_PIXEL_CONFIG.storage.persistence }\n : undefined,\n },\n attribution: {\n ...DEFAULT_PIXEL_CONFIG.attribution,\n customClickIdParams: DEFAULT_PIXEL_CONFIG.attribution.customClickIdParams\n ? [...DEFAULT_PIXEL_CONFIG.attribution.customClickIdParams]\n : [],\n },\n commerce: {\n ...DEFAULT_PIXEL_CONFIG.commerce,\n catalog: {\n products: DEFAULT_PIXEL_CONFIG.commerce.catalog?.products\n ? DEFAULT_PIXEL_CONFIG.commerce.catalog.products.map(p => ({\n ...p,\n }))\n : [],\n },\n cart: {\n ...DEFAULT_PIXEL_CONFIG.commerce.cart,\n initialItems: DEFAULT_PIXEL_CONFIG.commerce.cart?.initialItems\n ? DEFAULT_PIXEL_CONFIG.commerce.cart.initialItems.map(i => ({\n ...i,\n }))\n : [],\n },\n mappings: {\n attributes: {\n ...(DEFAULT_PIXEL_CONFIG.commerce.mappings?.attributes ?? {}),\n },\n fields: { ...(DEFAULT_PIXEL_CONFIG.commerce.mappings?.fields ?? {}) },\n },\n enrichment: { ...(DEFAULT_PIXEL_CONFIG.commerce.enrichment ?? {}) },\n },\n modules: {\n core: { ...DEFAULT_PIXEL_CONFIG.modules.core },\n behavior: { ...DEFAULT_PIXEL_CONFIG.modules.behavior },\n conversion: { ...DEFAULT_PIXEL_CONFIG.modules.conversion },\n transport: {\n ...DEFAULT_PIXEL_CONFIG.modules.transport,\n sender: { ...DEFAULT_PIXEL_CONFIG.modules.transport.sender },\n mockSender: { ...DEFAULT_PIXEL_CONFIG.modules.transport.mockSender },\n },\n integrations: { ...DEFAULT_PIXEL_CONFIG.modules.integrations },\n privacy: { ...DEFAULT_PIXEL_CONFIG.modules.privacy },\n },\n };\n\n config = applyBemonyPlatformDefaults(config, options.platform);\n config = applyBemonyEnvironment(config, envResolution);\n config = applyScenarioPreset(\n config,\n options.scenario,\n options.commerce,\n allowedDomains,\n options.autoInitiateCheckout,\n options.noThanksUrl\n );\n\n config = {\n ...config,\n identity: mapPublicContextToIdentity(config.identity, validatedPublic),\n };\n\n return config;\n}\n","import { prepareJourneyUrlContext, type PixelConfig } from '@beworke/pixel';\nimport {\n createStorageAdapter,\n StorageServiceImpl,\n} from '@beworke/pixel/services';\nimport {\n BemonyPixel,\n type BemonyCorePixel,\n type BemonyPixelConstructOptions,\n} from './BemonyPixel';\nimport {\n createBemonyPixelConfig,\n type CreateBemonyPixelConfigOptions,\n} from './createBemonyPixelConfig';\nimport {\n normalizeBemonyPageContextInput,\n type BemonyPublicPageContext,\n} from './domain/BemonyPageContext';\nimport { resolveBemonyPageContext } from './domain/resolveBemonyPageContext';\nimport { validateBemonyPageContext } from './domain/validateBemonyPageContext';\nimport { configureBemonyLinks } from './navigation/configureBemonyLinks';\n\n/**\n * Opções da factory de lifecycle.\n * Sem contextResolver / catálogo remoto.\n */\nexport type BemonyPixelOptions = CreateBemonyPixelConfigOptions & {\n createCorePixel?: (config: PixelConfig) => BemonyCorePixel;\n};\n\nexport type CreateBemonyPixelOptions = BemonyPixelOptions;\n\nfunction createJourneyStorage(): StorageServiceImpl {\n return new StorageServiceImpl(\n createStorageAdapter('localStorage'),\n 'bemony',\n 'urlctx'\n );\n}\n\nfunction seedJourneyManagedParams(\n journey: ReturnType<typeof prepareJourneyUrlContext>,\n publicContext: BemonyPublicPageContext\n): void {\n if (publicContext.funnelId) {\n journey.setManagedParam('fid', publicContext.funnelId);\n }\n if (publicContext.funnelStepId) {\n journey.setManagedParam('fsid', publicContext.funnelStepId);\n }\n if (publicContext.publicOrderId) {\n journey.setManagedParam('oid', publicContext.publicOrderId);\n }\n if (publicContext.affiliateId) {\n journey.setManagedParam('afid', publicContext.affiliateId);\n }\n}\n\n/**\n * Bootstrap local (sem consulta de catálogo):\n * 1. Normalizar cenário e contexto público\n * 2. Journey UrlContext + managed params\n * 3. PixelConfig\n * 4. Core init + detectores\n *\n * O browser captura priceCode observado; o backend enriquece o evento.\n */\nexport async function createBemonyPixel(\n options: CreateBemonyPixelOptions\n): Promise<BemonyPixel> {\n const pageInput = normalizeBemonyPageContextInput(options.page);\n const publicContext = validateBemonyPageContext({\n scenario: options.scenario,\n publicContext: resolveBemonyPageContext({\n input: pageInput.public,\n urlParams: options.urlParams,\n pageMetadata: options.pageMetadata,\n scenarioDefaults: options.scenarioDefaults,\n }),\n });\n\n const allowedDomains =\n options.overrides?.allowedDomains ?? options.platform.allowedDomains;\n const journeyUrlConfig = configureBemonyLinks({\n allowedDomains: allowedDomains ? [...allowedDomains] : [],\n });\n\n const journeyStorage = createJourneyStorage();\n const journey = prepareJourneyUrlContext(journeyUrlConfig, journeyStorage);\n seedJourneyManagedParams(journey, publicContext);\n\n const config = createBemonyPixelConfig({\n ...options,\n page: { public: publicContext },\n });\n\n const construct: BemonyPixelConstructOptions = {\n config,\n scenario: options.scenario,\n publicOrderId: publicContext.publicOrderId,\n publicContext,\n autoInitiateCheckout: options.autoInitiateCheckout,\n ...(options.noThanksUrl ? { noThanksUrl: options.noThanksUrl } : {}),\n ...(options.createCorePixel\n ? { createCorePixel: options.createCorePixel }\n : {}),\n };\n\n try {\n const instance = new BemonyPixel(construct);\n await instance.init();\n return instance;\n } finally {\n journey.destroy();\n }\n}\n","export type BemonyBootstrapErrorCode =\n | 'NOT_BROWSER'\n | 'CONSENT_DENIED'\n | 'INVALID_ATTRIBUTES'\n | 'FORBIDDEN_ATTRIBUTE'\n | 'MULTIPLE_SCRIPTS'\n | 'AMBIGUOUS_SCRIPT'\n | 'SCRIPT_NOT_FOUND'\n | 'MISSING_CONFIG'\n | 'INVALID_CONFIG'\n | 'AUTO_INIT_DISABLED'\n | 'AUTO_INIT_FAILED'\n | 'MISSING_ENDPOINT';\n\nexport class BemonyBootstrapError extends Error {\n readonly code: BemonyBootstrapErrorCode;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n code: BemonyBootstrapErrorCode,\n cause?: unknown\n ) {\n super(message);\n this.name = 'BemonyBootstrapError';\n this.code = code;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n","import type { BemonyPixel } from '../BemonyPixel';\nimport type { BemonyBootstrapErrorCode } from './errors';\n\nexport const BEMONY_PIXEL_READY_EVENT = 'bemony:pixel:ready' as const;\nexport const BEMONY_PIXEL_ERROR_EVENT = 'bemony:pixel:error' as const;\nexport const BEMONY_PIXEL_INITIALIZING_EVENT =\n 'bemony:pixel:initializing' as const;\nexport const BEMONY_PIXEL_DESTROYED_EVENT = 'bemony:pixel:destroyed' as const;\n\nexport type BemonyPixelReadyDetail = {\n pixel: BemonyPixel;\n};\n\nexport type BemonyPixelErrorDetail = {\n code: BemonyBootstrapErrorCode | string;\n message: string;\n};\n\nfunction safeDispatch(type: string, detail: unknown): void {\n if (typeof window === 'undefined' || typeof CustomEvent === 'undefined') {\n return;\n }\n try {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n } catch {\n // listener externo / ambiente sem CustomEvent não quebra o lifecycle\n }\n}\n\nexport function emitBemonyPixelReady(pixel: BemonyPixel): void {\n safeDispatch(BEMONY_PIXEL_READY_EVENT, {\n pixel,\n } satisfies BemonyPixelReadyDetail);\n}\n\nexport function emitBemonyPixelError(\n code: BemonyBootstrapErrorCode | string,\n message: string\n): void {\n safeDispatch(BEMONY_PIXEL_ERROR_EVENT, {\n code,\n message,\n } satisfies BemonyPixelErrorDetail);\n}\n\nexport function emitBemonyPixelInitializing(): void {\n safeDispatch(BEMONY_PIXEL_INITIALIZING_EVENT, {});\n}\n\nexport function emitBemonyPixelDestroyed(): void {\n safeDispatch(BEMONY_PIXEL_DESTROYED_EVENT, {});\n}\n","import type { BemonyPixel } from '../BemonyPixel';\nimport {\n createBemonyPixel,\n type CreateBemonyPixelOptions,\n} from '../createBemonyPixel';\nimport { BemonyBootstrapError } from './errors';\nimport {\n emitBemonyPixelDestroyed,\n emitBemonyPixelError,\n emitBemonyPixelInitializing,\n emitBemonyPixelReady,\n} from './events';\n\nconst WINDOW_STORE_KEY = '__bemony_pixel_bootstrap__' as const;\n\nexport type BootstrapBemonyPixelOptions = CreateBemonyPixelOptions & {\n /**\n * Destrói a instância atual (se houver) e cria outra.\n * Útil para HMR / reinit controlado.\n */\n force?: boolean;\n /**\n * Gate de consentimento. Se retornar `false`, o bootstrap aborta.\n */\n waitForConsent?: () => boolean | Promise<boolean>;\n};\n\ntype BootstrapStore = {\n instance: BemonyPixel | null;\n pending: Promise<BemonyPixel> | null;\n /** Evita emitir `ready` duas vezes para o mesmo lifecycle. */\n readyEmittedFor: BemonyPixel | null;\n};\n\ntype WindowWithBootstrapStore = Window & {\n [WINDOW_STORE_KEY]?: BootstrapStore;\n};\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined') {\n throw new BemonyBootstrapError(\n 'bootstrapBemonyPixel só pode ser usado no browser (window ausente).',\n 'NOT_BROWSER'\n );\n }\n}\n\nfunction getStore(): BootstrapStore {\n assertBrowser();\n const win = window as WindowWithBootstrapStore;\n if (!win[WINDOW_STORE_KEY]) {\n win[WINDOW_STORE_KEY] = {\n instance: null,\n pending: null,\n readyEmittedFor: null,\n };\n }\n return win[WINDOW_STORE_KEY]!;\n}\n\nfunction isReusableInstance(instance: BemonyPixel): boolean {\n const state = instance.getState();\n return state === 'ready' || state === 'initializing';\n}\n\n/**\n * Bootstrap explícito: uma instância por `window`.\n * SSR-safe no sentido de falhar com erro claro fora do browser.\n */\nexport async function bootstrapBemonyPixel(\n options: BootstrapBemonyPixelOptions\n): Promise<BemonyPixel> {\n assertBrowser();\n const store = getStore();\n const { force = false, waitForConsent, ...pixelOptions } = options;\n\n if (!force) {\n if (store.pending) {\n return store.pending;\n }\n if (store.instance && isReusableInstance(store.instance)) {\n return store.instance;\n }\n }\n\n if (force) {\n if (store.pending) {\n try {\n await store.pending;\n } catch {\n // reinit após falha anterior\n }\n store.pending = null;\n }\n if (store.instance) {\n try {\n await store.instance.destroy();\n } catch {\n // segue recriando\n }\n store.instance = null;\n store.readyEmittedFor = null;\n }\n }\n\n if (waitForConsent) {\n const allowed = await waitForConsent();\n if (!allowed) {\n const error = new BemonyBootstrapError(\n 'Consentimento negado — bootstrap abortado.',\n 'CONSENT_DENIED'\n );\n emitBemonyPixelError(error.code, error.message);\n throw error;\n }\n }\n\n emitBemonyPixelInitializing();\n\n const pending = createBemonyPixel(pixelOptions)\n .then(instance => {\n store.instance = instance;\n if (store.pending === pending) {\n store.pending = null;\n }\n if (store.readyEmittedFor !== instance) {\n emitBemonyPixelReady(instance);\n store.readyEmittedFor = instance;\n }\n return instance;\n })\n .catch((error: unknown) => {\n if (store.pending === pending) {\n store.pending = null;\n }\n const code =\n error instanceof BemonyBootstrapError ? error.code : 'AUTO_INIT_FAILED';\n const message =\n error instanceof Error ? error.message : 'Bootstrap falhou';\n emitBemonyPixelError(code, message);\n throw error;\n });\n\n store.pending = pending;\n return pending;\n}\n\nexport function getBootstrappedBemonyPixel(): BemonyPixel | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const store = (window as WindowWithBootstrapStore)[WINDOW_STORE_KEY];\n return store?.instance ?? null;\n}\n\n/**\n * Promise pendente do bootstrap atual (se houver).\n */\nexport function getBootstrappedBemonyPixelPending(): Promise<BemonyPixel> | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const store = (window as WindowWithBootstrapStore)[WINDOW_STORE_KEY];\n return store?.pending ?? null;\n}\n\n/**\n * Destroi a instância bootstrapada (se existir) e limpa o store da window.\n */\nexport async function destroyBootstrappedBemonyPixel(): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n const store = getStore();\n if (store.pending) {\n try {\n await store.pending;\n } catch {\n // ignore\n }\n store.pending = null;\n }\n if (store.instance) {\n await store.instance.destroy();\n store.instance = null;\n store.readyEmittedFor = null;\n emitBemonyPixelDestroyed();\n }\n}\n\n/** @internal limpa store sem destroy (testes). Preferir destroyBootstrappedBemonyPixel. */\nexport function clearBootstrapStoreForTests(): void {\n if (typeof window === 'undefined') {\n return;\n }\n const win = window as WindowWithBootstrapStore;\n delete win[WINDOW_STORE_KEY];\n}\n","/**\n * Cenários de domínio Bemony (V1).\n * Determinam comportamentos locais (eventos, detectores, params).\n * Nenhum cenário consulta catálogo no bootstrap.\n */\nexport type BemonyScenario =\n | 'offer-page'\n | 'checkout'\n | 'upsell-offer'\n | 'one-click-checkout'\n | 'thank-you';\n\nexport const BEMONY_SCENARIOS: readonly BemonyScenario[] = [\n 'offer-page',\n 'checkout',\n 'upsell-offer',\n 'one-click-checkout',\n 'thank-you',\n] as const;\n","import { BemonyBootstrapError } from './errors';\n\n/** Nome do arquivo do bundle IIFE global. */\nexport const BEMONY_GLOBAL_BUNDLE_FILENAME = 'pixel-bemony.global.js' as const;\n\nconst LEGACY_SCRIPT_SELECTOR = 'script[data-bemony-pixel]';\n\nexport type ResolveBemonyExecutingScriptInput = {\n /** Override de `document.currentScript` (testes). */\n currentScript?: HTMLScriptElement | SVGScriptElement | null;\n /** Documento / raiz para fallbacks (default: `document`). */\n root?: ParentNode;\n};\n\nfunction isHtmlScript(el: Element | null | undefined): el is HTMLScriptElement {\n return (\n !!el &&\n typeof HTMLScriptElement !== 'undefined' &&\n el instanceof HTMLScriptElement\n );\n}\n\n/**\n * Verifica se o `src` do script aponta para o bundle global Bemony.\n * Suporta URL absoluta, relativa, query string e hash.\n */\nexport function isBemonyGlobalBundleSrc(\n src: string | null | undefined\n): boolean {\n if (!src || !src.trim()) {\n return false;\n }\n try {\n const base =\n typeof location !== 'undefined' && location.href\n ? location.href\n : 'https://example.invalid/';\n const url = new URL(src.trim(), base);\n const path = url.pathname.toLowerCase();\n return (\n path === `/${BEMONY_GLOBAL_BUNDLE_FILENAME}` ||\n path.endsWith(`/${BEMONY_GLOBAL_BUNDLE_FILENAME}`)\n );\n } catch {\n const normalized = src.trim().toLowerCase().split(/[?#]/)[0] ?? '';\n return (\n normalized === BEMONY_GLOBAL_BUNDLE_FILENAME ||\n normalized.endsWith(`/${BEMONY_GLOBAL_BUNDLE_FILENAME}`)\n );\n }\n}\n\n/**\n * Localiza o `<script>` que está executando o bundle Bemony.\n *\n * Prioridade:\n * 1. `document.currentScript` (HTMLScriptElement)\n * 2. fallback por `src` contendo `pixel-bemony.global.js`\n * 3. legado `script[data-bemony-pixel]`\n */\nexport function resolveBemonyExecutingScript(\n input: ResolveBemonyExecutingScriptInput = {}\n): HTMLScriptElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const current =\n input.currentScript !== undefined\n ? input.currentScript\n : typeof document.currentScript !== 'undefined'\n ? document.currentScript\n : null;\n\n if (isHtmlScript(current)) {\n return current;\n }\n\n const root = input.root ?? document;\n const allScripts = Array.from(root.querySelectorAll('script'));\n\n const bySrc = allScripts.filter(\n (el): el is HTMLScriptElement =>\n isHtmlScript(el) && isBemonyGlobalBundleSrc(el.getAttribute('src'))\n );\n\n if (bySrc.length === 1) {\n return bySrc[0]!;\n }\n if (bySrc.length > 1) {\n throw new BemonyBootstrapError(\n `Encontrados ${bySrc.length} scripts com src de ${BEMONY_GLOBAL_BUNDLE_FILENAME}; não é possível determinar qual está em execução.`,\n 'AMBIGUOUS_SCRIPT'\n );\n }\n\n const legacy = Array.from(\n root.querySelectorAll(LEGACY_SCRIPT_SELECTOR)\n ).filter(isHtmlScript);\n\n if (legacy.length === 1) {\n return legacy[0]!;\n }\n // Múltiplos marcadores legado: deixa o caller decidir (MULTIPLE_SCRIPTS / defaults)\n return null;\n}\n","import type { CreateBemonyPixelOptions } from '../createBemonyPixel';\nimport type { BemonyPublicPageContext } from '../domain/BemonyPageContext';\nimport {\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_DEFAULT_NAMESPACE,\n BEMONY_DEFAULT_PIXEL_ID,\n type BemonyPlatformOptions,\n} from '../platform/defaults';\nimport {\n BEMONY_ENVIRONMENTS,\n type BemonyEnvironment,\n} from '../platform/environments';\nimport { BEMONY_SCENARIOS, type BemonyScenario } from '../scenarios/types';\nimport { BemonyBootstrapError } from './errors';\nimport { resolveBemonyExecutingScript } from './resolveExecutingScript';\n\n/**\n * Config global opcional (`window.BemonyPixelConfig`).\n * Apenas campos públicos — sem token efêmero.\n * Campos omitidos herdam `BEMONY_BROWSER_AUTO_INIT_DEFAULTS`.\n */\nexport type BemonyPixelGlobalConfig = {\n environment?: BemonyEnvironment;\n scenario?: BemonyScenario;\n /** Parcial — campos omitidos herdam defaults oficiais. */\n platform?: Partial<BemonyPlatformOptions>;\n page?: CreateBemonyPixelOptions['page'];\n commerce?: CreateBemonyPixelOptions['commerce'];\n overrides?: CreateBemonyPixelOptions['overrides'];\n autoInitiateCheckout?: boolean;\n /** URL de “No Thanks” (upsell/downsell). */\n noThanksUrl?: string;\n};\n\n/**\n * Fontes de configuração do auto-init.\n * Precedência (menor → maior): default → window-config → data-attributes → explicit.\n */\nexport type BemonyConfigSource =\n | 'default'\n | 'window-config'\n | 'data-attributes'\n | 'explicit'\n | 'merged';\n\n/** Atributos que nunca podem aparecer em data-* (token / segredos). */\nexport const BEMONY_FORBIDDEN_DATA_ATTRIBUTES: readonly string[] = [\n 'data-token',\n 'data-one-click-token',\n 'data-oneclick-token',\n 'data-ephemeral-token',\n 'data-payment-token',\n 'data-oc-token',\n 'data-secret',\n 'data-auth-token',\n] as const;\n\nconst SCRIPT_SELECTOR = 'script[data-bemony-pixel]';\n\nfunction isEnvironment(value: string): value is BemonyEnvironment {\n return (BEMONY_ENVIRONMENTS as readonly string[]).includes(value);\n}\n\nfunction isScenario(value: string): value is BemonyScenario {\n return (BEMONY_SCENARIOS as readonly string[]).includes(value);\n}\n\n/**\n * Parse de boolean em data-*.\n * Aceita: true/false/1/0 e atributo vazio (= true) quando aplicável.\n */\nexport function parseBooleanAttr(value: string | null): boolean | undefined {\n if (value === null) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true' || normalized === '1' || normalized === '') {\n return true;\n }\n if (normalized === 'false' || normalized === '0') {\n return false;\n }\n return undefined;\n}\n\n/**\n * Interpreta `data-auto-init` no entry global.\n * Ausência do atributo → true (auto-init por padrão).\n */\nexport function isAutoInitEnabledFromAttr(\n value: string | null | undefined\n): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n const parsed = parseBooleanAttr(value);\n if (parsed === undefined) {\n throw new BemonyBootstrapError(\n `data-auto-init inválido (recebido: ${value}). Use true/false/1/0.`,\n 'INVALID_ATTRIBUTES'\n );\n }\n return parsed;\n}\n\nfunction assertNoForbiddenAttributes(el: Element): void {\n for (const name of BEMONY_FORBIDDEN_DATA_ATTRIBUTES) {\n if (el.hasAttribute(name)) {\n throw new BemonyBootstrapError(\n `Atributo proibido em script tag: ${name}. Token one-click não pode ir em data-*.`,\n 'FORBIDDEN_ATTRIBUTE'\n );\n }\n }\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-') && attr.name.includes('token')) {\n throw new BemonyBootstrapError(\n `Atributo proibido em script tag: ${attr.name}. Token não permitido em data-*.`,\n 'FORBIDDEN_ATTRIBUTE'\n );\n }\n }\n}\n\nfunction nonEmpty(value: string | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readPublicPageFromDataset(\n el: HTMLElement\n): BemonyPublicPageContext | undefined {\n // TODO: parameters pegar do dataset do script\n const pageId = nonEmpty(el.getAttribute('data-page-id'));\n const funnelId = nonEmpty(el.getAttribute('data-funnel-id'));\n const funnelStepId = nonEmpty(el.getAttribute('data-funnel-step-id'));\n const offerId = nonEmpty(el.getAttribute('data-offer-id'));\n const productId = nonEmpty(el.getAttribute('data-product-id'));\n const priceCode = nonEmpty(el.getAttribute('data-price-code'));\n const checkoutId = nonEmpty(el.getAttribute('data-checkout-id'));\n const publicOrderId = nonEmpty(el.getAttribute('data-public-order-id'));\n\n if (\n !pageId &&\n !funnelId &&\n !funnelStepId &&\n !offerId &&\n !productId &&\n !priceCode &&\n !checkoutId &&\n !publicOrderId\n ) {\n return undefined;\n }\n\n return {\n ...(pageId ? { pageId } : {}),\n ...(funnelId ? { funnelId } : {}),\n ...(funnelStepId ? { funnelStepId } : {}),\n ...(offerId ? { offerId } : {}),\n ...(productId ? { productId } : {}),\n ...(priceCode ? { priceCode } : {}),\n ...(checkoutId ? { checkoutId } : {}),\n ...(publicOrderId ? { publicOrderId } : {}),\n };\n}\n\nfunction cloneDefaults(): CreateBemonyPixelOptions {\n return {\n environment: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.environment,\n scenario: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.scenario,\n platform: {\n pixelId: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.pixelId,\n apiEndpoint: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.apiEndpoint,\n namespace: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.namespace,\n allowedDomains: [\n ...BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.allowedDomains,\n ],\n },\n };\n}\n\nfunction mergePlatform(\n base: CreateBemonyPixelOptions['platform'],\n overlay: Partial<BemonyPlatformOptions> | undefined\n): CreateBemonyPixelOptions['platform'] {\n if (!overlay) return { ...base };\n\n const pixelId =\n overlay.pixelId !== undefined && overlay.pixelId.trim() !== ''\n ? overlay.pixelId.trim()\n : base.pixelId;\n const apiEndpoint =\n overlay.apiEndpoint !== undefined\n ? overlay.apiEndpoint.trim() || base.apiEndpoint\n : base.apiEndpoint;\n const namespace =\n overlay.namespace !== undefined\n ? overlay.namespace.trim() || base.namespace\n : base.namespace;\n\n return {\n ...base,\n pixelId,\n ...(apiEndpoint !== undefined ? { apiEndpoint } : {}),\n ...(namespace !== undefined ? { namespace } : {}),\n ...(overlay.debug !== undefined ? { debug: overlay.debug } : {}),\n allowedDomains:\n overlay.allowedDomains !== undefined\n ? (() => {\n const cleaned = overlay.allowedDomains.filter(\n d => d.trim().length > 0\n );\n // Array vazio não apaga defaults obrigatórios\n return cleaned.length > 0 ? cleaned : base.allowedDomains;\n })()\n : base.allowedDomains,\n };\n}\n\nfunction mergePage(\n base: CreateBemonyPixelOptions['page'] | undefined,\n overlay: CreateBemonyPixelOptions['page'] | undefined\n): CreateBemonyPixelOptions['page'] | undefined {\n if (!overlay && !base) return undefined;\n if (!overlay) return base;\n if (!base) return overlay;\n\n const baseNorm =\n base && 'public' in base\n ? base\n : ({ public: base as BemonyPublicPageContext } as NonNullable<\n CreateBemonyPixelOptions['page']\n >);\n const overlayNorm =\n overlay && 'public' in overlay\n ? overlay\n : ({ public: overlay as BemonyPublicPageContext } as NonNullable<\n CreateBemonyPixelOptions['page']\n >);\n\n const basePublic =\n baseNorm && 'public' in baseNorm ? (baseNorm.public ?? {}) : {};\n const overlayPublic =\n overlayNorm && 'public' in overlayNorm ? (overlayNorm.public ?? {}) : {};\n\n return {\n ...baseNorm,\n ...overlayNorm,\n public: {\n ...basePublic,\n ...overlayPublic,\n },\n };\n}\n\nfunction mergeOverrides(\n base: CreateBemonyPixelOptions['overrides'] | undefined,\n overlay: CreateBemonyPixelOptions['overrides'] | undefined\n): CreateBemonyPixelOptions['overrides'] | undefined {\n if (!overlay && !base) return undefined;\n if (!overlay) return base ? { ...base } : undefined;\n if (!base) return { ...overlay };\n\n const apiEndpoint =\n overlay.apiEndpoint !== undefined\n ? overlay.apiEndpoint.trim() || base.apiEndpoint\n : base.apiEndpoint;\n\n return {\n ...base,\n ...overlay,\n ...(apiEndpoint !== undefined ? { apiEndpoint } : {}),\n allowedDomains:\n overlay.allowedDomains !== undefined\n ? overlay.allowedDomains.filter(d => d.trim().length > 0)\n : base.allowedDomains,\n };\n}\n\n/**\n * Merge campo a campo — nunca apaga irmãos de objetos aninhados.\n * Strings vazias não apagam defaults obrigatórios.\n */\nexport function mergeBemonyPixelOptions(\n base: CreateBemonyPixelOptions,\n overlay: Partial<CreateBemonyPixelOptions> | BemonyPixelGlobalConfig\n): CreateBemonyPixelOptions {\n const environment =\n overlay.environment && isEnvironment(overlay.environment)\n ? overlay.environment\n : base.environment;\n const scenario =\n overlay.scenario && isScenario(overlay.scenario)\n ? overlay.scenario\n : base.scenario;\n\n const merged: CreateBemonyPixelOptions = {\n environment,\n scenario,\n platform: mergePlatform(base.platform, overlay.platform),\n };\n\n const page = mergePage(base.page, overlay.page);\n if (page !== undefined) merged.page = page;\n\n const commerce = overlay.commerce ?? base.commerce;\n if (commerce !== undefined) merged.commerce = commerce;\n\n const overrides = mergeOverrides(base.overrides, overlay.overrides);\n if (overrides !== undefined) merged.overrides = overrides;\n\n const autoInitiateCheckout =\n overlay.autoInitiateCheckout ?? base.autoInitiateCheckout;\n if (autoInitiateCheckout !== undefined) {\n merged.autoInitiateCheckout = autoInitiateCheckout;\n }\n\n const noThanksUrl = overlay.noThanksUrl ?? base.noThanksUrl;\n if (noThanksUrl !== undefined && noThanksUrl.trim() !== '') {\n merged.noThanksUrl = noThanksUrl.trim();\n }\n\n if ('createCorePixel' in overlay && overlay.createCorePixel) {\n merged.createCorePixel = overlay.createCorePixel;\n } else if (base.createCorePixel) {\n merged.createCorePixel = base.createCorePixel;\n }\n\n return merged;\n}\n\n/**\n * Lê overrides públicos de um elemento script (campos parciais).\n * Não exige environment/scenario — ausentes usam defaults no merge.\n */\nexport function parseBemonyScriptAttributes(\n el: Element\n): Partial<CreateBemonyPixelOptions> {\n assertNoForbiddenAttributes(el);\n const htmlEl = el as HTMLElement;\n\n const environmentRaw = nonEmpty(htmlEl.getAttribute('data-environment'));\n const scenarioRaw = nonEmpty(htmlEl.getAttribute('data-scenario'));\n\n if (environmentRaw !== undefined && !isEnvironment(environmentRaw)) {\n throw new BemonyBootstrapError(\n `data-environment inválido (recebido: ${environmentRaw}).`,\n 'INVALID_ATTRIBUTES'\n );\n }\n if (scenarioRaw !== undefined && !isScenario(scenarioRaw)) {\n throw new BemonyBootstrapError(\n `data-scenario inválido (recebido: ${scenarioRaw}).`,\n 'INVALID_ATTRIBUTES'\n );\n }\n\n // Funil: data-funnel-id é a chave do pixel na maioria dos casos.\n // Checkout (e overrides): data-pixel-id tem precedência quando presente.\n const pixelId =\n nonEmpty(htmlEl.getAttribute('data-pixel-id')) ??\n nonEmpty(htmlEl.getAttribute('data-funnel-id'));\n const namespace = nonEmpty(htmlEl.getAttribute('data-namespace'));\n const apiEndpoint = nonEmpty(htmlEl.getAttribute('data-api-endpoint'));\n const debug = parseBooleanAttr(htmlEl.getAttribute('data-debug'));\n const allowedDomainsRaw = nonEmpty(\n htmlEl.getAttribute('data-allowed-domains')\n );\n const allowedDomains = allowedDomainsRaw\n ? allowedDomainsRaw\n .split(',')\n .map(d => d.trim())\n .filter(Boolean)\n : undefined;\n\n const pagePublic = readPublicPageFromDataset(htmlEl);\n\n const partial: Partial<CreateBemonyPixelOptions> = {};\n\n if (environmentRaw) partial.environment = environmentRaw;\n if (scenarioRaw) partial.scenario = scenarioRaw;\n\n if (\n pixelId ||\n namespace ||\n apiEndpoint ||\n allowedDomains ||\n debug !== undefined\n ) {\n partial.platform = {\n pixelId: pixelId ?? BEMONY_DEFAULT_PIXEL_ID,\n ...(namespace ? { namespace } : {}),\n ...(apiEndpoint ? { apiEndpoint } : {}),\n ...(allowedDomains ? { allowedDomains } : {}),\n ...(debug !== undefined ? { debug } : {}),\n };\n }\n\n if (pagePublic) {\n partial.page = { public: pagePublic };\n }\n\n if (apiEndpoint || debug !== undefined) {\n partial.overrides = {\n ...(apiEndpoint ? { apiEndpoint } : {}),\n ...(debug !== undefined ? { debug } : {}),\n };\n }\n\n const autoInitiateCheckout = parseBooleanAttr(\n htmlEl.getAttribute('data-auto-initiate-checkout')\n );\n\n if (autoInitiateCheckout !== undefined) {\n partial.autoInitiateCheckout = autoInitiateCheckout;\n }\n\n const noThanksUrl = nonEmpty(htmlEl.getAttribute('data-no-thanks'));\n if (noThanksUrl) {\n partial.noThanksUrl = noThanksUrl;\n }\n\n return partial;\n}\n\nfunction readWindowConfig(): BemonyPixelGlobalConfig | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const config = (\n window as Window & { BemonyPixelConfig?: BemonyPixelGlobalConfig }\n ).BemonyPixelConfig;\n return config && typeof config === 'object' ? config : null;\n}\n\nfunction assertValidWindowConfigPartial(config: BemonyPixelGlobalConfig): void {\n if (config.environment !== undefined && !isEnvironment(config.environment)) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.environment inválido.',\n 'INVALID_CONFIG'\n );\n }\n if (config.scenario !== undefined && !isScenario(config.scenario)) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.scenario inválido.',\n 'INVALID_CONFIG'\n );\n }\n if (\n config.platform?.pixelId !== undefined &&\n config.platform.pixelId.trim() === ''\n ) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.platform.pixelId não pode ser vazio.',\n 'INVALID_CONFIG'\n );\n }\n}\n\nexport type ResolveAutoInitConfigResult = {\n options: CreateBemonyPixelOptions;\n source: BemonyConfigSource;\n /** Fontes que participaram do merge (menor → maior prioridade). */\n sources: readonly BemonyConfigSource[];\n script: Element | null;\n};\n\nexport type ResolveAutoInitConfigInput = {\n /** Config explícita (maior precedência). */\n config?: CreateBemonyPixelOptions;\n /** Documento / raiz para buscar scripts (default: document). */\n root?: ParentNode;\n /**\n * Script já resolvido (ex.: pelo entry global).\n * Se omitido, tenta `resolveBemonyExecutingScript`.\n */\n script?: HTMLScriptElement | null;\n /**\n * Quando true, aplica defaults browser mesmo sem fonte.\n * Default: true (auto-init com defaults oficiais).\n */\n applyDefaults?: boolean;\n};\n\n/**\n * Resolve opções com defaults + merge campo a campo.\n *\n * Precedência (menor → maior):\n * 1. BEMONY_BROWSER_AUTO_INIT_DEFAULTS\n * 2. window.BemonyPixelConfig\n * 3. atributos data-* do script executado\n * 4. config explícita\n */\nexport function resolveAutoInitConfig(\n input: ResolveAutoInitConfigInput = {}\n): ResolveAutoInitConfigResult | null {\n const applyDefaults = input.applyDefaults !== false;\n\n if (typeof document === 'undefined' && typeof window === 'undefined') {\n if (input.config && applyDefaults) {\n return {\n options: mergeBemonyPixelOptions(cloneDefaults(), input.config),\n source: 'explicit',\n sources: ['default', 'explicit'],\n script: null,\n };\n }\n if (input.config) {\n return {\n options: input.config,\n source: 'explicit',\n sources: ['explicit'],\n script: null,\n };\n }\n return null;\n }\n\n const sources: BemonyConfigSource[] = [];\n let options = applyDefaults ? cloneDefaults() : null;\n if (applyDefaults) {\n sources.push('default');\n }\n\n const windowConfig = readWindowConfig();\n if (windowConfig) {\n assertValidWindowConfigPartial(windowConfig);\n if (!options) {\n options = cloneDefaults();\n if (!sources.includes('default')) sources.push('default');\n }\n options = mergeBemonyPixelOptions(options, windowConfig);\n sources.push('window-config');\n }\n\n let script: Element | null = input.script ?? null;\n if (script === null && input.script === undefined) {\n const root =\n input.root ?? (typeof document !== 'undefined' ? document : undefined);\n try {\n script = resolveBemonyExecutingScript({\n ...(root ? { root } : {}),\n });\n } catch (error) {\n if (\n error instanceof BemonyBootstrapError &&\n error.code === 'AMBIGUOUS_SCRIPT'\n ) {\n throw error;\n }\n script = null;\n }\n\n // Compat: múltiplos scripts legado com data-auto-init\n if (!script && root) {\n const legacyAuto = Array.from(\n root.querySelectorAll(`${SCRIPT_SELECTOR}[data-auto-init]`)\n );\n if (legacyAuto.length > 1) {\n throw new BemonyBootstrapError(\n `Encontrados ${legacyAuto.length} scripts com data-bemony-pixel + data-auto-init; use apenas um.`,\n 'MULTIPLE_SCRIPTS'\n );\n }\n if (legacyAuto.length === 1) {\n script = legacyAuto[0]!;\n }\n }\n }\n\n if (script) {\n const fromAttrs = parseBemonyScriptAttributes(script);\n if (!options) {\n options = cloneDefaults();\n if (!sources.includes('default')) sources.push('default');\n }\n options = mergeBemonyPixelOptions(options, fromAttrs);\n sources.push('data-attributes');\n }\n\n if (input.config) {\n if (!options) {\n options = { ...input.config };\n sources.push('explicit');\n } else {\n options = mergeBemonyPixelOptions(options, input.config);\n sources.push('explicit');\n }\n }\n\n if (!options) {\n return null;\n }\n\n // Garante pixelId / namespace / endpoint mínimos após merge\n if (!options.platform.pixelId?.trim()) {\n options = mergeBemonyPixelOptions(options, {\n platform: {\n pixelId: BEMONY_DEFAULT_PIXEL_ID,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n },\n });\n }\n if (\n (options.environment === 'staging' ||\n options.environment === 'production') &&\n !options.platform.apiEndpoint?.trim() &&\n !options.overrides?.apiEndpoint?.trim()\n ) {\n options = mergeBemonyPixelOptions(options, {\n platform: {\n pixelId: options.platform.pixelId,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n },\n });\n }\n\n const highest = sources[sources.length - 1] ?? 'default';\n const source: BemonyConfigSource = sources.length > 1 ? 'merged' : highest;\n\n return {\n options,\n source: sources.length === 1 ? highest : source,\n sources,\n script,\n };\n}\n\nexport { SCRIPT_SELECTOR as BEMONY_PIXEL_SCRIPT_SELECTOR };\nexport { BEMONY_DEFAULT_API_ENDPOINT, BEMONY_BROWSER_AUTO_INIT_DEFAULTS };\n","import type { BemonyPixel } from '../BemonyPixel';\nimport type { CreateBemonyPixelOptions } from '../createBemonyPixel';\nimport {\n bootstrapBemonyPixel,\n type BootstrapBemonyPixelOptions,\n} from './bootstrap';\nimport { BemonyBootstrapError } from './errors';\nimport {\n isAutoInitEnabledFromAttr,\n resolveAutoInitConfig,\n type BemonyConfigSource,\n type BemonyPixelGlobalConfig,\n} from './resolveAutoInitConfig';\nimport { resolveBemonyExecutingScript } from './resolveExecutingScript';\n\nexport type InstallBemonyPixelAutoInitOptions = {\n /**\n * Config explícita (maior precedência no merge).\n */\n config?: CreateBemonyPixelOptions;\n root?: ParentNode;\n /**\n * Script já resolvido (entry global). Se omitido, resolve automaticamente.\n */\n script?: HTMLScriptElement | null;\n /**\n * Gate de consentimento. Se retornar `false`, lança CONSENT_DENIED.\n */\n waitForConsent?: () => boolean | Promise<boolean>;\n /**\n * Reinit controlado (HMR).\n */\n force?: boolean;\n /**\n * Se true, não aplica defaults browser e retorna null sem fonte.\n * Default: false — auto-init usa `BEMONY_BROWSER_AUTO_INIT_DEFAULTS`.\n */\n applyDefaults?: boolean;\n /**\n * @deprecated Preferir opt-out via `data-auto-init=\"false\"` no entry global.\n * Mantido por compatibilidade.\n */\n requireDataAutoInit?: boolean;\n};\n\nexport type InstallBemonyPixelAutoInitResult = {\n pixel: BemonyPixel;\n source: BemonyConfigSource;\n};\n\n/**\n * Instalação do auto-init.\n * No entry principal ESM não roda sozinha — só quando chamada (ou via IIFE global).\n */\nexport async function installBemonyPixelAutoInit(\n options: InstallBemonyPixelAutoInitOptions = {}\n): Promise<InstallBemonyPixelAutoInitResult | null> {\n if (typeof window === 'undefined') {\n throw new BemonyBootstrapError(\n 'installBemonyPixelAutoInit só pode ser usado no browser.',\n 'NOT_BROWSER'\n );\n }\n\n const script =\n options.script !== undefined\n ? options.script\n : resolveBemonyExecutingScript({\n ...(options.root ? { root: options.root } : {}),\n });\n\n if (script) {\n const autoInitAttr = script.getAttribute('data-auto-init');\n // Só interpreta opt-out quando o atributo está presente no script resolvido\n // e a chamada não traz config explícita (chamada programática sempre inicia).\n if (\n !options.config &&\n autoInitAttr !== null &&\n !isAutoInitEnabledFromAttr(autoInitAttr)\n ) {\n return null;\n }\n }\n\n const resolved = resolveAutoInitConfig({\n config: options.config,\n root: options.root,\n script,\n applyDefaults: options.applyDefaults,\n });\n\n if (!resolved) {\n return null;\n }\n\n if (\n options.requireDataAutoInit &&\n !options.config &&\n !resolved.sources.includes('data-attributes')\n ) {\n return null;\n }\n\n const bootstrapOptions: BootstrapBemonyPixelOptions = {\n ...resolved.options,\n ...(options.force !== undefined ? { force: options.force } : {}),\n ...(options.waitForConsent\n ? { waitForConsent: options.waitForConsent }\n : {}),\n };\n\n try {\n const pixel = await bootstrapBemonyPixel(bootstrapOptions);\n return { pixel, source: resolved.source };\n } catch (error: unknown) {\n if (error instanceof BemonyBootstrapError) {\n throw error;\n }\n throw new BemonyBootstrapError(\n error instanceof Error ? error.message : 'Auto-init falhou',\n 'AUTO_INIT_FAILED',\n error\n );\n }\n}\n\nexport type { BemonyPixelGlobalConfig, BemonyConfigSource };\n"],"mappings":"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","names":["SECRET_EXACT","MASK_EMAIL","MASK_PHONE","MASK_NAME","REDACT_ADDRESS","SENSITIVE_EMBEDDED","maskEmail","value","at","maskPhone","digits","maskName","trimmed","normalizeKey","key","isSensitiveKey","raw","compact","redactValueForKey","safeClone","deepFreeze","v","child","truncateLargeValues","depth","sliced","out","k","recursiveSanitize","input","seen","item","redactSensitiveKeys","freezeSanitizedSnapshot","cloned","sanitized","truncated","evaluateRuntimeHealth","ctx","checks","reasons","push","id","status","detail","t","engagement","driftBudget","drift","rateLimit","total","buffer","stateMachine","c","buildDebugSnapshot","services","transportState","snapshot","m","buildWarnings","warnings","DebugSnapshotService","deps","runtime","config","transportModule","conversionModule","integrationsModule","registered","initializedNames","moduleRegistry","servicesBag","urlSnap","commerceSnap","catalogProducts","items","cartValue","fromItem","fromCatalog","p","attrSnap","identifiers","sessionTtl","i","trackers","heartbeatCfg","engagementCfg","viewportCfg","behaviorTrackers","behaviorEngines","behaviorModule","behaviorHeartbeat","behaviorViewport","behaviorEngagement","rateLimitCfg","bufferCfg","stateMachineCfg","sessionSummaryCfg","behaviorRateLimit","behaviorBuffer","behaviorStateMachine","behaviorSessionSummary","manual","manualEnabledFlags","detectors","detectorCount","d","integrationState","delivery","advanced","buildSafeConfig","RuntimeDiagnosticsModule","snapshotService","_context","BehaviorSignalBus","signal","set","listener","type","current","source","data","ManagedScheduler","task","delayMs","handle","safeDelay","expectedAt","timer","entry","EngagementEmissionPolicy","EngagementLevelResolver","thresholds","score","ENGAGEMENT_SATURATION","clamp01","ratio","part","EngagementScoreCalculator","levelResolver","state","observedMs","weights","penalties","components","positive","totalDurationMs","idlePenalty","rageClickPenalty","rawScore","finalScore","level","EMPTY_SIGNAL_COUNTS","EngagementSignalAccumulator","now","elapsed","percent","EngagementSummaryBuilder","CONSUMED_SIGNALS","EngagementEngine","context","options","wasInitialized","unsub","reason","breakdown","evaluatedAt","previousScore","delta","event","averageScore","summary","HeartbeatPolicy","idle","HeartbeatSnapshotBuilder","sequence","visible","base","HeartbeatEngine","isVisible","since","onVisibility","DEFAULT_ENGAGEMENT_WEIGHTS","DEFAULT_ENGAGEMENT_PENALTIES","DEFAULT_ENGAGEMENT_THRESHOLDS","DEFAULT_ENGAGEMENT_CONFIG","WEIGHT_KEYS","toFiniteNumber","fallback","normalizeEngagementWeights","clamped","sum","normalizeEngagementPenalties","normalizeEngagementThresholds","lowMax","mediumMax","resolveEngagementConfig","behavior","normalizeEngagementConfig","enabled","evaluationIntervalMs","minScoreDelta","DEFAULT_HEARTBEAT_CONFIG","HEARTBEAT_MIN_INTERVAL_MS","resolveHeartbeatConfig","normalizeHeartbeatConfig","intervalMs","hiddenIntervalMs","result","VALID_DROP_STRATEGIES","toBoolean","normalizeRateLimitConfig","windowMs","maxSignalsPerWindow","normalizeBufferConfig","maxSize","maxAgeMs","flushSize","dropStrategy","normalizeStateMachineConfig","historyLimit","normalizeSessionSummaryConfig","minimumSessionMs","resolveRuntimeIntelligenceConfig","CRITICAL_SIGNAL_TYPES","CRITICAL_SET","BehaviorRateLimiter","cutoff","removeCount","ts","NON_COMPRESSIBLE_SIGNAL_TYPES","NON_COMPRESSIBLE_SET","BehaviorBuffer","dropIndex","oldest","drained","TRANSITIONS","BehaviorStateMachine","target","to","record","SessionSummaryAccumulator","BehaviorRuntimeCoordinator","signalBus","wasRunning","bus","entries","startedAt","finalState","generation","fn","BehaviorTrackerBase","handler","partial","SCROLL_THROTTLE_MS","ScrollTracker","doc","bodyScroll","scrollHeight","clientHeight","maxScroll","minIntervalMs","debounceMs","scrollY","deltaSeconds","deltaY","velocity","crossedNew","threshold","describeElement","element","htmlElement","classes","text","rawText","dataset","getElementFingerprint","el","tag","dataAttrs","name","ClickTracker","rageClick","currentTarget","targetDescriptor","currentTargetDescriptor","fingerprint","cooldownUntil","recent","VisibilityTracker","ACTIVITY_EVENTS","IdleTracker","eventName","previousIdleDurationMs","DEFAULT_EXIT_INTENT_THRESHOLD","ExitIntentTracker","describeViewportElement","clamp","min","max","isNonEmptyString","normalizeViewportConfig","seenKeys","targets","rawTargets","rawTarget","normalizedTarget","normalizeTarget","mutationDebounceMs","maxObservedElements","selector","enterThreshold","exitThreshold","minVisibleMs","makeStateKey","targetKey","elementId","createInitialState","ViewportStateStore","callback","active","pending","ViewportTargetRegistry","existingId","isIntersectionObserverAvailable","buildThresholds","unique","a","b","createIntersectionObserver","error","ViewportTracker","normalized","warning","observerResult","counts","observedElementCount","elements","rootNode","disconnected","registryEntry","isCandidate","enteredAt","visibilityRatio","exitedAt","visibleDurationMs","BehaviorModule","trackerConfig","engagementConfig","engine","intelligenceConfig","snap","viewportTracker","tracker","heartbeatConfig","BaseAutoTracker","buildAutoSourceOrigin","sourceType","eventType","sourceName","safeName","SENSITIVE_PATTERN","isBrowserElement","isHtmlFormElement","isHtmlInputElement","trimNonEmpty","normalizePrice","cleaned","hasComma","hasDot","parsed","normalizeQuantity","isSensitiveField","haystack","readAttribute","names","attrName","readInputValue","findFieldValue","root","candidates","candidate","exact","cssEscape","inputs","needle","fieldNameMatches","mergeDefined","sources","uniqueNames","custom","defaults","DEFAULT_EMAIL_FIELDS","DEFAULT_PHONE_FIELDS","DEFAULT_NAME_FIELDS","DEFAULT_FIRST_NAME_FIELDS","DEFAULT_LAST_NAME_FIELDS","EMAIL_ATTRS","PHONE_ATTRS","NAME_ATTRS","FIRST_NAME_ATTRS","LAST_NAME_ATTRS","CustomerExtractor","fromSelf","form","fromForm","container","fromContainer","email","phone","firstName","lastName","autocomplete","DEFAULT_PRODUCT_ID_ATTRS","DEFAULT_PRODUCT_NAME_ATTRS","DEFAULT_PRICE_ATTRS","DEFAULT_QUANTITY_ATTRS","DEFAULT_CURRENCY_ATTRS","DEFAULT_PRODUCT_ID_FIELDS","DEFAULT_PRODUCT_NAME_FIELDS","DEFAULT_PRICE_FIELDS","DEFAULT_QUANTITY_FIELDS","DEFAULT_CURRENCY_FIELDS","PRODUCT_CONTAINER_SELECTOR","ProductExtractor","productId","productName","priceRaw","quantityRaw","currency","DEFAULT_MODE","DEFAULT_TRIGGER","VALID_TRIGGERS","FIELD_HEURISTICS","FormConditionEvaluator","normalizeSelectorFormConfig","scope","values","filledFields","missingFields","field","resolveFieldValue","matched","filledCount","required","configured","received","found","safeQuerySelector","ownerForm","getOwnerForm","closestForm","sanitizeFields","fields","mode","trigger","formSelector","heuristic","typed","readTypedInput","auto","readAutocomplete","fromAttr","fromFields","kebab","toKebabCase","fromCustomAttr","ProductCatalog","products","product","sku","defaultCurrency","quantity","CommerceState","initialItems","previous","metadata","next","selectedItems","OrderCalculator","hasPriced","qty","DEFAULT_COMMERCE_ENRICHMENT","DEFAULT_COMMERCE_CONFIG","normalizeCalculateValueFrom","CommerceResolver","trim","payload","extracted","useCart","useCatalog","asString","cartFallback","catalogProduct","resolvedId","stateItem","price","asNumber","identity","resolveCatalogItemIdentity","isPurchase","manualValue","manualCurrency","manualItems","resolvedItems","pixelItems","allowCalculatedValue","shouldCalculateValue","calc","atc","checkout","contentId","contentName","enrichmentSource","fromState","catalog","incoming","meta","metaPriceId","metaProductId","metaOfferId","priceId","CommerceService","fromConfig","resolved","first","normalizeSelectorText","prepare","caseSensitive","elementMatchesText","isTextMatchLeaf","descendants","queryElementsByText","containers","collectTextMatches","results","nodes","PREFIX_TO_TYPE","SelectorResolver","logger","selectorType","fallbackType","prefixed","descriptor","colon","prefix","css","escapeCssIdent","escapeAttrValue","ConfiguredFormDetector","factory","resolveSelectorType","commerce","sourceDebounce","formDebounce","events","domType","evaluation","customer","ADD_TO_CART_KEYS","REMOVE_KEYS","VIEW_CONTENT_KEYS","LEAD_KEYS","CHECKOUT_KEYS","num","collectUnknown","known","isLinkSupportedEvent","mapLinkBindingsToEvent","unknownKeys","explicitPriceId","offerId","query","EMPTY_PARAMS","normalizePathname","pathname","withLeading","safeDecode","segment","matchesSegmentPrefix","normalizedPrefix","matchPathTemplate","template","pathParts","templateParts","params","tpl","seg","compareStrings","left","right","startsWithSafe","matchQueryCondition","condition","matchLinkTarget","url","rule","origin","host","h","pathParams","matchedPath","pathRule","exactHit","prefixHit","bare","firstSeg","segments","segmentHit","formatMatchedPathForDiagnostics","parts","isAbsent","pathSegments","stripStaticExtension","normalizeText","collapsed","readDataset","resolveOne","resolver","index","applyTransform","transform","resolveBinding","binding","resolvers","sawTransformFailure","transformed","resolveLinkBindings","bindings","missingRequired","MAX_ORIGINS","MAX_HOSTNAMES","MAX_PATH_ENTRIES","MAX_QUERY_CONDITIONS","MAX_BINDINGS","MAX_FROM","MAX_ONE_OF","MAX_NAME_LENGTH","MAX_STRING_LENGTH","RESERVED_OBJECT_KEYS","PATH_PARAM_NAME","TRANSFORMS","fail","isPlainObject","isSafeObjectKey","isBoundedString","isValidHostname","normalizeTimerMs","normalizeOrigin","cloneSelectorInput","cloneSelector","validateTemplateParams","normalizeQueryCondition","operator","normalizeResolver","hasTemplate","normalizeBinding","fromList","normalizedFrom","hasUsefulMatch","match","normalizeLinkAutoSourceInner","matchIn","protocols","origins","hostnames","path","templateError","conditions","keys","trimmedKey","cooldownMs","normalizeLinkAutoSource","SUPPORTED_PROTOCOLS","isDisabled","findAnchor","from","closest","normalizeLinkHref","href","baseURI","ConfiguredLinkDetector","anchor","lower","matchResult","resolution","mapped","clickTarget","ConfiguredSelectorDetector","CARD_NUMBER_IDS","CARD_NUMBER_NAMES","CVV_IDS","CVV_NAMES","isVisibleInput","inputHasValue","resolveRoot","findStartedByIdOrName","ids","findStartedByAutocomplete","scanPaymentInputStarted","FIELD_EVENTS","CardDetector","normalizePaymentMethod","CHECKOUT_SELECTORS","CheckoutDetector","LifecycleAutoDetector","DATA_TRACK_EVENT_MAP","resolveDataTrackEvent","buildSelector","SelectorDetector","selectors","built","trackValue","valueAttr","dataTrack","DEFAULT_KEYWORD_EVENTS","TextDetector","keywords","keyword","HistoryNavigationPatch","args","UrlDetector","patterns","pattern","DETECTOR_ENTRIES","FORM_EVENT_TYPES","AutoTrackerFactory","rules","rulesCardActive","cfg","created","_opts","selectorSource","payment","urlSource","ConversionDeduper","buildAddToCartDedupeKey","bucket","getInteractionBucket","window","CLICK_ORIGINS","isUrlOrigin","isInteractionOrigin","secondBucket","currentPath","buildCanonicalDedupeKey","sessionId","purchase","lead","remove","view","BaseTracker","AddPaymentInfoTracker","AddToCartTracker","InitiateCheckoutTracker","LeadTracker","PurchaseTracker","RemoveFromCartTracker","SearchTracker","ViewContentTracker","EVENT_TO_ENRICHMENT","COMMERCE_EVENT_TYPES","TrackerFactory","trackFn","dedupeSessionId","search","enriched","isCommerceEventType","enrichmentKey","ConversionEngine","detector","dedupeKey","ConversionModule","FingerprintEngine","NavigationObserver","onNavigate","PageViewDeduper","dedupeMs","timestamp","PageViewEngine","pageView","commercePayload","SessionEngine","ttlMs","renewOnActivity","session","expiredEvent","renewedEvent","UrlContextEngine","urlContext","VisitorEngine","CoreModule","DestinationRegistry","destination","existing","adapter","emptyCounters","DestinationMetrics","counters","count","sent","deduped","failed","pixelIds","tagIds","kind","perDestination","destTotal","DestinationLogger","_DestinationLogger","message","DestinationErrorHandler","continueOnError","duration","DestinationExecutor","controller","timeoutId","DestinationDispatcher","destinations","batch","settled","j","outcome","DestinationPipeline","_DestinationPipeline","stages","steps","stage","DestinationSubscriber","dispatcher","onEvent","DEFAULT_COMMERCE_EVENT_TYPES","BaseDestinationAdapter","extras","ConsoleDestination","MemoryDestination","MockDestination","ms","resolve","reject","cleanup","onAbort","globalSeen","buildExternalPageViewKey","destinationName","destinationId","pathOrUrl","shouldSkipExternalPageView","scriptCache","loadScript","timeoutMs","promise","script","releaseScript","src","META_PIXEL_SCRIPT_SRC","getWindow","ensureFbqStub","win","fbq","MetaScriptLoader","MetaBrowserDestination","initFailed","pixelId","GOOGLE_GTAG_SCRIPT_BASE","ensureGtagStub","GoogleScriptLoader","primaryTagId","gtag","GoogleBrowserDestination","primary","tagId","title","TIKTOK_PIXEL_SCRIPT_SRC","ensureTtqStub","ttq","TikTokScriptLoader","TikTokBrowserDestination","dedupeId","IntegrationEngine","pixelLogger","hooks","extraAdapters","errorHandler","executor","debug","processed","removed","IntegrationsModule","moduleConfig","PrivacyModule","DispatcherSubscriber","BatchManager","limit","IdentityCompressionStrategy","createCompressionStrategy","getCompressionDebugState","strategy","lastResult","CoordinationManager","instanceId","onLeaderChange","tabId","wasLeader","DeadLetterManager","attempts","lastError","TransportDelivery","FlushManager","onFlush","OfflineDetector","onOnline","onOffline","handleOnline","handleOffline","offline","OrderingManager","correlationId","transactionGroup","records","maxGlobal","maxSession","lastWithCorrelation","recordCount","EnqueueStage","queue","NormalizeStage","ValidateStage","TransportPipeline","_TransportPipeline","PersistentQueue","storage","ordering","backpressure","loaded","decision","applied","predicate","before","MemoryQueue","kept","MemoryQueueStorage","LocalStorageQueueStorage","storageKey","testKey","STORE_NAME","IndexedDBQueueStorage","dbName","request","database","transaction","store","clearRequest","buildStorageKey","namespace","buildDbName","createByType","resolveFallbackChain","preferred","order","rest","createQueueStorage","chain","createQueueStorageFromConfig","ReplayManager","BackpressureManager","currentSize","rate","accept","CircuitBreaker","CircuitBreakerSender","circuitBreaker","inner","calculateBackoffDelay","attempt","delay","RetryEngine","taskId","cancelled","runAttempt","generateEventId","mapCategory","extractData","category","hostname","language","timezone","queryParams","mapIdentifiers","EventPayloadBuilder","eventId","visitorId","apiEvents","fetchWithTimeout","externalSignal","init","SINGLE_ENDPOINT","BATCH_ENDPOINT","HttpSender","payloadBuilder","compression","useBatch","rawBody","compressed","response","body","ack","log","MockSender","TimedSender","signals","combined","combineAbortSignals","TransportEngine","sender","useHttp","mockSender","eventSender","timedSender","batchManager","flushManager","retryEngine","offlineDetector","isLeader","senderState","TransportModule","ModuleRegistry","module","BaseEventBuilder","metadataService","attribution","hasIdentifiers","urlSnapshot","hasQueryParams","hasUrlContext","ConsolePixelLogger","debugEnabled","DEFAULT_ATTRIBUTION_CONFIG","ATTRIBUTION_STORAGE_KEY","BUILTIN_CLICK_PARAMS","ClickIdParser","customParams","customClickIds","fbclid","existingFbc","CookieCollector","cookies","map","cookieName","acc","rawKey","AttributionCollector","fromUrl","fromCookies","merged","fbc","AttributionStore","AttributionServiceImpl","stored","fresh","BrowserMetadataServiceImpl","DispatcherServiceImpl","sanitizeDispatcherError","listenerIndex","DEFAULT_FINGERPRINT_KEY","hashFingerprintInput","hash","positiveHash","secondaryHash","computeLightFingerprint","FingerprintServiceImpl","BrowserStorageAdapter","keysToRemove","MemoryStorageAdapter","supportsNamespaceClear","StorageServiceImpl","namespaceKeyPrefix","createStorageAdapter","persistence","createRandomSuffix","generateSessionId","DEFAULT_SESSION_KEY","SessionServiceImpl","storage","config","raw","now","ttlMs","data","sessionId","previousSessionId","generateVisitorId","DEFAULT_VISITOR_KEY","VisitorServiceImpl","existing","visitorId","DEFAULT_URL_CONTEXT_DENYLIST","DEFAULT_URL_CONTEXT_EXCLUDED_DOMAINS","DEFAULT_URL_CONTEXT_EXCLUDE_SELECTORS","SID_EXCLUDE_SELECTOR","normalizeParamKey","key","safeDecodeURIComponent","value","buildDenylistSet","userDenylist","mergeDefault","set","buildExcludedDomains","userExcluded","list","domain","d","buildExcludeSelectors","userSelectors","includeSidSelector","sel","isDeniedKey","denylist","hostMatchesDomain","hostname","hostNoPort","target","isDomainAllowed","allowedDomains","excludedDomains","excluded","generatePublicId","prefix","safePrefix","ts","random","isBrowser","silentReplaceState","url","parseSearchParams","search","result","part","eq","buildSearchString","params","pairs","freezeRecord","record","formatDecoratedHref","originalHref","trimmed","hash","QueryParamCollector","mode","allowlist","ManagedParamResolver","store","configs","values","sources","decorateParams","urlWrites","currentParams","param","canRead","canWrite","source","fromUrl","cookieName","fromCookie","storageKey","fromStorage","strategy","cookieCfg","writes","next","path","ForwardParamResolver","input","queryParams","managedValues","BLOCKED_PROTOCOLS","LinkDecorator","paramsOrOptions","includeSidExclude","isLinkDecoratorOptions","flat","resolvedConfig","managedParams","event","anchor","findAnchor","href","baseHostname","lower","proto","base","preserve","overwrite","changed","originalParsed","hadDuplicateKeys","countQueryKeys","selector","nodes","node","qIndex","hashIndex","UrlContextStore","name","cookies","idx","options","parts","resolveCookieDomain","sameSite","host","DEFAULT_SID_MANAGED_PARAM","DEFAULT_QUERY_PARAMS_WHEN_ENABLED","DEFAULT_FORWARD_PARAMS_WHEN_ENABLED","DEFAULT_LINK_DECORATION_WHEN_ENABLED","resolveUrlContextConfig","cloneManagedParam","UrlContextService","emptySnapshot","resolved","managed","queryAfter","forwarded","urlContext","decorateForwarded","hasSid","p","c","prepareJourneyUrlContext","service","PixelRuntime","ModuleRegistry","ConsolePixelLogger","module","error","logger","index","m","namespace","persistence","visitorStorage","sessionStorage","fingerprintStorage","attributionStorage","browserMetadata","BrowserMetadataServiceImpl","attribution","AttributionServiceImpl","DEFAULT_ATTRIBUTION_CONFIG","urlContextStorage","eventBuilder","BaseEventBuilder","visitor","session","fingerprint","FingerprintServiceImpl","dispatcher","DispatcherServiceImpl","commerce","CommerceService","StorageServiceImpl","createStorageAdapter","SDK_VERSION","Pixel","ConversionModule","TransportModule","IntegrationsModule","BehaviorModule","DebugSnapshotService","RuntimeDiagnosticsModule","PrivacyModule","CoreModule","services","offline","type","reason","DEFAULT_BEHAVIOR_MODULE_CONFIG","EMPTY_DETECTOR","DEFAULT_CONVERSION_MODULE_CONFIG","DEFAULT_CORE_MODULE_CONFIG","DEFAULT_INTEGRATIONS_MODULE_CONFIG","DEFAULT_PRIVACY_MODULE_CONFIG","DEFAULT_TRANSPORT_MODULE_CONFIG","DEFAULT_PIXEL_CONFIG","DEFAULT_COMMERCE_CONFIG","BrowserStorageAdapter","storage","key","value","predicate","keysToRemove","index","MemoryStorageAdapter","supportsNamespaceClear","adapter","StorageServiceImpl","namespace","prefix","raw","namespaceKeyPrefix","createStorageAdapter","persistence","mode","DEFAULT_COMMERCE_ENRICHMENT","DEFAULT_COMMERCE_CONFIG","q","ee","el","el"]}
|