{"version":3,"sources":["../src/flatten-attributes.ts","../src/structured-error.ts","../src/rate-limiter.ts","../src/event-queue.ts","../src/validation.ts","../src/track.ts","../src/trace-context.ts","../src/correlation-id.ts"],"names":["SpanStatusCode","getConfig","getLogger","DEFAULT_CONFIG","getEventsConfig","isInitialized","warnIfNotInitialized","getValidationConfig","trace","AsyncLocalStorage","context","propagation"],"mappings":"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","file":"chunk-KKGM42RQ.cjs","sourcesContent":["import type { AttributeValue } from './trace-context';\n\n/**\n * Convert an unknown value to an OTel-compatible AttributeValue.\n * Returns undefined when the value cannot be represented.\n */\nexport function toAttributeValue(value: unknown): AttributeValue | undefined {\n  if (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean'\n  ) {\n    return value;\n  }\n  if (Array.isArray(value)) {\n    if (\n      value.every((v) => typeof v === 'string') ||\n      value.every((v) => typeof v === 'number') ||\n      value.every((v) => typeof v === 'boolean')\n    ) {\n      return value as AttributeValue;\n    }\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return '<serialization-failed>';\n    }\n  }\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n  if (value instanceof Error) {\n    return value.message;\n  }\n  return undefined;\n}\n\n/**\n * Recursively flatten a nested object into dot-notation OTel attributes.\n * Includes circular reference protection via WeakSet.\n */\nexport function flattenToAttributes(\n  fields: Record<string, unknown>,\n  prefix = '',\n): Record<string, AttributeValue> {\n  const out: Record<string, AttributeValue> = {};\n  const seen = new WeakSet<object>();\n\n  function flatten(obj: Record<string, unknown>, currentPrefix: string): void {\n    for (const [key, value] of Object.entries(obj)) {\n      if (value == null) continue;\n      const nextKey = currentPrefix ? `${currentPrefix}.${key}` : key;\n\n      const attr = toAttributeValue(value);\n      if (attr !== undefined) {\n        out[nextKey] = attr;\n        continue;\n      }\n\n      if (typeof value === 'object' && value.constructor === Object) {\n        if (seen.has(value)) {\n          out[nextKey] = '<circular-reference>';\n          continue;\n        }\n        seen.add(value);\n        flatten(value as Record<string, unknown>, nextKey);\n        continue;\n      }\n\n      try {\n        out[nextKey] = JSON.stringify(value);\n      } catch {\n        out[nextKey] = '<serialization-failed>';\n      }\n    }\n  }\n\n  flatten(fields, prefix);\n  return out;\n}\n","import { SpanStatusCode } from '@opentelemetry/api';\nimport type { AttributeValue, TraceContext } from './trace-context';\nimport { flattenToAttributes } from './flatten-attributes';\n\nconst internalKey = Symbol.for('autotel.error.internal');\n\nexport interface StructuredErrorInput {\n  message: string;\n  why?: string;\n  fix?: string;\n  link?: string;\n  code?: string | number;\n  status?: number;\n  cause?: unknown;\n  details?: Record<string, unknown>;\n  name?: string;\n  /** Backend-only context. Omitted from toJSON() and never serialized to clients. */\n  internal?: Record<string, unknown>;\n}\n\nexport interface StructuredError extends Error {\n  why?: string;\n  fix?: string;\n  link?: string;\n  code?: string | number;\n  status?: number;\n  details?: Record<string, unknown>;\n  /** Backend-only context. Omitted from toJSON() and never serialized to clients. */\n  readonly internal?: Record<string, unknown>;\n}\n\nexport function createStructuredError(\n  input: StructuredErrorInput,\n): StructuredError {\n  const error = new Error(input.message, {\n    cause: input.cause,\n  }) as StructuredError;\n\n  error.name = input.name ?? 'StructuredError';\n  if (input.why !== undefined) error.why = input.why;\n  if (input.fix !== undefined) error.fix = input.fix;\n  if (input.link !== undefined) error.link = input.link;\n  if (input.code !== undefined) error.code = input.code;\n  if (input.status !== undefined) error.status = input.status;\n  if (input.details !== undefined) error.details = input.details;\n\n  if (input.internal !== undefined) {\n    Object.defineProperty(error, internalKey, {\n      value: input.internal,\n      enumerable: false,\n      writable: false,\n      configurable: true,\n    });\n  }\n\n  Object.defineProperty(error, 'internal', {\n    get() {\n      return (\n        this as StructuredError & { [internalKey]?: Record<string, unknown> }\n      )[internalKey];\n    },\n    enumerable: false,\n    configurable: true,\n  });\n\n  error.toString = () => {\n    const lines = [`${error.name}: ${error.message}`];\n    if (error.why) lines.push(`  Why: ${error.why}`);\n    if (error.fix) lines.push(`  Fix: ${error.fix}`);\n    if (error.link) lines.push(`  Link: ${error.link}`);\n    if (error.code !== undefined) lines.push(`  Code: ${error.code}`);\n    if (error.status !== undefined) lines.push(`  Status: ${error.status}`);\n    if (error.cause) {\n      const cause = error.cause as Error;\n      lines.push(`  Caused by: ${cause.name}: ${cause.message}`);\n    }\n    return lines.join('\\n');\n  };\n\n  return error;\n}\n\nexport function structuredErrorToJSON(\n  error: StructuredError,\n): Record<string, unknown> {\n  const result: Record<string, unknown> = {\n    name: error.name,\n    message: error.message,\n  };\n\n  if (error.status !== undefined) result.status = error.status;\n  if (error.why || error.fix || error.link) {\n    result.data = {\n      ...(error.why && { why: error.why }),\n      ...(error.fix && { fix: error.fix }),\n      ...(error.link && { link: error.link }),\n    };\n  }\n  if (error.code !== undefined) result.code = error.code;\n  if (error.details) result.details = error.details;\n  if (error.cause instanceof Error) {\n    result.cause = { name: error.cause.name, message: error.cause.message };\n  }\n\n  return result;\n}\n\nexport function getStructuredErrorAttributes(\n  error: Error,\n): Record<string, AttributeValue> {\n  const structured = error as StructuredError;\n  const attributes: Record<string, AttributeValue> = {\n    'error.type': error.name || 'Error',\n    'error.message': error.message,\n  };\n\n  if (error.stack) attributes['error.stack'] = error.stack;\n  if (structured.why) attributes['error.why'] = structured.why;\n  if (structured.fix) attributes['error.fix'] = structured.fix;\n  if (structured.link) attributes['error.link'] = structured.link;\n  if (structured.code !== undefined) {\n    attributes['error.code'] =\n      typeof structured.code === 'string'\n        ? structured.code\n        : String(structured.code);\n  }\n  if (structured.status !== undefined) {\n    attributes['error.status'] = structured.status;\n  }\n  if (structured.details) {\n    Object.assign(\n      attributes,\n      flattenToAttributes(structured.details, 'error.details'),\n    );\n  }\n\n  return attributes;\n}\n\nexport function recordStructuredError(\n  ctx: Pick<TraceContext, 'setAttributes' | 'setStatus'>,\n  error: Error,\n): void {\n  const maybeRecordException = (\n    ctx as unknown as {\n      recordException?: (e: Error) => void;\n    }\n  ).recordException;\n  if (typeof maybeRecordException === 'function') {\n    maybeRecordException(error);\n  }\n  ctx.setStatus({\n    code: SpanStatusCode.ERROR,\n    message: error.message,\n  });\n  ctx.setAttributes(getStructuredErrorAttributes(error));\n}\n","/**\n * Token bucket rate limiter for event subscribers\n *\n * Prevents overwhelming downstream events platforms with too many events.\n * Uses token bucket algorithm for smooth rate limiting with burst capacity.\n */\n\nexport interface RateLimiterConfig {\n  /** Maximum events per second (default: 100) */\n  maxEventsPerSecond: number;\n  /** Burst capacity - max events in a single burst (default: 2x rate) */\n  burstCapacity?: number;\n}\n\n/**\n * Token bucket rate limiter\n *\n * Allows bursts up to burstCapacity, then smooths to maxEventsPerSecond.\n * Thread-safe for async operations.\n */\nexport class TokenBucketRateLimiter {\n  private tokens: number;\n  private readonly maxTokens: number;\n  private readonly refillRate: number; // tokens per millisecond\n  private lastRefill: number;\n\n  constructor(config: RateLimiterConfig) {\n    this.maxTokens = config.burstCapacity || config.maxEventsPerSecond * 2;\n    this.tokens = this.maxTokens; // Start with full bucket\n    this.refillRate = config.maxEventsPerSecond / 1000; // Convert to per-ms\n    this.lastRefill = Date.now();\n  }\n\n  /**\n   * Try to consume a token (allow an event)\n   * Returns true if allowed, false if rate limit exceeded\n   */\n  tryConsume(count = 1): boolean {\n    this.refill();\n\n    if (this.tokens >= count) {\n      this.tokens -= count;\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Wait until a token is available (async rate limiting)\n   * Returns a promise that resolves when the event can be processed\n   */\n  async waitForToken(count = 1): Promise<void> {\n    this.refill();\n\n    if (this.tokens >= count) {\n      this.tokens -= count;\n      return;\n    }\n\n    // Calculate wait time until we have enough tokens\n    const tokensNeeded = count - this.tokens;\n    const waitMs = Math.ceil(tokensNeeded / this.refillRate);\n\n    await new Promise((resolve) => setTimeout(resolve, waitMs));\n\n    // After waiting, try again (recursive)\n    return this.waitForToken(count);\n  }\n\n  /**\n   * Refill tokens based on elapsed time\n   */\n  private refill(): void {\n    const now = Date.now();\n    const elapsed = now - this.lastRefill;\n    const tokensToAdd = elapsed * this.refillRate;\n\n    this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n    this.lastRefill = now;\n  }\n\n  /**\n   * Get current available tokens (for testing/debugging)\n   */\n  getAvailableTokens(): number {\n    this.refill();\n    return Math.floor(this.tokens);\n  }\n\n  /**\n   * Reset the rate limiter (for testing)\n   */\n  reset(): void {\n    this.tokens = this.maxTokens;\n    this.lastRefill = Date.now();\n  }\n}\n","/**\n * Events event queue with batching, backpressure, retry logic, rate limiting, and OTel metrics\n *\n * Exposes delivery pipeline metrics for observability:\n * - autotel.event_delivery.queue.size - Current queue size\n * - autotel.event_delivery.queue.oldest_age_ms - Age of oldest event in queue\n * - autotel.event_delivery.queue.delivered - Successfully delivered events\n * - autotel.event_delivery.queue.failed - Failed event deliveries\n * - autotel.event_delivery.queue.dropped - Dropped events with reason\n * - autotel.event_delivery.queue.latency_ms - Delivery latency histogram\n * - autotel.event_delivery.subscriber.health - Subscriber health (1=healthy, 0=unhealthy)\n */\n\nimport type {\n  Counter,\n  Histogram,\n  ObservableGauge,\n  Attributes,\n} from '@opentelemetry/api';\nimport type { ObservableResult } from '@opentelemetry/api';\nimport type {\n  EventSubscriber,\n  EventAttributes,\n  AutotelEventContext,\n} from './event-subscriber';\nimport { getLogger } from './init';\nimport { getConfig as getRuntimeConfig } from './config';\nimport { TokenBucketRateLimiter, type RateLimiterConfig } from './rate-limiter';\nimport { getOrCreateCorrelationId } from './correlation-id';\n\nexport interface EventData {\n  name: string;\n  attributes?: EventAttributes;\n  timestamp: number;\n  /** Internal: correlation ID for debug breadcrumbs */\n  _correlationId?: string;\n  /** Internal: trace ID for debug breadcrumbs */\n  _traceId?: string;\n  /** Autotel context for trace correlation (passed to subscribers) */\n  autotel?: AutotelEventContext;\n}\n\n/**\n * Drop reasons for event delivery queue metrics\n * LOW CARDINALITY: Only these 4 values allowed in metric labels\n */\nexport type EventDropReason =\n  | 'rate_limit'\n  | 'circuit_open'\n  | 'payload_invalid'\n  | 'shutdown';\n\nexport interface QueueConfig {\n  maxSize: number; // Max events in queue (default: 50,000)\n  batchSize: number; // Events per batch (default: 100)\n  flushInterval: number; // Flush interval in ms (default: 10,000)\n  maxRetries: number; // Max retry attempts (default: 3)\n  rateLimit?: RateLimiterConfig; // Optional rate limiting (default: 100 events/sec)\n}\n\nconst DEFAULT_CONFIG: QueueConfig = {\n  maxSize: 50_000,\n  batchSize: 100,\n  flushInterval: 10_000,\n  maxRetries: 3,\n  rateLimit: {\n    maxEventsPerSecond: 100,\n    burstCapacity: 200,\n  },\n};\n\n/**\n * Metrics for event delivery queue observability\n *\n * All metrics use low-cardinality labels only:\n * - subscriber: stable identifier (e.g., 'posthog', 'mixpanel')\n * - reason: one of EventDropReason values\n */\ninterface EventQueueMetrics {\n  /** Current queue size (observable gauge) */\n  queueSize: ObservableGauge;\n  /** Age of oldest event in queue in ms (observable gauge) */\n  oldestAge: ObservableGauge;\n  /** Successfully delivered events (counter) */\n  delivered: Counter;\n  /** Failed event deliveries after all retries (counter) */\n  failed: Counter;\n  /** Dropped events (counter with reason label) */\n  dropped: Counter;\n  /** Event delivery latency histogram in ms */\n  latency: Histogram;\n  /** Subscriber health: 1=healthy, 0=unhealthy (observable gauge) */\n  subscriberHealth: ObservableGauge;\n}\n\n/**\n * Get subscriber name for metrics (stable, low-cardinality)\n *\n * Priority:\n * 1. Explicit config: subscriber.name\n * 2. Class static property (if available)\n * 3. Fallback: lowercase class name without \"Subscriber\" suffix\n */\nfunction getSubscriberName(subscriber: EventSubscriber): string {\n  // Use explicit name if provided\n  if (subscriber.name) {\n    return subscriber.name.toLowerCase();\n  }\n\n  // Fallback: derive from class name\n  const className = subscriber.constructor?.name || 'unknown';\n  return className.replace(/Subscriber$/i, '').toLowerCase();\n}\n\n/**\n * Events queue with batching and backpressure\n *\n * Features:\n * - Batches events for efficient sending\n * - Bounded queue with drop-oldest policy (prod) or blocking (dev)\n * - Exponential backoff retry\n * - Rate limiting to prevent overwhelming subscribers\n * - Graceful flush on shutdown\n */\nexport class EventQueue {\n  private queue: EventData[] = [];\n  private flushTimer: NodeJS.Timeout | null = null;\n  private readonly config: QueueConfig;\n  private readonly subscribers: EventSubscriber[];\n  private readonly rateLimiter: TokenBucketRateLimiter | null;\n  private flushPromise: Promise<void> | null = null;\n  private isShuttingDown = false;\n\n  // Metrics\n  private metrics: EventQueueMetrics | null = null;\n\n  // Observable callback cleanup functions\n  private observableCleanups: Array<() => void> = [];\n\n  // Subscriber health tracking (for observable gauges)\n  private subscriberHealthy: Map<string, boolean> = new Map();\n\n  constructor(subscribers: EventSubscriber[], config?: Partial<QueueConfig>) {\n    this.subscribers = subscribers;\n    this.config = { ...DEFAULT_CONFIG, ...config };\n\n    // Initialize rate limiter if configured\n    this.rateLimiter = this.config.rateLimit\n      ? new TokenBucketRateLimiter(this.config.rateLimit)\n      : null;\n\n    // Initialize subscriber health tracking\n    for (const subscriber of subscribers) {\n      const name = getSubscriberName(subscriber);\n      this.subscriberHealthy.set(name, true);\n    }\n\n    // Initialize metrics\n    this.initMetrics();\n  }\n\n  /**\n   * Initialize OTel metrics for queue observability\n   */\n  private initMetrics(): void {\n    const runtimeConfig = getRuntimeConfig();\n    const meter = runtimeConfig.meter;\n\n    // Queue size gauge - observe current queue length\n    const queueSize = meter.createObservableGauge(\n      'autotel.event_delivery.queue.size',\n      {\n        description: 'Current number of events in the delivery queue',\n        unit: 'count',\n      },\n    );\n    const queueSizeCallback = (observableResult: ObservableResult) => {\n      observableResult.observe(this.queue.length);\n    };\n    queueSize.addCallback(queueSizeCallback);\n    this.observableCleanups.push(() =>\n      queueSize.removeCallback(queueSizeCallback),\n    );\n\n    // Oldest event age gauge - observe wait time of oldest event\n    const oldestAge = meter.createObservableGauge(\n      'autotel.event_delivery.queue.oldest_age_ms',\n      {\n        description: 'Age of the oldest event in the queue in milliseconds',\n        unit: 'ms',\n      },\n    );\n    const oldestAgeCallback = (observableResult: ObservableResult) => {\n      if (this.queue.length > 0) {\n        const oldest = this.queue[0]!;\n        const ageMs = Date.now() - oldest.timestamp;\n        observableResult.observe(ageMs);\n      } else {\n        observableResult.observe(0);\n      }\n    };\n    oldestAge.addCallback(oldestAgeCallback);\n    this.observableCleanups.push(() =>\n      oldestAge.removeCallback(oldestAgeCallback),\n    );\n\n    // Delivered counter\n    const delivered = meter.createCounter(\n      'autotel.event_delivery.queue.delivered',\n      {\n        description: 'Number of events successfully delivered to subscribers',\n        unit: 'count',\n      },\n    );\n\n    // Failed counter\n    const failed = meter.createCounter('autotel.event_delivery.queue.failed', {\n      description:\n        'Number of events that failed delivery after all retry attempts',\n      unit: 'count',\n    });\n\n    // Dropped counter (with reason label)\n    const dropped = meter.createCounter(\n      'autotel.event_delivery.queue.dropped',\n      {\n        description: 'Number of events dropped from the queue',\n        unit: 'count',\n      },\n    );\n\n    // Latency histogram\n    const latency = meter.createHistogram(\n      'autotel.event_delivery.queue.latency_ms',\n      {\n        description: 'Event delivery latency from enqueue to successful send',\n        unit: 'ms',\n      },\n    );\n\n    // Subscriber health gauge\n    const subscriberHealth = meter.createObservableGauge(\n      'autotel.event_delivery.subscriber.health',\n      {\n        description: 'Subscriber health status (1=healthy, 0=unhealthy)',\n        unit: '1',\n      },\n    );\n    const subscriberHealthCallback = (observableResult: ObservableResult) => {\n      for (const [subscriberName, isHealthy] of this.subscriberHealthy) {\n        observableResult.observe(isHealthy ? 1 : 0, {\n          subscriber: subscriberName,\n        });\n      }\n    };\n    subscriberHealth.addCallback(subscriberHealthCallback);\n    this.observableCleanups.push(() =>\n      subscriberHealth.removeCallback(subscriberHealthCallback),\n    );\n\n    this.metrics = {\n      queueSize,\n      oldestAge,\n      delivered,\n      failed,\n      dropped,\n      latency,\n      subscriberHealth,\n    };\n  }\n\n  /**\n   * Record a dropped event with reason and emit debug breadcrumb\n   */\n  private recordDropped(\n    reason: EventDropReason,\n    event?: EventData,\n    subscriberName?: string,\n  ): void {\n    // Increment metric\n    const attrs: Attributes = { reason };\n    if (subscriberName) {\n      attrs.subscriber = subscriberName;\n    }\n    this.metrics?.dropped.add(1, attrs);\n\n    // Debug breadcrumb log (rate-limited via existing logger)\n    const logLevel = reason === 'payload_invalid' ? 'error' : 'warn';\n    const logger = getLogger();\n\n    if (logLevel === 'error') {\n      logger.error(\n        {\n          eventName: event?.name,\n          subscriber: subscriberName,\n          reason,\n          correlationId: event?._correlationId,\n          traceId: event?._traceId,\n        },\n        `[autotel] Event dropped: ${reason}`,\n      );\n    } else {\n      logger.warn(\n        {\n          eventName: event?.name,\n          subscriber: subscriberName,\n          reason,\n          correlationId: event?._correlationId,\n          traceId: event?._traceId,\n        },\n        `[autotel] Event dropped: ${reason}`,\n      );\n    }\n  }\n\n  /**\n   * Record permanent delivery failure (after all retries exhausted)\n   * Increments failed counter and logs error\n   */\n  private recordFailed(\n    event: EventData,\n    subscriberName: string,\n    error?: Error,\n  ): void {\n    this.metrics?.failed.add(1, { subscriber: subscriberName });\n\n    // Mark subscriber as unhealthy\n    this.subscriberHealthy.set(subscriberName, false);\n\n    // Debug breadcrumb log\n    getLogger().error(\n      {\n        eventName: event.name,\n        subscriber: subscriberName,\n        correlationId: event._correlationId,\n        traceId: event._traceId,\n        err: error,\n      },\n      `[autotel] Event delivery failed after all retries`,\n    );\n  }\n\n  /**\n   * Mark subscriber as unhealthy on transient failure (without incrementing failed counter)\n   * Used during retry attempts - only recordFailed should increment the counter\n   */\n  private markSubscriberUnhealthy(subscriberName: string): void {\n    this.subscriberHealthy.set(subscriberName, false);\n  }\n\n  /**\n   * Record successful delivery\n   */\n  private recordDelivered(\n    event: EventData,\n    subscriberName: string,\n    startTime: number,\n  ): void {\n    const latencyMs = Date.now() - startTime;\n\n    this.metrics?.delivered.add(1, { subscriber: subscriberName });\n    this.metrics?.latency.record(latencyMs, { subscriber: subscriberName });\n\n    // Mark subscriber as healthy\n    this.subscriberHealthy.set(subscriberName, true);\n  }\n\n  /**\n   * Enqueue an event for sending\n   *\n   * Backpressure policy:\n   * - Drops oldest event and logs warning if queue is full (same behavior in all environments)\n   */\n  enqueue(event: EventData): void {\n    // Reject events during shutdown\n    if (this.isShuttingDown) {\n      this.recordDropped('shutdown', event);\n      return;\n    }\n\n    // Check queue size\n    if (this.queue.length >= this.config.maxSize) {\n      // Drop oldest event and log warning (same behavior in all environments)\n      const droppedEvent = this.queue.shift();\n      this.recordDropped('rate_limit', droppedEvent);\n      getLogger().warn(\n        {\n          droppedEvent: droppedEvent?.name,\n        },\n        `[autotel] Events queue full (${this.config.maxSize} events). ` +\n          'Dropping oldest event. Events are being produced faster than they can be sent. ' +\n          'Check your subscribers or reduce tracking frequency.',\n      );\n    }\n\n    // Enrich event with correlation context for debug breadcrumbs\n    const enrichedEvent: EventData = {\n      ...event,\n      _correlationId: event._correlationId || getOrCreateCorrelationId(),\n    };\n\n    this.queue.push(enrichedEvent);\n    this.scheduleBatchFlush();\n  }\n\n  /**\n   * Schedule a batch flush if not already scheduled\n   */\n  private scheduleBatchFlush(): void {\n    if (this.flushTimer || this.flushPromise) return;\n\n    this.flushTimer = setTimeout(() => {\n      this.flushTimer = null;\n      void this.flushBatch();\n    }, this.config.flushInterval);\n  }\n\n  /**\n   * Flush a batch of events\n   * Uses promise-based concurrency control to prevent race conditions\n   */\n  private async flushBatch(): Promise<void> {\n    if (this.queue.length === 0) return;\n\n    // If already flushing, wait for existing flush\n    if (this.flushPromise) {\n      await this.flushPromise;\n      return;\n    }\n\n    this.flushPromise = this.doFlushBatch();\n\n    try {\n      await this.flushPromise;\n    } finally {\n      this.flushPromise = null;\n\n      // Schedule next flush if more events\n      if (this.queue.length > 0) {\n        this.scheduleBatchFlush();\n      }\n    }\n  }\n\n  /**\n   * Internal flush implementation\n   */\n  private async doFlushBatch(): Promise<void> {\n    const batch = this.queue.splice(0, this.config.batchSize);\n    await this.sendWithRetry(batch, this.config.maxRetries);\n  }\n\n  /**\n   * Send events with exponential backoff retry\n   * Tracks per-event, per-subscriber failures so failed counter reflects actual failed deliveries.\n   * On retry, only failed (event, subscriber) pairs are re-sent to avoid double-counting delivered.\n   */\n  private async sendWithRetry(\n    events: EventData[],\n    retriesLeft: number,\n    subscribersByEventIndex?: Map<number, Set<string>>,\n  ): Promise<void> {\n    const failedDeliveries = await this.sendToSubscribers(\n      events,\n      subscribersByEventIndex,\n    );\n\n    if (failedDeliveries.length > 0) {\n      if (retriesLeft > 0) {\n        // Retry only events that had at least one failure, and only to subscribers that failed (avoid re-sending to healthy subscribers and double-counting delivered)\n        const failedEventIndices = new Set(\n          failedDeliveries.map((f) => f.eventIndex),\n        );\n        const failedEventIndicesOrdered = [...failedEventIndices].sort(\n          (a, b) => a - b,\n        );\n        const eventsToRetry = failedEventIndicesOrdered.map(\n          (i) => events[i],\n        ) as EventData[];\n        const failedSubscribersByRetryIndex = new Map<number, Set<string>>();\n        for (let j = 0; j < failedEventIndicesOrdered.length; j++) {\n          const origIndex = failedEventIndicesOrdered[j];\n          const set = new Set<string>();\n          for (const { eventIndex, subscriberName } of failedDeliveries) {\n            if (eventIndex === origIndex) set.add(subscriberName);\n          }\n          failedSubscribersByRetryIndex.set(j, set);\n        }\n        const delay = Math.pow(2, this.config.maxRetries - retriesLeft) * 1000;\n        await new Promise((resolve) => setTimeout(resolve, delay));\n        return this.sendWithRetry(\n          eventsToRetry,\n          retriesLeft - 1,\n          failedSubscribersByRetryIndex,\n        );\n      } else {\n        // Give up after max retries - record one failure per (event, subscriber) pair\n        for (const { eventIndex, subscriberName, error } of failedDeliveries) {\n          const event = events[eventIndex];\n          if (event) this.recordFailed(event, subscriberName, error);\n        }\n\n        const failedSubscriberNames = [\n          ...new Set(failedDeliveries.map((f) => f.subscriberName)),\n        ];\n        getLogger().error(\n          {\n            failedSubscribers: failedSubscriberNames,\n            retriesAttempted: this.config.maxRetries,\n          },\n          '[autotel] Failed to send events after retries',\n        );\n      }\n    }\n  }\n\n  /**\n   * Send events to configured subscribers with rate limiting and metrics.\n   * When subscribersByEventIndex is provided (retry path), only those subscribers are tried per event.\n   * Returns per-event, per-subscriber failures (empty if all succeeded).\n   */\n  private async sendToSubscribers(\n    events: EventData[],\n    subscribersByEventIndex?: Map<number, Set<string>>,\n  ): Promise<\n    Array<{ eventIndex: number; subscriberName: string; error?: Error }>\n  > {\n    const failedDeliveries: Array<{\n      eventIndex: number;\n      subscriberName: string;\n      error?: Error;\n    }> = [];\n\n    const sendOne = async (event: EventData, eventIndex: number) => {\n      // On retry, only try subscribers that failed for this event (never re-send to healthy subscribers)\n      const subscriberNames = subscribersByEventIndex?.get(eventIndex);\n      const failures = await this.sendEventToSubscribers(\n        event,\n        subscriberNames ?? undefined,\n      );\n      for (const failure of failures) {\n        failedDeliveries.push({\n          eventIndex,\n          subscriberName: failure.subscriberName,\n          error: failure.error,\n        });\n      }\n    };\n\n    if (!this.rateLimiter) {\n      for (let i = 0; i < events.length; i++) {\n        const event = events[i];\n        if (event) await sendOne(event, i);\n      }\n      return failedDeliveries;\n    }\n\n    for (let i = 0; i < events.length; i++) {\n      await this.rateLimiter.waitForToken();\n      const event = events[i];\n      if (event) await sendOne(event, i);\n    }\n\n    return failedDeliveries;\n  }\n\n  /**\n   * Send a single event to subscribers.\n   * - When subscriberNames is undefined (initial attempt): send to all subscribers.\n   * - When subscriberNames is provided (retry): send only to those subscribers (never re-send to healthy ones).\n   * Returns list of subscribers that failed (empty if all succeeded).\n   */\n  private async sendEventToSubscribers(\n    event: EventData,\n    subscriberNames?: Set<string>,\n  ): Promise<Array<{ subscriberName: string; error?: Error }>> {\n    const startTime = event.timestamp;\n    const failures: Array<{ subscriberName: string; error?: Error }> = [];\n\n    const subscribersToTry =\n      subscriberNames === undefined\n        ? this.subscribers\n        : this.subscribers.filter((s) =>\n            subscriberNames.has(getSubscriberName(s)),\n          );\n\n    const results = await Promise.allSettled(\n      subscribersToTry.map(async (subscriber) => {\n        const subscriberName = getSubscriberName(subscriber);\n\n        try {\n          await subscriber.trackEvent(event.name, event.attributes, {\n            autotel: event.autotel,\n          });\n          this.recordDelivered(event, subscriberName, startTime);\n          return { subscriberName, success: true };\n        } catch (error) {\n          this.markSubscriberUnhealthy(subscriberName);\n          return {\n            subscriberName,\n            success: false,\n            error: error instanceof Error ? error : undefined,\n          };\n        }\n      }),\n    );\n\n    for (const result of results) {\n      if (result.status === 'fulfilled' && !result.value.success) {\n        failures.push({\n          subscriberName: result.value.subscriberName,\n          error: result.value.error,\n        });\n      }\n    }\n\n    return failures;\n  }\n\n  /**\n   * Flush all remaining events. Queue remains usable after flush (e.g. for\n   * auto-flush at root span end). Use shutdown() when tearing down the queue.\n   */\n  async flush(): Promise<void> {\n    // Cancel any pending timer\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer);\n      this.flushTimer = null;\n    }\n\n    // Wait for any in-progress flush to complete\n    if (this.flushPromise) {\n      await this.flushPromise;\n    }\n\n    // Flush all remaining batches\n    while (this.queue.length > 0) {\n      await this.doFlushBatch();\n    }\n  }\n\n  /**\n   * Flush remaining events and permanently disable the queue (reject new events).\n   * Use for process/SDK shutdown; use flush() for periodic or span-end drain.\n   */\n  async shutdown(): Promise<void> {\n    this.isShuttingDown = true;\n    await this.flush();\n  }\n\n  /**\n   * Cleanup observable metric callbacks to prevent memory leaks\n   * Call this when destroying the EventQueue instance\n   */\n  cleanup(): void {\n    // Remove all observable callbacks\n    for (const cleanupFn of this.observableCleanups) {\n      try {\n        cleanupFn();\n      } catch {\n        // Ignore cleanup errors\n      }\n    }\n    this.observableCleanups = [];\n  }\n\n  /**\n   * Get queue size (for testing/debugging)\n   */\n  size(): number {\n    return this.queue.length;\n  }\n\n  /**\n   * Get subscriber health status (for testing/debugging)\n   */\n  getSubscriberHealth(): Map<string, boolean> {\n    return new Map(this.subscriberHealthy);\n  }\n\n  /**\n   * Check if a specific subscriber is healthy\n   */\n  isSubscriberHealthy(subscriberName: string): boolean {\n    return this.subscriberHealthy.get(subscriberName.toLowerCase()) ?? true;\n  }\n\n  /**\n   * Manually mark a subscriber as healthy or unhealthy\n   * (used for circuit breaker integration)\n   */\n  setSubscriberHealth(subscriberName: string, healthy: boolean): void {\n    this.subscriberHealthy.set(subscriberName.toLowerCase(), healthy);\n  }\n}\n","/**\n * Input validation for events events and attributes\n *\n * Prevents:\n * - Invalid event names\n * - Oversized payloads\n * - Circular references\n * - Sensitive data leaks\n */\n\nimport type { EventAttributes } from './event-subscriber';\n\nexport interface ValidationConfig {\n  /** Max event name length (default: 100) */\n  maxEventNameLength: number;\n  /** Max attribute key length (default: 100) */\n  maxAttributeKeyLength: number;\n  /** Max attribute value length for strings (default: 1000) */\n  maxAttributeValueLength: number;\n  /** Max total attributes per event (default: 50) */\n  maxAttributeCount: number;\n  /** Max nesting depth for objects (default: 3) */\n  maxNestingDepth: number;\n  /** Sensitive field patterns to redact */\n  sensitivePatterns: RegExp[];\n}\n\nconst DEFAULT_CONFIG: ValidationConfig = {\n  maxEventNameLength: 100,\n  maxAttributeKeyLength: 100,\n  maxAttributeValueLength: 1000,\n  maxAttributeCount: 50,\n  maxNestingDepth: 3,\n  sensitivePatterns: [\n    /password/i,\n    /secret/i,\n    /token/i,\n    /api[_-]?key/i,\n    /access[_-]?key/i,\n    /private[_-]?key/i,\n    /auth/i,\n    /credential/i,\n    /ssn/i,\n    /credit[_-]?card/i,\n  ],\n};\n\nexport class ValidationError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'ValidationError';\n  }\n}\n\n/**\n * Validate and sanitize event name\n * Throws ValidationError if invalid\n */\nexport function validateEventName(\n  eventName: string,\n  config: ValidationConfig = DEFAULT_CONFIG,\n): string {\n  // Check type\n  if (typeof eventName !== 'string') {\n    throw new ValidationError(\n      `Event name must be a string, got ${typeof eventName}`,\n    );\n  }\n\n  // Check non-empty\n  const trimmed = eventName.trim();\n  if (trimmed.length === 0) {\n    throw new ValidationError('Event name cannot be empty');\n  }\n\n  // Check length\n  if (trimmed.length > config.maxEventNameLength) {\n    throw new ValidationError(\n      `Event name too long (${trimmed.length} chars). ` +\n        `Max: ${config.maxEventNameLength}`,\n    );\n  }\n\n  // Check valid characters (alphanumeric, dots, underscores, hyphens)\n  if (!/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n    throw new ValidationError(\n      `Event name contains invalid characters: \"${trimmed}\". ` +\n        'Use only letters, numbers, dots, underscores, and hyphens.',\n    );\n  }\n\n  return trimmed;\n}\n\n/**\n * Validate and sanitize attributes\n * Returns sanitized attributes (sensitive data redacted)\n */\nexport function validateAttributes(\n  attributes: EventAttributes | undefined,\n  config: ValidationConfig = DEFAULT_CONFIG,\n): EventAttributes | undefined {\n  if (attributes === undefined || attributes === null) {\n    return undefined;\n  }\n\n  // Check type\n  if (typeof attributes !== 'object' || Array.isArray(attributes)) {\n    throw new ValidationError('Attributes must be an object');\n  }\n\n  // Count attributes\n  const keys = Object.keys(attributes);\n  if (keys.length > config.maxAttributeCount) {\n    throw new ValidationError(\n      `Too many attributes (${keys.length}). ` +\n        `Max: ${config.maxAttributeCount}`,\n    );\n  }\n\n  // Validate and sanitize each attribute\n  const sanitized: EventAttributes = {};\n\n  for (const key of keys) {\n    // Validate key\n    if (key.length > config.maxAttributeKeyLength) {\n      throw new ValidationError(\n        `Attribute key too long: \"${key.slice(0, 20)}...\" ` +\n          `(${key.length} chars). Max: ${config.maxAttributeKeyLength}`,\n      );\n    }\n\n    // Check for sensitive field\n    const isSensitive = config.sensitivePatterns.some((pattern) =>\n      pattern.test(key),\n    );\n\n    if (isSensitive) {\n      // Redact sensitive data\n      sanitized[key] = '[REDACTED]';\n      continue;\n    }\n\n    // Sanitize value\n    const value = attributes[key];\n    sanitized[key] = sanitizeValue(value, config, 1) as\n      | string\n      | number\n      | boolean;\n  }\n\n  return sanitized;\n}\n\n/**\n * Sanitize attribute value (recursive)\n */\nfunction sanitizeValue(\n  value: unknown,\n  config: ValidationConfig,\n  depth: number,\n): unknown {\n  // Check nesting depth\n  if (depth > config.maxNestingDepth) {\n    return '[MAX_DEPTH_EXCEEDED]';\n  }\n\n  // Handle null/undefined\n  if (value === null || value === undefined) {\n    return value;\n  }\n\n  // Handle primitives\n  if (typeof value === 'string') {\n    if (value.length > config.maxAttributeValueLength) {\n      return value.slice(0, config.maxAttributeValueLength) + '...';\n    }\n    return value;\n  }\n\n  if (typeof value === 'number' || typeof value === 'boolean') {\n    return value;\n  }\n\n  // Handle arrays\n  if (Array.isArray(value)) {\n    return value.map((item) => sanitizeValue(item, config, depth + 1));\n  }\n\n  // Handle objects\n  if (typeof value === 'object') {\n    try {\n      // Check for circular references\n      JSON.stringify(value);\n\n      const sanitized: Record<string, unknown> = {};\n      for (const key in value) {\n        if (Object.prototype.hasOwnProperty.call(value, key)) {\n          // Check for sensitive field in nested objects\n          const isSensitive = config.sensitivePatterns.some((pattern) =>\n            pattern.test(key),\n          );\n\n          if (isSensitive) {\n            sanitized[key] = '[REDACTED]';\n          } else {\n            sanitized[key] = sanitizeValue(\n              (value as Record<string, unknown>)[key],\n              config,\n              depth + 1,\n            );\n          }\n        }\n      }\n      return sanitized;\n    } catch {\n      // Circular reference detected\n      return '[CIRCULAR]';\n    }\n  }\n\n  // Unsupported type (function, symbol, etc.)\n  return `[${typeof value}]`;\n}\n\n/**\n * Validate and sanitize an events event\n * Returns { eventName, attributes } with sanitized values\n */\nexport function validateEvent(\n  eventName: string,\n  attributes?: EventAttributes,\n  config?: Partial<ValidationConfig>,\n): { eventName: string; attributes?: EventAttributes } {\n  const fullConfig = { ...DEFAULT_CONFIG, ...config };\n\n  return {\n    eventName: validateEventName(eventName, fullConfig),\n    attributes: validateAttributes(attributes, fullConfig),\n  };\n}\n\n/**\n * Get default validation config (for testing/customization)\n */\nexport function getDefaultValidationConfig(): ValidationConfig {\n  return { ...DEFAULT_CONFIG };\n}\n","/**\n * Global track() function for business events\n *\n * Simple, no instantiation needed, auto-attaches trace context\n */\n\nimport { trace } from '@opentelemetry/api';\nimport { EventQueue } from './event-queue';\nimport {\n  getConfig,\n  warnIfNotInitialized,\n  isInitialized,\n  getValidationConfig,\n  getEventsConfig,\n} from './init';\nimport { validateEvent } from './validation';\nimport { getOrCreateCorrelationId } from './correlation-id';\nimport type { AutotelEventContext } from './event-subscriber';\n\n// Global events queue (initialized on first track call)\nlet eventsQueue: EventQueue | null = null;\n\n/**\n * Build autotel event context for trace correlation\n *\n * Works in multiple contexts:\n * 1. Inside a span → use current span's trace_id + span_id\n * 2. Outside span → use correlation_id only\n * 3. With trace URL config → include clickable trace URL\n */\nfunction buildAutotelContext(\n  span: ReturnType<typeof trace.getActiveSpan>,\n): AutotelEventContext | undefined {\n  const eventsConfig = getEventsConfig();\n  const config = getConfig();\n\n  // Always generate a correlation_id\n  const correlationId = getOrCreateCorrelationId();\n\n  // Return minimal context if trace context is not enabled\n  if (!eventsConfig?.includeTraceContext) {\n    return {\n      correlation_id: correlationId,\n    };\n  }\n\n  // Build base context\n  const autotelContext: AutotelEventContext = {\n    correlation_id: correlationId,\n  };\n\n  // Add trace context if inside a span\n  const spanContext = span?.spanContext();\n  if (spanContext) {\n    autotelContext.trace_id = spanContext.traceId;\n    autotelContext.span_id = spanContext.spanId;\n\n    // Trace flags as 2-char hex string (canonical format)\n    autotelContext.trace_flags = spanContext.traceFlags\n      .toString(16)\n      .padStart(2, '0');\n\n    // Tracestate if present\n    // Defensive: serialize() is standard OTel API but may be missing in some runtimes\n    const traceState = spanContext.traceState;\n    if (traceState) {\n      try {\n        if (typeof traceState.serialize === 'function') {\n          const traceStateStr = traceState.serialize();\n          if (traceStateStr) {\n            autotelContext.trace_state = traceStateStr;\n          }\n        }\n      } catch {\n        // Silently ignore serialization errors\n      }\n    }\n\n    // Generate trace URL if configured\n    if (eventsConfig.traceUrl && config) {\n      const traceUrl = eventsConfig.traceUrl({\n        traceId: spanContext.traceId,\n        spanId: spanContext.spanId,\n        correlationId,\n        serviceName: config.service,\n        environment: config.environment,\n      });\n      if (traceUrl) {\n        autotelContext.trace_url = traceUrl;\n      }\n    }\n  } else {\n    // Outside span but may still have trace URL generator\n    if (eventsConfig.traceUrl && config) {\n      const traceUrl = eventsConfig.traceUrl({\n        correlationId,\n        serviceName: config.service,\n        environment: config.environment,\n      });\n      if (traceUrl) {\n        autotelContext.trace_url = traceUrl;\n      }\n    }\n  }\n\n  return autotelContext;\n}\n\n/**\n * Initialize events queue lazily\n */\nfunction getOrCreateQueue(): EventQueue | null {\n  if (!isInitialized()) {\n    warnIfNotInitialized('track()');\n    return null;\n  }\n\n  if (!eventsQueue) {\n    const config = getConfig();\n    if (!config?.subscribers || config.subscribers.length === 0) {\n      // No subscribers configured - no-op\n      return null;\n    }\n\n    eventsQueue = new EventQueue(config.subscribers);\n  }\n\n  return eventsQueue;\n}\n\n/**\n * Track a business events event\n *\n * Features:\n * - Auto-attaches traceId and spanId if in active span\n * - Batched sending with retry\n * - Type-safe with optional generic\n * - No-op if init() not called or no subscribers configured\n *\n * @example Basic usage\n * ```typescript\n * track('user.signup', { userId: '123', plan: 'pro' })\n * ```\n *\n * @example With type safety\n * ```typescript\n * interface EventDatas {\n *   'user.signup': { userId: string; plan: string }\n *   'plan.upgraded': { userId: string; revenue: number }\n * }\n *\n * track<EventDatas>('user.signup', { userId: '123', plan: 'pro' })\n * ```\n *\n * @example Trace correlation (automatic)\n * ```typescript\n * @Instrumented()\n * class UserService {\n *   async createUser(data: CreateUserData) {\n *     // This track call automatically includes traceId + spanId\n *     track('user.signup', { userId: data.id })\n *   }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function track<Events extends Record<string, any> = Record<string, any>>(\n  event: keyof Events & string,\n  data?: Events[typeof event],\n): void {\n  const queue = getOrCreateQueue();\n  if (!queue) return; // No-op if not initialized or no subscribers\n\n  // Validate and sanitize input (with custom config if provided)\n  const validationConfig = getValidationConfig();\n  const validated = validateEvent(event, data, validationConfig || undefined);\n\n  // Auto-attach trace context if available (free win!)\n  const span = trace.getActiveSpan();\n  const enrichedData = span\n    ? {\n        ...validated.attributes,\n        traceId: span.spanContext().traceId,\n        spanId: span.spanContext().spanId,\n      }\n    : validated.attributes;\n\n  // Build autotel context (same as Event class)\n  const autotelContext = buildAutotelContext(span);\n\n  queue.enqueue({\n    name: validated.eventName,\n    attributes: enrichedData,\n    timestamp: Date.now(),\n    autotel: autotelContext,\n  });\n}\n\n/**\n * Get events queue (for flush/shutdown)\n * @internal\n */\nexport function getEventQueue(): EventQueue | null {\n  return eventsQueue;\n}\n\n/**\n * Reset events queue (for shutdown/cleanup)\n * @internal\n */\nexport function resetEventQueue(): void {\n  eventsQueue = null;\n}\n","/**\n * Trace context types and utilities\n */\n\nimport type {\n  Span,\n  SpanStatusCode,\n  BaggageEntry,\n  Context,\n  Link,\n} from '@opentelemetry/api';\nimport { context, propagation } from '@opentelemetry/api';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { recordStructuredError } from './structured-error';\nimport { track } from './track';\n\ntype AsyncLocalBox<T> = {\n  value: T;\n};\n\n/**\n * AsyncLocalStorage for storing the active context with baggage\n * This allows setters to update the context and have it persist\n */\nconst contextStorage = new AsyncLocalStorage<AsyncLocalBox<Context>>();\n\n/**\n * Get the context storage instance (for initialization in functional.ts)\n */\nexport function getContextStorage(): AsyncLocalStorage<AsyncLocalBox<Context>> {\n  return contextStorage;\n}\n\n/**\n * Get the active context, checking our stored context first\n * This ensures baggage setters work with OpenTelemetry's propagation\n */\nexport function getActiveContextWithBaggage(): Context {\n  // Check stored context first (from setters), then fall back to active context\n  // This ensures ctx.setBaggage() changes are visible to OpenTelemetry operations\n  const stored = contextStorage.getStore()?.value;\n  return stored ?? context.active();\n}\n\n/**\n * Set a value in AsyncLocalStorage, preferring enterWith() when available\n * (Node.js) and falling back to run() for environments that only support\n * run() (e.g. Cloudflare Workers).\n *\n * On runtimes without enterWith() we mutate the existing run() scope when one\n * exists. This is what allows baggage/correlation updates to remain visible\n * for the rest of the traced callback in Workers.\n */\nexport function enterOrRun<T>(\n  storage: AsyncLocalStorage<AsyncLocalBox<T>>,\n  value: T,\n): void {\n  const existingStore = storage.getStore();\n  if (existingStore) {\n    existingStore.value = value;\n    return;\n  }\n\n  const boxedValue = { value };\n  try {\n    storage.enterWith(boxedValue);\n  } catch {\n    // Cloudflare Workers define enterWith but throw at runtime\n    storage.run(boxedValue, () => {});\n  }\n}\n\n/**\n * Try to keep OpenTelemetry's context manager in sync with baggage updates\n */\ntype ContextManagerLike = {\n  with?: (ctx: Context, fn: () => void) => void;\n  _asyncLocalStorage?: { enterWith?: (ctx: Context) => void };\n};\n\nfunction updateActiveContext(newContext: Context): void {\n  // Update our storage first so any helper reads see the new context\n  enterOrRun(contextStorage, newContext);\n\n  const contextWithManager = context as unknown as {\n    _getContextManager?: () => ContextManagerLike;\n  };\n\n  const manager = contextWithManager._getContextManager?.();\n  if (!manager) return;\n\n  const asyncLocal =\n    (manager as { _asyncLocalStorage?: { enterWith?: (ctx: Context) => void } })\n      ._asyncLocalStorage ?? undefined;\n  if (asyncLocal?.enterWith) {\n    asyncLocal.enterWith(newContext);\n    return;\n  }\n\n  if (typeof manager.with === 'function') {\n    manager.with(newContext, () => {});\n  }\n}\n\n/**\n * Base trace context containing trace identifiers\n */\nexport interface TraceContextBase {\n  traceId: string;\n  spanId: string;\n  correlationId: string;\n}\n\n/**\n * Attribute value types following OpenTelemetry specification.\n * Supports primitive values and arrays of homogeneous primitives.\n */\nexport type AttributeValue =\n  | string\n  | number\n  | boolean\n  | string[]\n  | number[]\n  | boolean[];\n\n/**\n * Span methods available on trace context\n */\nexport interface SpanMethods {\n  /** Set a single attribute on the span */\n  setAttribute(key: string, value: AttributeValue): void;\n  /** Set multiple attributes on the span */\n  setAttributes(attrs: Record<string, AttributeValue>): void;\n  /** Set the status of the span */\n  setStatus(status: { code: SpanStatusCode; message?: string }): void;\n  /** Add a link to another span */\n  addLink(link: Link): void;\n  /** Add multiple links to other spans */\n  addLinks(links: Link[]): void;\n  /** Update the span name dynamically */\n  updateName(name: string): void;\n  /** Check if the span is recording */\n  isRecording(): boolean;\n  /**\n   * Record an error on the span: sets ERROR status, structured `error.*`\n   * attributes (including `why`/`fix`/`link` from `createStructuredError`),\n   * and during the OTel Span Event API back-compat window also records the\n   * exception via the legacy span event API.\n   *\n   * Replaces the deprecated `recordException` (OTEP 4430). Accepts `unknown`\n   * so it can be called directly with the value caught from a `catch` block.\n   */\n  recordError(error: unknown): void;\n  /**\n   * Emit a tracked event correlated to this span. Equivalent to the standalone\n   * `track(event, data)` but reads naturally on `ctx`. Replaces the deprecated\n   * `ctx.addEvent` (OTEP 4430) — events become correlated logs rather than\n   * span events.\n   */\n  track<Events extends Record<string, unknown> = Record<string, unknown>>(\n    event: keyof Events & string,\n    data?: Events[keyof Events & string],\n  ): void;\n}\n\n/**\n * Baggage methods available on trace context\n *\n * @template TBaggage - Optional type for typed baggage (defaults to undefined for untyped)\n */\nexport interface BaggageMethods<\n  TBaggage extends Record<string, unknown> | undefined = undefined,\n> {\n  /**\n   * Get a baggage entry by key\n   * @param key - Baggage key\n   * @returns Baggage entry value or undefined\n   */\n  getBaggage(key: string): string | undefined;\n\n  /**\n   * Set a baggage entry\n   *\n   * Note: OpenTelemetry contexts are immutable. For proper scoping across async\n   * boundaries, use withBaggage() instead. This method updates baggage in the\n   * current context which may not propagate to all child operations.\n   *\n   * @param key - Baggage key\n   * @param value - Baggage value\n   * @returns The baggage value that was set (for chaining)\n   *\n   * @example Using withBaggage() (recommended)\n   * ```typescript\n   * await withBaggage({ baggage: { 'key': 'value' }, fn: async () => {\n   *   // Baggage is available here and in child spans\n   * });\n   * ```\n   */\n  setBaggage(key: string, value: string): string;\n\n  /**\n   * Delete a baggage entry\n   *\n   * Note: OpenTelemetry contexts are immutable. For proper scoping across async\n   * boundaries, use withBaggage() with only the entries you want instead.\n   *\n   * @param key - Baggage key\n   */\n  deleteBaggage(key: string): void;\n\n  /**\n   * Get all baggage entries\n   * @returns Map of all baggage entries\n   */\n  getAllBaggage(): Map<string, BaggageEntry>;\n\n  /**\n   * Get typed baggage (only available when TBaggage is defined)\n   * This is used internally by defineBaggageSchema()\n   *\n   * @internal\n   */\n  getTypedBaggage?: TBaggage extends Record<string, unknown>\n    ? <T extends TBaggage>(namespace?: string) => Partial<T> | undefined\n    : never;\n\n  /**\n   * Set typed baggage (only available when TBaggage is defined)\n   * This is used internally by defineBaggageSchema()\n   *\n   * @internal\n   */\n  setTypedBaggage?: TBaggage extends Record<string, unknown>\n    ? <T extends TBaggage>(\n        namespace: string | undefined,\n        value: Partial<T>,\n      ) => void\n    : never;\n}\n\n/**\n * Complete trace context that merges base context, span methods, and baggage methods\n *\n * This is the ctx parameter passed to factory functions in trace().\n * It provides access to trace IDs, span manipulation methods, and baggage operations.\n *\n * @template TBaggage - Optional type for typed baggage support\n *\n * @example Untyped (default)\n * ```typescript\n * export const handler = trace((ctx) => async () => {\n *   ctx.getBaggage('key'); // returns string | undefined\n * });\n * ```\n *\n * @example Typed baggage\n * ```typescript\n * type TenantBaggage = { tenantId: string; region?: string };\n *\n * export const handler = trace<TenantBaggage>((ctx) => async () => {\n *   // Use typed schema helper for type-safe access\n *   const schema = defineBaggageSchema<TenantBaggage>('tenant');\n *   const tenant = schema.get(ctx); // Partial<TenantBaggage> | undefined\n * });\n * ```\n */\nexport type TraceContext<\n  TBaggage extends Record<string, unknown> | undefined = undefined,\n> = TraceContextBase & SpanMethods & BaggageMethods<TBaggage>;\n\n/**\n * Create a TraceContext from an OpenTelemetry Span\n *\n * This utility extracts trace context information from a span\n * and provides span manipulation methods and baggage operations in a consistent format.\n *\n * Note: Baggage methods always operate on the currently active context,\n * which may differ from the context when createTraceContext was called.\n */\nexport function createTraceContext<\n  TBaggage extends Record<string, unknown> | undefined = undefined,\n>(span: Span): TraceContext<TBaggage> {\n  const spanContext = span.spanContext();\n\n  // Store the current active context in AsyncLocalStorage so baggage setters can update it\n  // This ensures ctx.setBaggage() changes persist and are visible to OpenTelemetry operations\n  // IMPORTANT: Only initialize if not already set (preserve baggage updates from parent spans)\n  const existingStored = contextStorage.getStore()?.value;\n  if (!existingStored) {\n    const activeContext = context.active();\n    enterOrRun(contextStorage, activeContext);\n  }\n\n  // Baggage helpers that always use the current active context\n  // This ensures baggage operations work correctly even if context changes\n  const baggageHelpers: BaggageMethods<TBaggage> = {\n    getBaggage(key: string): string | undefined {\n      // Check active context first (from withBaggage, context.with, etc.)\n      // Then check stored context (from setters)\n      // This ensures both withBaggage() and ctx.setBaggage() work correctly\n      const activeCtx = context.active();\n      let baggage = propagation.getBaggage(activeCtx);\n      if (!baggage) {\n        const storedContext = contextStorage.getStore()?.value;\n        if (storedContext) {\n          baggage = propagation.getBaggage(storedContext);\n        }\n      }\n      return baggage?.getEntry(key)?.value;\n    },\n\n    setBaggage(key: string, value: string): string {\n      // OpenTelemetry contexts are immutable, so we create a new context with updated baggage\n      // Check active context first (may have baggage from withBaggage), then stored context\n      const activeCtx = context.active();\n      const storedContext = contextStorage.getStore()?.value;\n      const currentContext = storedContext ?? activeCtx;\n      const baggage =\n        propagation.getBaggage(currentContext) ?? propagation.createBaggage();\n      const updated = baggage.setEntry(key, { value });\n      const newContext = propagation.setBaggage(currentContext, updated);\n\n      updateActiveContext(newContext);\n\n      return value;\n    },\n\n    deleteBaggage(key: string): void {\n      // Check active context first, then stored context\n      const activeCtx = context.active();\n      const storedContext = contextStorage.getStore()?.value;\n      const currentContext = storedContext ?? activeCtx;\n      const baggage = propagation.getBaggage(currentContext);\n      if (baggage) {\n        const updated = baggage.removeEntry(key);\n        const newContext = propagation.setBaggage(currentContext, updated);\n\n        updateActiveContext(newContext);\n      }\n    },\n\n    getAllBaggage(): Map<string, BaggageEntry> {\n      // Check active context first, then stored context\n      const activeCtx = context.active();\n      let baggage = propagation.getBaggage(activeCtx);\n      if (!baggage) {\n        const storedContext = contextStorage.getStore()?.value;\n        if (storedContext) {\n          baggage = propagation.getBaggage(storedContext);\n        }\n      }\n      if (!baggage) {\n        return new Map();\n      }\n\n      // Convert baggage entries to a Map\n      const entries = new Map<string, BaggageEntry>();\n      for (const [key, entry] of baggage.getAllEntries()) {\n        entries.set(key, entry);\n      }\n      return entries;\n    },\n\n    // Typed baggage helpers (used by defineBaggageSchema)\n    getTypedBaggage: (<T extends Record<string, unknown>>(\n      namespace?: string,\n    ) => {\n      // Check active context first, then stored context\n      const activeCtx = context.active();\n      let baggage = propagation.getBaggage(activeCtx);\n      if (!baggage) {\n        const storedContext = contextStorage.getStore()?.value;\n        if (storedContext) {\n          baggage = propagation.getBaggage(storedContext);\n        }\n      }\n      if (!baggage) return;\n\n      const prefix = namespace ? `${namespace}.` : '';\n      const result: Record<string, unknown> = {};\n\n      for (const [key, entry] of baggage.getAllEntries()) {\n        if (namespace && key.startsWith(prefix)) {\n          const fieldName = key.slice(prefix.length);\n          result[fieldName] = entry.value;\n        } else if (!namespace) {\n          result[key] = entry.value;\n        }\n      }\n\n      return Object.keys(result).length > 0\n        ? (result as Partial<T>)\n        : undefined;\n    }) as TBaggage extends Record<string, unknown>\n      ? <T extends TBaggage>(namespace?: string) => Partial<T> | undefined\n      : never,\n\n    setTypedBaggage: (<T extends Record<string, unknown>>(\n      namespace: string | undefined,\n      value: Partial<T>,\n    ) => {\n      // Check active context first, then stored context\n      const activeCtx = context.active();\n      const storedContext = contextStorage.getStore()?.value;\n      const currentContext = storedContext ?? activeCtx;\n      let baggage =\n        propagation.getBaggage(currentContext) ?? propagation.createBaggage();\n\n      const prefix = namespace ? `${namespace}.` : '';\n      for (const [key, val] of Object.entries(value)) {\n        if (val !== undefined) {\n          const baggageKey = `${prefix}${key}`;\n          baggage = baggage.setEntry(baggageKey, { value: String(val) });\n        }\n      }\n\n      const newContext = propagation.setBaggage(currentContext, baggage);\n      updateActiveContext(newContext);\n    }) as TBaggage extends Record<string, unknown>\n      ? <T extends TBaggage>(\n          namespace: string | undefined,\n          value: Partial<T>,\n        ) => void\n      : never,\n  };\n\n  // `recordException` and `addEvent` are intentionally bound at runtime but\n  // omitted from the `SpanMethods` type. They exist solely so existing call\n  // sites keep working through the OTel Span Event API deprecation window\n  // (see MIGRATION.md). New code MUST go through `recordStructuredError`,\n  // `emitCorrelatedEvent`, or the request logger. The cast below is what hides\n  // these compatibility-only fields from the public type.\n  const traceCtx = {\n    traceId: spanContext.traceId,\n    spanId: spanContext.spanId,\n    correlationId: spanContext.traceId.slice(0, 16),\n    setAttribute: span.setAttribute.bind(span),\n    setAttributes: span.setAttributes.bind(span),\n    setStatus: span.setStatus.bind(span),\n    recordException: span.recordException.bind(span),\n    addEvent: span.addEvent.bind(span),\n    addLink: span.addLink.bind(span),\n    addLinks: span.addLinks.bind(span),\n    updateName: span.updateName.bind(span),\n    isRecording: span.isRecording.bind(span),\n    recordError: (error: unknown) => {\n      const err = error instanceof Error ? error : new Error(String(error));\n      recordStructuredError(traceCtx, err);\n    },\n    track: (event: string, data?: Record<string, unknown>) => {\n      track(event, data);\n    },\n    ...baggageHelpers,\n  } as unknown as TraceContext<TBaggage>;\n\n  return traceCtx;\n}\n\n/**\n * Define a typed baggage schema for type-safe baggage operations\n *\n * This helper provides a type-safe API for working with baggage entries.\n * The namespace parameter is optional and prefixes all keys to avoid collisions.\n *\n * @template T - The baggage schema type (all fields are treated as optional)\n * @param namespace - Optional namespace to prefix baggage keys\n *\n * @example Basic usage\n * ```typescript\n * type TenantBaggage = { tenantId: string; region?: string };\n * const tenantBaggage = defineBaggageSchema<TenantBaggage>('tenant');\n *\n * export const handler = trace<TenantBaggage>((ctx) => async () => {\n *   // Get typed baggage\n *   const tenant = tenantBaggage.get(ctx);\n *   if (tenant?.tenantId) {\n *     console.log('Tenant:', tenant.tenantId);\n *   }\n *\n *   // Set typed baggage\n *   tenantBaggage.set(ctx, { tenantId: 't1', region: 'us-east-1' });\n * });\n * ```\n *\n * @example With withBaggage helper\n * ```typescript\n * const tenantBaggage = defineBaggageSchema<TenantBaggage>('tenant');\n *\n * export const handler = trace<TenantBaggage>((ctx) => async () => {\n *   return await tenantBaggage.with(ctx, { tenantId: 't1' }, async () => {\n *     // Baggage is available here and in child spans\n *     const tenant = tenantBaggage.get(ctx);\n *   });\n * });\n * ```\n */\nexport function defineBaggageSchema<T extends Record<string, unknown>>(\n  namespace?: string,\n) {\n  return {\n    /**\n     * Get typed baggage from context\n     * @param ctx - Trace context\n     * @returns Partial baggage object or undefined if no baggage is set\n     */\n    get: (ctx: TraceContext<T>): Partial<T> | undefined => {\n      if (!ctx.getTypedBaggage) return undefined;\n      return ctx.getTypedBaggage<T>(namespace);\n    },\n\n    /**\n     * Set typed baggage in context\n     *\n     * Note: For proper scoping across async boundaries, use the `with` method instead\n     *\n     * @param ctx - Trace context\n     * @param value - Partial baggage object to set\n     */\n    set: (ctx: TraceContext<T>, value: Partial<T>): void => {\n      if (!ctx.setTypedBaggage) return;\n      ctx.setTypedBaggage<T>(namespace, value);\n    },\n\n    /**\n     * Run a function with typed baggage properly scoped\n     *\n     * This is the recommended way to set baggage as it ensures proper\n     * scoping across async boundaries.\n     *\n     * @param ctx - Trace context (can be omitted, will use active context)\n     * @param value - Partial baggage object to set\n     * @param fn - Function to execute with the baggage\n     */\n    with: <R>(\n      ctxOrValue: TraceContext<T> | Partial<T>,\n      valueOrFn: Partial<T> | (() => R | Promise<R>),\n      maybeFn?: () => R | Promise<R>,\n    ): R | Promise<R> => {\n      // Support both with(ctx, value, fn) and with(value, fn)\n      const value = maybeFn\n        ? (valueOrFn as Partial<T>)\n        : (ctxOrValue as Partial<T>);\n      const fn = maybeFn || (valueOrFn as () => R | Promise<R>);\n\n      // Serialize typed baggage to flat key-value pairs\n      const prefix = namespace ? `${namespace}.` : '';\n      const flatBaggage: Record<string, string> = {};\n      for (const [key, val] of Object.entries(value)) {\n        if (val !== undefined) {\n          flatBaggage[`${prefix}${key}`] = String(val);\n        }\n      }\n\n      // Use the existing withBaggage helper\n      const currentContext = context.active();\n      let baggage =\n        propagation.getBaggage(currentContext) ?? propagation.createBaggage();\n\n      for (const [key, val] of Object.entries(flatBaggage)) {\n        baggage = baggage.setEntry(key, { value: val });\n      }\n\n      const newContext = propagation.setBaggage(currentContext, baggage);\n      return context.with(newContext, fn);\n    },\n  };\n}\n","/**\n * Correlation ID utilities for event-driven observability\n *\n * Provides a stable join key across events, logs, and spans even when traces fragment.\n * Format: 16 hex chars (64 bits), crypto-random, URL-safe.\n *\n * Lifecycle:\n * 1. Generated at boundary root (HTTP server span, message process span, cron job span)\n * 2. Reused within context (nested work shares it via AsyncLocalStorage)\n * 3. Propagated via baggage (optional, default OFF to avoid header bloat)\n *\n * @example Basic usage\n * ```typescript\n * import { generateCorrelationId, getCorrelationId } from 'autotel/correlation-id';\n *\n * // Generate a new correlation ID\n * const id = generateCorrelationId();\n * // Returns: 'a1b2c3d4e5f67890'\n *\n * // Get current correlation ID from context\n * const currentId = getCorrelationId();\n * ```\n */\n\nimport { trace, propagation, context } from '@opentelemetry/api';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { enterOrRun } from './trace-context';\n\ntype CorrelationStore = {\n  value: string;\n};\n\n/**\n * AsyncLocalStorage for storing correlation ID\n * This allows correlation IDs to persist across async boundaries\n */\nconst correlationStorage = new AsyncLocalStorage<CorrelationStore>();\n\n/**\n * Baggage key for correlation ID propagation\n */\nexport const CORRELATION_ID_BAGGAGE_KEY = 'autotel.correlation_id';\n\n/**\n * Generate a new correlation ID\n *\n * Format: 16 hex chars (64 bits), crypto-random, URL-safe\n *\n * @returns A new correlation ID\n *\n * @example\n * ```typescript\n * const id = generateCorrelationId();\n * // Returns: 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateCorrelationId(): string {\n  // Use crypto.getRandomValues for secure random bytes\n  const bytes = new Uint8Array(8); // 64 bits\n  crypto.getRandomValues(bytes);\n\n  // Convert to hex string\n  return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Get the current correlation ID from context\n *\n * Resolution order:\n * 1. AsyncLocalStorage (from explicit setCorrelationId or runWithCorrelationId)\n * 2. Baggage (if propagated from upstream)\n * 3. Active span's trace ID (first 16 chars as fallback)\n * 4. undefined (if not in any context)\n *\n * @returns Current correlation ID or undefined\n *\n * @example\n * ```typescript\n * const id = getCorrelationId();\n * if (id) {\n *   console.log('Correlation ID:', id);\n * }\n * ```\n */\nexport function getCorrelationId(): string | undefined {\n  // 1. Check AsyncLocalStorage first (explicit correlation ID)\n  const storedId = correlationStorage.getStore()?.value;\n  if (storedId) {\n    return storedId;\n  }\n\n  // 2. Check baggage (propagated from upstream)\n  const activeContext = context.active();\n  const baggage = propagation.getBaggage(activeContext);\n  const baggageEntry = baggage?.getEntry(CORRELATION_ID_BAGGAGE_KEY);\n  if (baggageEntry?.value) {\n    return baggageEntry.value;\n  }\n\n  // 3. Fall back to active span's trace ID (first 16 chars)\n  const span = trace.getActiveSpan();\n  if (span) {\n    const spanContext = span.spanContext();\n    return spanContext.traceId.slice(0, 16);\n  }\n\n  // 4. No context available\n  return undefined;\n}\n\n/**\n * Get or create a correlation ID\n *\n * If a correlation ID exists in the current context, returns it.\n * Otherwise, generates a new one.\n *\n * @returns Existing or new correlation ID\n *\n * @example\n * ```typescript\n * const id = getOrCreateCorrelationId();\n * // Always returns a valid correlation ID\n * ```\n */\nexport function getOrCreateCorrelationId(): string {\n  return getCorrelationId() ?? generateCorrelationId();\n}\n\n/**\n * Run a function with a specific correlation ID in context\n *\n * The correlation ID will be available via getCorrelationId() throughout\n * the execution of the function and any async operations it spawns.\n *\n * @param correlationId - Correlation ID to use\n * @param fn - Function to execute\n * @returns The return value of the function\n *\n * @example\n * ```typescript\n * await runWithCorrelationId('abc123', async () => {\n *   // getCorrelationId() returns 'abc123' here\n *   await processRequest();\n * });\n * ```\n */\nexport function runWithCorrelationId<T>(correlationId: string, fn: () => T): T {\n  return correlationStorage.run({ value: correlationId }, fn);\n}\n\n/**\n * Set correlation ID in the current context (mutates context)\n *\n * Note: This updates the AsyncLocalStorage context. For proper scoping\n * across async boundaries, prefer runWithCorrelationId() instead.\n *\n * @param correlationId - Correlation ID to set\n *\n * @example\n * ```typescript\n * setCorrelationId('abc123');\n * // Now getCorrelationId() returns 'abc123'\n * ```\n */\nexport function setCorrelationId(correlationId: string): void {\n  enterOrRun(correlationStorage, correlationId);\n}\n\n/**\n * Set correlation ID in baggage for propagation\n *\n * This adds the correlation ID to the W3C baggage header, allowing it\n * to be propagated to downstream services.\n *\n * Note: Only use this when you explicitly want cross-service propagation.\n * Default is OFF to avoid header bloat.\n *\n * @param correlationId - Correlation ID to propagate\n * @returns New context with baggage set\n *\n * @example\n * ```typescript\n * const newContext = setCorrelationIdInBaggage('abc123');\n * context.with(newContext, () => {\n *   // Baggage will be propagated in outgoing requests\n * });\n * ```\n */\nexport function setCorrelationIdInBaggage(\n  correlationId: string,\n): import('@opentelemetry/api').Context {\n  const activeContext = context.active();\n  let baggage =\n    propagation.getBaggage(activeContext) ?? propagation.createBaggage();\n  baggage = baggage.setEntry(CORRELATION_ID_BAGGAGE_KEY, {\n    value: correlationId,\n  });\n  return propagation.setBaggage(activeContext, baggage);\n}\n\n/**\n * Get the correlation storage instance (for internal use in init/shutdown)\n */\nexport function getCorrelationStorage(): AsyncLocalStorage<CorrelationStore> {\n  return correlationStorage;\n}\n"]}