{"version":3,"file":"satori.mjs","sources":["../src/bus/rateLimiter.ts","../src/core/utils/deepEqual.ts","../src/bus/deduplicator.ts","../src/bus/circuitBreaker.ts","../src/core/metrics.ts","../src/core/config.ts","../src/bus/eventBus.ts","../src/core/utils/ids.ts","../src/core/utils/time.ts","../src/core/utils/stacktrace.ts","../src/enrich/env.ts","../src/enrich/stateSnapshot.ts","../src/enrich/causal.ts","../src/enrich/enrichEvent.ts","../src/watch/watcherEngine.ts","../src/logger/createLogger.ts","../src/core/validation.ts","../src/persistence/adapters.ts","../src/logger/createSatori.ts","../src/overlay/filters.ts","../src/overlay/state.ts","../src/overlay/bridge.ts","../src/bus/middleware.ts"],"sourcesContent":["/**\n * Rate Limiter implementation\n * Protects against log spam and high-volume scenarios\n */\n\nimport type { LogEntry, RateLimitConfig } from \"../core/types.js\";\n\nexport class RateLimiter {\n  private eventTimestamps: number[] = [];\n  private buffer: LogEntry[] = [];\n  private droppedCount = 0;\n  private sampledCount = 0;\n\n  constructor(private config: RateLimitConfig) {}\n\n  /**\n   * Check if an event should be allowed through\n   * Returns: { allowed: boolean, sampled?: boolean }\n   */\n  shouldAllow(entry: LogEntry): { allowed: boolean; sampled: boolean } {\n    if (!this.config.enabled) {\n      return { allowed: true, sampled: false };\n    }\n\n    const now = Date.now();\n\n    // Clean old timestamps (older than 1 second)\n    this.eventTimestamps = this.eventTimestamps.filter((ts) => now - ts < 1000);\n\n    const currentRate = this.eventTimestamps.length;\n\n    if (currentRate < this.config.maxEventsPerSecond) {\n      // Under the limit, allow through\n      this.eventTimestamps.push(now);\n      return { allowed: true, sampled: false };\n    }\n\n    // Over the limit, apply strategy\n    switch (this.config.strategy) {\n      case \"drop\":\n        this.droppedCount++;\n        return { allowed: false, sampled: false };\n\n      case \"sample\":\n        if (Math.random() < this.config.samplingRate) {\n          this.eventTimestamps.push(now);\n          this.sampledCount++;\n          return { allowed: true, sampled: true };\n        }\n        this.droppedCount++;\n        return { allowed: false, sampled: false };\n\n      case \"buffer\":\n        if (this.buffer.length < (this.config.bufferSize || 100)) {\n          this.buffer.push(entry);\n        } else {\n          this.droppedCount++;\n        }\n        return { allowed: false, sampled: false };\n\n      default:\n        return { allowed: true, sampled: false };\n    }\n  }\n\n  /**\n   * Get buffered events and clear the buffer\n   */\n  flushBuffer(): LogEntry[] {\n    const entries = [...this.buffer];\n    this.buffer = [];\n    return entries;\n  }\n\n  /**\n   * Get current rate (events per second)\n   */\n  getCurrentRate(): number {\n    const now = Date.now();\n    this.eventTimestamps = this.eventTimestamps.filter((ts) => now - ts < 1000);\n    return this.eventTimestamps.length;\n  }\n\n  /**\n   * Get statistics\n   */\n  getStats(): {\n    dropped: number;\n    sampled: number;\n    buffered: number;\n    currentRate: number;\n  } {\n    return {\n      dropped: this.droppedCount,\n      sampled: this.sampledCount,\n      buffered: this.buffer.length,\n      currentRate: this.getCurrentRate(),\n    };\n  }\n\n  /**\n   * Reset statistics\n   */\n  reset(): void {\n    this.eventTimestamps = [];\n    this.buffer = [];\n    this.droppedCount = 0;\n    this.sampledCount = 0;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<RateLimitConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n}\n","/**\n * Deep equality comparison utility\n * Compares two values for structural equality, handling:\n * - Primitives (including NaN)\n * - Objects and nested objects\n * - Arrays (including sparse arrays and arrays with extra properties)\n * - Date and RegExp objects\n * - Map and Set collections\n * - Circular references (detected and handled safely)\n */\n\nexport function deepEqual(\n  a: unknown,\n  b: unknown,\n  seen = new WeakMap<object, object>(),\n): boolean {\n  // Identical references or primitive values\n  if (a === b) return true;\n\n  // Handle NaN (NaN !== NaN in JavaScript)\n  if (typeof a === \"number\" && typeof b === \"number\") {\n    if (Number.isNaN(a) && Number.isNaN(b)) return true;\n    return a === b;\n  }\n\n  // Handle null/undefined\n  if (a === null || b === null) return a === b;\n  if (a === undefined || b === undefined) return a === b;\n\n  // Different types\n  if (typeof a !== typeof b) return false;\n\n  // Handle non-object types (already compared above for primitives)\n  if (typeof a !== \"object\") return false;\n\n  // Both are objects from here - check for circular references\n  const aObj = a as object;\n  const bObj = b as object;\n\n  if (seen.has(aObj)) {\n    return seen.get(aObj) === bObj;\n  }\n  seen.set(aObj, bObj);\n\n  // Handle Date objects\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() === b.getTime();\n  }\n  if (a instanceof Date || b instanceof Date) return false;\n\n  // Handle RegExp\n  if (a instanceof RegExp && b instanceof RegExp) {\n    return a.source === b.source && a.flags === b.flags;\n  }\n  if (a instanceof RegExp || b instanceof RegExp) return false;\n\n  // Handle Map\n  if (a instanceof Map && b instanceof Map) {\n    if (a.size !== b.size) return false;\n    for (const [key, value] of a) {\n      if (!b.has(key) || !deepEqual(value, b.get(key), seen)) return false;\n    }\n    return true;\n  }\n  if (a instanceof Map || b instanceof Map) return false;\n\n  // Handle Set\n  if (a instanceof Set && b instanceof Set) {\n    if (a.size !== b.size) return false;\n    // For sets, we need to check if all elements exist\n    const aArr = Array.from(a);\n    const bArr = Array.from(b);\n    for (const aVal of aArr) {\n      let found = false;\n      for (const bVal of bArr) {\n        if (deepEqual(aVal, bVal, seen)) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) return false;\n    }\n    return true;\n  }\n  if (a instanceof Set || b instanceof Set) return false;\n\n  // Handle arrays\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false;\n\n    // Check for sparse arrays - compare which indices exist\n    const aIndices = Object.keys(a)\n      .filter((k) => /^\\d+$/.test(k))\n      .map(Number);\n    const bIndices = Object.keys(b)\n      .filter((k) => /^\\d+$/.test(k))\n      .map(Number);\n\n    if (aIndices.length !== bIndices.length) return false;\n\n    // Compare sparse array indices\n    for (const idx of aIndices) {\n      if (!bIndices.includes(idx)) return false;\n    }\n\n    // Compare values at each index\n    for (let i = 0; i < a.length; i++) {\n      const aHas = Object.prototype.hasOwnProperty.call(a, i);\n      const bHas = Object.prototype.hasOwnProperty.call(b, i);\n      if (aHas !== bHas) return false;\n      if (aHas && !deepEqual(a[i], b[i], seen)) return false;\n    }\n\n    // Check for extra properties on arrays\n    const aKeys = Object.keys(a).filter((k) => !/^\\d+$/.test(k));\n    const bKeys = Object.keys(b).filter((k) => !/^\\d+$/.test(k));\n    if (aKeys.length !== bKeys.length) return false;\n\n    for (const key of aKeys) {\n      if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n      if (!deepEqual((a as any)[key], (b as any)[key], seen)) return false;\n    }\n\n    return true;\n  }\n\n  // One is array, one is not\n  if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n  // Handle plain objects\n  const aRecord = a as Record<string, unknown>;\n  const bRecord = b as Record<string, unknown>;\n\n  const aKeys = Object.keys(aRecord);\n  const bKeys = Object.keys(bRecord);\n\n  if (aKeys.length !== bKeys.length) return false;\n\n  for (const key of aKeys) {\n    if (!Object.prototype.hasOwnProperty.call(bRecord, key)) return false;\n    if (!deepEqual(aRecord[key], bRecord[key], seen)) return false;\n  }\n\n  return true;\n}\n\n/**\n * Deep clone utility\n * Creates a deep copy of a value, handling:\n * - Primitives\n * - Objects and nested objects\n * - Arrays (including sparse arrays)\n * - Date and RegExp objects\n * - Map and Set collections\n * - Circular references (detected and preserved)\n */\nexport function deepClone<T>(\n  value: T,\n  seen = new WeakMap<object, unknown>(),\n): T {\n  if (value === null || value === undefined) return value;\n\n  if (typeof value !== \"object\") return value;\n\n  // Check for circular reference\n  const objValue = value as object;\n  if (seen.has(objValue)) {\n    return seen.get(objValue) as T;\n  }\n\n  if (value instanceof Date) {\n    return new Date(value.getTime()) as unknown as T;\n  }\n\n  if (value instanceof RegExp) {\n    return new RegExp(value.source, value.flags) as unknown as T;\n  }\n\n  if (value instanceof Map) {\n    const cloned = new Map();\n    seen.set(objValue, cloned);\n    for (const [k, v] of value) {\n      cloned.set(deepClone(k, seen), deepClone(v, seen));\n    }\n    return cloned as unknown as T;\n  }\n\n  if (value instanceof Set) {\n    const cloned = new Set();\n    seen.set(objValue, cloned);\n    for (const v of value) {\n      cloned.add(deepClone(v, seen));\n    }\n    return cloned as unknown as T;\n  }\n\n  if (Array.isArray(value)) {\n    const cloned: unknown[] = [];\n    seen.set(objValue, cloned);\n\n    // Handle sparse arrays properly\n    for (let i = 0; i < value.length; i++) {\n      if (Object.prototype.hasOwnProperty.call(value, i)) {\n        cloned[i] = deepClone(value[i], seen);\n      }\n    }\n\n    // Copy non-index properties\n    for (const key of Object.keys(value)) {\n      if (!/^\\d+$/.test(key)) {\n        (cloned as any)[key] = deepClone((value as any)[key], seen);\n      }\n    }\n\n    return cloned as unknown as T;\n  }\n\n  const cloned: Record<string, unknown> = {};\n  seen.set(objValue, cloned);\n\n  for (const key of Object.keys(value)) {\n    cloned[key] = deepClone((value as Record<string, unknown>)[key], seen);\n  }\n\n  return cloned as T;\n}\n\n/**\n * Compute a hash for a value (for deduplication)\n * Handles circular references safely\n */\nexport function computeHash(\n  value: unknown,\n  seen = new WeakSet<object>(),\n): string {\n  if (value === null) return \"null\";\n  if (value === undefined) return \"undefined\";\n\n  if (typeof value === \"string\") return `s:${value}`;\n  if (typeof value === \"number\") {\n    if (Number.isNaN(value)) return \"n:NaN\";\n    return `n:${value}`;\n  }\n  if (typeof value === \"boolean\") return `b:${value}`;\n\n  if (typeof value !== \"object\") return String(value);\n\n  // Handle circular reference\n  if (seen.has(value as object)) {\n    return \"[Circular]\";\n  }\n  seen.add(value as object);\n\n  if (value instanceof Date) return `d:${value.getTime()}`;\n\n  if (value instanceof RegExp) return `r:${value.source}:${value.flags}`;\n\n  if (value instanceof Map) {\n    const entries = Array.from(value.entries())\n      .map(([k, v]) => `${computeHash(k, seen)}=>${computeHash(v, seen)}`)\n      .sort()\n      .join(\",\");\n    return `m:{${entries}}`;\n  }\n\n  if (value instanceof Set) {\n    const items = Array.from(value)\n      .map((v) => computeHash(v, seen))\n      .sort()\n      .join(\",\");\n    return `set:{${items}}`;\n  }\n\n  if (Array.isArray(value)) {\n    const items = value.map((v, i) => {\n      if (!Object.prototype.hasOwnProperty.call(value, i)) return \"<empty>\";\n      return computeHash(v, seen);\n    });\n    return `a:[${items.join(\",\")}]`;\n  }\n\n  const entries = Object.entries(value as Record<string, unknown>)\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([k, v]) => `${k}:${computeHash(v, seen)}`);\n  return `o:{${entries.join(\",\")}}`;\n}\n","/**\n * Event Deduplication implementation\n * Prevents duplicate events within a time window\n */\n\nimport type { LogEntry, DeduplicationConfig } from \"../core/types.js\";\nimport { computeHash } from \"../core/utils/deepEqual.js\";\n\ninterface DedupEntry {\n  hash: string;\n  timestamp: number;\n  count: number;\n}\n\nexport class Deduplicator {\n  private cache = new Map<string, DedupEntry>();\n  private deduplicatedCount = 0;\n\n  constructor(private config: DeduplicationConfig) {}\n\n  /**\n   * Compute a deduplication key for an entry based on configured fields\n   */\n  computeDedupKey(entry: LogEntry): string {\n    const parts: string[] = [];\n\n    for (const field of this.config.fields) {\n      switch (field) {\n        case \"message\":\n          parts.push(`m:${entry.message}`);\n          break;\n        case \"scope\":\n          parts.push(`s:${entry.scope}`);\n          break;\n        case \"level\":\n          parts.push(`l:${entry.level}`);\n          break;\n        case \"tags\":\n          parts.push(`t:${entry.tags.sort().join(\",\")}`);\n          break;\n        case \"state\":\n          if (entry.state) {\n            parts.push(`st:${computeHash(entry.state)}`);\n          }\n          break;\n      }\n    }\n\n    return parts.join(\"|\");\n  }\n\n  /**\n   * Check if an event is a duplicate\n   * Returns: { isDuplicate: boolean, originalId?: string, duplicateCount: number }\n   */\n  isDuplicate(entry: LogEntry): {\n    isDuplicate: boolean;\n    duplicateCount: number;\n  } {\n    if (!this.config.enabled) {\n      return { isDuplicate: false, duplicateCount: 0 };\n    }\n\n    const now = Date.now();\n    const dedupKey = this.computeDedupKey(entry);\n\n    // Clean expired entries\n    this.cleanExpired(now);\n\n    const existing = this.cache.get(dedupKey);\n\n    if (existing && now - existing.timestamp < this.config.windowMs) {\n      // It's a duplicate within the window\n      existing.count++;\n      this.deduplicatedCount++;\n      return { isDuplicate: true, duplicateCount: existing.count };\n    }\n\n    // Not a duplicate, add to cache\n    this.cache.set(dedupKey, {\n      hash: dedupKey,\n      timestamp: now,\n      count: 1,\n    });\n\n    // Enforce max cache size\n    if (this.cache.size > this.config.maxCacheSize) {\n      this.evictOldest();\n    }\n\n    return { isDuplicate: false, duplicateCount: 1 };\n  }\n\n  /**\n   * Clean expired entries from cache\n   */\n  private cleanExpired(now: number): void {\n    for (const [key, entry] of this.cache.entries()) {\n      if (now - entry.timestamp >= this.config.windowMs) {\n        this.cache.delete(key);\n      }\n    }\n  }\n\n  /**\n   * Evict oldest entries when cache is full\n   */\n  private evictOldest(): void {\n    let oldest: string | null = null;\n    let oldestTime = Infinity;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (entry.timestamp < oldestTime) {\n        oldestTime = entry.timestamp;\n        oldest = key;\n      }\n    }\n\n    if (oldest) {\n      this.cache.delete(oldest);\n    }\n  }\n\n  /**\n   * Get statistics\n   */\n  getStats(): { cacheSize: number; deduplicatedCount: number } {\n    return {\n      cacheSize: this.cache.size,\n      deduplicatedCount: this.deduplicatedCount,\n    };\n  }\n\n  /**\n   * Reset the deduplicator\n   */\n  reset(): void {\n    this.cache.clear();\n    this.deduplicatedCount = 0;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<DeduplicationConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n}\n","/**\n * Circuit Breaker implementation\n * Provides error recovery and protection for watchers and other components\n */\n\nimport type { CircuitBreakerConfig, CircuitState } from \"../core/types.js\";\n\nexport interface CircuitBreakerEvents {\n  onStateChange?: (state: CircuitState, previousState: CircuitState) => void;\n  onFailure?: (error: Error, failureCount: number) => void;\n  onSuccess?: (successCount: number) => void;\n  onOpen?: () => void;\n  onClose?: () => void;\n  onHalfOpen?: () => void;\n}\n\nexport class CircuitBreaker {\n  private state: CircuitState = \"closed\";\n  private failureCount = 0;\n  private successCount = 0;\n  private lastFailureTime = 0;\n  private totalFailures = 0;\n  private totalSuccesses = 0;\n\n  constructor(\n    private config: CircuitBreakerConfig,\n    private events: CircuitBreakerEvents = {},\n  ) {}\n\n  /**\n   * Execute a function with circuit breaker protection\n   */\n  async execute<T>(fn: () => T | Promise<T>): Promise<T> {\n    if (!this.config.enabled) {\n      return fn();\n    }\n\n    if (!this.canExecute()) {\n      throw new CircuitOpenError(\"Circuit breaker is open\");\n    }\n\n    try {\n      const result = await fn();\n      this.recordSuccess();\n      return result;\n    } catch (error) {\n      this.recordFailure(\n        error instanceof Error ? error : new Error(String(error)),\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Execute synchronously with circuit breaker protection\n   */\n  executeSync<T>(fn: () => T): T {\n    if (!this.config.enabled) {\n      return fn();\n    }\n\n    if (!this.canExecute()) {\n      throw new CircuitOpenError(\"Circuit breaker is open\");\n    }\n\n    try {\n      const result = fn();\n      this.recordSuccess();\n      return result;\n    } catch (error) {\n      this.recordFailure(\n        error instanceof Error ? error : new Error(String(error)),\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Check if execution is allowed\n   */\n  canExecute(): boolean {\n    if (this.state === \"closed\") {\n      return true;\n    }\n\n    if (this.state === \"open\") {\n      // Check if enough time has passed to try half-open\n      if (Date.now() - this.lastFailureTime >= this.config.resetTimeout) {\n        this.transitionTo(\"half-open\");\n        return true;\n      }\n      return false;\n    }\n\n    // Half-open: allow one request through\n    return true;\n  }\n\n  /**\n   * Record a successful execution\n   */\n  recordSuccess(): void {\n    this.totalSuccesses++;\n    this.events.onSuccess?.(this.successCount + 1);\n\n    if (this.state === \"half-open\") {\n      this.successCount++;\n      if (this.successCount >= this.config.successThreshold) {\n        this.transitionTo(\"closed\");\n      }\n    } else if (this.state === \"closed\") {\n      // Reset failure count on success in closed state\n      this.failureCount = 0;\n    }\n  }\n\n  /**\n   * Record a failed execution\n   */\n  recordFailure(error: Error): void {\n    this.totalFailures++;\n    this.failureCount++;\n    this.lastFailureTime = Date.now();\n    this.events.onFailure?.(error, this.failureCount);\n\n    if (this.state === \"half-open\") {\n      // Any failure in half-open goes back to open\n      this.transitionTo(\"open\");\n    } else if (this.state === \"closed\") {\n      if (this.failureCount >= this.config.failureThreshold) {\n        this.transitionTo(\"open\");\n      }\n    }\n  }\n\n  /**\n   * Transition to a new state\n   */\n  private transitionTo(newState: CircuitState): void {\n    const previousState = this.state;\n    this.state = newState;\n\n    // Reset counters on state change\n    if (newState === \"closed\") {\n      this.failureCount = 0;\n      this.successCount = 0;\n      this.events.onClose?.();\n    } else if (newState === \"open\") {\n      this.successCount = 0;\n      this.events.onOpen?.();\n    } else if (newState === \"half-open\") {\n      this.successCount = 0;\n      this.events.onHalfOpen?.();\n    }\n\n    this.events.onStateChange?.(newState, previousState);\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): CircuitState {\n    return this.state;\n  }\n\n  /**\n   * Get statistics\n   */\n  getStats(): {\n    state: CircuitState;\n    failureCount: number;\n    successCount: number;\n    totalFailures: number;\n    totalSuccesses: number;\n    lastFailureTime: number;\n  } {\n    return {\n      state: this.state,\n      failureCount: this.failureCount,\n      successCount: this.successCount,\n      totalFailures: this.totalFailures,\n      totalSuccesses: this.totalSuccesses,\n      lastFailureTime: this.lastFailureTime,\n    };\n  }\n\n  /**\n   * Manually reset the circuit breaker\n   */\n  reset(): void {\n    this.transitionTo(\"closed\");\n    this.failureCount = 0;\n    this.successCount = 0;\n    this.totalFailures = 0;\n    this.totalSuccesses = 0;\n    this.lastFailureTime = 0;\n  }\n\n  /**\n   * Force the circuit open (for testing/manual intervention)\n   */\n  forceOpen(): void {\n    this.transitionTo(\"open\");\n    this.lastFailureTime = Date.now();\n  }\n\n  /**\n   * Force the circuit closed (for testing/manual intervention)\n   */\n  forceClose(): void {\n    this.transitionTo(\"closed\");\n  }\n}\n\n/**\n * Error thrown when circuit is open\n */\nexport class CircuitOpenError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"CircuitOpenError\";\n  }\n}\n","/**\n * Self-Monitoring Metrics\n * Tracks internal metrics for the observability system itself\n */\n\nimport type { BusMetrics, SatoriMetrics, CircuitState } from \"../core/types.js\";\n\nexport interface MetricsSnapshot {\n  timestamp: number;\n  bus: BusMetrics;\n  loggerCount: number;\n  watcherCount: number;\n  circuitState?: CircuitState;\n  uptime: number;\n}\n\nexport class MetricsCollector {\n  private startTime: number;\n  private totalPublished = 0;\n  private totalDropped = 0;\n  private totalSampled = 0;\n  private totalDeduplicated = 0;\n  private recentEvents: number[] = [];\n  private loggerCount = 0;\n  private watcherCount = 0;\n  private subscriberCount = 0;\n  private bufferSize = 0;\n  private circuitState: CircuitState = \"closed\";\n\n  // For tracking events per second\n  private eventTimestamps: number[] = [];\n\n  // Historical snapshots for trending\n  private snapshots: MetricsSnapshot[] = [];\n  private maxSnapshots = 60; // Keep last 60 snapshots (e.g., 1 per second = 1 minute)\n\n  constructor() {\n    this.startTime = Date.now();\n  }\n\n  /**\n   * Record a published event\n   */\n  recordPublished(): void {\n    this.totalPublished++;\n    const now = Date.now();\n    this.eventTimestamps.push(now);\n\n    // Clean old timestamps (older than 1 second)\n    this.eventTimestamps = this.eventTimestamps.filter((ts) => now - ts < 1000);\n  }\n\n  /**\n   * Record a dropped event\n   */\n  recordDropped(): void {\n    this.totalDropped++;\n  }\n\n  /**\n   * Record a sampled event\n   */\n  recordSampled(): void {\n    this.totalSampled++;\n  }\n\n  /**\n   * Record a deduplicated event\n   */\n  recordDeduplicated(): void {\n    this.totalDeduplicated++;\n  }\n\n  /**\n   * Update logger count\n   */\n  setLoggerCount(count: number): void {\n    this.loggerCount = count;\n  }\n\n  /**\n   * Update watcher count\n   */\n  setWatcherCount(count: number): void {\n    this.watcherCount = count;\n  }\n\n  /**\n   * Update subscriber count\n   */\n  setSubscriberCount(count: number): void {\n    this.subscriberCount = count;\n  }\n\n  /**\n   * Update buffer size\n   */\n  setBufferSize(size: number): void {\n    this.bufferSize = size;\n  }\n\n  /**\n   * Update circuit state\n   */\n  setCircuitState(state: CircuitState): void {\n    this.circuitState = state;\n  }\n\n  /**\n   * Get current events per second\n   */\n  getEventsPerSecond(): number {\n    const now = Date.now();\n    this.eventTimestamps = this.eventTimestamps.filter((ts) => now - ts < 1000);\n    return this.eventTimestamps.length;\n  }\n\n  /**\n   * Get current bus metrics\n   */\n  getBusMetrics(): BusMetrics {\n    return {\n      totalPublished: this.totalPublished,\n      totalDropped: this.totalDropped,\n      totalSampled: this.totalSampled,\n      totalDeduplicated: this.totalDeduplicated,\n      eventsPerSecond: this.getEventsPerSecond(),\n      bufferSize: this.bufferSize,\n      subscriberCount: this.subscriberCount,\n    };\n  }\n\n  /**\n   * Get full Satori metrics\n   */\n  getMetrics(): SatoriMetrics {\n    return {\n      bus: this.getBusMetrics(),\n      loggerCount: this.loggerCount,\n      watcherCount: this.watcherCount,\n      circuitState: this.circuitState,\n      uptime: Date.now() - this.startTime,\n    };\n  }\n\n  /**\n   * Take a snapshot for historical tracking\n   */\n  takeSnapshot(): MetricsSnapshot {\n    const snapshot: MetricsSnapshot = {\n      timestamp: Date.now(),\n      bus: this.getBusMetrics(),\n      loggerCount: this.loggerCount,\n      watcherCount: this.watcherCount,\n      circuitState: this.circuitState,\n      uptime: Date.now() - this.startTime,\n    };\n\n    this.snapshots.push(snapshot);\n\n    // Trim old snapshots\n    if (this.snapshots.length > this.maxSnapshots) {\n      this.snapshots = this.snapshots.slice(-this.maxSnapshots);\n    }\n\n    return snapshot;\n  }\n\n  /**\n   * Get historical snapshots\n   */\n  getSnapshots(): MetricsSnapshot[] {\n    return [...this.snapshots];\n  }\n\n  /**\n   * Get average events per second over time\n   */\n  getAverageEventsPerSecond(): number {\n    if (this.snapshots.length === 0) return 0;\n\n    const sum = this.snapshots.reduce(\n      (acc, s) => acc + s.bus.eventsPerSecond,\n      0,\n    );\n    return sum / this.snapshots.length;\n  }\n\n  /**\n   * Reset all metrics\n   */\n  reset(): void {\n    this.startTime = Date.now();\n    this.totalPublished = 0;\n    this.totalDropped = 0;\n    this.totalSampled = 0;\n    this.totalDeduplicated = 0;\n    this.eventTimestamps = [];\n    this.snapshots = [];\n  }\n}\n\n// Singleton instance for global metrics\nlet globalMetrics: MetricsCollector | null = null;\n\nexport function getGlobalMetrics(): MetricsCollector {\n  if (!globalMetrics) {\n    globalMetrics = new MetricsCollector();\n  }\n  return globalMetrics;\n}\n\nexport function resetGlobalMetrics(): void {\n  globalMetrics = null;\n}\n","import type {\n  LogLevel,\n  RateLimitConfig,\n  DeduplicationConfig,\n  CircuitBreakerConfig,\n} from \"./types.js\";\n\nexport interface SatoriConfig {\n  enableCallsite?: boolean;\n  enableEnvInfo?: boolean;\n  enableStateSnapshot?: boolean;\n  enableCausalLinks?: boolean;\n  enableMetrics?: boolean;\n  enableConsole?: boolean;\n\n  stateSelectors?: Array<{\n    name?: string;\n    selector: () => Record<string, unknown>;\n  }>;\n\n  maxBufferSize?: number;\n  logLevel?: LogLevel;\n\n  appVersion?: string;\n\n  pollingInterval?: number;\n\n  customLevels?: Array<{ name: string; severity: number; color?: string }>;\n\n  rateLimiting?: Partial<RateLimitConfig>;\n  deduplication?: Partial<DeduplicationConfig>;\n  circuitBreaker?: Partial<CircuitBreakerConfig>;\n}\n\nexport type { LogLevel } from \"./types.js\";\n\nexport const DEFAULT_RATE_LIMIT_CONFIG: RateLimitConfig = {\n  enabled: false,\n  maxEventsPerSecond: 1000,\n  samplingRate: 0.1,\n  strategy: \"sample\",\n  bufferSize: 100,\n};\n\nexport const DEFAULT_DEDUP_CONFIG: DeduplicationConfig = {\n  enabled: false,\n  windowMs: 5000,\n  fields: [\"message\", \"scope\", \"level\"],\n  maxCacheSize: 1000,\n};\n\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n  enabled: false,\n  failureThreshold: 5,\n  resetTimeout: 30000,\n  successThreshold: 3,\n};\n\nexport const DEFAULT_CONFIG: Required<\n  Omit<SatoriConfig, \"rateLimiting\" | \"deduplication\" | \"circuitBreaker\">\n> & {\n  rateLimiting: RateLimitConfig;\n  deduplication: DeduplicationConfig;\n  circuitBreaker: CircuitBreakerConfig;\n} = {\n  enableCallsite: true,\n  enableEnvInfo: true,\n  enableStateSnapshot: false,\n  enableCausalLinks: true,\n  enableMetrics: true,\n  enableConsole: true,\n  stateSelectors: [],\n  maxBufferSize: 1000,\n  logLevel: \"info\",\n  appVersion: \"1.0.0\",\n  pollingInterval: 250, // More reasonable default\n  customLevels: [],\n  rateLimiting: DEFAULT_RATE_LIMIT_CONFIG,\n  deduplication: DEFAULT_DEDUP_CONFIG,\n  circuitBreaker: DEFAULT_CIRCUIT_BREAKER_CONFIG,\n};\n","import type {\n  EventBus,\n  EventSubscriber,\n  Middleware,\n  LogEntry,\n  BusMetrics,\n  RateLimitConfig,\n  DeduplicationConfig,\n  CircuitBreakerConfig,\n} from \"../core/types.js\";\nimport { RateLimiter } from \"./rateLimiter.js\";\nimport { Deduplicator } from \"./deduplicator.js\";\nimport { CircuitBreaker } from \"./circuitBreaker.js\";\nimport { MetricsCollector } from \"../core/metrics.js\";\nimport {\n  DEFAULT_RATE_LIMIT_CONFIG,\n  DEFAULT_DEDUP_CONFIG,\n  DEFAULT_CIRCUIT_BREAKER_CONFIG,\n} from \"../core/config.js\";\n\nexport interface EventBusConfig {\n  maxBufferSize?: number;\n  rateLimiting?: Partial<RateLimitConfig>;\n  deduplication?: Partial<DeduplicationConfig>;\n  circuitBreaker?: Partial<CircuitBreakerConfig>;\n  enableMetrics?: boolean;\n}\n\nexport class SimpleEventBus implements EventBus {\n  private subscribers: EventSubscriber[] = [];\n  private middleware: Middleware[] = [];\n  private buffer: LogEntry[] = [];\n  private maxBufferSize: number;\n\n  private rateLimiter: RateLimiter;\n  private deduplicator: Deduplicator;\n  private circuitBreaker: CircuitBreaker;\n  private metrics: MetricsCollector;\n  private enableMetrics: boolean;\n\n  constructor(config: EventBusConfig | number = {}) {\n    // Handle legacy number parameter\n    if (typeof config === \"number\") {\n      config = { maxBufferSize: config };\n    }\n\n    this.maxBufferSize = config.maxBufferSize || 1000;\n    this.enableMetrics = config.enableMetrics ?? true;\n\n    // Initialize components with merged configs\n    this.rateLimiter = new RateLimiter({\n      ...DEFAULT_RATE_LIMIT_CONFIG,\n      ...config.rateLimiting,\n    });\n\n    this.deduplicator = new Deduplicator({\n      ...DEFAULT_DEDUP_CONFIG,\n      ...config.deduplication,\n    });\n\n    this.circuitBreaker = new CircuitBreaker(\n      {\n        ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n        ...config.circuitBreaker,\n      },\n      {\n        onStateChange: (state) => {\n          if (this.enableMetrics) {\n            this.metrics.setCircuitState(state);\n          }\n        },\n      },\n    );\n\n    this.metrics = new MetricsCollector();\n  }\n\n  publish(entry: LogEntry): void {\n    // Check deduplication (unless skipped)\n    if (\n      !entry.__internal?.isReplay &&\n      !(entry as { skipDedup?: boolean }).skipDedup\n    ) {\n      const dedupResult = this.deduplicator.isDuplicate(entry);\n      if (dedupResult.isDuplicate) {\n        if (this.enableMetrics) {\n          this.metrics.recordDeduplicated();\n        }\n        return;\n      }\n    }\n\n    // Check rate limiting (unless skipped)\n    if (\n      !entry.__internal?.isReplay &&\n      !(entry as { skipRateLimit?: boolean }).skipRateLimit\n    ) {\n      const rateLimitResult = this.rateLimiter.shouldAllow(entry);\n      if (!rateLimitResult.allowed) {\n        if (this.enableMetrics) {\n          this.metrics.recordDropped();\n        }\n        return;\n      }\n      if (rateLimitResult.sampled) {\n        entry.__internal = entry.__internal || {};\n        entry.__internal.sampled = true;\n        if (this.enableMetrics) {\n          this.metrics.recordSampled();\n        }\n      }\n    }\n\n    // Use circuit breaker for actual publish\n    try {\n      this.circuitBreaker.executeSync(() => {\n        this.doPublish(entry);\n      });\n\n      if (this.enableMetrics) {\n        this.metrics.recordPublished();\n        this.metrics.setBufferSize(this.buffer.length);\n        this.metrics.setSubscriberCount(this.subscribers.length);\n      }\n    } catch (error) {\n      // Circuit is open or publish failed\n      if (this.enableMetrics) {\n        this.metrics.recordDropped();\n      }\n    }\n  }\n\n  private doPublish(entry: LogEntry): void {\n    let index = 0;\n\n    const runNext = () => {\n      if (index >= this.middleware.length) {\n        this.subscribers.forEach((sub) => sub(entry));\n        this.addToBuffer(entry);\n        return;\n      }\n\n      const mw = this.middleware[index];\n      index++;\n      mw(entry, runNext);\n    };\n\n    runNext();\n  }\n\n  subscribe(fn: EventSubscriber): () => void {\n    this.subscribers.push(fn);\n    if (this.enableMetrics) {\n      this.metrics.setSubscriberCount(this.subscribers.length);\n    }\n    return () => {\n      const idx = this.subscribers.indexOf(fn);\n      if (idx >= 0) {\n        this.subscribers.splice(idx, 1);\n        if (this.enableMetrics) {\n          this.metrics.setSubscriberCount(this.subscribers.length);\n        }\n      }\n    };\n  }\n\n  use(middleware: Middleware): void {\n    this.middleware.push(middleware);\n  }\n\n  getReplayBuffer(): LogEntry[] {\n    return [...this.buffer];\n  }\n\n  getMetrics(): BusMetrics {\n    return this.metrics.getBusMetrics();\n  }\n\n  /**\n   * Get the rate limiter instance for advanced configuration\n   */\n  getRateLimiter(): RateLimiter {\n    return this.rateLimiter;\n  }\n\n  /**\n   * Get the deduplicator instance for advanced configuration\n   */\n  getDeduplicator(): Deduplicator {\n    return this.deduplicator;\n  }\n\n  /**\n   * Get the circuit breaker instance for advanced configuration\n   */\n  getCircuitBreaker(): CircuitBreaker {\n    return this.circuitBreaker;\n  }\n\n  /**\n   * Clear the event buffer\n   */\n  clearBuffer(): void {\n    this.buffer.length = 0;\n    if (this.enableMetrics) {\n      this.metrics.setBufferSize(0);\n    }\n  }\n\n  /**\n   * Reset all state\n   */\n  reset(): void {\n    this.buffer.length = 0;\n    this.middleware.length = 0;\n    this.rateLimiter.reset();\n    this.deduplicator.reset();\n    this.circuitBreaker.reset();\n    this.metrics.reset();\n  }\n\n  private addToBuffer(entry: LogEntry): void {\n    this.buffer.push(entry);\n    if (this.buffer.length > this.maxBufferSize) {\n      this.buffer.shift();\n    }\n  }\n}\n","let counter = 0;\nconst base = Date.now().toString(36);\n\nexport function generateId(): string {\n  return `${base}-${++counter}`;\n}\n","export function now(): number {\n  return Date.now();\n}\n\nexport function formatTimestamp(ts: number): string {\n  return new Date(ts).toISOString();\n}\n","export interface CallsiteInfo {\n  file: string;\n  line: number;\n  column: number;\n  function?: string;\n}\n\nexport function extractCallsite(depth = 2): string | undefined {\n  try {\n    const stack = new Error().stack;\n    if (!stack) return undefined;\n\n    const lines = stack.split(\"\\n\");\n    const callerLine = lines[depth];\n\n    if (!callerLine) return undefined;\n\n    const match =\n      callerLine.match(/at\\s+(.+?)\\s+\\((.+?):(\\d+):(\\d+)\\)/) ||\n      callerLine.match(/at\\s+(.+?):(\\d+):(\\d+)/);\n\n    if (match) {\n      const [, func, file, line, column] = match;\n      return `${file}:${line}:${column}${func ? ` (${func})` : \"\"}`;\n    }\n\n    return callerLine.trim();\n  } catch {\n    return undefined;\n  }\n}\n","import type {\n  SatoriConfig,\n  EnvironmentInfo,\n  RuntimePlatform,\n} from \"../core/types.js\";\n\n/**\n * Detect the current runtime platform\n */\nexport function detectPlatform(): RuntimePlatform {\n  // Check for Deno\n  if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n    return \"deno\";\n  }\n\n  // Check for Bun\n  if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n    return \"bun\";\n  }\n\n  // Check for Cloudflare Workers\n  if (\n    typeof globalThis !== \"undefined\" &&\n    \"caches\" in globalThis &&\n    typeof (globalThis as Record<string, unknown>).caches === \"object\" &&\n    !(\"window\" in globalThis)\n  ) {\n    return \"cloudflare-workers\";\n  }\n\n  // Check for Edge runtime (Vercel Edge, etc.)\n  if (typeof globalThis !== \"undefined\" && \"EdgeRuntime\" in globalThis) {\n    return \"edge\";\n  }\n\n  // Check for browser\n  if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n    return \"browser\";\n  }\n\n  // Check for Node.js\n  if (\n    typeof process !== \"undefined\" &&\n    process.versions &&\n    process.versions.node\n  ) {\n    return \"node\";\n  }\n\n  return \"unknown\";\n}\n\n/**\n * Get environment information based on the current platform\n */\nexport function getEnvInfo(config: SatoriConfig): EnvironmentInfo {\n  const platform = detectPlatform();\n\n  const env: EnvironmentInfo = {\n    platform,\n    appVersion: config.appVersion,\n  };\n\n  switch (platform) {\n    case \"browser\":\n      if (typeof navigator !== \"undefined\") {\n        env.userAgent = navigator.userAgent;\n      }\n      if (typeof window !== \"undefined\") {\n        env.url = window.location?.href;\n        if (typeof document !== \"undefined\") {\n          env.referrer = document.referrer;\n        }\n      }\n      break;\n\n    case \"node\":\n      if (typeof process !== \"undefined\") {\n        env.nodeVersion = process.version;\n        env.arch = process.arch;\n        if (process.env.NODE_ENV) {\n          env.nodeEnv = process.env.NODE_ENV;\n        }\n      }\n      break;\n\n    case \"deno\":\n      try {\n        const Deno = (globalThis as Record<string, unknown>).Deno as {\n          version?: { deno?: string; v8?: string; typescript?: string };\n          build?: { os?: string; arch?: string };\n        };\n        if (Deno?.version) {\n          env.denoVersion = Deno.version.deno;\n          env.v8Version = Deno.version.v8;\n          env.typescriptVersion = Deno.version.typescript;\n        }\n        if (Deno?.build) {\n          env.os = Deno.build.os;\n          env.arch = Deno.build.arch;\n        }\n      } catch {\n        // Deno APIs might be restricted\n      }\n      break;\n\n    case \"bun\":\n      try {\n        const Bun = (globalThis as Record<string, unknown>).Bun as {\n          version?: string;\n          revision?: string;\n        };\n        if (Bun?.version) {\n          env.bunVersion = Bun.version;\n        }\n        if (Bun?.revision) {\n          env.bunRevision = Bun.revision;\n        }\n      } catch {\n        // Bun APIs might be restricted\n      }\n      break;\n\n    case \"cloudflare-workers\":\n      // Limited info available in Workers\n      env.runtime = \"cloudflare-workers\";\n      break;\n\n    case \"edge\":\n      try {\n        const EdgeRuntime = (globalThis as Record<string, unknown>)\n          .EdgeRuntime as string;\n        env.edgeRuntime = EdgeRuntime;\n      } catch {\n        // Edge runtime info might be restricted\n      }\n      break;\n  }\n\n  return env;\n}\n","import type { SatoriConfig, StateSelector } from \"../core/types.js\";\nimport { deepClone } from \"../core/utils/deepEqual.js\";\n\nexport interface StateSnapshotResult {\n  [key: string]: unknown;\n}\n\ntype SelectorInput = StateSelector | (() => Record<string, unknown>);\n\n/**\n * Capture a snapshot of application state using configured selectors\n * Now supports named selectors for better organization\n */\nexport function captureStateSnapshot(\n  config: SatoriConfig,\n): StateSnapshotResult | undefined {\n  if (!config.stateSelectors || config.stateSelectors.length === 0) {\n    return undefined;\n  }\n\n  const snapshot: StateSnapshotResult = {};\n\n  for (let index = 0; index < config.stateSelectors.length; index++) {\n    const selectorConfig: SelectorInput = config.stateSelectors[\n      index\n    ] as SelectorInput;\n\n    // Handle both old function format and new StateSelector format\n    const selector =\n      typeof selectorConfig === \"function\"\n        ? selectorConfig\n        : selectorConfig.selector;\n    const name =\n      typeof selectorConfig === \"function\"\n        ? `selector_${index}`\n        : selectorConfig.name || `selector_${index}`;\n\n    try {\n      const state = selector();\n      if (state !== undefined && state !== null) {\n        // Deep clone to prevent mutations\n        snapshot[name] = deepClone(state);\n      }\n    } catch (err) {\n      snapshot[`${name}_error`] =\n        err instanceof Error ? err.message : String(err);\n    }\n  }\n\n  return Object.keys(snapshot).length > 0 ? snapshot : undefined;\n}\n\n/**\n * Create a typed state selector\n * Provides better type safety for state snapshots\n */\nexport function createStateSelector<T extends Record<string, unknown>>(\n  name: string,\n  selector: () => T,\n): StateSelector<T> {\n  return { name, selector };\n}\n\n/**\n * Merge multiple state snapshots\n */\nexport function mergeSnapshots(\n  ...snapshots: (StateSnapshotResult | undefined)[]\n): StateSnapshotResult {\n  const merged: StateSnapshotResult = {};\n\n  for (const snapshot of snapshots) {\n    if (snapshot) {\n      Object.assign(merged, snapshot);\n    }\n  }\n\n  return merged;\n}\n\n/**\n * Compare two state snapshots and return differences\n */\nexport function diffSnapshots(\n  prev: StateSnapshotResult | undefined,\n  next: StateSnapshotResult | undefined,\n): { added: string[]; removed: string[]; changed: string[] } {\n  const added: string[] = [];\n  const removed: string[] = [];\n  const changed: string[] = [];\n\n  const prevKeys = new Set(prev ? Object.keys(prev) : []);\n  const nextKeys = new Set(next ? Object.keys(next) : []);\n\n  // Find added keys\n  for (const key of nextKeys) {\n    if (!prevKeys.has(key)) {\n      added.push(key);\n    }\n  }\n\n  // Find removed keys\n  for (const key of prevKeys) {\n    if (!nextKeys.has(key)) {\n      removed.push(key);\n    }\n  }\n\n  // Find changed keys\n  for (const key of prevKeys) {\n    if (nextKeys.has(key) && prev && next) {\n      if (JSON.stringify(prev[key]) !== JSON.stringify(next[key])) {\n        changed.push(key);\n      }\n    }\n  }\n\n  return { added, removed, changed };\n}\n","/**\n * Enhanced Causal Links Module\n * Supports complex causality graphs with forward and backward links\n */\n\ninterface CausalNode {\n  eventId: string;\n  scope: string;\n  timestamp: number;\n  /** IDs of events that caused this event */\n  causes: string[];\n  /** IDs of events that this event caused */\n  effects: string[];\n}\n\nexport class CausalGraph {\n  private nodes = new Map<string, CausalNode>();\n  private scopeLastEvent = new Map<string, string>();\n  private globalLastEvent: string | undefined;\n  private maxNodes = 10000;\n\n  /**\n   * Add a new event to the causal graph\n   */\n  addEvent(eventId: string, scope: string, causeEventIds?: string[]): void {\n    const node: CausalNode = {\n      eventId,\n      scope,\n      timestamp: Date.now(),\n      causes: causeEventIds || [],\n      effects: [],\n    };\n\n    // Add forward links from cause events\n    if (causeEventIds) {\n      for (const causeId of causeEventIds) {\n        const causeNode = this.nodes.get(causeId);\n        if (causeNode) {\n          causeNode.effects.push(eventId);\n        }\n      }\n    }\n\n    this.nodes.set(eventId, node);\n    this.scopeLastEvent.set(scope, eventId);\n    this.globalLastEvent = eventId;\n\n    // Prune old nodes if we exceed max\n    if (this.nodes.size > this.maxNodes) {\n      this.pruneOldest(Math.floor(this.maxNodes * 0.1));\n    }\n  }\n\n  /**\n   * Get the causal link for a new event\n   */\n  getCausalLink(scope: string, previousEventId?: string): string | undefined {\n    if (previousEventId) {\n      return previousEventId;\n    }\n    return this.scopeLastEvent.get(scope) || this.globalLastEvent;\n  }\n\n  /**\n   * Get all causes (direct and transitive) for an event\n   */\n  getCauses(eventId: string, depth = Infinity): string[] {\n    const causes = new Set<string>();\n    const visited = new Set<string>();\n\n    const traverse = (id: string, currentDepth: number) => {\n      if (visited.has(id) || currentDepth > depth) return;\n      visited.add(id);\n\n      const node = this.nodes.get(id);\n      if (!node) return;\n\n      for (const causeId of node.causes) {\n        causes.add(causeId);\n        traverse(causeId, currentDepth + 1);\n      }\n    };\n\n    traverse(eventId, 0);\n    return Array.from(causes);\n  }\n\n  /**\n   * Get all effects (direct and transitive) for an event\n   */\n  getEffects(eventId: string, depth = Infinity): string[] {\n    const effects = new Set<string>();\n    const visited = new Set<string>();\n\n    const traverse = (id: string, currentDepth: number) => {\n      if (visited.has(id) || currentDepth > depth) return;\n      visited.add(id);\n\n      const node = this.nodes.get(id);\n      if (!node) return;\n\n      for (const effectId of node.effects) {\n        effects.add(effectId);\n        traverse(effectId, currentDepth + 1);\n      }\n    };\n\n    traverse(eventId, 0);\n    return Array.from(effects);\n  }\n\n  /**\n   * Get the causal chain from root to an event\n   */\n  getCausalChain(eventId: string): string[] {\n    const chain: string[] = [];\n    let currentId: string | undefined = eventId;\n    const visited = new Set<string>();\n\n    while (currentId && !visited.has(currentId)) {\n      visited.add(currentId);\n      chain.unshift(currentId);\n\n      const node = this.nodes.get(currentId);\n      if (!node || node.causes.length === 0) break;\n\n      // Follow the first cause (primary chain)\n      currentId = node.causes[0];\n    }\n\n    return chain;\n  }\n\n  /**\n   * Get node information\n   */\n  getNode(eventId: string): CausalNode | undefined {\n    return this.nodes.get(eventId);\n  }\n\n  /**\n   * Check if two events are causally related\n   */\n  areCausallyRelated(eventId1: string, eventId2: string): boolean {\n    const causes1 = this.getCauses(eventId1);\n    const effects1 = this.getEffects(eventId1);\n\n    return causes1.includes(eventId2) || effects1.includes(eventId2);\n  }\n\n  /**\n   * Get events in the same scope\n   */\n  getEventsByScope(scope: string): string[] {\n    const events: string[] = [];\n    for (const [id, node] of this.nodes) {\n      if (node.scope === scope) {\n        events.push(id);\n      }\n    }\n    return events;\n  }\n\n  /**\n   * Prune oldest nodes to stay within memory limits\n   */\n  private pruneOldest(count: number): void {\n    const sortedNodes = Array.from(this.nodes.entries())\n      .sort(([, a], [, b]) => a.timestamp - b.timestamp)\n      .slice(0, count);\n\n    for (const [id] of sortedNodes) {\n      const node = this.nodes.get(id);\n      if (node) {\n        // Remove references from cause nodes\n        for (const causeId of node.causes) {\n          const causeNode = this.nodes.get(causeId);\n          if (causeNode) {\n            causeNode.effects = causeNode.effects.filter((e) => e !== id);\n          }\n        }\n        // Remove references from effect nodes\n        for (const effectId of node.effects) {\n          const effectNode = this.nodes.get(effectId);\n          if (effectNode) {\n            effectNode.causes = effectNode.causes.filter((c) => c !== id);\n          }\n        }\n      }\n      this.nodes.delete(id);\n    }\n  }\n\n  /**\n   * Clear all causal links\n   */\n  clear(): void {\n    this.nodes.clear();\n    this.scopeLastEvent.clear();\n    this.globalLastEvent = undefined;\n  }\n\n  /**\n   * Get statistics about the causal graph\n   */\n  getStats(): { nodeCount: number; avgCauses: number; avgEffects: number } {\n    let totalCauses = 0;\n    let totalEffects = 0;\n\n    for (const node of this.nodes.values()) {\n      totalCauses += node.causes.length;\n      totalEffects += node.effects.length;\n    }\n\n    const count = this.nodes.size || 1;\n    return {\n      nodeCount: this.nodes.size,\n      avgCauses: totalCauses / count,\n      avgEffects: totalEffects / count,\n    };\n  }\n}\n\n// Global causal graph instance\nconst globalCausalGraph = new CausalGraph();\n\n// Legacy API for backwards compatibility\nconst scopeLastEvent = new Map<string, string>();\nlet globalLastEvent: string | undefined;\n\nexport function getCausalLink(\n  scope: string,\n  previousEventId?: string,\n): string | undefined {\n  return globalCausalGraph.getCausalLink(scope, previousEventId);\n}\n\nexport function updateCausalLink(\n  scope: string,\n  eventId: string,\n  causeEventIds?: string[],\n): void {\n  globalCausalGraph.addEvent(eventId, scope, causeEventIds);\n\n  // Also maintain legacy maps for compatibility\n  scopeLastEvent.set(scope, eventId);\n  globalLastEvent = eventId;\n}\n\nexport function clearCausalLinks(): void {\n  globalCausalGraph.clear();\n  scopeLastEvent.clear();\n  globalLastEvent = undefined;\n}\n\n// Export the graph for advanced usage\nexport function getCausalGraph(): CausalGraph {\n  return globalCausalGraph;\n}\n\n// Export graph operations\nexport const causalGraph = {\n  getCauses: (eventId: string, depth?: number) =>\n    globalCausalGraph.getCauses(eventId, depth),\n  getEffects: (eventId: string, depth?: number) =>\n    globalCausalGraph.getEffects(eventId, depth),\n  getCausalChain: (eventId: string) =>\n    globalCausalGraph.getCausalChain(eventId),\n  areCausallyRelated: (eventId1: string, eventId2: string) =>\n    globalCausalGraph.areCausallyRelated(eventId1, eventId2),\n  getEventsByScope: (scope: string) =>\n    globalCausalGraph.getEventsByScope(scope),\n  getStats: () => globalCausalGraph.getStats(),\n};\n","import type { LogEntry, LogOptions, SatoriConfig } from \"../core/types.js\";\nimport { generateId } from \"../core/utils/ids.js\";\nimport { now } from \"../core/utils/time.js\";\nimport { extractCallsite } from \"../core/utils/stacktrace.js\";\nimport { getEnvInfo } from \"./env.js\";\nimport { captureStateSnapshot } from \"./stateSnapshot.js\";\nimport { getCausalLink } from \"./causal.js\";\n\ninterface EventInput {\n  level: string;\n  scope: string;\n  message: string;\n  options?: LogOptions;\n  inheritedTags?: string[];\n  inheritedCause?: string;\n  inheritedCauseEventId?: string;\n}\n\nexport function enrichEvent(\n  input: EventInput,\n  config: SatoriConfig,\n  previousEventId?: string,\n): LogEntry {\n  const id = generateId();\n  const timestamp = now();\n\n  const tags = [...(input.inheritedTags || []), ...(input.options?.tags || [])];\n\n  const entry: LogEntry = {\n    id,\n    timestamp,\n    level: input.level,\n    scope: input.scope,\n    message: input.message,\n    tags,\n    cause: input.inheritedCause || input.options?.cause,\n    causeEventId: input.inheritedCauseEventId || input.options?.causeEventId,\n    suggest: input.options?.suggest,\n  };\n\n  // Add user-provided state\n  if (input.options?.state) {\n    entry.state = { ...input.options.state };\n  }\n\n  if (config.enableCallsite && !entry.__internal?.isReplay) {\n    entry.callsite = extractCallsite(4); // Adjusted depth for new call stack\n  }\n\n  if (config.enableEnvInfo && !entry.__internal?.isReplay) {\n    entry.env = getEnvInfo(config);\n  }\n\n  if (config.enableStateSnapshot && !entry.__internal?.isReplay) {\n    const snapshot = captureStateSnapshot(config);\n    if (snapshot) {\n      entry.state = { ...entry.state, ...snapshot };\n    }\n  }\n\n  if (config.enableCausalLinks && !entry.__internal?.isReplay) {\n    const causalLink = getCausalLink(input.scope, previousEventId);\n    if (causalLink) {\n      entry.previousEventId = causalLink;\n    }\n  }\n\n  return entry;\n}\n","import type {\n  SatoriLogger,\n  WatchSource,\n  WhenPredicate,\n  WhenCallback,\n  WatchHandle,\n  SatoriConfig,\n} from \"../core/types.js\";\nimport { deepEqual, deepClone } from \"../core/utils/deepEqual.js\";\nimport { CircuitBreaker } from \"../bus/circuitBreaker.js\";\nimport { DEFAULT_CIRCUIT_BREAKER_CONFIG } from \"../core/config.js\";\n\ninterface WatcherHandle {\n  id: string;\n  getValue(): unknown;\n  label?: string;\n  intervalId?: ReturnType<typeof setInterval>;\n  lastValue?: unknown;\n  errorCount: number;\n  disposed: boolean;\n}\n\ninterface WhenHandler {\n  id: string;\n  getValue(): unknown;\n  predicate: WhenPredicate<unknown>;\n  onTrigger: WhenCallback<unknown>;\n  lastValue?: unknown;\n  intervalId: ReturnType<typeof setInterval>;\n  errorCount: number;\n  disposed: boolean;\n}\n\nexport class WatcherEngine {\n  private watchers = new Map<string, WatcherHandle>();\n  private whenHandlers = new Map<string, WhenHandler>();\n  private circuitBreaker: CircuitBreaker;\n  private disposed = false;\n\n  constructor(\n    private logger: SatoriLogger,\n    private config: SatoriConfig,\n  ) {\n    this.circuitBreaker = new CircuitBreaker(\n      {\n        ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n        enabled: config.circuitBreaker?.enabled ?? false,\n        ...config.circuitBreaker,\n      },\n      {\n        onOpen: () => {\n          this.logger.warn(\n            \"WatcherEngine circuit breaker opened: too many errors\",\n            {\n              tags: [\"watcher\", \"circuit-breaker\"],\n            },\n          );\n        },\n        onClose: () => {\n          this.logger.info(\"WatcherEngine circuit breaker closed: recovered\", {\n            tags: [\"watcher\", \"circuit-breaker\"],\n          });\n        },\n      },\n    );\n  }\n\n  watch<T>(source: WatchSource<T>, label?: string): WatchHandle {\n    if (this.disposed) {\n      throw new Error(\"WatcherEngine has been disposed\");\n    }\n\n    const id = this.generateId();\n    const getValue = typeof source === \"function\" ? source : () => source;\n\n    const handle: WatcherHandle = {\n      id,\n      getValue,\n      label,\n      lastValue: undefined,\n      errorCount: 0,\n      disposed: false,\n    };\n\n    const check = () => {\n      if (handle.disposed || this.disposed) return;\n\n      try {\n        this.circuitBreaker.executeSync(() => {\n          const currentValue = getValue();\n\n          // Use deep equality for proper object comparison\n          if (!deepEqual(currentValue, handle.lastValue)) {\n            const changeLabel = label || `watch_${id}`;\n\n            // Create descriptive message\n            let message: string;\n            if (typeof currentValue === \"object\" && currentValue !== null) {\n              message = `${changeLabel}: state changed`;\n            } else {\n              const prevStr = this.formatValue(handle.lastValue);\n              const currStr = this.formatValue(currentValue);\n              message = `${changeLabel}: ${prevStr} -> ${currStr}`;\n            }\n\n            this.logger.info(message, {\n              tags: [\"watch\"],\n              state: {\n                [`${changeLabel}_prev`]: deepClone(handle.lastValue),\n                [`${changeLabel}_current`]: deepClone(currentValue),\n              },\n            });\n\n            // Deep clone to prevent reference issues\n            handle.lastValue = deepClone(currentValue);\n          }\n\n          // Reset error count on success\n          handle.errorCount = 0;\n        });\n      } catch (err) {\n        handle.errorCount++;\n\n        // Only log errors occasionally to prevent spam\n        if (handle.errorCount <= 3 || handle.errorCount % 10 === 0) {\n          this.logger.error(\n            `Watch error for ${label || id} (count: ${handle.errorCount})`,\n            {\n              tags: [\"watch\", \"error\"],\n              state: {\n                error: err instanceof Error ? err.message : String(err),\n              },\n            },\n          );\n        }\n\n        // Auto-dispose after too many consecutive errors\n        if (handle.errorCount >= 50) {\n          this.logger.error(\n            `Watch ${label || id} disposed due to repeated errors`,\n            {\n              tags: [\"watch\", \"error\", \"auto-disposed\"],\n            },\n          );\n          this.disposeWatcher(id);\n        }\n      }\n    };\n\n    // Initial check\n    check();\n\n    const intervalId = setInterval(check, this.config.pollingInterval || 250);\n    handle.intervalId = intervalId;\n\n    this.watchers.set(id, handle);\n\n    return {\n      dispose: () => this.disposeWatcher(id),\n    };\n  }\n\n  when<T>(\n    source: WatchSource<T>,\n    predicate: WhenPredicate<T>,\n    onTrigger: WhenCallback<T>,\n  ): WatchHandle {\n    if (this.disposed) {\n      throw new Error(\"WatcherEngine has been disposed\");\n    }\n\n    const id = this.generateId();\n    const getValue = typeof source === \"function\" ? source : () => source;\n\n    const handler: WhenHandler = {\n      id,\n      getValue,\n      predicate: predicate as WhenPredicate<unknown>,\n      onTrigger: onTrigger as WhenCallback<unknown>,\n      lastValue: undefined,\n      intervalId: null as unknown as ReturnType<typeof setInterval>,\n      errorCount: 0,\n      disposed: false,\n    };\n\n    const check = () => {\n      if (handler.disposed || this.disposed) return;\n\n      try {\n        this.circuitBreaker.executeSync(() => {\n          const currentValue = getValue();\n\n          // Use the predicate with deep-cloned values\n          const prevClone =\n            handler.lastValue !== undefined\n              ? deepClone(handler.lastValue)\n              : undefined;\n          const currClone = deepClone(currentValue);\n\n          if (predicate(prevClone as T | undefined, currClone as T)) {\n            onTrigger(currClone as T, prevClone as T | undefined);\n          }\n\n          handler.lastValue = currClone;\n          handler.errorCount = 0;\n        });\n      } catch (err) {\n        handler.errorCount++;\n\n        if (handler.errorCount <= 3 || handler.errorCount % 10 === 0) {\n          this.logger.error(\n            `When condition error for ${id} (count: ${handler.errorCount})`,\n            {\n              tags: [\"when\", \"error\"],\n              state: {\n                error: err instanceof Error ? err.message : String(err),\n              },\n            },\n          );\n        }\n\n        if (handler.errorCount >= 50) {\n          this.logger.error(\n            `When handler ${id} disposed due to repeated errors`,\n            {\n              tags: [\"when\", \"error\", \"auto-disposed\"],\n            },\n          );\n          this.disposeWhenHandler(id);\n        }\n      }\n    };\n\n    const intervalId = setInterval(check, this.config.pollingInterval || 250);\n    handler.intervalId = intervalId;\n\n    this.whenHandlers.set(id, handler);\n\n    return {\n      dispose: () => this.disposeWhenHandler(id),\n    };\n  }\n\n  private disposeWatcher(id: string): void {\n    const watcher = this.watchers.get(id);\n    if (watcher) {\n      watcher.disposed = true;\n      if (watcher.intervalId) {\n        clearInterval(watcher.intervalId);\n      }\n      this.watchers.delete(id);\n    }\n  }\n\n  private disposeWhenHandler(id: string): void {\n    const handler = this.whenHandlers.get(id);\n    if (handler) {\n      handler.disposed = true;\n      if (handler.intervalId) {\n        clearInterval(handler.intervalId);\n      }\n      this.whenHandlers.delete(id);\n    }\n  }\n\n  private generateId(): string {\n    return Math.random().toString(36).substring(2, 11);\n  }\n\n  private formatValue(value: unknown): string {\n    if (value === undefined) return \"undefined\";\n    if (value === null) return \"null\";\n    if (typeof value === \"string\") return `\"${value}\"`;\n    if (typeof value === \"number\" || typeof value === \"boolean\")\n      return String(value);\n    if (Array.isArray(value)) return `Array(${value.length})`;\n    if (typeof value === \"object\")\n      return `Object(${Object.keys(value).length} keys)`;\n    return String(value);\n  }\n\n  /**\n   * Get the number of active watchers\n   */\n  getWatcherCount(): number {\n    return this.watchers.size + this.whenHandlers.size;\n  }\n\n  /**\n   * Get circuit breaker state\n   */\n  getCircuitState() {\n    return this.circuitBreaker.getState();\n  }\n\n  /**\n   * Dispose all watchers and clean up\n   */\n  dispose(): void {\n    if (this.disposed) return;\n    this.disposed = true;\n\n    this.watchers.forEach((watcher) => {\n      watcher.disposed = true;\n      if (watcher.intervalId) {\n        clearInterval(watcher.intervalId);\n      }\n    });\n\n    this.whenHandlers.forEach((handler) => {\n      handler.disposed = true;\n      if (handler.intervalId) {\n        clearInterval(handler.intervalId);\n      }\n    });\n\n    this.watchers.clear();\n    this.whenHandlers.clear();\n  }\n\n  /**\n   * Check if the engine has been disposed\n   */\n  isDisposed(): boolean {\n    return this.disposed;\n  }\n}\n","import type {\n  SatoriLogger,\n  SatoriConfig,\n  EventBus,\n  LogEntry,\n  LogLevel,\n  LogOptions,\n  WatchSource,\n  WhenPredicate,\n  WhenCallback,\n  WatchHandle,\n  CustomLogLevel,\n} from \"../core/types.js\";\nimport { enrichEvent } from \"../enrich/enrichEvent.js\";\nimport { updateCausalLink } from \"../enrich/causal.js\";\nimport { WatcherEngine } from \"../watch/watcherEngine.js\";\n\nconst BUILTIN_LEVELS: Record<LogLevel, number> = {\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n};\n\nexport class ScopedLogger implements SatoriLogger {\n  private inheritedTags: string[] = [];\n  private inheritedCause?: string;\n  private inheritedCauseEventId?: string;\n  private watcherEngine: WatcherEngine;\n  private disposed = false;\n  private levelSeverities: Record<string, number>;\n\n  constructor(\n    public readonly scope: string,\n    private config: SatoriConfig,\n    private bus: EventBus,\n    private lastEventId?: string,\n  ) {\n    this.watcherEngine = new WatcherEngine(this, config);\n\n    // Build level severity map including custom levels\n    this.levelSeverities = { ...BUILTIN_LEVELS };\n    if (config.customLevels) {\n      for (const level of config.customLevels) {\n        this.levelSeverities[level.name] = level.severity;\n      }\n    }\n  }\n\n  event(message: string, options?: LogOptions): void {\n    this.log(\"info\", message, options);\n  }\n\n  info(message: string, options?: LogOptions): void {\n    this.log(\"info\", message, options);\n  }\n\n  warn(message: string, options?: LogOptions): void {\n    this.log(\"warn\", message, options);\n  }\n\n  error(message: string, options?: LogOptions): void {\n    this.log(\"error\", message, options);\n  }\n\n  debug(message: string, options?: LogOptions): void {\n    this.log(\"debug\", message, options);\n  }\n\n  /**\n   * Log with any level (built-in or custom)\n   */\n  log(level: string, message: string, options?: LogOptions): void {\n    if (this.disposed) {\n      console.warn(\n        `Attempted to log on disposed logger (scope: ${this.scope})`,\n      );\n      return;\n    }\n\n    // Check if level is valid\n    if (!(level in this.levelSeverities)) {\n      console.warn(`Unknown log level: ${level}, defaulting to info`);\n      level = \"info\";\n    }\n\n    // Check if level meets minimum threshold\n    const minLevel = this.config.logLevel || \"info\";\n    const minSeverity = this.levelSeverities[minLevel] ?? 1;\n    const levelSeverity = this.levelSeverities[level] ?? 1;\n\n    if (levelSeverity < minSeverity) {\n      return; // Skip logging below minimum level\n    }\n\n    const entry = enrichEvent(\n      {\n        level,\n        scope: this.scope,\n        message,\n        options,\n        inheritedTags: this.inheritedTags,\n        inheritedCause: this.inheritedCause,\n        inheritedCauseEventId: this.inheritedCauseEventId,\n      },\n      this.config,\n      this.lastEventId,\n    );\n\n    // Update causal links with any cause event IDs\n    const causeEventIds = this.inheritedCauseEventId\n      ? [this.inheritedCauseEventId]\n      : undefined;\n    updateCausalLink(this.scope, entry.id, causeEventIds);\n    this.lastEventId = entry.id;\n\n    this.bus.publish(entry);\n  }\n\n  tag(...tags: string[]): SatoriLogger {\n    const newLogger = new ScopedLogger(\n      this.scope,\n      this.config,\n      this.bus,\n      this.lastEventId,\n    );\n    newLogger.inheritedTags = [...this.inheritedTags, ...tags];\n    newLogger.inheritedCause = this.inheritedCause;\n    newLogger.inheritedCauseEventId = this.inheritedCauseEventId;\n    return newLogger;\n  }\n\n  causedBy(messageOrEvent: string | LogEntry): SatoriLogger {\n    const newLogger = new ScopedLogger(\n      this.scope,\n      this.config,\n      this.bus,\n      this.lastEventId,\n    );\n    newLogger.inheritedTags = [...this.inheritedTags];\n\n    if (typeof messageOrEvent === \"string\") {\n      newLogger.inheritedCause = messageOrEvent;\n    } else {\n      newLogger.inheritedCause = messageOrEvent.message;\n      newLogger.inheritedCauseEventId = messageOrEvent.id;\n    }\n\n    return newLogger;\n  }\n\n  watch<T>(source: WatchSource<T>, label?: string): WatchHandle {\n    if (this.disposed) {\n      throw new Error(\n        `Cannot create watch on disposed logger (scope: ${this.scope})`,\n      );\n    }\n    return this.watcherEngine.watch(source, label);\n  }\n\n  when<T>(\n    source: WatchSource<T>,\n    predicate: WhenPredicate<T>,\n    onTrigger: WhenCallback<T>,\n  ): WatchHandle {\n    if (this.disposed) {\n      throw new Error(\n        `Cannot create when handler on disposed logger (scope: ${this.scope})`,\n      );\n    }\n    return this.watcherEngine.when(source, predicate, onTrigger);\n  }\n\n  /**\n   * Get the number of active watchers on this logger\n   */\n  getWatcherCount(): number {\n    return this.watcherEngine.getWatcherCount();\n  }\n\n  /**\n   * Dispose this logger and all its watchers\n   */\n  dispose(): void {\n    if (this.disposed) return;\n    this.disposed = true;\n    this.watcherEngine.dispose();\n  }\n\n  /**\n   * Check if this logger has been disposed\n   */\n  isDisposed(): boolean {\n    return this.disposed;\n  }\n}\n","/**\n * Configuration validation module\n * Validates SatoriConfig to prevent runtime errors\n */\n\nimport type { SatoriConfig, LogLevel } from \"./types.js\";\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\nconst VALID_LOG_LEVELS: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\nexport function validateConfig(\n  config: Partial<SatoriConfig>,\n): ValidationResult {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  // Validate enableCallsite\n  if (\n    config.enableCallsite !== undefined &&\n    typeof config.enableCallsite !== \"boolean\"\n  ) {\n    errors.push(\"enableCallsite must be a boolean\");\n  }\n\n  // Validate enableEnvInfo\n  if (\n    config.enableEnvInfo !== undefined &&\n    typeof config.enableEnvInfo !== \"boolean\"\n  ) {\n    errors.push(\"enableEnvInfo must be a boolean\");\n  }\n\n  // Validate enableStateSnapshot\n  if (\n    config.enableStateSnapshot !== undefined &&\n    typeof config.enableStateSnapshot !== \"boolean\"\n  ) {\n    errors.push(\"enableStateSnapshot must be a boolean\");\n  }\n\n  // Validate enableCausalLinks\n  if (\n    config.enableCausalLinks !== undefined &&\n    typeof config.enableCausalLinks !== \"boolean\"\n  ) {\n    errors.push(\"enableCausalLinks must be a boolean\");\n  }\n\n  // Validate stateSelectors\n  if (config.stateSelectors !== undefined) {\n    if (!Array.isArray(config.stateSelectors)) {\n      errors.push(\"stateSelectors must be an array\");\n    } else {\n      config.stateSelectors.forEach((selector, index) => {\n        if (typeof selector !== \"function\") {\n          errors.push(`stateSelectors[${index}] must be a function`);\n        }\n      });\n    }\n  }\n\n  // Validate maxBufferSize\n  if (config.maxBufferSize !== undefined) {\n    if (typeof config.maxBufferSize !== \"number\") {\n      errors.push(\"maxBufferSize must be a number\");\n    } else if (config.maxBufferSize < 1) {\n      errors.push(\"maxBufferSize must be at least 1\");\n    } else if (config.maxBufferSize > 100000) {\n      warnings.push(\n        \"maxBufferSize is very large (>100000), this may cause memory issues\",\n      );\n    }\n  }\n\n  // Validate logLevel\n  if (config.logLevel !== undefined) {\n    if (!VALID_LOG_LEVELS.includes(config.logLevel)) {\n      errors.push(`logLevel must be one of: ${VALID_LOG_LEVELS.join(\", \")}`);\n    }\n  }\n\n  // Validate appVersion\n  if (\n    config.appVersion !== undefined &&\n    typeof config.appVersion !== \"string\"\n  ) {\n    errors.push(\"appVersion must be a string\");\n  }\n\n  // Validate pollingInterval\n  if (config.pollingInterval !== undefined) {\n    if (typeof config.pollingInterval !== \"number\") {\n      errors.push(\"pollingInterval must be a number\");\n    } else if (config.pollingInterval < 10) {\n      errors.push(\"pollingInterval must be at least 10ms\");\n    } else if (config.pollingInterval < 50) {\n      warnings.push(\n        \"pollingInterval is very low (<50ms), this may impact performance\",\n      );\n    }\n  }\n\n  // Validate rateLimiting\n  if (config.rateLimiting !== undefined) {\n    if (\n      typeof config.rateLimiting !== \"object\" ||\n      config.rateLimiting === null\n    ) {\n      errors.push(\"rateLimiting must be an object\");\n    } else {\n      const rl = config.rateLimiting;\n      if (rl.enabled !== undefined && typeof rl.enabled !== \"boolean\") {\n        errors.push(\"rateLimiting.enabled must be a boolean\");\n      }\n      if (rl.maxEventsPerSecond !== undefined) {\n        if (typeof rl.maxEventsPerSecond !== \"number\") {\n          errors.push(\"rateLimiting.maxEventsPerSecond must be a number\");\n        } else if (rl.maxEventsPerSecond < 1) {\n          errors.push(\"rateLimiting.maxEventsPerSecond must be at least 1\");\n        }\n      }\n      if (rl.samplingRate !== undefined) {\n        if (typeof rl.samplingRate !== \"number\") {\n          errors.push(\"rateLimiting.samplingRate must be a number\");\n        } else if (rl.samplingRate < 0 || rl.samplingRate > 1) {\n          errors.push(\"rateLimiting.samplingRate must be between 0 and 1\");\n        }\n      }\n    }\n  }\n\n  // Validate deduplication\n  if (config.deduplication !== undefined) {\n    if (\n      typeof config.deduplication !== \"object\" ||\n      config.deduplication === null\n    ) {\n      errors.push(\"deduplication must be an object\");\n    } else {\n      const dd = config.deduplication;\n      if (dd.enabled !== undefined && typeof dd.enabled !== \"boolean\") {\n        errors.push(\"deduplication.enabled must be a boolean\");\n      }\n      if (dd.windowMs !== undefined) {\n        if (typeof dd.windowMs !== \"number\") {\n          errors.push(\"deduplication.windowMs must be a number\");\n        } else if (dd.windowMs < 100) {\n          errors.push(\"deduplication.windowMs must be at least 100ms\");\n        }\n      }\n      if (dd.fields !== undefined) {\n        if (!Array.isArray(dd.fields)) {\n          errors.push(\"deduplication.fields must be an array\");\n        } else {\n          const validFields = [\"message\", \"scope\", \"level\", \"tags\", \"state\"];\n          dd.fields.forEach((field, index) => {\n            if (typeof field !== \"string\") {\n              errors.push(`deduplication.fields[${index}] must be a string`);\n            } else if (!validFields.includes(field)) {\n              errors.push(\n                `deduplication.fields[${index}] \"${field}\" is not a valid field. Valid fields: ${validFields.join(\", \")}`,\n              );\n            }\n          });\n        }\n      }\n    }\n  }\n\n  // Validate customLevels\n  if (config.customLevels !== undefined) {\n    if (!Array.isArray(config.customLevels)) {\n      errors.push(\"customLevels must be an array\");\n    } else {\n      const seenNames = new Set<string>();\n      // These names are completely reserved and cannot be used\n      const reservedNames = [\"log\", \"event\"];\n\n      config.customLevels.forEach((level, index) => {\n        if (typeof level.name !== \"string\" || level.name.trim() === \"\") {\n          errors.push(`customLevels[${index}].name must be a non-empty string`);\n        } else {\n          // Check for duplicates\n          if (seenNames.has(level.name)) {\n            errors.push(\n              `customLevels[${index}].name \"${level.name}\" is a duplicate`,\n            );\n          }\n          seenNames.add(level.name);\n\n          // Check for completely reserved names (method names)\n          if (reservedNames.includes(level.name.toLowerCase())) {\n            errors.push(\n              `customLevels[${index}].name \"${level.name}\" is a reserved method name`,\n            );\n          }\n\n          // Warn if shadowing a built-in level\n          if (VALID_LOG_LEVELS.includes(level.name as LogLevel)) {\n            warnings.push(\n              `customLevels[${index}].name \"${level.name}\" shadows a built-in level`,\n            );\n          }\n        }\n        if (typeof level.severity !== \"number\") {\n          errors.push(`customLevels[${index}].severity must be a number`);\n        }\n      });\n    }\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n    warnings,\n  };\n}\n\n/**\n * Throws an error if config is invalid\n */\nexport function assertValidConfig(config: Partial<SatoriConfig>): void {\n  const result = validateConfig(config);\n  if (!result.valid) {\n    throw new Error(\n      `Invalid Satori configuration:\\n${result.errors.join(\"\\n\")}`,\n    );\n  }\n}\n","/**\n * Persistence Layer\n * Provides async persistence adapters for log entries\n */\n\nimport type {\n  LogEntry,\n  PersistenceAdapter,\n  PersistenceReadOptions,\n  PersistenceConfig,\n} from \"../core/types.js\";\n\n/**\n * In-memory persistence adapter (useful for testing)\n */\nexport class MemoryAdapter implements PersistenceAdapter {\n  name = \"memory\";\n  private store: LogEntry[] = [];\n  private maxSize: number;\n\n  constructor(maxSize = 10000) {\n    this.maxSize = maxSize;\n  }\n\n  async write(entries: LogEntry[]): Promise<void> {\n    this.store.push(...entries);\n\n    // Trim if over max size\n    if (this.store.length > this.maxSize) {\n      this.store = this.store.slice(-this.maxSize);\n    }\n  }\n\n  async read(options?: PersistenceReadOptions): Promise<LogEntry[]> {\n    let results = [...this.store];\n\n    if (options?.startTime) {\n      results = results.filter((e) => e.timestamp >= options.startTime!);\n    }\n    if (options?.endTime) {\n      results = results.filter((e) => e.timestamp <= options.endTime!);\n    }\n    if (options?.levels?.length) {\n      results = results.filter((e) => options.levels!.includes(e.level));\n    }\n    if (options?.scopes?.length) {\n      results = results.filter((e) => options.scopes!.includes(e.scope));\n    }\n    if (options?.offset) {\n      results = results.slice(options.offset);\n    }\n    if (options?.limit) {\n      results = results.slice(0, options.limit);\n    }\n\n    return results;\n  }\n\n  async clear(): Promise<void> {\n    this.store = [];\n  }\n\n  async close(): Promise<void> {\n    // No-op for memory adapter\n  }\n\n  getSize(): number {\n    return this.store.length;\n  }\n}\n\n/**\n * LocalStorage persistence adapter (browser only)\n */\nexport class LocalStorageAdapter implements PersistenceAdapter {\n  name = \"localStorage\";\n  private storageKey: string;\n  private maxSize: number;\n\n  constructor(storageKey = \"satori_logs\", maxSize = 1000) {\n    this.storageKey = storageKey;\n    this.maxSize = maxSize;\n  }\n\n  async write(entries: LogEntry[]): Promise<void> {\n    if (typeof localStorage === \"undefined\") {\n      throw new Error(\"localStorage is not available in this environment\");\n    }\n\n    const existing = await this.read();\n    const combined = [...existing, ...entries];\n\n    // Trim if over max size\n    const trimmed = combined.slice(-this.maxSize);\n\n    localStorage.setItem(this.storageKey, JSON.stringify(trimmed));\n  }\n\n  async read(options?: PersistenceReadOptions): Promise<LogEntry[]> {\n    if (typeof localStorage === \"undefined\") {\n      return [];\n    }\n\n    const stored = localStorage.getItem(this.storageKey);\n    if (!stored) return [];\n\n    let results: LogEntry[];\n    try {\n      results = JSON.parse(stored);\n    } catch {\n      return [];\n    }\n\n    if (options?.startTime) {\n      results = results.filter((e) => e.timestamp >= options.startTime!);\n    }\n    if (options?.endTime) {\n      results = results.filter((e) => e.timestamp <= options.endTime!);\n    }\n    if (options?.levels?.length) {\n      results = results.filter((e) => options.levels!.includes(e.level));\n    }\n    if (options?.scopes?.length) {\n      results = results.filter((e) => options.scopes!.includes(e.scope));\n    }\n    if (options?.offset) {\n      results = results.slice(options.offset);\n    }\n    if (options?.limit) {\n      results = results.slice(0, options.limit);\n    }\n\n    return results;\n  }\n\n  async clear(): Promise<void> {\n    if (typeof localStorage !== \"undefined\") {\n      localStorage.removeItem(this.storageKey);\n    }\n  }\n\n  async close(): Promise<void> {\n    // No-op for localStorage\n  }\n}\n\n/**\n * IndexedDB persistence adapter (browser only, larger capacity)\n */\nexport class IndexedDBAdapter implements PersistenceAdapter {\n  name = \"indexedDB\";\n  private dbName: string;\n  private storeName = \"logs\";\n  private db: IDBDatabase | null = null;\n  private maxSize: number;\n\n  constructor(dbName = \"satori\", maxSize = 100000) {\n    this.dbName = dbName;\n    this.maxSize = maxSize;\n  }\n\n  private async getDB(): Promise<IDBDatabase> {\n    if (this.db) return this.db;\n\n    return new Promise((resolve, reject) => {\n      if (typeof indexedDB === \"undefined\") {\n        reject(new Error(\"IndexedDB is not available in this environment\"));\n        return;\n      }\n\n      const request = indexedDB.open(this.dbName, 1);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => {\n        this.db = request.result;\n        resolve(this.db);\n      };\n\n      request.onupgradeneeded = () => {\n        const db = request.result;\n        if (!db.objectStoreNames.contains(this.storeName)) {\n          const store = db.createObjectStore(this.storeName, { keyPath: \"id\" });\n          store.createIndex(\"timestamp\", \"timestamp\");\n          store.createIndex(\"level\", \"level\");\n          store.createIndex(\"scope\", \"scope\");\n        }\n      };\n    });\n  }\n\n  async write(entries: LogEntry[]): Promise<void> {\n    const db = await this.getDB();\n\n    return new Promise((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, \"readwrite\");\n      const store = transaction.objectStore(this.storeName);\n\n      for (const entry of entries) {\n        store.put(entry);\n      }\n\n      transaction.oncomplete = () => resolve();\n      transaction.onerror = () => reject(transaction.error);\n    });\n  }\n\n  async read(options?: PersistenceReadOptions): Promise<LogEntry[]> {\n    const db = await this.getDB();\n\n    return new Promise((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, \"readonly\");\n      const store = transaction.objectStore(this.storeName);\n      const index = store.index(\"timestamp\");\n\n      const results: LogEntry[] = [];\n      const request = index.openCursor();\n\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor) {\n          const entry = cursor.value as LogEntry;\n          let include = true;\n\n          if (options?.startTime && entry.timestamp < options.startTime) {\n            include = false;\n          }\n          if (options?.endTime && entry.timestamp > options.endTime) {\n            include = false;\n          }\n          if (\n            options?.levels?.length &&\n            !options.levels.includes(entry.level)\n          ) {\n            include = false;\n          }\n          if (\n            options?.scopes?.length &&\n            !options.scopes.includes(entry.scope)\n          ) {\n            include = false;\n          }\n\n          if (include) {\n            results.push(entry);\n          }\n\n          cursor.continue();\n        } else {\n          let finalResults = results;\n          if (options?.offset) {\n            finalResults = finalResults.slice(options.offset);\n          }\n          if (options?.limit) {\n            finalResults = finalResults.slice(0, options.limit);\n          }\n          resolve(finalResults);\n        }\n      };\n\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async clear(): Promise<void> {\n    const db = await this.getDB();\n\n    return new Promise((resolve, reject) => {\n      const transaction = db.transaction(this.storeName, \"readwrite\");\n      const store = transaction.objectStore(this.storeName);\n      const request = store.clear();\n\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  async close(): Promise<void> {\n    if (this.db) {\n      this.db.close();\n      this.db = null;\n    }\n  }\n}\n\n/**\n * Console adapter (logs to console, useful for debugging)\n */\nexport class ConsoleAdapter implements PersistenceAdapter {\n  name = \"console\";\n  private inMemory: LogEntry[] = [];\n\n  async write(entries: LogEntry[]): Promise<void> {\n    for (const entry of entries) {\n      const level = entry.level as string;\n      const method = level === \"debug\" ? \"log\" : level;\n      const consoleMethod =\n        (console as unknown as Record<string, (...args: unknown[]) => void>)[\n          method\n        ] ?? console.log;\n      consoleMethod(`[${entry.scope}] ${entry.message}`, entry);\n      this.inMemory.push(entry);\n    }\n  }\n\n  async read(): Promise<LogEntry[]> {\n    return [...this.inMemory];\n  }\n\n  async clear(): Promise<void> {\n    this.inMemory = [];\n  }\n\n  async close(): Promise<void> {\n    // No-op\n  }\n}\n\n/**\n * Persistence manager for batched writes\n */\nexport class PersistenceManager {\n  private buffer: LogEntry[] = [];\n  private flushTimer: ReturnType<typeof setInterval> | null = null;\n  private config: PersistenceConfig;\n\n  constructor(config: PersistenceConfig) {\n    this.config = config;\n\n    if (config.enabled && config.flushInterval) {\n      this.startAutoFlush();\n    }\n  }\n\n  /**\n   * Add an entry to the persistence buffer\n   */\n  add(entry: LogEntry): void {\n    if (!this.config.enabled) return;\n\n    this.buffer.push(entry);\n\n    // Auto-flush if batch size reached\n    if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n      this.flush();\n    }\n  }\n\n  /**\n   * Flush the buffer to the adapter\n   */\n  async flush(): Promise<void> {\n    if (this.buffer.length === 0) return;\n\n    const toFlush = [...this.buffer];\n    this.buffer = [];\n\n    try {\n      await this.config.adapter.write(toFlush);\n    } catch (error) {\n      // Re-add entries on failure (with limit to prevent infinite growth)\n      if (this.buffer.length < 10000) {\n        this.buffer = [...toFlush, ...this.buffer];\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Start auto-flush timer\n   */\n  private startAutoFlush(): void {\n    if (this.flushTimer) return;\n\n    this.flushTimer = setInterval(() => {\n      this.flush().catch(console.error);\n    }, this.config.flushInterval);\n  }\n\n  /**\n   * Stop auto-flush and close adapter\n   */\n  async close(): Promise<void> {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = null;\n    }\n\n    // Final flush\n    await this.flush();\n    await this.config.adapter.close?.();\n  }\n\n  /**\n   * Get buffer size\n   */\n  getBufferSize(): number {\n    return this.buffer.length;\n  }\n}\n","import type {\n  SatoriInstance,\n  SatoriConfig,\n  SatoriLogger,\n  SatoriMetrics,\n} from \"../core/types.js\";\nimport { SimpleEventBus } from \"../bus/eventBus.js\";\nimport { ScopedLogger } from \"./createLogger.js\";\nimport { DEFAULT_CONFIG } from \"../core/config.js\";\nimport { validateConfig, assertValidConfig } from \"../core/validation.js\";\nimport { PersistenceManager } from \"../persistence/adapters.js\";\nimport { MetricsCollector } from \"../core/metrics.js\";\n\nexport function createSatori(\n  config: Partial<SatoriConfig> = {},\n): SatoriInstance {\n  // Validate configuration\n  const validation = validateConfig(config);\n  if (!validation.valid) {\n    throw new Error(\n      `Invalid Satori configuration:\\n${validation.errors.join(\"\\n\")}`,\n    );\n  }\n\n  // Log warnings\n  if (validation.warnings.length > 0) {\n    console.warn(\"Satori configuration warnings:\", validation.warnings);\n  }\n\n  const resolvedConfig: SatoriConfig = {\n    ...DEFAULT_CONFIG,\n    ...config,\n    // Merge nested configs properly\n    rateLimiting: { ...DEFAULT_CONFIG.rateLimiting, ...config.rateLimiting },\n    deduplication: { ...DEFAULT_CONFIG.deduplication, ...config.deduplication },\n    circuitBreaker: {\n      ...DEFAULT_CONFIG.circuitBreaker,\n      ...config.circuitBreaker,\n    },\n  };\n\n  const bus = new SimpleEventBus({\n    maxBufferSize: resolvedConfig.maxBufferSize,\n    rateLimiting: resolvedConfig.rateLimiting,\n    deduplication: resolvedConfig.deduplication,\n    circuitBreaker: resolvedConfig.circuitBreaker,\n    enableMetrics: resolvedConfig.enableMetrics,\n  });\n\n  // Auto-log to console when available (disabled by default in tests)\n  const isTestEnv =\n    typeof process !== \"undefined\" && process.env?.NODE_ENV === \"test\";\n  if (\n    !isTestEnv &&\n    resolvedConfig.enableConsole !== false &&\n    typeof console !== \"undefined\"\n  ) {\n    bus.subscribe((entry) => {\n      const level = entry.level as string;\n      const method = level === \"debug\" ? \"log\" : level;\n      const consoleMethod =\n        (console as unknown as Record<string, (...args: unknown[]) => void>)[\n          method\n        ] ?? console.log;\n      consoleMethod(`[${entry.scope}] ${entry.message}`, entry);\n    });\n  }\n\n  const rootLogger = new ScopedLogger(\"root\", resolvedConfig, bus);\n  const loggers = new Map<string, ScopedLogger>();\n  loggers.set(\"root\", rootLogger);\n\n  // Set up persistence if configured\n  let persistenceManager: PersistenceManager | null = null;\n  if (resolvedConfig.persistence?.enabled) {\n    persistenceManager = new PersistenceManager(resolvedConfig.persistence);\n\n    // Subscribe to bus to persist events\n    bus.subscribe((entry) => {\n      persistenceManager?.add(entry);\n    });\n  }\n\n  // Metrics for tracking\n  const metrics = new MetricsCollector();\n  const startTime = Date.now();\n\n  return {\n    config: resolvedConfig,\n    bus,\n    rootLogger,\n\n    createLogger(scope: string): SatoriLogger {\n      const logger = new ScopedLogger(scope, resolvedConfig, bus);\n      loggers.set(scope, logger);\n      metrics.setLoggerCount(loggers.size);\n      return logger;\n    },\n\n    getMetrics(): SatoriMetrics {\n      // Calculate total watcher count\n      let watcherCount = 0;\n      for (const logger of loggers.values()) {\n        if (!logger.isDisposed()) {\n          watcherCount += logger.getWatcherCount();\n        }\n      }\n      metrics.setWatcherCount(watcherCount);\n\n      return {\n        bus: bus.getMetrics(),\n        loggerCount: loggers.size,\n        watcherCount,\n        circuitState: bus.getCircuitBreaker().getState(),\n        uptime: Date.now() - startTime,\n      };\n    },\n\n    async flush(): Promise<void> {\n      if (persistenceManager) {\n        await persistenceManager.flush();\n      }\n    },\n\n    dispose(): void {\n      // Dispose all loggers\n      for (const logger of loggers.values()) {\n        logger.dispose();\n      }\n      loggers.clear();\n\n      // Clear bus\n      const buffer = bus.getReplayBuffer?.();\n      if (buffer) {\n        buffer.length = 0;\n      }\n      bus.reset();\n\n      // Close persistence\n      if (persistenceManager) {\n        persistenceManager.close().catch(console.error);\n      }\n    },\n  };\n}\n","import type { LogEntry, LogLevel, CustomLogLevel } from \"../core/types.js\";\n\nconst BUILTIN_LEVELS: Record<string, number> = {\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n};\n\nexport function filterByLevel(\n  events: LogEntry[],\n  minLevel?: LogLevel | string,\n  customLevels?: CustomLogLevel[],\n): LogEntry[] {\n  if (!minLevel) return events;\n\n  // Build combined level map\n  const levels: Record<string, number> = { ...BUILTIN_LEVELS };\n  if (customLevels) {\n    for (const level of customLevels) {\n      levels[level.name] = level.severity;\n    }\n  }\n\n  const minSeverity = levels[minLevel] ?? 1;\n  return events.filter((event) => (levels[event.level] ?? 1) >= minSeverity);\n}\n\nexport function filterByScopes(\n  events: LogEntry[],\n  scopes: string[],\n): LogEntry[] {\n  if (scopes.length === 0) return events;\n  return events.filter((event) => scopes.includes(event.scope));\n}\n\nexport function filterByScopePattern(\n  events: LogEntry[],\n  pattern: string | RegExp,\n): LogEntry[] {\n  const regex = typeof pattern === \"string\" ? new RegExp(pattern) : pattern;\n  return events.filter((event) => regex.test(event.scope));\n}\n\nexport function filterByTags(events: LogEntry[], tags: string[]): LogEntry[] {\n  if (tags.length === 0) return events;\n  return events.filter((event) => tags.some((tag) => event.tags.includes(tag)));\n}\n\nexport function filterByAllTags(\n  events: LogEntry[],\n  tags: string[],\n): LogEntry[] {\n  if (tags.length === 0) return events;\n  return events.filter((event) =>\n    tags.every((tag) => event.tags.includes(tag)),\n  );\n}\n\nexport function filterByText(\n  events: LogEntry[],\n  searchText?: string,\n): LogEntry[] {\n  if (!searchText || searchText.trim() === \"\") return events;\n\n  const term = searchText.toLowerCase();\n  return events.filter(\n    (event) =>\n      event.message.toLowerCase().includes(term) ||\n      event.scope.toLowerCase().includes(term) ||\n      event.tags.some((tag) => tag.toLowerCase().includes(term)),\n  );\n}\n\nexport function filterByRegex(\n  events: LogEntry[],\n  pattern: string | RegExp,\n): LogEntry[] {\n  const regex =\n    typeof pattern === \"string\" ? new RegExp(pattern, \"i\") : pattern;\n  return events.filter(\n    (event) =>\n      regex.test(event.message) ||\n      regex.test(event.scope) ||\n      event.tags.some((tag) => regex.test(tag)),\n  );\n}\n\nexport function filterByTimeRange(\n  events: LogEntry[],\n  startTime?: number,\n  endTime?: number,\n): LogEntry[] {\n  return events.filter((event) => {\n    if (startTime && event.timestamp < startTime) return false;\n    if (endTime && event.timestamp > endTime) return false;\n    return true;\n  });\n}\n\nexport function filterByRelativeTime(\n  events: LogEntry[],\n  msAgo: number,\n): LogEntry[] {\n  const cutoff = Date.now() - msAgo;\n  return events.filter((event) => event.timestamp >= cutoff);\n}\n\nexport function filterByCause(\n  events: LogEntry[],\n  causeEventId: string,\n): LogEntry[] {\n  return events.filter((event) => event.causeEventId === causeEventId);\n}\n\nexport function filterByHasCause(events: LogEntry[]): LogEntry[] {\n  return events.filter((event) => event.causeEventId !== undefined);\n}\n\nexport function filterByState(\n  events: LogEntry[],\n  predicate: (state: Record<string, unknown> | undefined) => boolean,\n): LogEntry[] {\n  return events.filter((event) => predicate(event.state));\n}\n\nexport function filterByStateKey(events: LogEntry[], key: string): LogEntry[] {\n  return events.filter((event) => event.state && key in event.state);\n}\n\nexport function filterByStateValue(\n  events: LogEntry[],\n  key: string,\n  value: unknown,\n): LogEntry[] {\n  return events.filter((event) => event.state && event.state[key] === value);\n}\n\nexport interface FilterOptions {\n  level?: LogLevel | string;\n  scopes?: string[];\n  scopePattern?: string | RegExp;\n  tags?: string[];\n  allTags?: string[];\n  text?: string;\n  regex?: string | RegExp;\n  startTime?: number;\n  endTime?: number;\n  relativeTime?: number;\n  causeEventId?: string;\n  hasCause?: boolean;\n  stateKey?: string;\n  statePredicate?: (state: Record<string, unknown> | undefined) => boolean;\n  customLevels?: CustomLogLevel[];\n}\n\nexport function applyAllFilters(\n  events: LogEntry[],\n  filters:\n    | FilterOptions\n    | {\n        level?: LogLevel;\n        scopes: string[];\n        tags: string[];\n        text?: string;\n      },\n): LogEntry[] {\n  let filtered = events;\n\n  // Level filter\n  if (\"level\" in filters && filters.level) {\n    filtered = filterByLevel(\n      filtered,\n      filters.level,\n      (filters as FilterOptions).customLevels,\n    );\n  }\n\n  // Scope filters\n  if (\"scopes\" in filters && filters.scopes && filters.scopes.length > 0) {\n    filtered = filterByScopes(filtered, filters.scopes);\n  }\n  if (\"scopePattern\" in filters && (filters as FilterOptions).scopePattern) {\n    filtered = filterByScopePattern(\n      filtered,\n      (filters as FilterOptions).scopePattern!,\n    );\n  }\n\n  // Tag filters\n  if (\"tags\" in filters && filters.tags && filters.tags.length > 0) {\n    filtered = filterByTags(filtered, filters.tags);\n  }\n  if (\n    \"allTags\" in filters &&\n    (filters as FilterOptions).allTags &&\n    (filters as FilterOptions).allTags!.length > 0\n  ) {\n    filtered = filterByAllTags(filtered, (filters as FilterOptions).allTags!);\n  }\n\n  // Text/Regex filters\n  if (\"text\" in filters && filters.text) {\n    filtered = filterByText(filtered, filters.text);\n  }\n  if (\"regex\" in filters && (filters as FilterOptions).regex) {\n    filtered = filterByRegex(filtered, (filters as FilterOptions).regex!);\n  }\n\n  // Time filters\n  const opts = filters as FilterOptions;\n  if (opts.startTime || opts.endTime) {\n    filtered = filterByTimeRange(filtered, opts.startTime, opts.endTime);\n  }\n  if (opts.relativeTime) {\n    filtered = filterByRelativeTime(filtered, opts.relativeTime);\n  }\n\n  // Causal filters\n  if (opts.causeEventId) {\n    filtered = filterByCause(filtered, opts.causeEventId);\n  }\n  if (opts.hasCause) {\n    filtered = filterByHasCause(filtered);\n  }\n\n  // State filters\n  if (opts.stateKey) {\n    filtered = filterByStateKey(filtered, opts.stateKey);\n  }\n  if (opts.statePredicate) {\n    filtered = filterByState(filtered, opts.statePredicate);\n  }\n\n  return filtered;\n}\n\n/**\n * Group events by a specified field\n */\nexport function groupBy<K extends keyof LogEntry>(\n  events: LogEntry[],\n  field: K,\n): Map<LogEntry[K], LogEntry[]> {\n  const groups = new Map<LogEntry[K], LogEntry[]>();\n\n  for (const event of events) {\n    const key = event[field];\n    const existing = groups.get(key) || [];\n    existing.push(event);\n    groups.set(key, existing);\n  }\n\n  return groups;\n}\n\n/**\n * Aggregate events by time buckets\n */\nexport function aggregateByTime(\n  events: LogEntry[],\n  bucketSizeMs: number,\n): Map<number, LogEntry[]> {\n  const buckets = new Map<number, LogEntry[]>();\n  if (events.length === 0) {\n    return buckets;\n  }\n\n  const base = Math.min(...events.map((e) => e.timestamp));\n\n  for (const event of events) {\n    const bucket =\n      Math.floor((event.timestamp - base) / bucketSizeMs) * bucketSizeMs + base;\n    const existing = buckets.get(bucket) || [];\n    existing.push(event);\n    buckets.set(bucket, existing);\n  }\n\n  return buckets;\n}\n\n/**\n * Get event counts by level\n */\nexport function countByLevel(events: LogEntry[]): Record<string, number> {\n  const counts: Record<string, number> = {};\n\n  for (const event of events) {\n    counts[event.level] = (counts[event.level] || 0) + 1;\n  }\n\n  return counts;\n}\n\n/**\n * Get event counts by scope\n */\nexport function countByScope(events: LogEntry[]): Record<string, number> {\n  const counts: Record<string, number> = {};\n\n  for (const event of events) {\n    counts[event.scope] = (counts[event.scope] || 0) + 1;\n  }\n\n  return counts;\n}\n","import type { LogEntry, LogLevel } from \"../core/types.js\";\nimport { applyAllFilters } from \"./filters.js\";\n\nexport class OverlayState {\n  private events: LogEntry[] = [];\n  private selectedEventId?: string;\n  private filters = {\n    level: undefined as LogLevel | undefined,\n    scopes: [] as string[],\n    tags: [] as string[],\n    text: undefined as string | undefined,\n  };\n\n  addEvent(event: LogEntry): void {\n    this.events.push(event);\n  }\n\n  getAllEvents(): LogEntry[] {\n    return [...this.events];\n  }\n\n  getFilteredEvents(): LogEntry[] {\n    return applyAllFilters(this.events, this.filters);\n  }\n\n  selectEvent(id?: string): void {\n    this.selectedEventId = id;\n  }\n\n  getSelectedEventId(): string | undefined {\n    return this.selectedEventId;\n  }\n\n  getSelectedEvent(): LogEntry | undefined {\n    if (!this.selectedEventId) return undefined;\n    return this.events.find((event) => event.id === this.selectedEventId);\n  }\n\n  getEventById(id: string): LogEntry | undefined {\n    return this.events.find((event) => event.id === id);\n  }\n\n  setLevelFilter(level?: LogLevel): void {\n    this.filters.level = level;\n  }\n\n  getLevelFilter(): LogLevel | undefined {\n    return this.filters.level;\n  }\n\n  setScopeFilter(scopes: string[]): void {\n    this.filters.scopes = [...scopes];\n  }\n\n  getScopeFilter(): string[] {\n    return [...this.filters.scopes];\n  }\n\n  setTagFilter(tags: string[]): void {\n    this.filters.tags = [...tags];\n  }\n\n  getTagFilter(): string[] {\n    return [...this.filters.tags];\n  }\n\n  setTextFilter(text?: string): void {\n    this.filters.text = text;\n  }\n\n  getTextFilter(): string | undefined {\n    return this.filters.text;\n  }\n\n  clear(): void {\n    this.events.length = 0;\n    this.selectedEventId = undefined;\n    this.filters = {\n      level: undefined,\n      scopes: [],\n      tags: [],\n      text: undefined,\n    };\n  }\n}\n","import type { EventBus, LogEntry, LogLevel } from \"../core/types.js\";\nimport { OverlayState } from \"./overlayState.js\";\n\nexport class OverlayBridge {\n  private state = new OverlayState();\n  private unsubscribe?: () => void;\n\n  constructor(private eventBus: EventBus) {\n    this.subscribe();\n  }\n\n  private subscribe(): void {\n    this.unsubscribe = this.eventBus.subscribe((entry) => {\n      this.state.addEvent(entry);\n    });\n  }\n\n  getFilteredEvents(): LogEntry[] {\n    return this.state.getFilteredEvents();\n  }\n\n  setLevelFilter(level?: LogLevel): void {\n    this.state.setLevelFilter(level);\n  }\n\n  setScopeFilter(scopes: string[]): void {\n    this.state.setScopeFilter(scopes);\n  }\n\n  setTagFilter(tags: string[]): void {\n    this.state.setTagFilter(tags);\n  }\n\n  setTextFilter(text?: string): void {\n    this.state.setTextFilter(text);\n  }\n\n  selectEvent(id?: string): void {\n    this.state.selectEvent(id);\n  }\n\n  getSelectedEvent(): LogEntry | undefined {\n    return this.state.getSelectedEvent();\n  }\n\n  getEventById(id: string): LogEntry | undefined {\n    return this.state.getEventById(id);\n  }\n\n  clearEvents(): void {\n    this.state.clear();\n  }\n\n  dispose(): void {\n    if (this.unsubscribe) {\n      this.unsubscribe();\n      this.unsubscribe = undefined;\n    }\n    this.state.clear();\n  }\n\n  getState(): {\n    events: LogEntry[];\n    filteredEvents: LogEntry[];\n    selectedEventId?: string;\n    selectedEvent?: LogEntry;\n    filters: {\n      level?: LogLevel;\n      scopes: string[];\n      tags: string[];\n      text?: string;\n    };\n  } {\n    return {\n      events: this.state.getAllEvents(),\n      filteredEvents: this.state.getFilteredEvents(),\n      selectedEventId: this.state.getSelectedEventId(),\n      selectedEvent: this.state.getSelectedEvent(),\n      filters: {\n        level: this.state.getLevelFilter(),\n        scopes: this.state.getScopeFilter(),\n        tags: this.state.getTagFilter(),\n        text: this.state.getTextFilter(),\n      },\n    };\n  }\n}\n","import type { LogEntry, LogLevel, Middleware } from \"../core/types.js\";\n\nexport function createLevelFilter(minLevel: LogLevel): Middleware {\n  const levels: Record<string, number> = {\n    debug: 0,\n    info: 1,\n    warn: 2,\n    error: 3,\n  };\n\n  const minSeverity = levels[minLevel];\n\n  return (entry, next) => {\n    if ((levels[entry.level] ?? 0) >= minSeverity) {\n      next();\n    }\n  };\n}\n\nexport function createTagFilter(allowedTags: string[]): Middleware {\n  return (entry, next) => {\n    if (\n      allowedTags.length === 0 ||\n      entry.tags.some((tag) => allowedTags.includes(tag))\n    ) {\n      next();\n    }\n  };\n}\n\nexport function createScopeFilter(allowedScopes: string[]): Middleware {\n  return (entry, next) => {\n    if (allowedScopes.length === 0 || allowedScopes.includes(entry.scope)) {\n      next();\n    }\n  };\n}\n\nexport function createTextFilter(searchTerm: string): Middleware {\n  const term = searchTerm.toLowerCase();\n  return (entry, next) => {\n    if (\n      term === \"\" ||\n      entry.message.toLowerCase().includes(term) ||\n      entry.scope.toLowerCase().includes(term) ||\n      entry.tags.some((tag) => tag.toLowerCase().includes(term))\n    ) {\n      next();\n    }\n  };\n}\n"],"names":["RateLimiter","config","entry","now","ts","entries","deepEqual","a","b","seen","aObj","bObj","key","value","aArr","bArr","aVal","found","bVal","aIndices","k","bIndices","idx","i","aHas","bHas","aKeys","bKeys","aRecord","bRecord","deepClone","objValue","cloned","v","computeHash","Deduplicator","parts","field","dedupKey","existing","oldest","oldestTime","CircuitBreaker","events","fn","CircuitOpenError","result","error","newState","previousState","message","MetricsCollector","count","size","state","snapshot","acc","s","globalMetrics","getGlobalMetrics","resetGlobalMetrics","DEFAULT_RATE_LIMIT_CONFIG","DEFAULT_DEDUP_CONFIG","DEFAULT_CIRCUIT_BREAKER_CONFIG","DEFAULT_CONFIG","SimpleEventBus","rateLimitResult","index","runNext","sub","mw","middleware","counter","base","generateId","formatTimestamp","extractCallsite","depth","stack","callerLine","match","func","file","line","column","detectPlatform","getEnvInfo","platform","env","Deno","Bun","EdgeRuntime","captureStateSnapshot","selectorConfig","selector","name","err","createStateSelector","mergeSnapshots","snapshots","merged","diffSnapshots","prev","next","added","removed","changed","prevKeys","nextKeys","CausalGraph","eventId","scope","causeEventIds","node","causeId","causeNode","previousEventId","causes","visited","traverse","id","currentDepth","effects","effectId","chain","currentId","eventId1","eventId2","causes1","effects1","sortedNodes","e","effectNode","c","totalCauses","totalEffects","globalCausalGraph","scopeLastEvent","getCausalLink","updateCausalLink","clearCausalLinks","getCausalGraph","causalGraph","enrichEvent","input","timestamp","tags","causalLink","WatcherEngine","logger","source","label","getValue","handle","check","currentValue","changeLabel","prevStr","currStr","intervalId","predicate","onTrigger","handler","prevClone","currClone","watcher","BUILTIN_LEVELS","ScopedLogger","bus","lastEventId","level","options","minLevel","minSeverity","newLogger","messageOrEvent","VALID_LOG_LEVELS","validateConfig","errors","warnings","rl","dd","validFields","seenNames","reservedNames","assertValidConfig","MemoryAdapter","maxSize","results","LocalStorageAdapter","storageKey","trimmed","stored","IndexedDBAdapter","dbName","resolve","reject","request","db","store","transaction","cursor","include","finalResults","ConsoleAdapter","PersistenceManager","toFlush","createSatori","validation","resolvedConfig","rootLogger","loggers","persistenceManager","metrics","startTime","watcherCount","buffer","filterByLevel","customLevels","levels","event","filterByScopes","scopes","filterByScopePattern","pattern","regex","filterByTags","tag","filterByAllTags","filterByText","searchText","term","filterByRegex","filterByTimeRange","endTime","filterByRelativeTime","msAgo","cutoff","filterByCause","causeEventId","filterByHasCause","filterByState","filterByStateKey","filterByStateValue","applyAllFilters","filters","filtered","opts","groupBy","groups","aggregateByTime","bucketSizeMs","buckets","bucket","countByLevel","counts","countByScope","OverlayState","text","OverlayBridge","eventBus","createLevelFilter","createTagFilter","allowedTags","createScopeFilter","allowedScopes","createTextFilter","searchTerm"],"mappings":"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"}