{"version":3,"sources":["../src/constants/index.ts","../src/types/Logger.ts","../src/logger/SimpleLogger.ts","../src/logger/index.ts","../src/exporters/HyperlookExporter/utils/generateEventId.ts","../src/exporters/HyperlookExporter/utils/limitPropertiesSize.ts","../src/exporters/HyperlookExporter/utils/transformEvent.ts","../src/exporters/HyperlookExporter/index.ts","../src/exporters/HTTPExporter.ts","../src/TelemetryManager/utils/sanitizeString.ts","../src/TelemetryManager/utils/sanitizePayload.ts","../src/TelemetryManager/utils/validateConfig.ts","../src/TelemetryManager/utils/generateSessionId.ts","../src/plugins/BasePlugin.ts","../src/plugins/ClickPlugin.ts","../src/plugins/CustomEventsPlugin.ts","../src/plugins/ErrorPlugin.ts","../src/plugins/LogPlugin/utils/sanitization.ts","../src/plugins/LogPlugin/utils/consoleInterceptor.ts","../src/plugins/LogPlugin/index.ts","../src/plugins/NetworkPlugin/utils/extractQueryParams.ts","../src/plugins/NetworkPlugin/utils/extractResponseHeaders.ts","../src/plugins/NetworkPlugin/utils/extractResponseBody.ts","../src/utils/isSupabaseUrl.ts","../src/utils/initialTelemetryConfig.ts","../src/utils/earlyInitialization/extractResponseHeaders.ts","../src/utils/earlyInitialization/extractResponseBody.ts","../src/utils/earlyInitialization/extractQueryParams.ts","../src/utils/earlyInitialization/setupEarlyInterceptors.ts","../src/plugins/NetworkPlugin/utils/fetchInterceptor.ts","../src/plugins/NetworkPlugin/utils/xhrInterceptor.ts","../src/plugins/NetworkPlugin/utils/initialization.ts","../src/plugins/NetworkPlugin/index.ts","../src/plugins/PerformancePlugin/utils/navigationTiming.ts","../src/plugins/PerformancePlugin/utils/resourceTiming.ts","../src/plugins/PerformancePlugin/utils/webVitals.ts","../src/plugins/PerformancePlugin/utils/observers.ts","../src/plugins/PerformancePlugin/utils/initialization.ts","../src/plugins/PerformancePlugin/index.ts","../src/plugins/PageViewPlugin.ts","../src/TelemetryManager/PluginManager.ts","../src/TelemetryManager/EventProcessor.ts","../src/TelemetryManager/CircuitBreaker.ts","../src/TelemetryManager/ExportManager.ts","../src/TelemetryManager/index.ts","../src/index.ts"],"names":["TELEMETRY_SDK_PREFIX","HYPERLOOK_URL","LogLevel","SimpleLogger","config","message","meta","level","formattedMessage","timestamp","levelStr","prefix","formatted","globalLogger","getLogger","setLogger","logger","createLogger","generateEventId","limitPropertiesSize","properties","maxSizeBytes","filteredProperties","key","value","originalSize","limitedProperties","propertyEntries","keyA","keyB","tryTruncateStrings","removeNonEssentialProperties","finalSize","removedCount","currentSize","stringEntries","a","b","truncatedValue","step","lastAddedKey","essentialKeys","nonEssentialKeys","transformEvent","event","payload","transformed","HyperlookExporter","apiKey","events","_endpoint","controller","timeoutId","response","errorText","error","HTTPExporter","endpoint","sanitizeString","input","fieldName","sanitized","i","code","sanitizePayload","seen","keys","sanitizedKey","validateConfig","generateSessionId","BasePlugin","manager","ClickPlugin","target","tgt","rect","evt","attr","CustomEventsPlugin","eventType","eventName","userId","sessionId","sanitizedEventType","sanitizedEventName","sanitizedPayload","ErrorPlugin","errorVal","stackVal","sanitizeConsoleArgs","args","arg","_key","createConsoleInterceptor","method","context","originals","safeCapture","original","sanitizedArgs","payloadMessage","payloadArgs","setupConsoleInterceptors","LogPlugin","extractQueryParams","url","urlObj","params","extractResponseHeaders","headers","extractXHRResponseHeaders","xhr","headerString","line","extractResponseBody","text","extractXHRResponseBody","responseText","isSupabaseUrl","hostname","initialTelemetryConfig","earlyEventQueue","earlyInterceptorsSetup","setupModuleLevelEarlyInterceptors","originalFetch","earlyFetchInterceptor","init","startTime","endTime","isSupabase","createFetchInterceptor","telemetryEndpoint","interceptor","duration","isSupabaseQuery","originalProperties","setupFetchInterceptor","createXHROpenInterceptor","patchedXHRs","originalOpen","async","user","password","createXHRSendInterceptor","xhrHandlers","originalSend","body","eventCaptured","successHandler","cleanup","errorHandler","abortHandler","setupXHRInterceptors","openInterceptor","sendInterceptor","isNetworkSupported","initializeOriginalFetch","createOriginalXHROpen","createOriginalXHRSend","NetworkPlugin","xhrInterceptors","deadXHRs","cleanedCount","captureNavigationTiming","navigation","captureResourceTiming","resource","captureWebVitals","vitals","fcpEntry","lcpEntries","fidEntries","fidEntry","setupLongTaskObserver","longTaskObserver","list","entry","setupLayoutShiftObserver","layoutShiftObserver","layoutShiftEntry","isPerformanceSupported","isPageFullyLoaded","waitForPageLoad","callback","PerformancePlugin","navigationMetrics","resourceMetrics","webVitals","allMetrics","PageViewPlugin","isNavigation","currentUrl","currentTitle","nav","result","navigationListener","PluginManager","state","pluginsToRegister","enabled","plugin","isCustomEvents","pluginInstance","p","EventProcessor","samplingRate","batchSize","validatedEvent","enrichedEvent","batch","CircuitBreaker","maxConsecutiveFailures","circuitBreakerTimeout","ExportManager","exporters","maxRetries","retryDelay","e","retries","lastErrors","results","exporter","anySuccess","r","resolve","TelemetryManager","customLogger","enabledExporters","exportersToEnable","exporterType","eventsToRetry","traits","identifyEvent","initTelemetry","finalConfig","telemetry","gracefulShutdown","signal","reason","promise"],"mappings":"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","file":"index.mjs","sourcesContent":["export const TELEMETRY_SDK_PREFIX = \"[TelemetrySDK]\";\n\nexport const HYPERLOOK_URL = \"https://ingest.hyperlook.io/events/batch\";\n","export enum LogLevel {\n  ERROR = 0,\n  WARN = 1,\n  INFO = 2,\n  DEBUG = 3,\n  SILENT = 4,\n}\n\nexport interface LoggerConfig {\n  level?: LogLevel;\n  enableConsole?: boolean;\n  enableTimestamp?: boolean;\n  prefix?: string;\n  formatter?: (\n    level: LogLevel,\n    message: string,\n    meta?: Record<string, unknown>\n  ) => string;\n}\n\nexport interface Logger {\n  error(message: string, meta?: Record<string, unknown>): void;\n  warn(message: string, meta?: Record<string, unknown>): void;\n  info(message: string, meta?: Record<string, unknown>): void;\n  debug(message: string, meta?: Record<string, unknown>): void;\n  setLevel(level: LogLevel): void;\n  setConfig(config: Partial<LoggerConfig>): void;\n}\n","import { TELEMETRY_SDK_PREFIX } from \"../constants\";\nimport { LogLevel, type LoggerConfig, type Logger } from \"../types/Logger\";\n\nexport class SimpleLogger implements Logger {\n  private config: LoggerConfig;\n\n  constructor(config: LoggerConfig = {}) {\n    this.config = {\n      level: LogLevel.INFO,\n      enableConsole: true,\n      enableTimestamp: true,\n      prefix: TELEMETRY_SDK_PREFIX,\n      ...config,\n    };\n  }\n\n  error(message: string, meta?: Record<string, unknown>): void {\n    this.log(LogLevel.ERROR, message, meta);\n  }\n\n  warn(message: string, meta?: Record<string, unknown>): void {\n    this.log(LogLevel.WARN, message, meta);\n  }\n\n  info(message: string, meta?: Record<string, unknown>): void {\n    this.log(LogLevel.INFO, message, meta);\n  }\n\n  debug(message: string, meta?: Record<string, unknown>): void {\n    this.log(LogLevel.DEBUG, message, meta);\n  }\n\n  setLevel(level: LogLevel): void {\n    this.config.level = level;\n  }\n\n  setConfig(config: Partial<LoggerConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n\n  private log(\n    level: LogLevel,\n    message: string,\n    meta?: Record<string, unknown>\n  ): void {\n    if (\n      !this.config.enableConsole ||\n      level < (this.config.level ?? LogLevel.INFO)\n    ) {\n      return;\n    }\n\n    const formattedMessage = this.formatMessage(level, message, meta);\n\n    switch (level) {\n      case LogLevel.DEBUG:\n        console.debug(formattedMessage);\n        break;\n      case LogLevel.INFO:\n        console.info(formattedMessage);\n        break;\n      case LogLevel.WARN:\n        console.warn(formattedMessage);\n        break;\n      case LogLevel.ERROR:\n        console.error(formattedMessage);\n        break;\n    }\n  }\n\n  private formatMessage(\n    level: LogLevel,\n    message: string,\n    meta?: Record<string, unknown>\n  ): string {\n    if (this.config.formatter) {\n      return this.config.formatter(level, message, meta);\n    }\n\n    const timestamp = this.config.enableTimestamp\n      ? `[${new Date().toISOString()}]`\n      : \"\";\n    const levelStr = `[${LogLevel[level]}]`;\n    const prefix = this.config.prefix || \"\";\n\n    let formatted = `${timestamp}${prefix}${levelStr} ${message}`;\n\n    if (meta !== undefined) {\n      formatted += ` ${JSON.stringify(meta)}`;\n    }\n\n    return formatted;\n  }\n}\n","import { SimpleLogger } from \"./SimpleLogger\";\nimport type { LoggerConfig, Logger } from \"../types/Logger\";\n\nexport { LogLevel } from \"../types/Logger\";\nexport type { LoggerConfig, Logger } from \"../types/Logger\";\n\n// Global logger instance\nlet globalLogger: Logger | null = null;\n\nexport function getLogger(): Logger {\n  if (!globalLogger) {\n    globalLogger = new SimpleLogger();\n  }\n  return globalLogger;\n}\n\nexport function setLogger(logger: Logger): void {\n  globalLogger = logger;\n}\n\nexport function createLogger(config?: LoggerConfig): Logger {\n  return new SimpleLogger(config);\n}\n","export function generateEventId(): string {\n  return \"event_\" + Date.now() + \"_\" + Math.random().toString(36).substr(2, 9);\n}\n","import { getLogger } from \"../../../logger\";\n\n/**\n * Limits the size of properties object to ensure it doesn't exceed 8KB\n * @param properties - The properties object to limit\n * @param maxSizeBytes - Maximum size in bytes (default: 8192 for 8KB)\n * @returns A new properties object that fits within the size limit\n */\nexport function limitPropertiesSize(\n  properties: Record<string, unknown>,\n  maxSizeBytes: number = 8192\n): Record<string, unknown> {\n  const logger = getLogger();\n\n  if (!properties || Object.keys(properties).length === 0) {\n    return properties;\n  }\n\n  // Filter out properties that are null, undefined, or empty strings/arrays\n  const filteredProperties: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(properties)) {\n    if (value !== null && value !== undefined) {\n      if (typeof value === \"string\" && value.trim() === \"\") {\n        // Keep empty strings for console events as they might be meaningful\n        filteredProperties[key] = value;\n      } else if (Array.isArray(value) && value.length === 0) {\n        // Keep empty arrays for console events as they might be meaningful\n        filteredProperties[key] = value;\n      } else {\n        filteredProperties[key] = value;\n      }\n    }\n  }\n\n  // If all properties were filtered out, return the original properties\n  if (Object.keys(filteredProperties).length === 0) {\n    return properties;\n  }\n\n  // Ensure we always have at least a message field for console events\n  if (\n    filteredProperties.message === undefined ||\n    filteredProperties.message === null\n  ) {\n    filteredProperties.message = \"[No message]\";\n  }\n\n  // Convert filtered properties to JSON string to check size\n  const propertiesString = JSON.stringify(filteredProperties);\n  const originalSize = propertiesString.length;\n\n  // If already within limit, return filtered properties\n  if (originalSize <= maxSizeBytes) {\n    return filteredProperties;\n  }\n\n  logger.debug(\"Properties size limit exceeded, truncating\", {\n    originalSize,\n    maxSizeBytes,\n    propertyCount: Object.keys(filteredProperties).length,\n  });\n\n  // Create a copy to work with\n  const limitedProperties: Record<string, unknown> = {};\n  const propertyEntries = Object.entries(filteredProperties);\n\n  // Sort properties by priority: message first, then others alphabetically\n  propertyEntries.sort(([keyA], [keyB]) => {\n    if (keyA === \"message\") return -1;\n    if (keyB === \"message\") return 1;\n    return keyA.localeCompare(keyB);\n  });\n\n  // First pass: add all properties and see if we're within limits\n  for (const [key, value] of propertyEntries) {\n    limitedProperties[key] = value;\n    const currentString = JSON.stringify(limitedProperties);\n\n    // If adding this property exceeds the limit, try to truncate strings\n    if (currentString.length > maxSizeBytes) {\n      // Try to truncate string values to fit within limits\n      const canTruncate = tryTruncateStrings(limitedProperties, maxSizeBytes);\n      if (!canTruncate) {\n        // If we can't truncate enough, remove non-essential properties\n        removeNonEssentialProperties(limitedProperties, key);\n        break;\n      }\n    }\n  }\n\n  const finalSize = JSON.stringify(limitedProperties).length;\n  const removedCount =\n    Object.keys(filteredProperties).length -\n    Object.keys(limitedProperties).length;\n\n  logger.debug(\"Properties truncated successfully\", {\n    originalSize,\n    finalSize,\n    removedCount,\n    remainingCount: Object.keys(limitedProperties).length,\n  });\n\n  return limitedProperties;\n}\n\n/**\n * Try to truncate string values in properties to fit within size limit\n */\nfunction tryTruncateStrings(\n  properties: Record<string, unknown>,\n  maxSizeBytes: number\n): boolean {\n  let currentSize = JSON.stringify(properties).length;\n\n  // If already within limits, no need to truncate\n  if (currentSize <= maxSizeBytes) {\n    return true;\n  }\n\n  // Try to truncate string values, starting with the longest ones\n  const stringEntries = Object.entries(properties)\n    .filter(([, value]) => typeof value === \"string\")\n    .sort(([, a], [, b]) => (b as string).length - (a as string).length);\n\n  for (const [key, value] of stringEntries) {\n    if (typeof value !== \"string\") continue;\n\n    let truncatedValue = value;\n    const step = Math.max(1, Math.floor(value.length * 0.1)); // Truncate 10% at a time\n\n    while (truncatedValue.length > 10 && currentSize > maxSizeBytes) {\n      truncatedValue = truncatedValue.slice(0, -step);\n      properties[key] = truncatedValue + \"...\";\n      currentSize = JSON.stringify(properties).length;\n    }\n\n    // If we still can't fit, try more aggressive truncation\n    if (currentSize > maxSizeBytes) {\n      properties[key] = truncatedValue.slice(0, 50) + \"...\";\n      currentSize = JSON.stringify(properties).length;\n    }\n\n    // If we still can't fit, give up on this property (except message)\n    if (currentSize > maxSizeBytes && key !== \"message\") {\n      delete properties[key];\n      currentSize = JSON.stringify(properties).length;\n    }\n  }\n\n  // Ensure message is never completely removed\n  if (!properties.message || typeof properties.message !== \"string\") {\n    properties.message = \"[Message truncated]\";\n  }\n\n  return currentSize <= maxSizeBytes;\n}\n\n/**\n * Remove non-essential properties while keeping essential ones\n */\nfunction removeNonEssentialProperties(\n  properties: Record<string, unknown>,\n  lastAddedKey: string\n): void {\n  // Essential properties that should always be kept\n  const essentialKeys = [\"message\"];\n\n  // Remove the property that caused the overflow\n  if (!essentialKeys.includes(lastAddedKey)) {\n    delete properties[lastAddedKey];\n  }\n\n  // Remove other non-essential properties if still needed\n  const nonEssentialKeys = Object.keys(properties).filter(\n    key => !essentialKeys.includes(key)\n  );\n\n  for (const key of nonEssentialKeys) {\n    delete properties[key];\n    const currentSize = JSON.stringify(properties).length;\n    if (currentSize <= 8192) {\n      break;\n    }\n  }\n\n  // Ensure we always have a message\n  if (!properties.message) {\n    properties.message = \"[Properties truncated]\";\n  }\n}\n","import type { TelemetryEvent } from \"../../../types\";\nimport type { HyperlookEvent } from \"../types\";\nimport { generateEventId } from \"./generateEventId\";\nimport { limitPropertiesSize } from \"./limitPropertiesSize\";\n\nexport function transformEvent(event: TelemetryEvent): HyperlookEvent {\n  // Ensure payload is properly handled - limitPropertiesSize will always return at least a message\n  const payload = event.payload || {};\n  const limitedProperties = limitPropertiesSize(payload);\n\n  // Properties should never be null since limitPropertiesSize ensures at least a message field\n  const properties = limitedProperties;\n\n  const transformed: HyperlookEvent = {\n    event_id: generateEventId(),\n    event_type: event.eventType,\n    event_name: event.eventName,\n    properties: properties,\n    user_properties: null, // Set to null instead of empty object\n    timestamp: event.timestamp,\n  };\n\n  // Only add optional properties if they have values\n  if (event.userId) {\n    transformed.user_id = event.userId;\n  }\n  if (event.sessionId) {\n    transformed.session_id = event.sessionId;\n  }\n  if (typeof window !== \"undefined\") {\n    transformed.page_url = window.location.href;\n  }\n  if (typeof document !== \"undefined\") {\n    transformed.page_title = document.title;\n    transformed.referrer = document.referrer;\n  }\n  if (typeof window !== \"undefined\" && window.navigator) {\n    transformed.user_agent = window.navigator.userAgent;\n  }\n\n  return transformed;\n}\n","import type { TelemetryExporter, TelemetryEvent } from \"../../types\";\nimport { getLogger } from \"../../logger\";\nimport { HYPERLOOK_URL } from \"../../constants\";\nimport { transformEvent } from \"./utils\";\n\nexport class HyperlookExporter implements TelemetryExporter {\n  private logger = getLogger();\n  private apiKey: string;\n\n  constructor(apiKey: string) {\n    this.apiKey = apiKey;\n    this.logger.debug(\"HyperlookExporter initialized\", {\n      endpoint: HYPERLOOK_URL,\n    });\n  }\n\n  async export(events: TelemetryEvent[], _endpoint?: string): Promise<void> {\n    if (!events.length) {\n      this.logger.debug(\"No events to export to Hyperlook\");\n      return;\n    }\n\n    this.logger.debug(\"Exporting events to Hyperlook\", {\n      endpoint: HYPERLOOK_URL,\n      eventCount: events.length,\n    });\n\n    try {\n      // Transform events to Hyperlook format\n      const hyperlookEvents = events.map(event => transformEvent(event));\n\n      const payload = {\n        events: hyperlookEvents,\n      };\n\n      this.logger.debug(\"Sending payload to Hyperlook\", {\n        payload: JSON.stringify(payload, null, 2),\n      });\n\n      // Add timeout protection for network requests\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n      try {\n        const response = await fetch(HYPERLOOK_URL, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n            Accept: \"application/json\",\n            \"X-API-Key\": this.apiKey,\n          },\n          body: JSON.stringify(payload),\n          signal: controller.signal,\n        });\n        clearTimeout(timeoutId);\n\n        if (!response.ok) {\n          const errorText = await response.text();\n          throw new Error(`HTTP ${response.status}: ${errorText}`);\n        }\n\n        this.logger.debug(\"Hyperlook export successful\", {\n          status: response.status,\n          eventCount: events.length,\n        });\n      } catch (error) {\n        clearTimeout(timeoutId);\n        this.logger.error(\"Hyperlook export failed\", {\n          endpoint: HYPERLOOK_URL,\n          error: error instanceof Error ? error.message : String(error),\n          errorStack: error instanceof Error ? error.stack : undefined,\n          eventCount: events.length,\n        });\n        throw error;\n      }\n    } catch (error) {\n      this.logger.error(\"Hyperlook export failed\", {\n        endpoint: HYPERLOOK_URL,\n        error: error instanceof Error ? error.message : String(error),\n        errorStack: error instanceof Error ? error.stack : undefined,\n        eventCount: events.length,\n      });\n      throw error;\n    }\n  }\n}\n\n// Export types and utils\nexport * from \"./types\";\nexport * from \"./utils\";\n","import type { TelemetryExporter, TelemetryEvent } from \"../types\";\nimport { getLogger } from \"../logger\";\n\nexport class HTTPExporter implements TelemetryExporter {\n  private logger = getLogger();\n\n  constructor() {\n    this.logger.debug(\"HttpExporter initialized\");\n  }\n\n  async export(events: TelemetryEvent[], endpoint?: string): Promise<void> {\n    if (!endpoint || endpoint.trim() === \"\") {\n      this.logger.warn(\"HTTP export skipped - no endpoint configured\", {\n        eventCount: events.length,\n      });\n      return;\n    }\n\n    this.logger.debug(\"Exporting events via HTTP\", {\n      endpoint,\n      eventCount: events.length,\n    });\n\n    try {\n      // Add timeout protection for network requests\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n      try {\n        const response = await fetch(endpoint, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ events }),\n          signal: controller.signal,\n        });\n        clearTimeout(timeoutId);\n\n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n        }\n\n        this.logger.debug(\"HTTP export successful\", {\n          status: response.status,\n          eventCount: events.length,\n        });\n      } catch (error) {\n        clearTimeout(timeoutId);\n        this.logger.error(\"HTTP export failed\", {\n          endpoint,\n          error: error instanceof Error ? error.message : String(error),\n          errorStack: error instanceof Error ? error.stack : undefined,\n          eventCount: events.length,\n        });\n        throw error;\n      }\n    } catch (error) {\n      this.logger.error(\"HTTP export failed\", {\n        endpoint,\n        error: error instanceof Error ? error.message : String(error),\n        errorStack: error instanceof Error ? error.stack : undefined,\n        eventCount: events.length,\n      });\n      throw error;\n    }\n  }\n}\n","export function sanitizeString(input: string, fieldName: string): string {\n  if (typeof input !== \"string\") {\n    throw new Error(`${fieldName} must be a string`);\n  }\n  // Remove null bytes and control characters without regex\n  let sanitized = \"\";\n  for (let i = 0; i < input.length; i++) {\n    const code = input.charCodeAt(i);\n    if ((code > 31 && code !== 127) || code === 10 || code === 13) {\n      sanitized += input[i];\n    }\n  }\n  sanitized = sanitized.trim();\n  if (sanitized.length === 0) throw new Error(`${fieldName} cannot be empty`);\n  if (sanitized.length > 1000)\n    throw new Error(`${fieldName} is too long (max 1000 characters)`);\n  return sanitized;\n}\n","import { sanitizeString } from \"./sanitizeString\";\n\nexport function sanitizePayload(\n  payload: Record<string, unknown>,\n  seen = new WeakSet<object>()\n): Record<string, unknown> {\n  if (!payload || typeof payload !== \"object\") {\n    throw new Error(\"Payload must be an object\");\n  }\n\n  // Check for circular references\n  if (seen.has(payload)) {\n    throw new Error(\"Circular reference detected in payload\");\n  }\n\n  const sanitized: Record<string, unknown> = {};\n  const keys = Object.keys(payload);\n  if (keys.length > 100) {\n    throw new Error(\"Payload has too many keys (max 100)\");\n  }\n\n  // Add current object to seen set to detect circular references\n  seen.add(payload);\n\n  try {\n    for (const key of keys) {\n      const sanitizedKey = sanitizeString(key, \"payload key\");\n      const value = payload[key];\n\n      if (\n        value !== null &&\n        typeof value !== \"string\" &&\n        typeof value !== \"number\" &&\n        typeof value !== \"boolean\" &&\n        !Array.isArray(value) &&\n        typeof value !== \"object\"\n      ) {\n        throw new Error(`Invalid payload value type for key '${sanitizedKey}'`);\n      }\n\n      if (\n        typeof value === \"object\" &&\n        value !== null &&\n        !Array.isArray(value)\n      ) {\n        sanitized[sanitizedKey] = sanitizePayload(\n          value as Record<string, unknown>,\n          seen\n        );\n      } else {\n        sanitized[sanitizedKey] = value;\n      }\n    }\n  } finally {\n    // Remove from seen set when done processing this object\n    seen.delete(payload);\n  }\n\n  return sanitized;\n}\n","import type { TelemetryConfig } from \"../../types\";\nimport { ExporterType } from \"../../types/ExporterTypes\";\n\nexport function validateConfig(config: TelemetryConfig): void {\n  // Endpoint validation removed since we use hardcoded Hyperlook URL\n\n  // Validate Hyperlook API key if Hyperlook exporter is enabled\n  const exportersToEnable = config.exporters ?? [ExporterType.HYPERLOOK];\n  if (\n    exportersToEnable.includes(ExporterType.HYPERLOOK) &&\n    !config.hyperlookApiKey\n  ) {\n    throw new Error(\n      \"Hyperlook API key is required when Hyperlook exporter is enabled\"\n    );\n  }\n\n  if (\n    config.samplingRate !== undefined &&\n    (config.samplingRate < 0 || config.samplingRate > 1)\n  ) {\n    throw new Error(\"Sampling rate must be between 0 and 1\");\n  }\n\n  if (config.batchSize !== undefined && config.batchSize <= 0) {\n    throw new Error(\"Batch size must be greater than 0\");\n  }\n\n  if (config.flushInterval !== undefined && config.flushInterval < 0) {\n    throw new Error(\"Flush interval must be non-negative\");\n  }\n\n  if (config.maxRetries !== undefined && config.maxRetries < 0) {\n    throw new Error(\"Max retries must be non-negative\");\n  }\n\n  if (config.retryDelay !== undefined && config.retryDelay < 0) {\n    throw new Error(\"Retry delay must be non-negative\");\n  }\n}\n","export function generateSessionId(): string {\n  return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n","import type { TelemetryManager } from \"../TelemetryManager\";\nimport type { TelemetryEvent, Logger } from \"../types\";\nimport { getLogger } from \"../logger\";\n\nexport abstract class BasePlugin {\n  protected manager!: TelemetryManager;\n  protected logger: Logger;\n  protected isEnabled = true;\n  protected isInitialized = false;\n  protected isDestroyed = false;\n\n  constructor() {\n    this.logger = getLogger();\n  }\n\n  initialize(manager: TelemetryManager): void {\n    try {\n      if (this.isInitialized) {\n        this.logger.warn(\"Plugin already initialized\", {\n          pluginName: this.constructor.name,\n        });\n        return;\n      }\n\n      if (this.isDestroyed) {\n        this.logger.error(\"Cannot initialize destroyed plugin\", {\n          pluginName: this.constructor.name,\n        });\n        return;\n      }\n\n      if (!manager) {\n        throw new Error(\n          \"TelemetryManager is required for plugin initialization\"\n        );\n      }\n\n      this.manager = manager;\n\n      if (this.isSupported()) {\n        this.setup();\n        this.isInitialized = true;\n        this.logger.debug(\"Plugin initialized\", {\n          pluginName: this.constructor.name,\n        });\n      } else {\n        this.logger.warn(\"Plugin not supported in this environment\", {\n          pluginName: this.constructor.name,\n        });\n        this.isEnabled = false;\n      }\n    } catch (error) {\n      this.logger.error(\"Failed to initialize plugin\", {\n        pluginName: this.constructor.name,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n      throw error;\n    }\n  }\n\n  protected abstract isSupported(): boolean;\n  protected abstract setup(): void;\n\n  protected safeCapture(event: TelemetryEvent): void {\n    try {\n      if (!this.isEnabled) {\n        this.logger.debug(\"Plugin is disabled, skipping event capture\", {\n          pluginName: this.constructor.name,\n          eventType: event.eventType,\n          eventName: event.eventName,\n        });\n        return;\n      }\n\n      if (!this.isInitialized) {\n        this.logger.warn(\"Plugin not initialized, skipping event capture\", {\n          pluginName: this.constructor.name,\n          eventType: event.eventType,\n          eventName: event.eventName,\n        });\n        return;\n      }\n\n      if (this.isDestroyed) {\n        this.logger.warn(\"Plugin is destroyed, skipping event capture\", {\n          pluginName: this.constructor.name,\n          eventType: event.eventType,\n          eventName: event.eventName,\n        });\n        return;\n      }\n\n      if (!this.manager) {\n        this.logger.error(\"TelemetryManager not available\", {\n          pluginName: this.constructor.name,\n          eventType: event.eventType,\n          eventName: event.eventName,\n        });\n        return;\n      }\n\n      this.manager.capture(event);\n    } catch (error) {\n      this.logger.error(\"Failed to capture event in plugin\", {\n        pluginName: this.constructor.name,\n        eventType: event.eventType,\n        eventName: event.eventName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  teardown?(): void;\n\n  destroy(): void {\n    try {\n      if (this.isDestroyed) {\n        return;\n      }\n\n      this.isDestroyed = true;\n      this.isEnabled = false;\n      this.isInitialized = false;\n\n      if (this.teardown) {\n        this.teardown();\n      }\n\n      this.logger.debug(\"Plugin destroyed\", {\n        pluginName: this.constructor.name,\n      });\n    } catch (error) {\n      this.logger.error(\"Failed to destroy plugin\", {\n        pluginName: this.constructor.name,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  isPluginEnabled(): boolean {\n    return this.isEnabled && this.isInitialized && !this.isDestroyed;\n  }\n}\n","import { BasePlugin } from \"./BasePlugin\";\nimport type { TelemetryEvent } from \"../types\";\n\nexport class ClickPlugin extends BasePlugin {\n  private handler = (e: MouseEvent) => {\n    try {\n      const target = e.target;\n\n      // Validate that target is an HTMLElement\n      if (!target || !(target instanceof HTMLElement)) {\n        this.logger.debug(\n          \"Click event target is not an HTMLElement, skipping\",\n          {\n            targetType: target ? typeof target : \"null\",\n          }\n        );\n        return;\n      }\n\n      const tgt = target;\n\n      // Safely extract text content with null checks\n      // Removed unused textContent extraction and try-catch block\n\n      const rect = tgt.getBoundingClientRect();\n\n      const evt: TelemetryEvent = {\n        eventType: \"interaction\",\n        eventName: \"click\",\n        payload: {\n          element: {\n            tagName: tgt.tagName,\n            id: tgt.id || null,\n            className: tgt.className || null,\n            textContent: tgt.textContent?.slice(0, 100) || null,\n            href: (tgt as HTMLAnchorElement).href || null,\n            type: (tgt as HTMLInputElement).type || null,\n            value: (tgt as HTMLInputElement).value || null,\n            placeholder: (tgt as HTMLInputElement).placeholder || null,\n            role: tgt.getAttribute(\"role\") || null,\n            ariaLabel: tgt.getAttribute(\"aria-label\") || null,\n            dataAttributes: Object.fromEntries(\n              Array.from(tgt.attributes)\n                .filter(attr => attr.name.startsWith(\"data-\"))\n                .map(attr => [attr.name, attr.value])\n            ),\n          },\n          position: {\n            x: e.clientX,\n            y: e.clientY,\n            pageX: e.pageX,\n            pageY: e.pageY,\n            screenX: e.screenX,\n            screenY: e.screenY,\n          },\n          boundingRect: {\n            top: rect.top,\n            left: rect.left,\n            width: rect.width,\n            height: rect.height,\n          },\n          event: {\n            button: e.button,\n            buttons: e.buttons,\n            ctrlKey: e.ctrlKey,\n            shiftKey: e.shiftKey,\n            altKey: e.altKey,\n            metaKey: e.metaKey,\n            type: e.type,\n            timestamp: e.timeStamp,\n          },\n          scrollX: window.scrollX,\n          scrollY: window.scrollY,\n        },\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.debug(\"Click event captured\", {\n        tag: tgt.tagName,\n        id: tgt.id,\n        coordinates: { x: e.clientX, y: e.clientY },\n      });\n\n      this.safeCapture(evt);\n    } catch (error) {\n      this.logger.error(\"Failed to process click event\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  };\n\n  protected isSupported(): boolean {\n    return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n  }\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"ClickPlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      document.addEventListener(\"click\", this.handler, true);\n      this.logger.info(\"ClickPlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup ClickPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  teardown(): void {\n    try {\n      if (typeof document !== \"undefined\") {\n        document.removeEventListener(\"click\", this.handler, true);\n      }\n      this.logger.info(\"ClickPlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown ClickPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","import { BasePlugin } from \"./BasePlugin\";\nimport type { TelemetryEvent } from \"../types\";\nimport { sanitizeString, sanitizePayload } from \"../TelemetryManager/utils\";\n\nexport class CustomEventsPlugin extends BasePlugin {\n  private readonly MAX_EVENT_TYPE_LENGTH = 50;\n  private readonly MAX_EVENT_NAME_LENGTH = 100;\n  private readonly MAX_PAYLOAD_SIZE = 10000; // 10KB limit\n  private readonly RESERVED_EVENT_TYPES = new Set([\n    \"system\",\n    \"internal\",\n    \"debug\",\n    \"telemetry\",\n    \"sdk\",\n  ]);\n\n  protected isSupported(): boolean {\n    return true; // Custom events are always supported\n  }\n\n  private validateEventType(eventType: string): void {\n    if (!eventType || typeof eventType !== \"string\") {\n      throw new Error(\"Event type is required and must be a string\");\n    }\n\n    if (eventType.length > this.MAX_EVENT_TYPE_LENGTH) {\n      throw new Error(\n        `Event type too long (max ${this.MAX_EVENT_TYPE_LENGTH} characters)`\n      );\n    }\n\n    if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(eventType)) {\n      throw new Error(\n        \"Event type must start with a letter and contain only letters, numbers, and underscores\"\n      );\n    }\n\n    if (this.RESERVED_EVENT_TYPES.has(eventType.toLowerCase())) {\n      throw new Error(\n        `Event type '${eventType}' is reserved and cannot be used`\n      );\n    }\n  }\n\n  private validateEventName(eventName: string): void {\n    if (!eventName || typeof eventName !== \"string\") {\n      throw new Error(\"Event name is required and must be a string\");\n    }\n\n    if (eventName.length > this.MAX_EVENT_NAME_LENGTH) {\n      throw new Error(\n        `Event name too long (max ${this.MAX_EVENT_NAME_LENGTH} characters)`\n      );\n    }\n\n    if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(eventName)) {\n      throw new Error(\n        \"Event name must start with a letter and contain only letters, numbers, and underscores\"\n      );\n    }\n  }\n\n  private validatePayload(payload: unknown): void {\n    if (payload === null || payload === undefined) {\n      throw new Error(\"Payload cannot be null or undefined\");\n    }\n\n    if (typeof payload !== \"object\") {\n      throw new Error(\"Payload must be an object\");\n    }\n\n    if (Array.isArray(payload)) {\n      throw new Error(\"Payload cannot be an array\");\n    }\n\n    // Check payload size\n    const payloadString = JSON.stringify(payload);\n    if (payloadString.length > this.MAX_PAYLOAD_SIZE) {\n      throw new Error(`Payload too large (max ${this.MAX_PAYLOAD_SIZE} bytes)`);\n    }\n  }\n\n  /**\n   * Capture a custom event with the specified type, name, and payload\n   */\n  captureCustomEvent<T = Record<string, unknown>>(\n    eventType: string,\n    eventName: string,\n    payload: T\n  ): void {\n    try {\n      // Validate inputs\n      this.validateEventType(eventType);\n      this.validateEventName(eventName);\n      this.validatePayload(payload);\n\n      const userId = this.manager.getUserId();\n      const sessionId = this.manager.getSessionId();\n\n      // Sanitize inputs\n      const sanitizedEventType = sanitizeString(eventType, \"eventType\");\n      const sanitizedEventName = sanitizeString(eventName, \"eventName\");\n      const sanitizedPayload = sanitizePayload(\n        payload as Record<string, unknown>\n      );\n\n      const event: TelemetryEvent<T> = {\n        eventType: sanitizedEventType,\n        eventName: sanitizedEventName,\n        payload: sanitizedPayload as T,\n        timestamp: new Date().toISOString(),\n        ...(sessionId && { sessionId }),\n        ...(userId && { userId }),\n      };\n\n      this.logger.debug(\"Custom event captured\", {\n        eventType: sanitizedEventType,\n        eventName: sanitizedEventName,\n        payloadKeys: Object.keys(sanitizedPayload),\n      });\n\n      this.safeCapture(event as TelemetryEvent);\n    } catch (error) {\n      this.logger.error(\"Failed to capture custom event\", {\n        eventType,\n        eventName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Capture a custom event with a pre-built TelemetryEvent object\n   */\n  captureEvent<T = Record<string, unknown>>(event: TelemetryEvent<T>): void {\n    try {\n      // Validate the event object\n      if (!event || typeof event !== \"object\") {\n        throw new Error(\"Event must be a valid TelemetryEvent object\");\n      }\n\n      this.validateEventType(event.eventType);\n      this.validateEventName(event.eventName);\n      this.validatePayload(event.payload);\n\n      // Validate timestamp\n      if (!event.timestamp || typeof event.timestamp !== \"string\") {\n        throw new Error(\"Event timestamp is required and must be a string\");\n      }\n\n      // Validate timestamp format\n      if (\n        !/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(\n          event.timestamp\n        )\n      ) {\n        throw new Error(\"Invalid timestamp format. Expected ISO 8601 format\");\n      }\n\n      this.logger.debug(\"Custom event captured\", {\n        eventType: event.eventType,\n        eventName: event.eventName,\n        payloadKeys: Object.keys(event.payload as Record<string, unknown>),\n      });\n\n      this.safeCapture(event as TelemetryEvent);\n    } catch (error) {\n      this.logger.error(\"Failed to capture custom event\", {\n        eventType: event?.eventType,\n        eventName: event?.eventName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  protected setup(): void {\n    // No setup required for custom events plugin\n    this.logger.info(\"CustomEventsPlugin setup complete\");\n  }\n}\n","import { BasePlugin } from \"./BasePlugin\";\nimport type { TelemetryEvent } from \"../types\";\n\nexport class ErrorPlugin extends BasePlugin {\n  private errorHandler = (event: ErrorEvent) => {\n    try {\n      const errorVal = event.error as unknown;\n      let stackVal: string | undefined = undefined;\n      if (\n        errorVal &&\n        typeof errorVal === \"object\" &&\n        \"stack\" in errorVal &&\n        typeof (errorVal as { stack?: unknown }).stack === \"string\"\n      ) {\n        stackVal = (errorVal as { stack: string }).stack;\n      }\n      const evt: TelemetryEvent = {\n        eventType: \"error\",\n        eventName: \"javascript_error\",\n        payload: {\n          message: event.message,\n          filename: event.filename,\n          lineno: event.lineno,\n          colno: event.colno,\n          error: event.error ? JSON.stringify(event.error) : undefined,\n          stack: stackVal,\n        },\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.debug(\"JavaScript error captured\", {\n        message: event.message,\n        filename: event.filename,\n        lineno: event.lineno,\n      });\n\n      this.safeCapture(evt);\n    } catch (error) {\n      this.logger.error(\"Failed to process JavaScript error\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  };\n\n  private unhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n    try {\n      const reasonStr = JSON.stringify(event.reason);\n      const evt: TelemetryEvent = {\n        eventType: \"error\",\n        eventName: \"unhandled_promise_rejection\",\n        payload: {\n          reason: reasonStr,\n          promise: event.promise,\n        },\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.debug(\"Unhandled promise rejection captured\", {\n        reason: JSON.stringify(event.reason),\n      });\n\n      this.safeCapture(evt);\n    } catch (error) {\n      this.logger.error(\"Failed to process unhandled promise rejection\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  };\n\n  protected isSupported(): boolean {\n    return typeof window !== \"undefined\";\n  }\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"ErrorPlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      window.addEventListener(\"error\", this.errorHandler);\n      window.addEventListener(\n        \"unhandledrejection\",\n        this.unhandledRejectionHandler\n      );\n      this.logger.info(\"ErrorPlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup ErrorPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  teardown(): void {\n    try {\n      if (typeof window !== \"undefined\") {\n        window.removeEventListener(\"error\", this.errorHandler);\n        window.removeEventListener(\n          \"unhandledrejection\",\n          this.unhandledRejectionHandler\n        );\n      }\n      this.logger.info(\"ErrorPlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown ErrorPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","/**\n * Sanitize console arguments to prevent XSS\n */\nexport const sanitizeConsoleArgs = (args: unknown[]): string[] => {\n  return args.map(arg => {\n    try {\n      if (typeof arg === \"string\") {\n        // Basic XSS prevention for strings\n        return arg\n          .replace(/</g, \"&lt;\")\n          .replace(/>/g, \"&gt;\")\n          .replace(/\"/g, \"&quot;\")\n          .replace(/'/g, \"&#x27;\")\n          .replace(/\\//g, \"&#x2F;\");\n      }\n      if (typeof arg === \"object\" && arg !== null) {\n        // For objects, try to safely stringify\n        const sanitized = JSON.stringify(arg, (_key, value: string) => {\n          if (typeof value === \"string\") {\n            return value\n              .replace(/</g, \"&lt;\")\n              .replace(/>/g, \"&gt;\")\n              .replace(/\"/g, \"&quot;\")\n              .replace(/'/g, \"&#x27;\")\n              .replace(/\\//g, \"&#x2F;\");\n          }\n          return value;\n        });\n        return typeof sanitized === \"string\" ? sanitized : \"[Object]\";\n      }\n      return String(arg);\n    } catch {\n      // If stringification fails, return a safe fallback\n      return \"[Object]\";\n    }\n  });\n};\n","import { ConsoleEventName, type ConsoleMethod, type LogEvent } from \"../types\";\nimport { sanitizeConsoleArgs } from \"./sanitization\";\nimport { TELEMETRY_SDK_PREFIX } from \"../../../constants\";\n\nexport type ConsoleInterceptorContext = {\n  originals: Partial<Record<ConsoleMethod, typeof console.log>>;\n  safeCapture: (event: LogEvent) => void;\n};\n\nexport const createConsoleInterceptor = (\n  method: ConsoleMethod,\n  context: ConsoleInterceptorContext\n) => {\n  const { originals, safeCapture } = context;\n\n  return (...args: unknown[]) => {\n    // 1. forward to the real console using the stored original\n    const original = originals[method];\n    if (original) {\n      original.apply(console, args);\n    }\n\n    // 2. check if this is our own SDK log to prevent infinite recursion\n    const sanitizedArgs = sanitizeConsoleArgs(args);\n    const message = sanitizedArgs.join(\" \");\n\n    if (!message.includes(TELEMETRY_SDK_PREFIX)) {\n      // 3. emit telemetry event with sanitized data\n      let eventName: ConsoleEventName;\n      switch (method) {\n        case \"log\":\n          eventName = ConsoleEventName.LOG;\n          break;\n        case \"warn\":\n          eventName = ConsoleEventName.WARN;\n          break;\n        case \"error\":\n          eventName = ConsoleEventName.ERROR;\n          break;\n        case \"info\":\n          eventName = ConsoleEventName.INFO;\n          break;\n        case \"debug\":\n          eventName = ConsoleEventName.DEBUG;\n          break;\n        default:\n          eventName = ConsoleEventName.LOG;\n      }\n\n      // Ensure we have meaningful payload data even for empty console calls\n      let payloadMessage =\n        message.trim() || `[${method.toUpperCase()}] No message provided`;\n      const payloadArgs =\n        sanitizedArgs.length > 0\n          ? sanitizedArgs.map(arg => {\n              if (typeof arg === \"object\") {\n                try {\n                  return JSON.stringify(arg);\n                } catch {\n                  return String(arg);\n                }\n              }\n              return String(arg);\n            })\n          : [`[${method.toUpperCase()}] No arguments provided`];\n\n      // Ensure the message is never empty or just whitespace\n      if (!payloadMessage || payloadMessage.trim() === \"\") {\n        payloadMessage = `[${method.toUpperCase()}] Empty message`;\n      }\n\n      const evt: LogEvent = {\n        eventType: \"console\",\n        eventName: eventName,\n        payload: {\n          message: payloadMessage,\n          args: payloadArgs,\n          stack: new Error().stack?.split(\"\\n\").slice(2, 7) || [],\n        },\n        timestamp: new Date().toISOString(),\n      };\n      safeCapture(evt);\n    }\n  };\n};\n\nexport const setupConsoleInterceptors = (\n  context: ConsoleInterceptorContext\n) => {\n  const methods: ConsoleMethod[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n\n  methods.forEach(method => {\n    // Store the original method BEFORE replacing it\n    context.originals[method] = console[method].bind(console);\n    console[method] = createConsoleInterceptor(method, context);\n  });\n};\n","import { BasePlugin } from \"../BasePlugin\";\nimport type { ConsoleMethod } from \"./types\";\nimport { setupConsoleInterceptors } from \"./utils\";\n\nexport class LogPlugin extends BasePlugin {\n  private originals: Partial<Record<ConsoleMethod, typeof console.log>> = {};\n\n  protected isSupported(): boolean {\n    return typeof console !== \"undefined\";\n  }\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"LogPlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      setupConsoleInterceptors({\n        originals: this.originals,\n        safeCapture: this.safeCapture.bind(this),\n      });\n\n      this.logger.info(\"LogPlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup LogPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  public teardown(): void {\n    try {\n      // Restore originals\n      (Object.keys(this.originals) as ConsoleMethod[]).forEach(method => {\n        const original = this.originals[method];\n        if (original) {\n          console[method] = original;\n        }\n      });\n      this.logger.info(\"LogPlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown LogPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","/**\n * Helper function to extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Record of query parameters\n */\nexport const extractQueryParams = (url: string): Record<string, string> => {\n  try {\n    const urlObj = new URL(\n      url,\n      typeof window !== \"undefined\" ? window.location.origin : \"\"\n    );\n    const params: Record<string, string> = {};\n    urlObj.searchParams.forEach((value, key) => {\n      params[key] = value;\n    });\n    return params;\n  } catch {\n    return {};\n  }\n};\n","/**\n * Helper function to extract response headers from Response object\n * @param response - The Response object to extract headers from\n * @returns Record of response headers\n */\nexport const extractResponseHeaders = (\n  response: Response\n): Record<string, string> => {\n  const headers: Record<string, string> = {};\n  try {\n    response.headers.forEach((value, key) => {\n      headers[key.toLowerCase()] = value;\n    });\n  } catch {\n    // Ignore header extraction errors\n  }\n  return headers;\n};\n\n/**\n * Helper function to extract response headers from XMLHttpRequest object\n * @param xhr - The XMLHttpRequest object to extract headers from\n * @returns Record of response headers\n */\nexport const extractXHRResponseHeaders = (\n  xhr: XMLHttpRequest\n): Record<string, string> => {\n  const headers: Record<string, string> = {};\n  try {\n    const headerString = xhr.getAllResponseHeaders();\n    if (headerString) {\n      headerString.split(\"\\r\\n\").forEach(line => {\n        const [key, value] = line.split(\": \");\n        if (key && value) {\n          headers[key.toLowerCase()] = value;\n        }\n      });\n    }\n  } catch {\n    // Ignore header extraction errors\n  }\n  return headers;\n};\n","/**\n * Helper function to extract response body from Response object\n * @param response - The Response object to extract body from\n * @returns The response body as parsed JSON or text\n */\nexport const extractResponseBody = async (\n  response: Response\n): Promise<unknown> => {\n  try {\n    // Check if response is already consumed\n    if (response.bodyUsed) {\n      return null;\n    }\n\n    const clone = response.clone(); // Clone to avoid consuming the response\n    const text = await clone.text();\n    if (text) {\n      try {\n        return JSON.parse(text);\n      } catch {\n        // If JSON parsing fails, return the raw text\n        return text;\n      }\n    }\n  } catch {\n    // If any error occurs, return null\n    return null;\n  }\n  return null;\n};\n\n/**\n * Helper function to extract response body from XMLHttpRequest object\n * @param xhr - The XMLHttpRequest object to extract body from\n * @returns The response body as parsed JSON or text\n */\nexport const extractXHRResponseBody = (xhr: XMLHttpRequest): unknown => {\n  try {\n    const responseText = xhr.responseText;\n    if (responseText) {\n      try {\n        return JSON.parse(responseText);\n      } catch {\n        // If JSON parsing fails, return the raw text\n        return responseText;\n      }\n    }\n  } catch {\n    // If any error occurs, return null\n    return null;\n  }\n  return null;\n};\n","/**\n * Helper function to detect Supabase URLs more accurately\n * @param url - The URL to check\n * @returns true if the URL is a Supabase endpoint, false otherwise\n */\nexport const isSupabaseUrl = (url: string): boolean => {\n  try {\n    const urlObj = new URL(\n      url,\n      typeof window !== \"undefined\" ? window.location.origin : \"\"\n    );\n    const hostname = urlObj.hostname.toLowerCase();\n\n    const isSupabase =\n      hostname.includes(\"supabase.co\") || hostname.includes(\"supabase.com\");\n\n    return isSupabase;\n  } catch {\n    // If URL parsing fails, we can't reliably determine if it's a Supabase URL\n    // Return false to avoid false positives\n    return false;\n  }\n};\n","import type { TelemetryConfig } from \"../types/TelemetryConfig\";\nimport { ExporterType } from \"../types/ExporterTypes\";\n\nexport const initialTelemetryConfig: TelemetryConfig = {\n  endpoint: \"https://api.your-domain.com/telemetry\", // Replace with your actual telemetry endpoint\n  hyperlookApiKey: \"your-hyperlook-api-key-here\", // Replace with your actual Hyperlook API key\n  exporters: [ExporterType.HYPERLOOK],\n  enablePageViews: true, // Enable page view tracking by default\n  batchSize: 5,\n  enableClicks: true,\n  enableLogs: true,\n  enableNetwork: true,\n  enablePerformance: true,\n  enableErrors: true, // Enable error tracking by default\n  enableCustomEvents: false, // Disabled by default\n  flushInterval: 10000,\n  maxRetries: 3,\n  retryDelay: 1000,\n  samplingRate: 1.0,\n};\n","export const extractResponseHeaders = (\n  response: Response\n): Record<string, string> => {\n  const headers: Record<string, string> = {};\n  response.headers.forEach((value, key) => {\n    headers[key] = value;\n  });\n  return headers;\n};\n","export const extractResponseBody = async (\n  response: Response\n): Promise<string> => {\n  try {\n    const clone = response.clone();\n    const text = await clone.text();\n    return text.length > 1000 ? text.substring(0, 1000) + \"...\" : text;\n  } catch {\n    return \"\";\n  }\n};\n","export const extractQueryParams = (url: string): Record<string, string> => {\n  try {\n    const urlObj = new URL(\n      url,\n      typeof window !== \"undefined\"\n        ? window.location.origin\n        : \"http://localhost\"\n    );\n    const params: Record<string, string> = {};\n    urlObj.searchParams.forEach((value, key) => {\n      params[key] = value;\n    });\n    return params;\n  } catch {\n    return {};\n  }\n};\n","import type { TelemetryEvent } from \"../../types\";\nimport { HYPERLOOK_URL } from \"../../constants\";\nimport { isSupabaseUrl } from \"../isSupabaseUrl\";\nimport { extractResponseHeaders } from \"./extractResponseHeaders\";\nimport { extractResponseBody } from \"./extractResponseBody\";\nimport { extractQueryParams } from \"./extractQueryParams\";\n\n// Global early event queue for requests made before SDK initialization\nexport const earlyEventQueue: TelemetryEvent[] = [];\nlet earlyInterceptorsSetup = false;\n\n// Immediate module-level early interceptor setup\n// This ensures interceptors are set up as soon as this module is imported\nexport const setupModuleLevelEarlyInterceptors = () => {\n  if (earlyInterceptorsSetup) {\n    return;\n  }\n\n  // Set up early fetch interceptor immediately\n  const originalFetch =\n    typeof window !== \"undefined\" ? window.fetch : globalThis.fetch;\n\n  const earlyFetchInterceptor = async (\n    input: RequestInfo | URL,\n    init?: RequestInit\n  ) => {\n    const startTime = performance.now();\n    let url: string;\n\n    if (typeof input === \"string\") {\n      url = input;\n    } else if (input instanceof URL) {\n      url = input.toString();\n    } else if (typeof (input as { url?: string }).url === \"string\") {\n      url = (input as { url: string }).url;\n    } else {\n      url = JSON.stringify(input);\n    }\n\n    const method = init?.method || \"GET\";\n\n    // Filter out requests to the Hyperlook ingestion URL\n    if (url.includes(HYPERLOOK_URL)) {\n      return originalFetch.call(\n        typeof window !== \"undefined\" ? window : globalThis,\n        input,\n        init\n      );\n    }\n\n    try {\n      const response = await originalFetch.call(\n        typeof window !== \"undefined\" ? window : globalThis,\n        input,\n        init\n      );\n      const endTime = performance.now();\n\n      // Determine event type and name\n      const isSupabase = isSupabaseUrl(url);\n      const eventType = isSupabase ? \"supabase\" : \"network\";\n      const eventName = isSupabase\n        ? \"supabase_fetch_complete\"\n        : \"fetch_complete\";\n\n      // Queue the request for later processing\n      earlyEventQueue.push({\n        eventType,\n        eventName,\n        payload: {\n          url,\n          method,\n          responseStatus: response.status,\n          responseStatusText: response.statusText,\n          responseHeaders: extractResponseHeaders(response),\n          responseBody: await extractResponseBody(response),\n          duration: endTime - startTime,\n          startTime,\n          endTime,\n          isSupabaseQuery: isSupabase,\n          queryParams: extractQueryParams(url),\n        },\n        timestamp: new Date().toISOString(),\n      });\n\n      return response;\n    } catch (error) {\n      const endTime = performance.now();\n\n      // Determine event type and name\n      const isSupabase = isSupabaseUrl(url);\n      const eventType = isSupabase ? \"supabase\" : \"network\";\n      const eventName = isSupabase ? \"supabase_fetch_error\" : \"fetch_error\";\n\n      // Queue the failed request for later processing\n      earlyEventQueue.push({\n        eventType,\n        eventName,\n        payload: {\n          url,\n          method,\n          error: error instanceof Error ? error.message : String(error),\n          duration: endTime - startTime,\n          startTime,\n          endTime,\n          isSupabaseQuery: isSupabase,\n          queryParams: extractQueryParams(url),\n        },\n        timestamp: new Date().toISOString(),\n      });\n\n      throw error;\n    }\n  };\n\n  // Replace fetch immediately\n  if (typeof window !== \"undefined\") {\n    (window as unknown as { fetch: typeof fetch }).fetch =\n      earlyFetchInterceptor;\n  } else {\n    (globalThis as { fetch: typeof fetch }).fetch = earlyFetchInterceptor;\n  }\n\n  earlyInterceptorsSetup = true;\n};\n","import type { NetworkEvent } from \"../types\";\nimport type { Logger } from \"../../../types/Logger\";\nimport {\n  extractQueryParams,\n  extractResponseHeaders,\n  extractResponseBody,\n} from \"./index\";\nimport { isSupabaseUrl } from \"../../../utils\";\nimport { HYPERLOOK_URL } from \"../../../constants\";\n\nexport type FetchInterceptorContext = {\n  originalFetch: typeof fetch;\n  telemetryEndpoint: string;\n  safeCapture: (event: NetworkEvent) => void;\n  logger?: Logger;\n};\n\nexport const createFetchInterceptor = (context: FetchInterceptorContext) => {\n  const { originalFetch, telemetryEndpoint, safeCapture } = context;\n\n  const interceptor = async (input: RequestInfo | URL, init?: RequestInit) => {\n    const startTime = performance.now();\n    let url: string;\n\n    if (typeof input === \"string\") {\n      url = input;\n    } else if (input instanceof URL) {\n      url = input.toString();\n    } else if (typeof (input as { url?: string }).url === \"string\") {\n      url = (input as { url: string }).url;\n    } else {\n      url = JSON.stringify(input);\n    }\n\n    const method = init?.method || \"GET\";\n\n    // Filter out requests to the Hyperlook ingestion URL\n    if (url.includes(HYPERLOOK_URL)) {\n      return originalFetch.call(\n        typeof window !== \"undefined\" ? window : globalThis,\n        input,\n        init\n      );\n    }\n\n    try {\n      const response = await originalFetch.call(\n        typeof window !== \"undefined\" ? window : globalThis,\n        input,\n        init\n      );\n      const endTime = performance.now();\n      const duration = endTime - startTime;\n\n      if (!telemetryEndpoint || !url.includes(telemetryEndpoint)) {\n        const isSupabaseQuery = isSupabaseUrl(url);\n        const eventName = isSupabaseQuery\n          ? \"supabase_fetch_complete\"\n          : \"fetch_complete\";\n        const eventType = isSupabaseQuery ? \"supabase\" : \"network\";\n\n        const evt: NetworkEvent = {\n          eventType: eventType,\n          eventName: eventName,\n          payload: {\n            url,\n            method,\n            queryParams: extractQueryParams(url),\n            responseStatus: response.status,\n            responseStatusText: response.statusText,\n            responseHeaders: extractResponseHeaders(response),\n            responseBody: await extractResponseBody(response),\n            duration,\n            startTime,\n            endTime: endTime,\n            isSupabaseQuery,\n          },\n          timestamp: new Date().toISOString(),\n        };\n\n        safeCapture(evt);\n      }\n      return response;\n    } catch (error) {\n      const endTime = performance.now();\n      const duration = endTime - startTime;\n\n      if (!telemetryEndpoint || !url.includes(telemetryEndpoint)) {\n        const isSupabaseQuery = isSupabaseUrl(url);\n        const eventName = isSupabaseQuery\n          ? \"supabase_fetch_error\"\n          : \"fetch_error\";\n        const eventType = isSupabaseQuery ? \"supabase\" : \"network\";\n\n        const evt: NetworkEvent = {\n          eventType: eventType,\n          eventName: eventName,\n          payload: {\n            url,\n            method,\n            queryParams: extractQueryParams(url),\n            error: error instanceof Error ? error.message : String(error),\n            duration,\n            startTime,\n            endTime: endTime,\n            isSupabaseQuery,\n          },\n          timestamp: new Date().toISOString(),\n        };\n\n        safeCapture(evt);\n      }\n      throw error;\n    }\n  };\n\n  // Copy all properties from the original fetch to maintain compatibility\n  Object.setPrototypeOf(\n    interceptor,\n    Object.getPrototypeOf(originalFetch) as typeof fetch\n  );\n\n  const originalProperties = Object.getOwnPropertyDescriptors(originalFetch);\n  Object.defineProperties(interceptor, originalProperties);\n\n  return interceptor;\n};\n\nexport const setupFetchInterceptor = (context: FetchInterceptorContext) => {\n  const interceptor = createFetchInterceptor(context);\n\n  // Store original fetch\n  const originalFetch =\n    typeof window !== \"undefined\" ? window.fetch : globalThis.fetch;\n\n  // Replace fetch with interceptor\n  if (typeof window !== \"undefined\") {\n    window.fetch = interceptor;\n  } else {\n    // In Node.js, we need to patch the global fetch\n    (globalThis as { fetch: typeof fetch }).fetch = interceptor;\n  }\n\n  // Return function to restore original fetch\n  return () => {\n    if (typeof window !== \"undefined\") {\n      window.fetch = originalFetch;\n    } else {\n      (globalThis as { fetch: typeof fetch }).fetch = originalFetch;\n    }\n  };\n};\n","import type { NetworkEvent } from \"../types\";\nimport {\n  extractQueryParams,\n  extractXHRResponseHeaders,\n  extractXHRResponseBody,\n} from \"./index\";\nimport { isSupabaseUrl } from \"../../../utils\";\nimport { HYPERLOOK_URL } from \"../../../constants\";\n\nexport type XHRInterceptorContext = {\n  telemetryEndpoint: string;\n  safeCapture: (event: NetworkEvent) => void;\n  xhrHandlers: WeakMap<XMLHttpRequest, () => void>;\n  patchedXHRs: Set<XMLHttpRequest>;\n};\n\nexport const createXHROpenInterceptor = (context: XHRInterceptorContext) => {\n  const { patchedXHRs } = context;\n\n  const originalOpen = (...args: Parameters<XMLHttpRequest[\"open\"]>) =>\n    XMLHttpRequest.prototype.open.apply(this, args);\n\n  return function (\n    this: XMLHttpRequest,\n    method: string,\n    url: string | URL,\n    async?: boolean,\n    user?: string | null,\n    password?: string | null\n  ) {\n    // Filter out requests to the Hyperlook ingestion URL\n    if (typeof url === \"string\" && url.includes(HYPERLOOK_URL)) {\n      return originalOpen.call(\n        this,\n        method,\n        url,\n        async ?? true,\n        user,\n        password\n      );\n    }\n    (this as unknown as Record<string, unknown>)._telemetryMethod = method;\n    (this as unknown as Record<string, unknown>)._telemetryUrl =\n      typeof url === \"string\" ? url : String(url);\n    (this as unknown as Record<string, unknown>)._telemetryStartTime =\n      performance.now();\n\n    patchedXHRs.add(this);\n\n    return originalOpen.call(this, method, url, async ?? true, user, password);\n  };\n};\n\nexport const createXHRSendInterceptor = (context: XHRInterceptorContext) => {\n  const { telemetryEndpoint, safeCapture, xhrHandlers } = context;\n\n  const originalSend = (...args: Parameters<XMLHttpRequest[\"send\"]>) =>\n    XMLHttpRequest.prototype.send.apply(this, args);\n\n  return function (\n    this: XMLHttpRequest,\n    body?: Document | XMLHttpRequestBodyInit | null\n  ) {\n    const startTime = (this as unknown as Record<string, unknown>)\n      ._telemetryStartTime as number;\n    const method = (this as unknown as Record<string, unknown>)\n      ._telemetryMethod as string;\n    const url = (this as unknown as Record<string, unknown>)\n      ._telemetryUrl as string;\n\n    if (!telemetryEndpoint || !url.includes(telemetryEndpoint)) {\n      const isSupabaseQuery = isSupabaseUrl(url);\n\n      // Track if we've already captured an event for this XHR to prevent duplicates\n      let eventCaptured = false;\n\n      // Success handler\n      const successHandler = function (this: XMLHttpRequest) {\n        if (eventCaptured) return; // Prevent duplicate events\n        eventCaptured = true;\n\n        const endTime = performance.now();\n        const duration = endTime - startTime;\n        const eventName = isSupabaseQuery\n          ? \"supabase_xhr_complete\"\n          : \"xhr_complete\";\n        const eventType = isSupabaseQuery ? \"supabase\" : \"network\";\n\n        const evt: NetworkEvent = {\n          eventType: eventType,\n          eventName: eventName,\n          payload: {\n            url,\n            method,\n            queryParams: extractQueryParams(url),\n            responseStatus: this.status,\n            responseStatusText: this.statusText,\n            responseHeaders: extractXHRResponseHeaders(this),\n            responseBody: extractXHRResponseBody(this),\n            duration,\n            startTime,\n            endTime: endTime,\n            isSupabaseQuery,\n          },\n          timestamp: new Date().toISOString(),\n        };\n\n        safeCapture(evt);\n        cleanup();\n      };\n\n      // Error handler\n      const errorHandler = function (this: XMLHttpRequest) {\n        if (eventCaptured) return; // Prevent duplicate events\n        eventCaptured = true;\n\n        const endTime = performance.now();\n        const duration = endTime - startTime;\n        const eventName = isSupabaseQuery ? \"supabase_xhr_error\" : \"xhr_error\";\n        const eventType = isSupabaseQuery ? \"supabase\" : \"network\";\n\n        const evt: NetworkEvent = {\n          eventType: eventType,\n          eventName: eventName,\n          payload: {\n            url,\n            method,\n            queryParams: extractQueryParams(url),\n            responseStatus: this.status,\n            responseStatusText: this.statusText,\n            error: \"XHR request failed\",\n            duration,\n            startTime,\n            endTime: endTime,\n            isSupabaseQuery,\n          },\n          timestamp: new Date().toISOString(),\n        };\n\n        safeCapture(evt);\n        cleanup();\n      };\n\n      // Abort handler (treat as error)\n      const abortHandler = function (this: XMLHttpRequest) {\n        if (eventCaptured) return; // Prevent duplicate events\n        eventCaptured = true;\n\n        const endTime = performance.now();\n        const duration = endTime - startTime;\n        const eventName = isSupabaseQuery ? \"supabase_xhr_error\" : \"xhr_error\";\n        const eventType = isSupabaseQuery ? \"supabase\" : \"network\";\n\n        const evt: NetworkEvent = {\n          eventType: eventType,\n          eventName: eventName,\n          payload: {\n            url,\n            method,\n            queryParams: extractQueryParams(url),\n            responseStatus: this.status,\n            responseStatusText: this.statusText,\n            error: \"XHR request aborted\",\n            duration,\n            startTime,\n            endTime: endTime,\n            isSupabaseQuery,\n          },\n          timestamp: new Date().toISOString(),\n        };\n\n        safeCapture(evt);\n        cleanup();\n      };\n\n      // Cleanup function\n      const cleanup = () => {\n        this.removeEventListener(\"load\", successHandler);\n        this.removeEventListener(\"error\", errorHandler);\n        this.removeEventListener(\"abort\", abortHandler);\n        xhrHandlers.delete(this);\n      };\n\n      // Store handlers for later cleanup\n      xhrHandlers.set(this, cleanup);\n\n      this.addEventListener(\"load\", successHandler);\n      this.addEventListener(\"error\", errorHandler);\n      this.addEventListener(\"abort\", abortHandler);\n    }\n\n    return originalSend.call(this, body);\n  };\n};\n\nexport const setupXHRInterceptors = (context: XHRInterceptorContext) => {\n  const openInterceptor = createXHROpenInterceptor(context);\n  const sendInterceptor = createXHRSendInterceptor(context);\n\n  XMLHttpRequest.prototype.open = openInterceptor;\n  XMLHttpRequest.prototype.send = sendInterceptor;\n\n  return {\n    originalOpen: openInterceptor,\n    originalSend: sendInterceptor,\n  };\n};\n","export const isNetworkSupported = (): boolean => {\n  // In browser environment, require both fetch and XMLHttpRequest\n  if (typeof window !== \"undefined\") {\n    return (\n      typeof fetch !== \"undefined\" && typeof XMLHttpRequest !== \"undefined\"\n    );\n  }\n\n  // In Node.js environment, only require fetch (XMLHttpRequest not available)\n  return typeof fetch !== \"undefined\";\n};\n\nexport const initializeOriginalFetch = (): typeof fetch => {\n  // In browser environment\n  if (typeof window !== \"undefined\") {\n    if (!(window as unknown as Record<string, unknown>)._originalFetch) {\n      (window as unknown as Record<string, unknown>)._originalFetch =\n        window.fetch;\n    }\n\n    return (\n      ((window as unknown as Record<string, unknown>)\n        ._originalFetch as typeof fetch) || window.fetch\n    );\n  }\n\n  // In Node.js environment, return the global fetch\n  return globalThis.fetch;\n};\n\nexport const createOriginalXHROpen =\n  (): typeof XMLHttpRequest.prototype.open => {\n    return function (\n      this: XMLHttpRequest,\n      method: string,\n      url: string | URL,\n      async?: boolean,\n      user?: string | null,\n      password?: string | null\n    ) {\n      return XMLHttpRequest.prototype.open.call(\n        this,\n        method,\n        url,\n        async === undefined ? true : async,\n        user,\n        password\n      );\n    };\n  };\n\nexport const createOriginalXHRSend =\n  (): typeof XMLHttpRequest.prototype.send => {\n    return function (\n      this: XMLHttpRequest,\n      body?: Document | XMLHttpRequestBodyInit | null\n    ) {\n      return XMLHttpRequest.prototype.send.call(this, body);\n    };\n  };\n","import { BasePlugin } from \"../BasePlugin\";\nimport type { TelemetryManager } from \"../../TelemetryManager\";\nimport {\n  isNetworkSupported,\n  initializeOriginalFetch,\n  createOriginalXHROpen,\n  createOriginalXHRSend,\n  setupFetchInterceptor,\n  setupXHRInterceptors,\n} from \"./utils\";\n\nexport class NetworkPlugin extends BasePlugin {\n  private originalFetch!: typeof fetch;\n  private originalXHROpen!: typeof XMLHttpRequest.prototype.open;\n  private originalXHRSend!: typeof XMLHttpRequest.prototype.send;\n  private unregister: (() => void) | null = null;\n  private telemetryEndpoint: string = \"\";\n  private xhrHandlers = new WeakMap<XMLHttpRequest, () => void>();\n  private patchedXHRs = new Set<XMLHttpRequest>();\n  private cleanupInterval: NodeJS.Timeout | null = null;\n\n  protected isSupported(): boolean {\n    return isNetworkSupported();\n  }\n\n  constructor() {\n    super();\n    if (this.isSupported()) {\n      this.originalFetch = initializeOriginalFetch();\n      // Only initialize XHR if we're in a browser environment\n      if (typeof XMLHttpRequest !== \"undefined\") {\n        this.originalXHROpen = createOriginalXHROpen();\n        this.originalXHRSend = createOriginalXHRSend();\n      }\n    }\n  }\n\n  initialize(manager: TelemetryManager) {\n    super.initialize(manager);\n    this.telemetryEndpoint = manager.getEndpoint();\n  }\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"NetworkPlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      // Set up fetch interceptor\n      this.unregister = setupFetchInterceptor({\n        originalFetch: this.originalFetch,\n        telemetryEndpoint: this.telemetryEndpoint,\n        safeCapture: this.safeCapture.bind(this),\n        logger: this.logger,\n      });\n\n      // Set up XHR interceptors only if XMLHttpRequest is available\n      if (typeof XMLHttpRequest !== \"undefined\") {\n        const xhrInterceptors = setupXHRInterceptors({\n          telemetryEndpoint: this.telemetryEndpoint,\n          safeCapture: this.safeCapture.bind(this),\n          xhrHandlers: this.xhrHandlers,\n          patchedXHRs: this.patchedXHRs,\n        });\n\n        this.originalXHROpen = xhrInterceptors.originalOpen;\n        this.originalXHRSend = xhrInterceptors.originalSend;\n\n        // Set up periodic cleanup to prevent memory leaks\n        this.setupCleanupInterval();\n      }\n\n      // Early events are now processed by the TelemetryManager itself\n      this.logger.info(\n        \"NetworkPlugin setup complete - early events handled by TelemetryManager\"\n      );\n\n      this.logger.info(\"NetworkPlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup NetworkPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  private setupCleanupInterval(): void {\n    // Clean up dead XHR references every 30 seconds\n    this.cleanupInterval = setInterval(() => {\n      this.cleanupDeadXHRs();\n    }, 30000);\n  }\n\n  private cleanupDeadXHRs(): void {\n    try {\n      const deadXHRs: XMLHttpRequest[] = [];\n\n      // Check for XHRs that are no longer valid\n      this.patchedXHRs.forEach(xhr => {\n        try {\n          // Try to access a property to see if the XHR is still valid\n          if (xhr.readyState === undefined) {\n            deadXHRs.push(xhr);\n          }\n        } catch {\n          // XHR is no longer valid\n          deadXHRs.push(xhr);\n        }\n      });\n\n      // Remove dead XHRs\n      deadXHRs.forEach(xhr => {\n        this.patchedXHRs.delete(xhr);\n        this.xhrHandlers.delete(xhr);\n      });\n\n      if (deadXHRs.length > 0) {\n        this.logger.debug(\"Cleaned up dead XHR references\", {\n          cleanedCount: deadXHRs.length,\n          remainingCount: this.patchedXHRs.size,\n        });\n      }\n    } catch (error) {\n      this.logger.error(\"Failed to cleanup dead XHRs\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  teardown(): void {\n    try {\n      // Clear cleanup interval\n      if (this.cleanupInterval) {\n        clearInterval(this.cleanupInterval);\n        this.cleanupInterval = null;\n      }\n\n      // Restore fetch\n      if (this.unregister) {\n        this.unregister();\n        this.unregister = null;\n      }\n\n      // Restore XMLHttpRequest only if it was available\n      if (\n        typeof XMLHttpRequest !== \"undefined\" &&\n        this.originalXHROpen &&\n        this.originalXHRSend\n      ) {\n        try {\n          XMLHttpRequest.prototype.open = this.originalXHROpen;\n          XMLHttpRequest.prototype.send = this.originalXHRSend;\n        } catch (error) {\n          this.logger.error(\"Failed to restore XMLHttpRequest prototypes\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // Clean up XHR handlers\n      this.cleanupAllXHRHandlers();\n\n      this.logger.info(\"NetworkPlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown NetworkPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private cleanupAllXHRHandlers(): void {\n    try {\n      let cleanedCount = 0;\n      this.patchedXHRs.forEach(xhr => {\n        try {\n          const cleanup = this.xhrHandlers.get(xhr);\n          if (cleanup) {\n            // Call the cleanup function to remove event listeners\n            cleanup();\n            cleanedCount++;\n          }\n        } catch (error) {\n          this.logger.debug(\"Failed to cleanup XHR handler\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      });\n\n      this.patchedXHRs.clear();\n      this.xhrHandlers = new WeakMap();\n\n      this.logger.debug(\"Cleaned up XHR handlers\", {\n        cleanedCount,\n      });\n    } catch (error) {\n      this.logger.error(\"Failed to cleanup XHR handlers\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","import type { PerformanceMetrics } from \"../types\";\n\nexport const captureNavigationTiming = (): PerformanceMetrics => {\n  const navigation = performance.getEntriesByType(\n    \"navigation\"\n  )[0] as PerformanceNavigationTiming;\n\n  if (!navigation) {\n    throw new Error(\"Navigation Timing API not supported\");\n  }\n\n  const metrics: PerformanceMetrics = {\n    // Navigation Timing API metrics\n    navigationStart: navigation.startTime,\n    unloadEventStart: navigation.unloadEventStart,\n    unloadEventEnd: navigation.unloadEventEnd,\n    redirectStart: navigation.redirectStart,\n    redirectEnd: navigation.redirectEnd,\n    fetchStart: navigation.fetchStart,\n    domainLookupStart: navigation.domainLookupStart,\n    domainLookupEnd: navigation.domainLookupEnd,\n    connectStart: navigation.connectStart,\n    connectEnd: navigation.connectEnd,\n    secureConnectionStart: navigation.secureConnectionStart,\n    requestStart: navigation.requestStart,\n    responseStart: navigation.responseStart,\n    responseEnd: navigation.responseEnd,\n    domLoading: navigation.domContentLoadedEventStart,\n    domInteractive: navigation.domInteractive,\n    domContentLoadedEventStart: navigation.domContentLoadedEventStart,\n    domContentLoadedEventEnd: navigation.domContentLoadedEventEnd,\n    domComplete: navigation.domComplete,\n    loadEventStart: navigation.loadEventStart,\n    loadEventEnd: navigation.loadEventEnd,\n\n    // Calculated metrics\n    dnsTime: navigation.domainLookupEnd - navigation.domainLookupStart,\n    tcpTime: navigation.connectEnd - navigation.connectStart,\n    requestTime: navigation.responseStart - navigation.requestStart,\n    responseTime: navigation.responseEnd - navigation.responseStart,\n    domParsingTime: navigation.domComplete - navigation.domInteractive,\n    domContentLoadedTime:\n      navigation.domContentLoadedEventEnd - navigation.startTime,\n    loadCompleteTime: navigation.loadEventEnd - navigation.startTime,\n    totalPageLoadTime: navigation.loadEventEnd - navigation.startTime,\n\n    // Resource metrics\n    resourceCount: 0,\n    resourceLoadTimes: [],\n  };\n\n  return metrics;\n};\n","import type { ResourceTiming } from \"../types\";\n\nexport const captureResourceTiming = (): ResourceTiming[] => {\n  const resources = performance.getEntriesByType(\n    \"resource\"\n  ) as PerformanceResourceTiming[];\n\n  return resources.map(resource => ({\n    name: resource.name,\n    duration: resource.duration,\n    size: resource.transferSize || 0,\n    type: resource.initiatorType,\n  }));\n};\n","import type { PerformanceMetrics } from \"../types\";\n\nexport const captureWebVitals = (): Partial<PerformanceMetrics> => {\n  const vitals: Partial<PerformanceMetrics> = {};\n\n  // Time to First Byte\n  const navigation = performance.getEntriesByType(\n    \"navigation\"\n  )[0] as PerformanceNavigationTiming;\n  if (navigation) {\n    vitals.ttfb = navigation.responseStart - navigation.requestStart;\n  }\n\n  // First Contentful Paint\n  const fcpEntry = performance.getEntriesByName(\"first-contentful-paint\")[0];\n  if (fcpEntry) {\n    vitals.fcp = fcpEntry.startTime;\n  }\n\n  // Largest Contentful Paint\n  const lcpEntries = performance.getEntriesByType(\"largest-contentful-paint\");\n  if (lcpEntries.length > 0) {\n    vitals.lcp = lcpEntries[lcpEntries.length - 1].startTime;\n  }\n\n  // First Input Delay (if available)\n  const fidEntries = performance.getEntriesByType(\"first-input\");\n  if (fidEntries.length > 0) {\n    const fidEntry = fidEntries[0] as unknown as Record<string, unknown>;\n    vitals.fid =\n      (fidEntry.processingStart as number) - (fidEntry.startTime as number);\n  }\n\n  return vitals;\n};\n","import type { LongTaskEvent, LayoutShiftEvent } from \"../types\";\n\nexport type ObserverContext = {\n  safeCapture: (event: LongTaskEvent | LayoutShiftEvent) => void;\n  logger: {\n    warn: (message: string, meta?: Record<string, unknown>) => void;\n  };\n};\n\nexport const setupLongTaskObserver = (context: ObserverContext) => {\n  const { safeCapture, logger } = context;\n\n  if (!(\"PerformanceObserver\" in window)) {\n    return null;\n  }\n\n  try {\n    const longTaskObserver = new PerformanceObserver(list => {\n      list.getEntries().forEach(entry => {\n        try {\n          const evt: LongTaskEvent = {\n            eventType: \"performance\",\n            eventName: \"long_task\",\n            payload: {\n              duration: entry.duration,\n              startTime: entry.startTime,\n              name: entry.name,\n            },\n            timestamp: new Date().toISOString(),\n          };\n\n          safeCapture(evt);\n        } catch (error) {\n          logger.warn(\"Failed to capture long task\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      });\n    });\n\n    longTaskObserver.observe({ entryTypes: [\"longtask\"] });\n    return longTaskObserver;\n  } catch (error) {\n    logger.warn(\"Long task monitoring not supported\", {\n      error: error instanceof Error ? error.message : String(error),\n    });\n    return null;\n  }\n};\n\nexport const setupLayoutShiftObserver = (context: ObserverContext) => {\n  const { safeCapture, logger } = context;\n\n  if (!(\"PerformanceObserver\" in window)) {\n    return null;\n  }\n\n  try {\n    const layoutShiftObserver = new PerformanceObserver(list => {\n      list.getEntries().forEach(entry => {\n        try {\n          const layoutShiftEntry = entry as unknown as Record<string, unknown>;\n          const evt: LayoutShiftEvent = {\n            eventType: \"performance\",\n            eventName: \"layout_shift\",\n            payload: {\n              value: layoutShiftEntry.value as number,\n              sources: layoutShiftEntry.sources as unknown[],\n              startTime: layoutShiftEntry.startTime as number,\n            },\n            timestamp: new Date().toISOString(),\n          };\n\n          safeCapture(evt);\n        } catch (error) {\n          logger.warn(\"Failed to capture layout shift\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      });\n    });\n\n    layoutShiftObserver.observe({ entryTypes: [\"layout-shift\"] });\n    return layoutShiftObserver;\n  } catch (error) {\n    logger.warn(\"Layout shift monitoring not supported\", {\n      error: error instanceof Error ? error.message : String(error),\n    });\n    return null;\n  }\n};\n","export const isPerformanceSupported = (): boolean => {\n  return (\n    typeof window !== \"undefined\" &&\n    typeof performance !== \"undefined\" &&\n    typeof document !== \"undefined\"\n  );\n};\n\nexport const isPageFullyLoaded = (): boolean => {\n  return document.readyState === \"complete\";\n};\n\nexport const waitForPageLoad = (callback: () => void): void => {\n  if (isPageFullyLoaded()) {\n    callback();\n  } else {\n    window.addEventListener(\"load\", callback);\n  }\n};\n","import { BasePlugin } from \"../BasePlugin\";\nimport type { PageLoadMetricsEvent } from \"./types\";\nimport {\n  isPerformanceSupported,\n  waitForPageLoad,\n  captureNavigationTiming,\n  captureResourceTiming,\n  captureWebVitals,\n  setupLongTaskObserver,\n  setupLayoutShiftObserver,\n} from \"./utils\";\n\nexport class PerformancePlugin extends BasePlugin {\n  private hasCapturedInitialMetrics = false;\n  private longTaskObserver: PerformanceObserver | null = null;\n  private layoutShiftObserver: PerformanceObserver | null = null;\n  private pageLoadTimeout: NodeJS.Timeout | null = null;\n\n  protected isSupported(): boolean {\n    return isPerformanceSupported();\n  }\n\n  private capturePerformanceMetrics = () => {\n    try {\n      if (this.hasCapturedInitialMetrics) {\n        return;\n      }\n\n      this.hasCapturedInitialMetrics = true;\n\n      // Clear timeout if it was set\n      if (this.pageLoadTimeout) {\n        clearTimeout(this.pageLoadTimeout);\n        this.pageLoadTimeout = null;\n      }\n\n      // Capture navigation timing\n      const navigationMetrics = captureNavigationTiming();\n\n      // Capture resource timing\n      const resourceMetrics = captureResourceTiming();\n      navigationMetrics.resourceCount = resourceMetrics.length;\n      navigationMetrics.resourceLoadTimes = resourceMetrics;\n\n      // Capture web vitals\n      const webVitals = captureWebVitals();\n      const allMetrics = { ...navigationMetrics, ...webVitals };\n\n      const evt: PageLoadMetricsEvent = {\n        eventType: \"page\",\n        eventName: \"page_load\",\n        payload: allMetrics,\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.debug(\"Performance metrics captured\", {\n        totalPageLoadTime: allMetrics.totalPageLoadTime,\n        resourceCount: allMetrics.resourceCount,\n        ttfb: allMetrics.ttfb,\n      });\n\n      this.safeCapture(evt);\n    } catch (error) {\n      this.logger.error(\"Failed to capture performance metrics\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  };\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"PerformancePlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      // Capture initial page load metrics with timeout fallback\n      waitForPageLoad(() => {\n        this.capturePerformanceMetrics();\n      });\n\n      // Set a timeout fallback in case page load event doesn't fire\n      this.pageLoadTimeout = setTimeout(() => {\n        if (!this.hasCapturedInitialMetrics) {\n          this.logger.warn(\n            \"Page load timeout reached, capturing metrics anyway\"\n          );\n          this.capturePerformanceMetrics();\n        }\n      }, 10000); // 10 second timeout\n\n      // Monitor for long tasks with error handling\n      try {\n        this.longTaskObserver = setupLongTaskObserver({\n          safeCapture: this.safeCapture.bind(this),\n          logger: this.logger,\n        });\n\n        if (this.longTaskObserver) {\n          this.logger.debug(\"Long task observer setup successful\");\n        } else {\n          this.logger.warn(\"Long task observer not supported\");\n        }\n      } catch (error) {\n        this.logger.error(\"Failed to setup long task observer\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n\n      // Monitor for layout shifts with error handling\n      try {\n        this.layoutShiftObserver = setupLayoutShiftObserver({\n          safeCapture: this.safeCapture.bind(this),\n          logger: this.logger,\n        });\n\n        if (this.layoutShiftObserver) {\n          this.logger.debug(\"Layout shift observer setup successful\");\n        } else {\n          this.logger.warn(\"Layout shift observer not supported\");\n        }\n      } catch (error) {\n        this.logger.error(\"Failed to setup layout shift observer\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n\n      this.logger.info(\"PerformancePlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup PerformancePlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  teardown(): void {\n    try {\n      // Clear page load timeout\n      if (this.pageLoadTimeout) {\n        clearTimeout(this.pageLoadTimeout);\n        this.pageLoadTimeout = null;\n      }\n\n      // Remove page load event listener\n      try {\n        window.removeEventListener(\"load\", this.capturePerformanceMetrics);\n      } catch (error) {\n        this.logger.debug(\"Failed to remove load event listener\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n\n      // Disconnect long task observer\n      if (this.longTaskObserver) {\n        try {\n          this.longTaskObserver.disconnect();\n          this.logger.debug(\"Long task observer disconnected\");\n        } catch (error) {\n          this.logger.error(\"Failed to disconnect long task observer\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        this.longTaskObserver = null;\n      }\n\n      // Disconnect layout shift observer\n      if (this.layoutShiftObserver) {\n        try {\n          this.layoutShiftObserver.disconnect();\n          this.logger.debug(\"Layout shift observer disconnected\");\n        } catch (error) {\n          this.logger.error(\"Failed to disconnect layout shift observer\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        this.layoutShiftObserver = null;\n      }\n\n      this.logger.info(\"PerformancePlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown PerformancePlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\nimport { BasePlugin } from \"./BasePlugin\";\nimport type { TelemetryEvent } from \"../types\";\n\nexport class PageViewPlugin extends BasePlugin {\n  private hasCapturedInitialPageView = false;\n  private lastUrl: string | null = null;\n  private lastTitle: string | null = null;\n  private popstateListener: (() => void) | null = null;\n  private navigationTimeout: ReturnType<typeof setTimeout> | null = null;\n  private originalPushState: typeof window.history.pushState | null = null;\n  private originalReplaceState: typeof window.history.replaceState | null =\n    null;\n  private domContentLoadedListener: () => void;\n  private loadListener: () => void;\n  private navigationListener: (() => void) | null = null;\n\n  constructor() {\n    super();\n    this.domContentLoadedListener = () => {\n      // Inline logic of capturePageView(false)\n      try {\n        if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n          return;\n        }\n        const currentUrl = window.location.href;\n        const currentTitle = document.title;\n        if (this.hasCapturedInitialPageView) {\n          return;\n        }\n        this.hasCapturedInitialPageView = true;\n        this.lastUrl = currentUrl;\n        this.lastTitle = currentTitle;\n        const nav =\n          typeof window !== \"undefined\" && window.navigator\n            ? window.navigator\n            : undefined;\n        const evt: TelemetryEvent = {\n          eventType: \"page\",\n          eventName: \"page_hit\",\n          payload: {\n            viewport: {\n              width: window.innerWidth,\n              height: window.innerHeight,\n              devicePixelRatio: window.devicePixelRatio,\n            },\n            characterSet: document.characterSet,\n            language: nav ? nav.language : \"\",\n            cookieEnabled: nav ? nav.cookieEnabled : false,\n            onLine: nav ? nav.onLine : false,\n            platform: nav ? nav.platform : \"\",\n            userAgent: nav ? nav.userAgent : \"\",\n            referrer: document.referrer,\n            url: currentUrl,\n            title: currentTitle,\n            isNavigation: false,\n          },\n          timestamp: new Date().toISOString(),\n        };\n        this.logger.debug(\"Page view event captured\", {\n          url: currentUrl,\n          title: currentTitle,\n          viewport: { width: window.innerWidth, height: window.innerHeight },\n          isNavigation: false,\n        });\n        this.safeCapture(evt);\n      } catch (error) {\n        this.logger.error(\"Failed to capture page view event\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    };\n    this.loadListener = () => {\n      if (!this.hasCapturedInitialPageView) {\n        // Inline logic of capturePageView(false)\n        try {\n          if (\n            typeof window === \"undefined\" ||\n            typeof document === \"undefined\"\n          ) {\n            return;\n          }\n          const currentUrl = window.location.href;\n          const currentTitle = document.title;\n          this.hasCapturedInitialPageView = true;\n          this.lastUrl = currentUrl;\n          this.lastTitle = currentTitle;\n          const nav =\n            typeof window !== \"undefined\" && window.navigator\n              ? window.navigator\n              : undefined;\n          const evt: TelemetryEvent = {\n            eventType: \"page\",\n            eventName: \"page_hit\",\n            payload: {\n              viewport: {\n                width: window.innerWidth,\n                height: window.innerHeight,\n                devicePixelRatio: window.devicePixelRatio,\n              },\n              characterSet: document.characterSet,\n              language: nav ? nav.language : \"\",\n              cookieEnabled: nav ? nav.cookieEnabled : false,\n              onLine: nav ? nav.onLine : false,\n              platform: nav ? nav.platform : \"\",\n              userAgent: nav ? nav.userAgent : \"\",\n              referrer: document.referrer,\n              url: currentUrl,\n              title: currentTitle,\n              isNavigation: false,\n            },\n            timestamp: new Date().toISOString(),\n          };\n          this.logger.debug(\"Page view event captured\", {\n            url: currentUrl,\n            title: currentTitle,\n            viewport: { width: window.innerWidth, height: window.innerHeight },\n            isNavigation: false,\n          });\n          this.safeCapture(evt);\n        } catch (error) {\n          this.logger.error(\"Failed to capture page view event\", {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n    };\n  }\n\n  protected isSupported(): boolean {\n    return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n  }\n\n  private capturePageView = (isNavigation = false) => {\n    try {\n      // Double-check we're still in a browser environment\n      if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n        return;\n      }\n\n      const currentUrl = window.location.href;\n      const currentTitle = document.title;\n\n      // For initial page load, only capture once\n      if (!isNavigation && this.hasCapturedInitialPageView) {\n        return;\n      }\n\n      // For navigation, only capture if URL or title has changed\n      if (\n        isNavigation &&\n        this.lastUrl === currentUrl &&\n        this.lastTitle === currentTitle\n      ) {\n        return;\n      }\n\n      // Update tracking state\n      if (!isNavigation) {\n        this.hasCapturedInitialPageView = true;\n      }\n      this.lastUrl = currentUrl;\n      this.lastTitle = currentTitle;\n\n      // Use window.navigator for clarity and compatibility\n      const nav =\n        typeof window !== \"undefined\" && window.navigator\n          ? window.navigator\n          : undefined;\n\n      const evt: TelemetryEvent = {\n        eventType: \"page\",\n        eventName: \"page_hit\",\n        payload: {\n          viewport: {\n            width: window.innerWidth,\n            height: window.innerHeight,\n            devicePixelRatio: window.devicePixelRatio,\n          },\n          characterSet: document.characterSet,\n          language: nav ? nav.language : \"\",\n          cookieEnabled: nav ? nav.cookieEnabled : false,\n          onLine: nav ? nav.onLine : false,\n          platform: nav ? nav.platform : \"\",\n          userAgent: nav ? nav.userAgent : \"\",\n          referrer: document.referrer,\n          url: currentUrl,\n          title: currentTitle,\n          isNavigation: isNavigation,\n        },\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.debug(\"Page view event captured\", {\n        url: currentUrl,\n        title: currentTitle,\n        viewport: { width: window.innerWidth, height: window.innerHeight },\n        isNavigation: isNavigation,\n      });\n\n      this.safeCapture(evt);\n    } catch (error) {\n      this.logger.error(\"Failed to capture page view event\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  };\n\n  private captureInitialPageView = () => {\n    this.capturePageView(false);\n  };\n\n  private handleNavigation = () => {\n    // Clear any existing timeout\n    if (this.navigationTimeout) {\n      clearTimeout(this.navigationTimeout);\n    }\n\n    // Use a small delay to ensure the URL and title have been updated\n    this.navigationTimeout = setTimeout(() => {\n      this.capturePageView(true);\n      this.navigationTimeout = null;\n    }, 100);\n  };\n\n  protected setup(): void {\n    if (!this.isSupported()) {\n      this.logger.warn(\"PageViewPlugin not supported in this environment\");\n      this.isEnabled = false;\n      return;\n    }\n\n    try {\n      // Initialize tracking variables early\n      this.lastUrl = window.location.href;\n      this.lastTitle = document.title;\n\n      // Capture page view immediately if document is already loaded\n      if (document.readyState === \"complete\") {\n        this.captureInitialPageView();\n      } else {\n        // Wait for DOM content loaded to capture page view\n        document.addEventListener(\n          \"DOMContentLoaded\",\n          this.domContentLoadedListener\n        );\n        // Fallback: capture on window load if DOMContentLoaded doesn't fire\n        window.addEventListener(\"load\", this.loadListener);\n      }\n\n      // Set up navigation tracking for React/Next.js client-side routing\n      this.setupNavigationTracking();\n\n      this.logger.info(\"PageViewPlugin setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup PageViewPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.isEnabled = false;\n    }\n  }\n\n  private setupNavigationTracking(): void {\n    try {\n      // Listen for popstate events (back/forward navigation)\n      this.popstateListener = () => {\n        this.handleNavigation();\n      };\n      window.addEventListener(\"popstate\", this.popstateListener);\n\n      // Use a safe History API override that doesn't cause infinite loops\n      this.setupHistoryTracking();\n\n      this.logger.debug(\"Navigation tracking setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup navigation tracking\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private setupHistoryTracking(): void {\n    try {\n      // Store original methods\n      this.originalPushState = window.history.pushState;\n      this.originalReplaceState = window.history.replaceState;\n\n      // Create safe overrides that don't dispatch popstate events\n      // This prevents the infinite loop that was causing the original issue\n      window.history.pushState = (...args) => {\n        // Call the original method first\n        if (!this.originalPushState) return;\n        const result = this.originalPushState.apply(window.history, args);\n\n        // Use a custom event instead of popstate to avoid infinite loops\n        window.dispatchEvent(\n          new CustomEvent(\"telemetry-navigation\", {\n            detail: { type: \"pushstate\", args },\n          })\n        );\n\n        return result;\n      };\n\n      window.history.replaceState = (...args) => {\n        // Call the original method first\n        if (!this.originalReplaceState) return;\n        const result = this.originalReplaceState.apply(window.history, args);\n\n        // Use a custom event instead of popstate to avoid infinite loops\n        window.dispatchEvent(\n          new CustomEvent(\"telemetry-navigation\", {\n            detail: { type: \"replacestate\", args },\n          })\n        );\n\n        return result;\n      };\n\n      // Listen for our custom navigation events\n      const navigationListener = () => {\n        this.handleNavigation();\n      };\n      window.addEventListener(\"telemetry-navigation\", navigationListener);\n\n      // Store the listener for cleanup\n      this.navigationListener = navigationListener;\n\n      this.logger.debug(\"History tracking setup complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to setup history tracking\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  teardown(): void {\n    try {\n      // Clear navigation timeout\n      if (this.navigationTimeout) {\n        clearTimeout(this.navigationTimeout);\n        this.navigationTimeout = null;\n      }\n\n      // Remove DOM content loaded listener\n      document.removeEventListener(\n        \"DOMContentLoaded\",\n        this.domContentLoadedListener\n      );\n      // Remove load listener\n      window.removeEventListener(\"load\", this.loadListener);\n\n      // Remove navigation tracking\n      if (this.popstateListener) {\n        window.removeEventListener(\"popstate\", this.popstateListener);\n        this.popstateListener = null;\n      }\n\n      // Remove custom navigation listener\n      if (this.navigationListener) {\n        window.removeEventListener(\n          \"telemetry-navigation\",\n          this.navigationListener\n        );\n        this.navigationListener = null;\n      }\n\n      // Restore original History API methods\n      if (this.originalPushState) {\n        window.history.pushState = this.originalPushState;\n        this.originalPushState = null;\n      }\n      if (this.originalReplaceState) {\n        window.history.replaceState = this.originalReplaceState;\n        this.originalReplaceState = null;\n      }\n\n      this.logger.info(\"PageViewPlugin teardown complete\");\n    } catch (error) {\n      this.logger.error(\"Failed to teardown PageViewPlugin\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n}\n","import type { TelemetryPlugin, Logger, TelemetryConfig } from \"../types\";\nimport { TelemetryState } from \"./types\";\nimport {\n  ClickPlugin,\n  LogPlugin,\n  NetworkPlugin,\n  PerformancePlugin,\n  CustomEventsPlugin,\n  PageViewPlugin,\n  ErrorPlugin,\n} from \"../plugins\";\n\nexport class PluginManager {\n  private plugins: TelemetryPlugin[] = [];\n  private customEventsPlugin?: CustomEventsPlugin;\n  private logger: Logger;\n  private state: TelemetryState;\n\n  constructor(logger: Logger, state: TelemetryState) {\n    this.logger = logger;\n    this.state = state;\n  }\n\n  initializePlugins(config: TelemetryConfig): TelemetryPlugin[] {\n    const pluginsToRegister: TelemetryPlugin[] = [];\n    try {\n      // Define plugin configurations\n      const pluginConfigs = [\n        {\n          enabled: config.enablePageViews ?? true, // Enable page views by default\n          plugin: PageViewPlugin,\n          name: \"PageViewPlugin\",\n        },\n        {\n          enabled: config.enableClicks,\n          plugin: ClickPlugin,\n          name: \"ClickPlugin\",\n        },\n        {\n          enabled: config.enableLogs,\n          plugin: LogPlugin,\n          name: \"LogPlugin\",\n        },\n        {\n          enabled: config.enableNetwork,\n          plugin: NetworkPlugin,\n          name: \"NetworkPlugin\",\n        },\n        {\n          enabled: config.enablePerformance,\n          plugin: PerformancePlugin,\n          name: \"PerformancePlugin\",\n        },\n        {\n          enabled: config.enableErrors ?? true, // Enable errors by default\n          plugin: ErrorPlugin,\n          name: \"ErrorPlugin\",\n        },\n        {\n          enabled: config.enableCustomEvents,\n          plugin: CustomEventsPlugin,\n          name: \"CustomEventsPlugin\",\n          isCustomEvents: true,\n        },\n      ];\n\n      pluginConfigs.forEach(({ enabled, plugin, isCustomEvents }) => {\n        if (enabled) {\n          const pluginInstance = new plugin();\n          if (isCustomEvents) {\n            this.customEventsPlugin = pluginInstance as CustomEventsPlugin;\n          }\n          pluginsToRegister.push(pluginInstance);\n        }\n      });\n\n      this.logger.info(\"Plugin initialization completed\", {\n        totalPlugins: pluginsToRegister.length,\n        enabledPlugins: pluginsToRegister.map(p => p.constructor.name),\n      });\n    } catch (error) {\n      this.logger.error(\"Failed to initialize plugins\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n    return pluginsToRegister;\n  }\n\n  register(\n    plugin: TelemetryPlugin,\n    manager: {\n      capture(event: {\n        eventType: string;\n        eventName: string;\n        payload: Record<string, unknown>;\n        timestamp: string;\n      }): void;\n    }\n  ): void {\n    try {\n      this.validateState();\n      this.plugins.push(plugin);\n      plugin.initialize(manager);\n      this.logger.debug(\"Plugin registered\", {\n        pluginName: plugin.constructor.name,\n        totalPlugins: this.plugins.length,\n      });\n    } catch (error) {\n      this.logger.error(\"Failed to register plugin\", {\n        pluginName: plugin.constructor.name,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      this.plugins.pop();\n    }\n  }\n\n  private validateState(): void {\n    if (\n      this.state === TelemetryState.SHUTDOWN ||\n      this.state === TelemetryState.SHUTTING_DOWN\n    ) {\n      throw new Error(\n        `TelemetryManager is in ${this.state} state and cannot register plugins`\n      );\n    }\n  }\n\n  destroyAll(): void {\n    for (const p of this.plugins) {\n      try {\n        if (p.destroy) {\n          p.destroy();\n        } else if (p.teardown) {\n          p.teardown();\n        }\n        this.logger.debug(\"Plugin destroyed\", {\n          pluginName: p.constructor.name,\n        });\n      } catch (error) {\n        this.logger.error(\"Plugin destruction failed\", {\n          pluginName: p.constructor.name,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n    this.plugins = [];\n  }\n\n  getCustomEventsPlugin(): CustomEventsPlugin | undefined {\n    return this.customEventsPlugin;\n  }\n\n  getPlugins(): TelemetryPlugin[] {\n    return [...this.plugins];\n  }\n\n  setState(state: TelemetryState): void {\n    this.state = state;\n  }\n}\n","import type { TelemetryEvent, Logger } from \"../types\";\nimport { TelemetryState } from \"./types\";\nimport { sanitizeString, sanitizePayload } from \"./utils\";\n\nexport class EventProcessor {\n  private eventQueue: TelemetryEvent[] = [];\n  private buffer: TelemetryEvent[] = [];\n  private isProcessingQueue = false;\n  private logger: Logger;\n  private state: TelemetryState;\n  private samplingRate: number;\n  private batchSize: number;\n  private sessionId: string;\n  private userId?: string;\n  private readonly MAX_QUEUE_SIZE = 10000; // Prevent unbounded queue growth\n  private readonly MAX_BUFFER_SIZE = 5000; // Prevent unbounded buffer growth\n\n  constructor(\n    logger: Logger,\n    state: TelemetryState,\n    samplingRate: number,\n    batchSize: number,\n    sessionId: string,\n    userId?: string\n  ) {\n    this.logger = logger;\n    this.state = state;\n    this.samplingRate = samplingRate;\n    this.batchSize = batchSize;\n    this.sessionId = sessionId;\n    if (userId !== undefined) {\n      this.userId = userId;\n    }\n  }\n\n  validateEvent(event: TelemetryEvent): TelemetryEvent {\n    if (!event.eventType || typeof event.eventType !== \"string\") {\n      throw new Error(\"Event type is required and must be a string\");\n    }\n    if (!event.eventName || typeof event.eventName !== \"string\") {\n      throw new Error(\"Event name is required and must be a string\");\n    }\n    if (!event.payload || typeof event.payload !== \"object\") {\n      throw new Error(\"Event payload is required and must be an object\");\n    }\n    if (!event.timestamp || typeof event.timestamp !== \"string\") {\n      throw new Error(\"Event timestamp is required and must be a string\");\n    }\n    if (\n      !/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(\n        event.timestamp\n      )\n    ) {\n      throw new Error(\"Invalid timestamp format. Expected ISO 8601 format\");\n    }\n    const sanitizedEvent: TelemetryEvent = {\n      ...event,\n      eventType: sanitizeString(event.eventType, \"eventType\"),\n      eventName: sanitizeString(event.eventName, \"eventName\"),\n      payload: sanitizePayload(event.payload),\n    };\n    return sanitizedEvent;\n  }\n\n  capture(event: TelemetryEvent): boolean {\n    try {\n      this.validateState();\n\n      const validatedEvent = this.validateEvent(event);\n      if (Math.random() > this.samplingRate) {\n        this.logger.debug(\"Event dropped due to sampling\", {\n          eventType: validatedEvent.eventType,\n          eventName: validatedEvent.eventName,\n          samplingRate: this.samplingRate,\n        });\n        return false;\n      }\n\n      const enrichedEvent: TelemetryEvent = {\n        ...validatedEvent,\n        sessionId: this.sessionId,\n        ...(this.userId && { userId: this.userId }),\n      };\n\n      // Check queue size limit to prevent memory leaks\n      if (this.eventQueue.length >= this.MAX_QUEUE_SIZE) {\n        this.logger.warn(\"Event queue full, dropping oldest event\", {\n          eventType: validatedEvent.eventType,\n          eventName: validatedEvent.eventName,\n          queueSize: this.eventQueue.length,\n          maxQueueSize: this.MAX_QUEUE_SIZE,\n        });\n        this.eventQueue.shift(); // Remove oldest event\n      }\n\n      this.eventQueue.push(enrichedEvent);\n      this.logger.debug(\"Event queued\", {\n        eventType: validatedEvent.eventType,\n        eventName: validatedEvent.eventName,\n        queueSize: this.eventQueue.length,\n        sessionId: this.sessionId,\n        userId: this.userId,\n      });\n\n      return true;\n    } catch (error) {\n      this.logger.error(\"Failed to capture event\", {\n        eventType: event.eventType,\n        eventName: event.eventName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return false;\n    }\n  }\n\n  processEventQueue(): void {\n    if (this.isProcessingQueue || this.eventQueue.length === 0) {\n      return;\n    }\n\n    this.isProcessingQueue = true;\n    try {\n      while (this.eventQueue.length > 0) {\n        const event = this.eventQueue.shift();\n        if (event) {\n          // Check buffer size limit to prevent memory leaks\n          if (this.buffer.length >= this.MAX_BUFFER_SIZE) {\n            this.logger.warn(\"Buffer full, dropping oldest event\", {\n              eventType: event.eventType,\n              eventName: event.eventName,\n              bufferSize: this.buffer.length,\n              maxBufferSize: this.MAX_BUFFER_SIZE,\n            });\n            this.buffer.shift(); // Remove oldest event\n          }\n\n          this.buffer.push(event);\n          this.logger.debug(\"Event processed and added to buffer\", {\n            eventType: event.eventType,\n            eventName: event.eventName,\n            bufferSize: this.buffer.length,\n          });\n        }\n      }\n    } catch (error) {\n      this.logger.error(\"Error processing event queue\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    } finally {\n      this.isProcessingQueue = false;\n    }\n  }\n\n  getBatchForExport(): TelemetryEvent[] {\n    return this.buffer.splice(0);\n  }\n\n  returnBatchToBuffer(batch: TelemetryEvent[]): void {\n    this.buffer.unshift(...batch);\n  }\n\n  isBufferFull(): boolean {\n    return this.buffer.length >= this.batchSize;\n  }\n\n  getBufferSize(): number {\n    return this.buffer.length;\n  }\n\n  getQueueSize(): number {\n    return this.eventQueue.length;\n  }\n\n  private validateState(): void {\n    if (\n      this.state === TelemetryState.SHUTDOWN ||\n      this.state === TelemetryState.SHUTTING_DOWN\n    ) {\n      throw new Error(\n        `TelemetryManager is in ${this.state} state and cannot process events`\n      );\n    }\n  }\n\n  setState(state: TelemetryState): void {\n    this.state = state;\n  }\n\n  clear(): void {\n    this.buffer = [];\n    this.eventQueue = [];\n  }\n}\n","import type { Logger } from \"../types\";\nimport type { CircuitBreakerState } from \"./types\";\n\nexport class CircuitBreaker {\n  private state: CircuitBreakerState;\n  private logger: Logger;\n\n  constructor(\n    logger: Logger,\n    maxConsecutiveFailures: number = 5,\n    circuitBreakerTimeout: number = 30000\n  ) {\n    this.logger = logger;\n    this.state = {\n      consecutiveFailures: 0,\n      maxConsecutiveFailures,\n      circuitBreakerTimeout,\n      lastFailureTime: 0,\n      isCircuitOpen: false,\n    };\n  }\n\n  isOpen(): boolean {\n    if (!this.state.isCircuitOpen) {\n      return false;\n    }\n\n    // Check if enough time has passed to try again\n    if (\n      Date.now() - this.state.lastFailureTime >\n      this.state.circuitBreakerTimeout\n    ) {\n      this.reset();\n      this.logger.info(\n        \"Circuit breaker reset - attempting to export events again\"\n      );\n      return false;\n    }\n\n    return true;\n  }\n\n  recordSuccess(): void {\n    this.state.consecutiveFailures = 0;\n    this.state.isCircuitOpen = false;\n  }\n\n  recordFailure(): void {\n    this.state.consecutiveFailures++;\n    this.state.lastFailureTime = Date.now();\n\n    // Open circuit breaker if too many consecutive failures\n    if (this.state.consecutiveFailures >= this.state.maxConsecutiveFailures) {\n      this.state.isCircuitOpen = true;\n      this.logger.error(\"Circuit breaker opened due to consecutive failures\", {\n        consecutiveFailures: this.state.consecutiveFailures,\n        maxConsecutiveFailures: this.state.maxConsecutiveFailures,\n      });\n    }\n  }\n\n  private reset(): void {\n    this.state.isCircuitOpen = false;\n    this.state.consecutiveFailures = 0;\n  }\n\n  getState(): CircuitBreakerState {\n    return { ...this.state };\n  }\n}\n","import type { TelemetryEvent, TelemetryExporter, Logger } from \"../types\";\nimport { CircuitBreaker } from \"./CircuitBreaker\";\n\nexport class ExportManager {\n  private exporters: TelemetryExporter[] = [];\n  private endpoint?: string;\n  private circuitBreaker: CircuitBreaker;\n  private logger: Logger;\n  private maxRetries: number;\n  private retryDelay: number;\n  private isFlushing = false;\n\n  constructor(\n    logger: Logger,\n    exporters: TelemetryExporter[],\n    maxRetries: number = 3,\n    retryDelay: number = 1000,\n    endpoint?: string\n  ) {\n    this.logger = logger;\n    this.exporters = exporters;\n    if (endpoint) {\n      this.endpoint = endpoint;\n    }\n    this.maxRetries = maxRetries;\n    this.retryDelay = retryDelay;\n    this.circuitBreaker = new CircuitBreaker(logger);\n  }\n\n  async flush(\n    events: TelemetryEvent[]\n  ): Promise<{ success: boolean; shouldReturnToBuffer: boolean }> {\n    if (!events.length) {\n      this.logger.debug(\"No events to flush\");\n      return { success: true, shouldReturnToBuffer: false };\n    }\n\n    if (this.isFlushing) {\n      this.logger.debug(\"Flush already in progress, skipping\");\n      return { success: false, shouldReturnToBuffer: false };\n    }\n\n    // Check circuit breaker\n    if (this.circuitBreaker.isOpen()) {\n      this.logger.warn(\"Circuit breaker is open, skipping flush\", {\n        consecutiveFailures: this.circuitBreaker.getState().consecutiveFailures,\n        lastFailureTime: this.circuitBreaker.getState().lastFailureTime,\n      });\n      return { success: false, shouldReturnToBuffer: false };\n    }\n\n    this.isFlushing = true;\n    try {\n      this.logger.info(\"Flushing events\", {\n        eventCount: events.length,\n        events: events.map(e => ({ type: e.eventType, name: e.eventName })),\n        exporters: this.exporters.length,\n      });\n\n      let retries = 0;\n      let lastErrors: unknown[] = [];\n      while (retries <= this.maxRetries) {\n        const results = await Promise.all(\n          this.exporters.map(async exporter => {\n            try {\n              await exporter.export(events, this.endpoint);\n              return { success: true };\n            } catch (error) {\n              return { success: false, error };\n            }\n          })\n        );\n        const anySuccess = results.some(r => r.success);\n        lastErrors = results.filter(r => !r.success).map(r => r.error);\n        if (anySuccess) {\n          this.circuitBreaker.recordSuccess();\n          this.logger.info(\n            \"Events exported successfully to at least one exporter\",\n            {\n              eventCount: events.length,\n              retries,\n            }\n          );\n          return { success: true, shouldReturnToBuffer: false };\n        } else {\n          retries++;\n          this.circuitBreaker.recordFailure();\n          this.logger.error(\"Failed to export events to all exporters\", {\n            eventCount: events.length,\n            retry: retries,\n            maxRetries: this.maxRetries,\n            consecutiveFailures:\n              this.circuitBreaker.getState().consecutiveFailures,\n            errors: lastErrors.map(e =>\n              e instanceof Error ? e.message : String(e)\n            ),\n          });\n          if (retries <= this.maxRetries) {\n            await new Promise(resolve =>\n              setTimeout(resolve, this.retryDelay * retries)\n            );\n          } else {\n            // Don't return events to buffer if circuit breaker is open\n            const isCircuitOpen = this.circuitBreaker.isOpen();\n            if (!isCircuitOpen) {\n              this.logger.error(\n                \"Max retries exceeded, events returned to buffer\",\n                {\n                  eventCount: events.length,\n                }\n              );\n              return { success: false, shouldReturnToBuffer: true };\n            } else {\n              this.logger.error(\n                \"Max retries exceeded, circuit breaker open, events dropped\",\n                {\n                  eventCount: events.length,\n                }\n              );\n              return { success: false, shouldReturnToBuffer: false };\n            }\n          }\n        }\n      }\n      return { success: false, shouldReturnToBuffer: false };\n    } finally {\n      this.isFlushing = false;\n    }\n  }\n\n  setExporters(exporters: TelemetryExporter[]): void {\n    this.exporters = exporters;\n  }\n\n  getCircuitBreakerState() {\n    return this.circuitBreaker.getState();\n  }\n}\n","import { HyperlookExporter } from \"../exporters/HyperlookExporter\";\nimport { HTTPExporter } from \"../exporters/HTTPExporter\";\nimport { getLogger, setLogger, createLogger } from \"../logger\";\nimport type {\n  TelemetryConfig,\n  TelemetryEvent,\n  TelemetryPlugin,\n  Logger,\n  TelemetryExporter,\n} from \"../types\";\nimport { ExporterType } from \"../types/ExporterTypes\";\nimport { validateConfig, generateSessionId } from \"./utils\";\nimport { TelemetryState } from \"./types\";\nimport { PluginManager } from \"./PluginManager\";\nimport { EventProcessor } from \"./EventProcessor\";\nimport { ExportManager } from \"./ExportManager\";\nimport { HYPERLOOK_URL } from \"../constants\";\nimport {\n  earlyEventQueue,\n  setupModuleLevelEarlyInterceptors,\n} from \"../utils/earlyInitialization\";\n\n// Set up interceptors immediately when module is loaded\nsetupModuleLevelEarlyInterceptors();\n\nexport class TelemetryManager {\n  private state: TelemetryState = TelemetryState.INITIALIZING;\n  private logger: Logger;\n  private sessionId!: string;\n  private userId?: string;\n  private flushTimer: NodeJS.Timeout | undefined;\n  private flushInterval: number;\n  private failedEvents: TelemetryEvent[] = [];\n  private maxFailedEvents = 1000;\n\n  // Component managers\n  private pluginManager: PluginManager;\n  private eventProcessor: EventProcessor;\n  private exportManager: ExportManager;\n\n  // Early initialization support - removed unused singleton instance\n\n  constructor(config: TelemetryConfig) {\n    validateConfig(config);\n\n    // Early interceptors are already set up at module level\n    // No need to set them up again\n\n    // Initialize logger\n    if (config.logging) {\n      const customLogger = createLogger(config.logging);\n      setLogger(customLogger);\n    }\n    this.logger = getLogger();\n\n    // Initialize core properties\n    this.sessionId = config.sessionId ?? generateSessionId();\n    if (config.userId !== undefined) {\n      this.userId = config.userId;\n    }\n    this.flushInterval = config.flushInterval ?? 30000;\n\n    // Initialize component managers\n    this.pluginManager = new PluginManager(this.logger, this.state);\n    this.eventProcessor = new EventProcessor(\n      this.logger,\n      this.state,\n      config.samplingRate ?? 1.0,\n      config.batchSize ?? 50,\n      this.sessionId,\n      this.userId\n    );\n\n    // Instantiate exporters based on config\n    const enabledExporters: TelemetryExporter[] = [];\n    const exportersToEnable = config.exporters ?? [ExporterType.HYPERLOOK];\n    for (const exporterType of exportersToEnable) {\n      if (exporterType === ExporterType.HYPERLOOK) {\n        if (!config.hyperlookApiKey) {\n          throw new Error(\n            \"Hyperlook API key is required when Hyperlook exporter is enabled\"\n          );\n        }\n        enabledExporters.push(new HyperlookExporter(config.hyperlookApiKey));\n      } else if (exporterType === ExporterType.HTTP) {\n        enabledExporters.push(new HTTPExporter());\n      }\n    }\n\n    this.exportManager = new ExportManager(\n      this.logger,\n      enabledExporters,\n      config.maxRetries ?? 3,\n      config.retryDelay ?? 1000,\n      config.endpoint\n    );\n\n    // Initialize plugins\n    const pluginsToRegister = this.pluginManager.initializePlugins(config);\n    pluginsToRegister.forEach(plugin => {\n      this.pluginManager.register(plugin, this);\n    });\n\n    // Process any events that were queued before initialization\n    this.processEarlyEventQueue();\n\n    // Set state to running\n    this.state = TelemetryState.RUNNING;\n    this.pluginManager.setState(this.state);\n    this.eventProcessor.setState(this.state);\n\n    // Start flush timer\n    this.startFlushTimer();\n\n    this.logger.info(\"TelemetryManager initialized\", {\n      endpoint: HYPERLOOK_URL,\n      batchSize: config.batchSize ?? 50,\n      flushInterval: this.flushInterval,\n      maxRetries: config.maxRetries ?? 3,\n      samplingRate: config.samplingRate ?? 1.0,\n      enablePageViews: config.enablePageViews,\n      enableClicks: config.enableClicks,\n      enableLogs: config.enableLogs,\n      enableNetwork: config.enableNetwork,\n      enablePerformance: config.enablePerformance,\n      enableCustomEvents: config.enableCustomEvents,\n      exporters: exportersToEnable,\n    });\n  }\n\n  register(plugin: TelemetryPlugin): void {\n    this.pluginManager.register(plugin, this);\n  }\n\n  capture(event: TelemetryEvent): void {\n    const success = this.eventProcessor.capture(event);\n    if (success) {\n      // Process queue asynchronously\n      this.processEventQueueAsync();\n\n      // Check if buffer is full and trigger flush\n      if (this.eventProcessor.isBufferFull()) {\n        this.logger.info(\"Buffer full, triggering flush\", {\n          bufferSize: this.eventProcessor.getBufferSize(),\n        });\n        void this.flushAsync();\n      }\n    }\n  }\n\n  private processEventQueueAsync(): void {\n    try {\n      this.eventProcessor.processEventQueue();\n    } catch (error) {\n      this.logger.error(\"Async event queue processing failed\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async flushAsync(): Promise<void> {\n    try {\n      await this.flush();\n    } catch (error) {\n      this.logger.error(\"Async flush failed\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private startFlushTimer(): void {\n    if (this.flushInterval > 0) {\n      this.flushTimer = setInterval(() => {\n        if (\n          this.eventProcessor.getBufferSize() > 0 &&\n          this.state === TelemetryState.RUNNING\n        ) {\n          this.logger.debug(\"Periodic flush triggered\", {\n            bufferSize: this.eventProcessor.getBufferSize(),\n            flushInterval: this.flushInterval,\n          });\n          void this.flushAsync();\n        }\n      }, this.flushInterval);\n    }\n  }\n\n  async flush(): Promise<void> {\n    const batch = this.eventProcessor.getBatchForExport();\n    const result = await this.exportManager.flush(batch);\n\n    if (!result.success && result.shouldReturnToBuffer) {\n      this.eventProcessor.returnBatchToBuffer(batch);\n    }\n  }\n\n  async shutdown(): Promise<void> {\n    this.logger.info(\"Shutting down TelemetryManager\");\n    this.state = TelemetryState.SHUTTING_DOWN;\n\n    // Update state in all components\n    this.pluginManager.setState(this.state);\n    this.eventProcessor.setState(this.state);\n\n    // Clear flush timer\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = undefined;\n    }\n\n    // Destroy plugins\n    this.pluginManager.destroyAll();\n\n    // Final flush\n    await this.flush();\n\n    // Clear all data\n    this.eventProcessor.clear();\n    this.failedEvents = [];\n    this.exportManager.setExporters([]);\n\n    this.state = TelemetryState.SHUTDOWN;\n    this.logger.info(\"TelemetryManager shutdown complete\");\n  }\n\n  destroy(): void {\n    this.logger.warn(\"Force destroying TelemetryManager\");\n    this.state = TelemetryState.SHUTDOWN;\n\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = undefined;\n    }\n\n    this.eventProcessor.clear();\n    this.failedEvents = [];\n    this.exportManager.setExporters([]);\n\n    this.logger.info(\"TelemetryManager destroyed\");\n  }\n\n  retryFailedEvents(): void {\n    if (this.failedEvents.length === 0) {\n      this.logger.debug(\"No failed events to retry\");\n      return;\n    }\n    this.logger.info(\"Retrying failed events\", {\n      count: this.failedEvents.length,\n    });\n    const eventsToRetry = [...this.failedEvents];\n    this.failedEvents = [];\n    for (const event of eventsToRetry) {\n      try {\n        this.capture(event);\n      } catch (error) {\n        this.logger.error(\"Failed to retry event\", {\n          eventType: event.eventType,\n          eventName: event.eventName,\n          error: error instanceof Error ? error.message : String(error),\n        });\n        // Check if we're at the limit before adding to failed events\n        if (this.failedEvents.length < this.maxFailedEvents) {\n          this.failedEvents.push(event);\n        } else {\n          this.logger.warn(\"Failed events limit reached, dropping event\", {\n            eventType: event.eventType,\n            eventName: event.eventName,\n            maxFailedEvents: this.maxFailedEvents,\n          });\n        }\n      }\n    }\n  }\n\n  getFailedEventsCount(): number {\n    return this.failedEvents.length;\n  }\n\n  getQueuedEventsCount(): number {\n    return this.eventProcessor.getQueueSize();\n  }\n\n  getBufferedEventsCount(): number {\n    return this.eventProcessor.getBufferSize();\n  }\n\n  getState(): TelemetryState {\n    return this.state;\n  }\n\n  isShutdown(): boolean {\n    return (\n      this.state === TelemetryState.SHUTDOWN ||\n      this.state === TelemetryState.SHUTTING_DOWN\n    );\n  }\n\n  identify(userId: string, traits?: Record<string, unknown>): void {\n    try {\n      if (!userId || typeof userId !== \"string\") {\n        throw new Error(\"User ID is required and must be a string\");\n      }\n\n      this.userId = userId;\n\n      const identifyEvent: TelemetryEvent = {\n        eventType: \"identify\",\n        eventName: \"user_identified\",\n        payload: {\n          userId,\n          traits: traits || {},\n        },\n        timestamp: new Date().toISOString(),\n      };\n\n      this.logger.info(\"User identified\", {\n        userId,\n        traits: Object.keys(traits || {}),\n      });\n\n      this.capture(identifyEvent);\n    } catch (error) {\n      this.logger.error(\"Failed to identify user\", {\n        userId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  getSessionId(): string {\n    return this.sessionId;\n  }\n\n  getUserId(): string | undefined {\n    return this.userId;\n  }\n\n  getCustomEventsPlugin() {\n    return this.pluginManager.getCustomEventsPlugin();\n  }\n\n  getEndpoint(): string {\n    return HYPERLOOK_URL;\n  }\n\n  private processEarlyEventQueue(): void {\n    if (earlyEventQueue.length === 0) {\n      return;\n    }\n\n    this.logger.info(\"Processing early event queue\", {\n      queuedEvents: earlyEventQueue.length,\n    });\n\n    // Process all queued events\n    earlyEventQueue.forEach(event => {\n      this.capture(event);\n    });\n\n    // Clear the queue\n    earlyEventQueue.length = 0;\n  }\n}\n","import { TelemetryManager } from \"./TelemetryManager\";\nimport type {\n  TelemetryConfig,\n  TelemetryEvent,\n  TelemetryExporter,\n  TelemetryPlugin,\n  Logger,\n  LogLevel,\n  LoggerConfig,\n} from \"./types\";\nimport { HTTPExporter } from \"./exporters\";\nimport { getLogger, setLogger, createLogger } from \"./logger\";\nimport { BasePlugin } from \"./plugins/BasePlugin\";\nimport { ClickPlugin } from \"./plugins/ClickPlugin\";\nimport { LogPlugin } from \"./plugins/LogPlugin\";\nimport { NetworkPlugin } from \"./plugins/NetworkPlugin\";\nimport { PerformancePlugin } from \"./plugins/PerformancePlugin\";\nimport { CustomEventsPlugin } from \"./plugins/CustomEventsPlugin\";\nimport { PageViewPlugin } from \"./plugins/PageViewPlugin\";\nimport { ErrorPlugin } from \"./plugins/ErrorPlugin\";\nimport { initialTelemetryConfig } from \"./utils/initialTelemetryConfig\";\n\nexport {\n  TelemetryManager,\n  BasePlugin,\n  ClickPlugin,\n  LogPlugin,\n  NetworkPlugin,\n  PerformancePlugin,\n  CustomEventsPlugin,\n  PageViewPlugin,\n  ErrorPlugin,\n  HTTPExporter,\n  getLogger,\n  setLogger,\n  createLogger,\n};\n\nexport type {\n  TelemetryConfig,\n  TelemetryEvent,\n  TelemetryExporter,\n  TelemetryPlugin,\n  Logger,\n  LogLevel,\n  LoggerConfig,\n};\n\nexport function initTelemetry(\n  config: Partial<TelemetryConfig> = {}\n): TelemetryManager {\n  const finalConfig = { ...initialTelemetryConfig, ...config };\n  const telemetry = new TelemetryManager(finalConfig);\n\n  // Set up automatic shutdown handlers to ensure events are flushed\n  // when the application closes, even if developers forget to add them manually\n  if (typeof window !== \"undefined\") {\n    // Browser environment\n    const gracefulShutdown = async () => {\n      try {\n        // Only shutdown if not already shutting down or shutdown\n        if (!telemetry.isShutdown()) {\n          await telemetry.shutdown();\n        }\n      } catch (error) {\n        // If shutdown fails, force destroy to prevent memory leaks\n        console.warn(\"Telemetry shutdown failed, forcing destroy:\", error);\n        telemetry.destroy();\n      }\n    };\n\n    // Handle page unload events\n    window.addEventListener(\"beforeunload\", () => {\n      void gracefulShutdown();\n    });\n    window.addEventListener(\"pagehide\", () => {\n      void gracefulShutdown();\n    });\n\n    // Handle visibility change (when user switches tabs/apps)\n    document.addEventListener(\"visibilitychange\", () => {\n      if (document.visibilityState === \"hidden\") {\n        // Use a timeout to allow the page to potentially become visible again\n        // This prevents unnecessary flushes when user just switches tabs\n        setTimeout(() => {\n          if (\n            document.visibilityState === \"hidden\" &&\n            !telemetry.isShutdown()\n          ) {\n            void telemetry.flush();\n          }\n        }, 1000);\n      }\n    });\n  } else if (typeof process !== \"undefined\") {\n    // Node.js environment\n    const gracefulShutdown = async (signal?: string) => {\n      try {\n        console.log(\n          `Received ${signal || \"shutdown\"} signal, flushing telemetry...`\n        );\n\n        // Only shutdown if not already shutting down or shutdown\n        if (!telemetry.isShutdown()) {\n          await telemetry.shutdown();\n        }\n      } catch (error) {\n        // If shutdown fails, force destroy to prevent memory leaks\n        console.warn(\"Telemetry shutdown failed, forcing destroy:\", error);\n        telemetry.destroy();\n      }\n    };\n\n    // Handle process exit events\n    process.on(\"exit\", () => {\n      // Note: 'exit' event handlers are synchronous, so we can't use async/await\n      // Just force destroy to ensure cleanup\n      if (!telemetry.isShutdown()) {\n        telemetry.destroy();\n      }\n    });\n\n    // Handle graceful shutdown signals\n    process.on(\"SIGTERM\", () => {\n      void gracefulShutdown(\"SIGTERM\");\n    });\n    process.on(\"SIGINT\", () => {\n      void gracefulShutdown(\"SIGINT\");\n    });\n\n    // Handle uncaught exceptions and unhandled rejections\n    process.on(\"uncaughtException\", error => {\n      console.error(\"Uncaught exception:\", error);\n      void gracefulShutdown(\"uncaughtException\");\n    });\n\n    process.on(\"unhandledRejection\", (reason, promise) => {\n      console.error(\"Unhandled rejection at:\", promise, \"reason:\", reason);\n      void gracefulShutdown(\"unhandledRejection\");\n    });\n  }\n\n  return telemetry;\n}\n"]}