{"version":3,"sources":["../src/parse-stack.ts","../src/breadcrumbs.ts","../src/tracing.ts","../src/client.ts","../src/server-reporter.ts","../src/index.ts"],"names":["uuid","_a","_b"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { StackFrame } from './types.js';\n\n// Chrome/V8:   \"  at functionName (filename:line:col)\"\n//              \"  at filename:line:col\"\nconst CHROME_RE = /^\\s*at (?:(.*?) \\()?(.+?):(\\d+):(\\d+)\\)?$/;\n\n// Firefox/Safari: \"functionName@filename:line:col\"\n//                 \"@filename:line:col\"\nconst FIREFOX_RE = /^(?:(.+?)@)?(.+?):(\\d+):(\\d+)$/;\n\n// Origins that are not \"in-app\" frames\nconst INTERNAL_PATTERNS = [/node_modules\\//, /bugcatch[-_]?sdk/, /^\\(native\\)$/, /^native code/];\n\nfunction isInApp(filename: string | undefined): boolean {\n  if (!filename) return false;\n  return !INTERNAL_PATTERNS.some((p) => p.test(filename));\n}\n\nfunction parseChromeLine(line: string): StackFrame | null {\n  const m = CHROME_RE.exec(line);\n  if (!m) return null;\n  const [, fn, filename, lineno, colno] = m;\n  return {\n    function: fn ?? '<anonymous>',\n    filename: filename ?? undefined,\n    lineno: lineno ? parseInt(lineno, 10) : undefined,\n    colno: colno ? parseInt(colno, 10) : undefined,\n    in_app: isInApp(filename ?? undefined),\n  };\n}\n\nfunction parseFirefoxLine(line: string): StackFrame | null {\n  const m = FIREFOX_RE.exec(line);\n  if (!m) return null;\n  const [, fn, filename, lineno, colno] = m;\n  return {\n    function: fn ?? '<anonymous>',\n    filename: filename ?? undefined,\n    lineno: lineno ? parseInt(lineno, 10) : undefined,\n    colno: colno ? parseInt(colno, 10) : undefined,\n    in_app: isInApp(filename ?? undefined),\n  };\n}\n\nexport function parseStack(error: Error): StackFrame[] {\n  const stack = error.stack;\n  if (!stack) return [];\n\n  const lines = stack.split('\\n');\n  const frames: StackFrame[] = [];\n\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (!trimmed || trimmed.startsWith('Error') || trimmed.startsWith(error.message ?? '')) {\n      continue;\n    }\n    const frame = parseChromeLine(trimmed) ?? parseFirefoxLine(trimmed);\n    if (frame) {\n      frames.push(frame);\n    }\n  }\n\n  // The API fingerprinting uses the LAST in-app frame, which maps to innermost\n  // call. Return in innermost-first order (as captured).\n  return frames;\n}\n","import type { BreadcrumbEntry } from './types.js';\n\nexport class BreadcrumbBuffer {\n  private readonly buffer: BreadcrumbEntry[] = [];\n  private readonly max: number;\n\n  constructor(max = 100) {\n    this.max = max;\n  }\n\n  add(crumb: BreadcrumbEntry): void {\n    if (this.buffer.length >= this.max) {\n      this.buffer.shift();\n    }\n    this.buffer.push(crumb);\n  }\n\n  getAll(): BreadcrumbEntry[] {\n    return [...this.buffer];\n  }\n\n  clear(): void {\n    this.buffer.length = 0;\n  }\n}\n\n// ─── Auto-capture helpers ─────────────────────────────────────────────────────\n\ntype AddFn = (crumb: BreadcrumbEntry) => void;\n\n/**\n * Patch History API (pushState / replaceState / popstate) to capture\n * navigation breadcrumbs.\n */\nexport function installNavigationBreadcrumbs(add: AddFn): () => void {\n  if (typeof window === 'undefined') return () => undefined;\n\n  const originalPush = history.pushState.bind(history);\n  const originalReplace = history.replaceState.bind(history);\n\n  history.pushState = function (...args) {\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'navigation',\n      category: 'navigation',\n      message: `Navigated to ${String(args[2] ?? '')}`,\n      data: { to: String(args[2] ?? '') },\n    });\n    return originalPush(...args);\n  };\n\n  history.replaceState = function (...args) {\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'navigation',\n      category: 'navigation',\n      message: `Replaced state: ${String(args[2] ?? '')}`,\n      data: { to: String(args[2] ?? '') },\n    });\n    return originalReplace(...args);\n  };\n\n  const onPopState = () => {\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'navigation',\n      category: 'navigation',\n      message: `Navigated back/forward to ${window.location.href}`,\n      data: { to: window.location.href },\n    });\n  };\n\n  window.addEventListener('popstate', onPopState);\n\n  return () => {\n    history.pushState = originalPush;\n    history.replaceState = originalReplace;\n    window.removeEventListener('popstate', onPopState);\n  };\n}\n\n/**\n * Capture click events as breadcrumbs (element tag + text).\n */\nexport function installClickBreadcrumbs(add: AddFn): () => void {\n  if (typeof document === 'undefined') return () => undefined;\n\n  const handler = (e: MouseEvent) => {\n    const target = e.target as HTMLElement | null;\n    if (!target) return;\n    const tag = target.tagName?.toLowerCase() ?? 'unknown';\n    const text = (target.textContent ?? '').trim().slice(0, 50);\n    const id = target.id ? `#${target.id}` : '';\n    const cls = target.className && typeof target.className === 'string'\n      ? `.${target.className.split(' ').join('.')}`\n      : '';\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'user',\n      category: 'ui.click',\n      message: `Click on <${tag}${id}${cls}>`,\n      data: { tag, text: text || undefined },\n    });\n  };\n\n  document.addEventListener('click', handler, { capture: true, passive: true });\n\n  return () => {\n    document.removeEventListener('click', handler, { capture: true });\n  };\n}\n\n/**\n * Capture console.warn and console.error calls as breadcrumbs.\n */\nexport function installConsoleBreadcrumbs(add: AddFn): () => void {\n  if (typeof console === 'undefined') return () => undefined;\n\n  const originalWarn = console.warn.bind(console);\n  const originalError = console.error.bind(console);\n\n  const formatArgs = (args: unknown[]): string =>\n    args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ').slice(0, 200);\n\n  console.warn = (...args: unknown[]) => {\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'console',\n      category: 'console',\n      message: formatArgs(args),\n      data: { level: 'warning' },\n    });\n    originalWarn(...args);\n  };\n\n  console.error = (...args: unknown[]) => {\n    add({\n      timestamp: new Date().toISOString(),\n      type: 'console',\n      category: 'console',\n      message: formatArgs(args),\n      data: { level: 'error' },\n    });\n    originalError(...args);\n  };\n\n  return () => {\n    console.warn = originalWarn;\n    console.error = originalError;\n  };\n}\n","import type { SpanPayload, TransactionPayload } from './types.js';\n\nfunction uuid(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n/** Shorter id than a full UUID - span_id only needs to be unique within one trace. */\nfunction shortId(): string {\n  return uuid().replace(/-/g, '').slice(0, 16);\n}\n\n/** One timed unit of work inside a transaction (a DB query, an outbound call). */\nexport class BugCatchSpan {\n  readonly spanId = shortId();\n  readonly startedAt = Date.now();\n  durationMs: number | undefined;\n  status = 'ok';\n\n  constructor(\n    private readonly transaction: BugCatchTransaction,\n    public readonly parentSpanId: string | undefined,\n    public readonly op: string,\n    public description?: string,\n    public tags?: Record<string, string>,\n  ) {}\n\n  /** Start a span nested inside this one. */\n  startChild(op: string, description?: string, tags?: Record<string, string>): BugCatchSpan {\n    return this.transaction.startChildSpan(this.spanId, op, description, tags);\n  }\n\n  setStatus(status: string): this {\n    this.status = status;\n    return this;\n  }\n\n  finish(status?: string): void {\n    if (this.durationMs !== undefined) return; // already finished\n    if (status) this.status = status;\n    this.durationMs = Date.now() - this.startedAt;\n  }\n\n  /** @internal */\n  toPayload(): SpanPayload {\n    return {\n      span_id: this.spanId,\n      parent_span_id: this.parentSpanId,\n      op: this.op,\n      description: this.description,\n      start_timestamp: new Date(this.startedAt).toISOString(),\n      duration_ms: this.durationMs ?? Date.now() - this.startedAt,\n      status: this.status,\n      tags: this.tags,\n    };\n  }\n}\n\n/**\n * The root of one traced operation - an HTTP request, a background job.\n * Created via `BugCatch.startTransaction()`, not directly.\n */\nexport class BugCatchTransaction {\n  readonly traceId = uuid();\n  readonly startedAt = Date.now();\n  durationMs: number | undefined;\n  status = 'ok';\n  statusCode: number | undefined;\n  tags: Record<string, string> | undefined;\n\n  private readonly spans: BugCatchSpan[] = [];\n\n  constructor(\n    public readonly name: string,\n    public readonly op: string,\n    private readonly onFinish: (txn: BugCatchTransaction) => void,\n  ) {}\n\n  /** Start a span as a direct child of the transaction. */\n  startChild(op: string, description?: string, tags?: Record<string, string>): BugCatchSpan {\n    return this.startChildSpan(undefined, op, description, tags);\n  }\n\n  setStatus(status: string): this {\n    this.status = status;\n    return this;\n  }\n\n  /** Convenience: maps >=400 (client errors included, not just 5xx server errors) to 'error', everything else to 'ok'. */\n  setHttpStatus(statusCode: number): this {\n    this.statusCode = statusCode;\n    this.status = statusCode >= 400 ? 'error' : 'ok';\n    return this;\n  }\n\n  setTag(key: string, value: string): this {\n    this.tags = { ...this.tags, [key]: value };\n    return this;\n  }\n\n  finish(status?: string): void {\n    if (this.durationMs !== undefined) return; // already finished\n    if (status) this.status = status;\n    this.durationMs = Date.now() - this.startedAt;\n\n    // Finish any spans the caller forgot to close, so a bug in instrumentation\n    // code doesn't silently drop the whole transaction.\n    for (const span of this.spans) {\n      span.finish();\n    }\n\n    this.onFinish(this);\n  }\n\n  /** @internal */\n  startChildSpan(\n    parentSpanId: string | undefined,\n    op: string,\n    description?: string,\n    tags?: Record<string, string>,\n  ): BugCatchSpan {\n    const span = new BugCatchSpan(this, parentSpanId, op, description, tags);\n    this.spans.push(span);\n    return span;\n  }\n\n  /** @internal */\n  toPayload(userId?: string, environment?: string, release?: string): TransactionPayload {\n    return {\n      trace_id: this.traceId,\n      name: this.name,\n      op: this.op,\n      start_timestamp: new Date(this.startedAt).toISOString(),\n      duration_ms: this.durationMs ?? Date.now() - this.startedAt,\n      status: this.status,\n      status_code: this.statusCode,\n      environment,\n      release,\n      user_id: userId,\n      tags: this.tags,\n      spans: this.spans.map((s) => s.toPayload()),\n    };\n  }\n}\n","import type {\n  BugCatchOptions,\n  UserContext,\n  BreadcrumbEntry,\n  EventPayload,\n  MetricPayload,\n  ParsedDsn,\n  ExceptionValue,\n  LogLevel,\n  LogPayload,\n  TransactionPayload,\n  SessionPayload,\n  SessionStatus,\n  WebVitalPayload,\n  WebVitalMetric,\n  ReplayChunkPayload,\n} from './types.js';\nimport { parseStack } from './parse-stack.js';\nimport {\n  BreadcrumbBuffer,\n  installNavigationBreadcrumbs,\n  installClickBreadcrumbs,\n  installConsoleBreadcrumbs,\n} from './breadcrumbs.js';\nimport { BugCatchTransaction } from './tracing.js';\n\n// ─── UUID ─────────────────────────────────────────────────────────────────────\n\nfunction uuid(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  // Fallback for older environments\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n// ─── Session status severity ────────────────────────────────────────────────\n\nconst SESSION_SEVERITY: Record<SessionStatus, number> = { ok: 0, errored: 1, crashed: 2 };\n\n/** Marks the handler an error came through - unhandled ones crash the session, manual `captureException()` calls only mark it \"errored\". */\nconst FATAL_HANDLERS = new Set([\n  'uncaughtException',\n  'unhandledRejection',\n  'window.onerror',\n  'unhandledrejection',\n]);\n\n// ─── DSN parser ───────────────────────────────────────────────────────────────\n\nfunction parseDsn(\n  dsn: string,\n): ParsedDsn & {\n  metricsUrl: string;\n  logsUrl: string;\n  transactionsUrl: string;\n  sessionsUrl: string;\n  webVitalsUrl: string;\n  replayUrl: string;\n  replayAllowedUrl: string;\n} {\n  let url: URL;\n  try {\n    url = new URL(dsn);\n  } catch {\n    throw new Error(`[BugCatch] Invalid DSN: \"${dsn}\"`);\n  }\n\n  const sdkKey = url.searchParams.get('key');\n  if (!sdkKey) {\n    throw new Error(`[BugCatch] DSN is missing the \"key\" query parameter: \"${dsn}\"`);\n  }\n\n  // Extract projectId from the last path segment (/ingest/{projectId})\n  const segments = url.pathname.split('/').filter(Boolean);\n  const projectId = segments[segments.length - 1];\n  if (!projectId) {\n    throw new Error(`[BugCatch] Could not extract projectId from DSN path: \"${dsn}\"`);\n  }\n\n  // Reconstruct the URL without extra query params\n  const ingestUrl = `${url.origin}${url.pathname}?key=${sdkKey}`;\n  const metricsUrl = `${url.origin}${url.pathname}/metrics?key=${sdkKey}`;\n  const logsUrl = `${url.origin}${url.pathname}/logs?key=${sdkKey}`;\n  const transactionsUrl = `${url.origin}${url.pathname}/transactions?key=${sdkKey}`;\n  const sessionsUrl = `${url.origin}${url.pathname}/sessions?key=${sdkKey}`;\n  const webVitalsUrl = `${url.origin}${url.pathname}/web-vitals?key=${sdkKey}`;\n  const replayUrl = `${url.origin}${url.pathname}/replay?key=${sdkKey}`;\n  const replayAllowedUrl = `${url.origin}${url.pathname}/replay-allowed?key=${sdkKey}`;\n\n  return {\n    ingestUrl,\n    metricsUrl,\n    logsUrl,\n    transactionsUrl,\n    sessionsUrl,\n    webVitalsUrl,\n    replayUrl,\n    replayAllowedUrl,\n    projectId,\n    sdkKey,\n  };\n}\n\n// ─── Route normalizer ─────────────────────────────────────────────────────────\n\n/**\n * Strips the origin and query string from a URL and replaces dynamic path\n * segments (UUIDs, numeric IDs) with `:id` so metrics group by route template.\n *\n * e.g. https://api.example.com/users/42/orders/abc-123?page=1 → /users/:id/orders/:id\n */\nfunction normalizeUrl(rawUrl: string): string {\n  let pathname: string;\n  try {\n    pathname = new URL(rawUrl).pathname;\n  } catch {\n    // rawUrl is already a path (e.g. \"/api/users/1\")\n    pathname = rawUrl.split('?')[0];\n  }\n  return pathname\n    .replace(/\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '/:id')\n    .replace(/\\/\\d{1,20}(?=\\/|$)/g, '/:id');\n}\n\n// ─── Pattern matching ─────────────────────────────────────────────────────────\n\nfunction matchesPattern(value: string, patterns: Array<string | RegExp>): boolean {\n  return patterns.some((p) =>\n    typeof p === 'string' ? value.includes(p) : p.test(value),\n  );\n}\n\n// ─── String truncation (span descriptions) ─────────────────────────────────────\n\nfunction truncate(value: string, max = 300): string {\n  return value.length > max ? `${value.slice(0, max)}…` : value;\n}\n\n// ─── Client ───────────────────────────────────────────────────────────────────\n\nexport class BugCatchClient {\n  private readonly opts: Required<\n    Pick<\n      BugCatchOptions,\n      | 'debug'\n      | 'maxBreadcrumbs'\n      | 'autoCaptureErrors'\n      | 'autoCaptureBreadcrumbs'\n      | 'autoTrackRequests'\n      | 'autoCaptureLogs'\n      | 'logsFlushInterval'\n      | 'logsBatchSize'\n      | 'tracesFlushInterval'\n      | 'tracesBatchSize'\n      | 'autoSessionTracking'\n      | 'sessionsFlushInterval'\n      | 'autoCaptureWebVitals'\n      | 'webVitalsFlushInterval'\n      | 'sessionReplay'\n      | 'replayFlushInterval'\n      | 'replayRequestTimeout'\n    >\n  > & BugCatchOptions;\n\n  private readonly dsn: ParsedDsn & {\n    metricsUrl: string;\n    logsUrl: string;\n    transactionsUrl: string;\n    sessionsUrl: string;\n    webVitalsUrl: string;\n    replayUrl: string;\n    replayAllowedUrl: string;\n  };\n  private readonly crumbs: BreadcrumbBuffer;\n  private user: UserContext = {};\n  private tags: Record<string, string> = {};\n  private currentTraceId: string | undefined;\n  private currentTransaction: BugCatchTransaction | undefined;\n  private readonly logQueue: LogPayload[] = [];\n  private logFlushTimer: ReturnType<typeof setInterval> | undefined;\n  private readonly transactionQueue: TransactionPayload[] = [];\n  private transactionFlushTimer: ReturnType<typeof setInterval> | undefined;\n  private readonly sessionQueue: SessionPayload[] = [];\n  private sessionFlushTimer: ReturnType<typeof setInterval> | undefined;\n  private sessionId: string | undefined;\n  private sessionStartedAt: string | undefined;\n  private sessionStatus: SessionStatus = 'ok';\n  private sessionErrorCount = 0;\n  private readonly webVitalsQueue: WebVitalPayload[] = [];\n  private webVitalsFlushTimer: ReturnType<typeof setInterval> | undefined;\n  private readonly replayQueue: unknown[] = [];\n  private replayFlushTimer: ReturnType<typeof setInterval> | undefined;\n  private replayId: string | undefined;\n  private replaySequence = 0;\n  private replayStartedAt: string | undefined;\n  /** True while an `isReplayAllowed()` check for a pending start is in flight. */\n  private replayStarting = false;\n  /** Set if `stopReplay()` runs while a start's allowlist check is still in flight, so the check's callback aborts instead of starting a recording that was already told to stop. */\n  private replayStopRequested = false;\n  /** Guards against concurrent replay POSTs - a busy page can refill 200 events\n   *  faster than one large chunk round-trips, and unbounded parallel sends\n   *  can exhaust the browser's per-origin connection limit and stall every\n   *  other request the page makes. */\n  private replaySendInFlight = false;\n  private replayFlushPending = false;\n  private stopRecording: (() => void) | undefined;\n  private readonly cleanups: Array<() => void> = [];\n\n  constructor(options: BugCatchOptions) {\n    this.opts = {\n      debug: false,\n      maxBreadcrumbs: 100,\n      autoCaptureErrors: true,\n      autoCaptureBreadcrumbs: true,\n      autoTrackRequests: false,\n      autoCaptureLogs: false,\n      logsFlushInterval: 2000,\n      logsBatchSize: 20,\n      tracesFlushInterval: 2000,\n      tracesBatchSize: 10,\n      autoSessionTracking: true,\n      sessionsFlushInterval: 5000,\n      autoCaptureWebVitals: true,\n      webVitalsFlushInterval: 5000,\n      sessionReplay: false,\n      replayFlushInterval: 10000,\n      replayRequestTimeout: 15000,\n      ...options,\n    };\n\n    this.dsn = parseDsn(options.dsn);\n    this.crumbs = new BreadcrumbBuffer(this.opts.maxBreadcrumbs);\n\n    if (this.opts.autoCaptureErrors) {\n      this.installErrorHandlers();\n    }\n\n    if (this.opts.autoCaptureBreadcrumbs) {\n      this.cleanups.push(installNavigationBreadcrumbs((c) => this.addBreadcrumb(c)));\n      this.cleanups.push(installClickBreadcrumbs((c) => this.addBreadcrumb(c)));\n      this.cleanups.push(installConsoleBreadcrumbs((c) => this.addBreadcrumb(c)));\n    }\n\n    if (this.opts.autoTrackRequests) {\n      this.cleanups.push(this.installFetchInterceptor());\n      this.cleanups.push(this.installXhrInterceptor());\n    }\n\n    if (this.opts.autoCaptureLogs) {\n      this.cleanups.push(this.installConsoleLogCapture());\n    }\n\n    // The flush timer runs regardless of autoCaptureLogs - captureLog() is a\n    // public method callers can use directly without the console hook.\n    this.logFlushTimer = setInterval(() => void this.flushLogs(), this.opts.logsFlushInterval);\n    this.cleanups.push(() => clearInterval(this.logFlushTimer));\n\n    this.transactionFlushTimer = setInterval(\n      () => void this.flushTransactions(),\n      this.opts.tracesFlushInterval,\n    );\n    this.cleanups.push(() => clearInterval(this.transactionFlushTimer));\n\n    if (this.opts.autoSessionTracking) {\n      this.startSession();\n    }\n    this.sessionFlushTimer = setInterval(\n      () => void this.flushSessions(),\n      this.opts.sessionsFlushInterval,\n    );\n    this.cleanups.push(() => clearInterval(this.sessionFlushTimer));\n\n    if (this.opts.autoCaptureWebVitals && typeof window !== 'undefined') {\n      this.installWebVitalsCapture();\n    }\n    this.webVitalsFlushTimer = setInterval(\n      () => void this.flushWebVitals(),\n      this.opts.webVitalsFlushInterval,\n    );\n    this.cleanups.push(() => clearInterval(this.webVitalsFlushTimer));\n\n    if (this.opts.sessionReplay && typeof window !== 'undefined') {\n      this.startReplay();\n    }\n    this.replayFlushTimer = setInterval(\n      () => void this.flushReplay(),\n      this.opts.replayFlushInterval,\n    );\n    this.cleanups.push(() => clearInterval(this.replayFlushTimer));\n\n    if (typeof window !== 'undefined') {\n      // beacon, not fetch - the tab is closing, there's no time for a normal\n      // request/response round trip.\n      const onPageHide = () => {\n        this.endSession();\n        void this.flushLogs(true);\n        void this.flushTransactions(true);\n        void this.flushSessions(true);\n        void this.flushWebVitals(true);\n        this.stopReplay(true);\n      };\n      window.addEventListener('pagehide', onPageHide);\n      this.cleanups.push(() => window.removeEventListener('pagehide', onPageHide));\n    } else if (this.opts.autoSessionTracking) {\n      // Node has no pagehide - `beforeExit` fires when the event loop is\n      // about to end naturally. Doesn't catch SIGKILL or a direct\n      // process.exit() call, but that's true of any flush-on-shutdown hook;\n      // destroy() covers explicit teardown.\n      const onBeforeExit = () => {\n        this.endSession();\n        void this.flushSessions();\n      };\n      process.on('beforeExit', onBeforeExit);\n      this.cleanups.push(() => process.off('beforeExit', onBeforeExit));\n    }\n\n    this.log('Initialized. Project:', this.dsn.projectId);\n  }\n\n  // ─── Public API ─────────────────────────────────────────────────────────────\n\n  captureException(error: unknown, extra?: Record<string, unknown>): string {\n    // Auto-tagged, not something callers pass themselves - lets the\n    // dashboard jump from an error straight to \"what led to this\" without\n    // any manual plumbing at the call site.\n    const taggedExtra = this.replayId ? { ...extra, replay_id: this.replayId } : extra;\n    const event = this.buildExceptionPayload(error, taggedExtra);\n    void this.send(event);\n    const fatal = typeof extra?.handler === 'string' && FATAL_HANDLERS.has(extra.handler);\n    this.recordSessionError(fatal);\n    return event.event_id;\n  }\n\n  captureMessage(message: string, level: string = 'info', extra?: Record<string, unknown>): string {\n    const event = this.buildMessagePayload(message, level, extra);\n    void this.send(event);\n    return event.event_id;\n  }\n\n  /**\n   * Queue a structured log line. Batched and flushed automatically - does\n   * not send a request per call. `traceId` overrides the trace set via\n   * `setTraceId()` for this one line.\n   */\n  captureLog(\n    level: LogLevel,\n    message: string,\n    attributes?: Record<string, unknown>,\n    traceId?: string,\n  ): void {\n    this.logQueue.push({\n      level,\n      message,\n      timestamp: new Date().toISOString(),\n      trace_id: traceId ?? this.currentTraceId,\n      attributes,\n      environment: this.opts.environment,\n      release: this.opts.release,\n    });\n\n    if (this.logQueue.length >= this.opts.logsBatchSize) {\n      void this.flushLogs();\n    }\n  }\n\n  /**\n   * Set the trace id attached to every `captureLog()` call that doesn't pass\n   * its own. Global mutable state, same as `setUser` - fine for a browser\n   * session, but a Node server handling concurrent requests should pass\n   * `traceId` explicitly to `captureLog()` instead of relying on this.\n   */\n  setTraceId(traceId: string): void {\n    this.currentTraceId = traceId;\n  }\n\n  clearTraceId(): void {\n    this.currentTraceId = undefined;\n  }\n\n  /** Send any queued log lines immediately instead of waiting for the next flush. */\n  flushLogsNow(): Promise<void> {\n    return this.flushLogs();\n  }\n\n  /** Send any queued session updates immediately instead of waiting for the next flush. */\n  flushSessionsNow(): Promise<void> {\n    return this.flushSessions();\n  }\n\n  /** Send any queued Web Vitals readings immediately instead of waiting for the next flush. */\n  flushWebVitalsNow(): Promise<void> {\n    return this.flushWebVitals();\n  }\n\n  /**\n   * Start recording session replay if it isn't already running. Only needed\n   * when `sessionReplay: true` wasn't set at `init()` time - e.g. starting a\n   * recording only after a user opts in, or only for a sampled subset of\n   * sessions decided by the calling app. No-op outside the browser.\n   */\n  startReplayNow(): void {\n    if (typeof window === 'undefined' || this.replayId) return;\n    this.startReplay();\n  }\n\n  /** Stop the active recording (if any) and flush whatever's queued. */\n  stopReplayNow(): void {\n    this.stopReplay();\n    void this.flushReplay();\n  }\n\n  /** Send any queued replay chunks immediately instead of waiting for the next flush. */\n  flushReplayNow(): Promise<void> {\n    return this.flushReplay();\n  }\n\n  /** The active replay recording's id, if session replay is currently running. */\n  getReplayId(): string | undefined {\n    return this.replayId;\n  }\n\n  /**\n   * Start a new traced transaction. Queued for delivery when `.finish()` is\n   * called on it - starting one and never finishing it leaks nothing (no\n   * request is made), it's just never reported.\n   *\n   * @example\n   * const txn = BugCatch.startTransaction('GET /api/orders/:id', 'http.server');\n   * const span = txn.startChild('db.query', 'SELECT * FROM orders WHERE id = ?');\n   * // ...\n   * span.finish();\n   * txn.setHttpStatus(200);\n   * txn.finish();\n   */\n  startTransaction(name: string, op = 'custom'): BugCatchTransaction {\n    return new BugCatchTransaction(name, op, (txn) => this.captureTransaction(txn));\n  }\n\n  /**\n   * Set the transaction `startTransaction()`'s auto-instrumentation (the\n   * fetch/XHR interceptors under `autoTrackRequests`) attaches child spans\n   * to. Global mutable state, same limitation as `setTraceId` - a Node\n   * server handling concurrent requests should keep its own reference to\n   * the transaction (e.g. on `req`) and call `.startChild()` on it directly\n   * instead of relying on this.\n   */\n  setCurrentTransaction(transaction: BugCatchTransaction | undefined): void {\n    this.currentTransaction = transaction;\n  }\n\n  getCurrentTransaction(): BugCatchTransaction | undefined {\n    return this.currentTransaction;\n  }\n\n  /**\n   * Queue a finished transaction for delivery. Called automatically by\n   * `transaction.finish()` - only call this directly if you built the\n   * transaction payload yourself instead of using `startTransaction()`.\n   */\n  captureTransaction(transaction: BugCatchTransaction): void {\n    this.transactionQueue.push(\n      transaction.toPayload(this.user.id, this.opts.environment, this.opts.release),\n    );\n    if (this.transactionQueue.length >= this.opts.tracesBatchSize) {\n      void this.flushTransactions();\n    }\n  }\n\n  /** Send any queued transactions immediately instead of waiting for the next flush. */\n  flushTransactionsNow(): Promise<void> {\n    return this.flushTransactions();\n  }\n\n  /**\n   * Express/Connect-style middleware: starts an `http.server` transaction\n   * per request, finishes it when the response ends. Attaches the\n   * transaction to `req.bugcatchTransaction` for concurrency-safe access,\n   * and also sets it as the \"current\" transaction (see `setCurrentTransaction`)\n   * as a convenience for single-request-at-a-time contexts.\n   *\n   * By default, requests that end in a 404 are dropped rather than\n   * captured - a \"route not found\" is rarely a real business transaction\n   * (bots/scanners probing random paths are a common source), and letting\n   * them through skews throughput/error-rate stats and clutters the\n   * transaction list with noise nobody asked to track. Pass\n   * `ignoreStatusCodes: []` to capture everything, or a different list to\n   * customize it.\n   *\n   * `ignoreRoutes` is the explicit version of the same idea - name specific\n   * paths (health checks, readiness probes, ...) that were never a \"real\"\n   * request to begin with, so they're skipped before a transaction is even\n   * started (no wasted work, and any db.query/etc spans during the request\n   * just have no parent transaction to attach to, same as when tracing\n   * isn't active at all). Matched against the same normalized route\n   * (`/users/:id`, not the raw URL) used for the transaction name - a\n   * string matches by substring, a RegExp by `.test()`, same as\n   * `ignoreUrls`/`ignoreErrors`.\n   *\n   * @example\n   * app.use(BugCatch.tracingMiddleware());\n   * app.use(BugCatch.tracingMiddleware({ ignoreStatusCodes: [404, 401] }));\n   * app.use(BugCatch.tracingMiddleware({ ignoreRoutes: ['/health', /^\\/internal\\//] }));\n   */\n  tracingMiddleware(options?: { ignoreStatusCodes?: number[]; ignoreRoutes?: Array<string | RegExp> }) {\n    const ignoreStatusCodes = new Set(options?.ignoreStatusCodes ?? [404]);\n    const ignoreRoutes = options?.ignoreRoutes ?? [];\n\n    return (\n      req: { method: string; originalUrl?: string; url?: string; bugcatchTransaction?: BugCatchTransaction },\n      res: { statusCode: number; on: (event: 'finish', cb: () => void) => void },\n      next: () => void,\n    ) => {\n      const route = normalizeUrl(req.originalUrl ?? req.url ?? '/');\n\n      if (ignoreRoutes.length > 0 && matchesPattern(route, ignoreRoutes)) {\n        next();\n        return;\n      }\n\n      const txn = this.startTransaction(`${req.method} ${route}`, 'http.server');\n      req.bugcatchTransaction = txn;\n      this.setCurrentTransaction(txn);\n\n      res.on('finish', () => {\n        if (this.currentTransaction === txn) this.setCurrentTransaction(undefined);\n        // Not txn.finish() - that unconditionally queues the transaction for\n        // delivery. Dropping it here means it's simply never sent.\n        if (ignoreStatusCodes.has(res.statusCode)) return;\n        txn.setHttpStatus(res.statusCode);\n        txn.finish();\n      });\n\n      next();\n    };\n  }\n\n  /**\n   * Patch TypeORM's `QueryRunner.query()` (the single choke point every\n   * repository/query-builder call eventually goes through) so each query\n   * becomes a `db.query` child span on `currentTransaction` - same global\n   * mutable state `tracingMiddleware()` sets, same caveat as `setTraceId`\n   * for concurrent servers.\n   *\n   * TypeORM's `QueryRunner` export is a TypeScript **interface**, not a\n   * class - there is no `.prototype` to patch on it directly. The concrete\n   * class is driver-specific (`MysqlQueryRunner`, `PostgresQueryRunner`,\n   * ...) and isn't exported. So this takes the `DataSource` instead, spins\n   * up one query runner to discover its (shared, per-driver) prototype via\n   * `Object.getPrototypeOf`, patches `.query` there - which affects every\n   * runner of that driver, past or future, since they all share the same\n   * class - and releases the probe runner. Duck-typed against\n   * `{ createQueryRunner }` so this package never needs `typeorm` as a\n   * dependency.\n   *\n   * @example\n   * BugCatch.instrumentTypeOrm(dataSource); // the TypeORM DataSource\n   */\n  instrumentTypeOrm(dataSource: {\n    createQueryRunner: () => {\n      // Method-shorthand syntax (not `query: (...args) => ...`) so\n      // TypeScript checks this bivariantly - a property-style function type\n      // is checked strictly contravariantly, which real QueryRunner.query\n      // overloads (newer typeorm versions add more of them) can fail against\n      // even though they're perfectly callable with `...args: unknown[]`.\n      query(...args: unknown[]): Promise<unknown>;\n      release?: () => unknown;\n    };\n  }): () => void {\n    const probe = dataSource.createQueryRunner();\n    const proto = Object.getPrototypeOf(probe) as {\n      query(...args: unknown[]): Promise<unknown>;\n    };\n    const original = proto.query;\n    const self = this;\n\n    proto.query = function (this: unknown, sql: unknown, ...rest: unknown[]) {\n      const span = self.currentTransaction?.startChild(\n        'db.query',\n        typeof sql === 'string' ? truncate(sql) : undefined,\n      );\n      return Promise.resolve(original.apply(this, [sql, ...rest])).then(\n        (value) => {\n          span?.finish('ok');\n          return value;\n        },\n        (err: unknown) => {\n          span?.finish('error');\n          throw err;\n        },\n      );\n    };\n\n    void Promise.resolve(probe.release?.()).catch(() => {});\n\n    this.log('instrumentTypeOrm: QueryRunner.prototype.query patched');\n\n    return () => {\n      proto.query = original;\n      this.log('instrumentTypeOrm: QueryRunner.prototype.query restored');\n    };\n  }\n\n  /**\n   * Patch ioredis's `sendCommand()` (every command - `get`, `set`, `hset`, a\n   * pipeline's individual calls - funnels through it) so each Redis command\n   * becomes a `cache.command` child span on `currentTransaction`. Same\n   * global-mutable-state caveat as `instrumentTypeOrm`/`tracingMiddleware`.\n   * Duck-typed against `{ prototype: { sendCommand } }` so this package\n   * never needs `ioredis` as a dependency.\n   *\n   * @example\n   * import Redis from 'ioredis';\n   * BugCatch.instrumentIoredis(Redis);\n   */\n  instrumentIoredis(RedisClass: {\n    // Method-shorthand syntax, same reasoning as instrumentTypeOrm()'s\n    // `query` - keeps this bivariantly checked against ioredis's real\n    // (overloaded) `sendCommand` signature instead of strict contravariance.\n    prototype: { sendCommand(...args: unknown[]): unknown };\n  }): () => void {\n    const proto = RedisClass.prototype;\n    const original = proto.sendCommand;\n    const self = this;\n\n    proto.sendCommand = function (this: unknown, command: unknown, ...rest: unknown[]) {\n      const cmd = command as { name?: string; args?: unknown[]; promise?: Promise<unknown> };\n      const description = [cmd?.name, ...(cmd?.args ?? [])]\n        .filter((v) => v !== undefined)\n        .map(String)\n        .join(' ');\n      const span = self.currentTransaction?.startChild(\n        'cache.command',\n        description ? truncate(description) : undefined,\n      );\n\n      const result = original.apply(this, [command, ...rest]);\n      const promise = cmd?.promise ?? result;\n      if (promise && typeof (promise as Promise<unknown>).then === 'function') {\n        (promise as Promise<unknown>).then(\n          () => span?.finish('ok'),\n          () => span?.finish('error'),\n        );\n      } else {\n        span?.finish('ok');\n      }\n      return result;\n    };\n\n    this.log('instrumentIoredis: Redis.prototype.sendCommand patched');\n\n    return () => {\n      proto.sendCommand = original;\n      this.log('instrumentIoredis: Redis.prototype.sendCommand restored');\n    };\n  }\n\n  setUser(user: UserContext): void {\n    this.user = {\n      ...user,\n      id: user.id != null ? String(user.id) : undefined,\n    };\n  }\n\n  clearUser(): void {\n    this.user = {};\n  }\n\n  setTag(key: string, value: string): void {\n    this.tags[key] = value;\n  }\n\n  addBreadcrumb(crumb: BreadcrumbEntry): void {\n    this.crumbs.add(crumb);\n  }\n\n  /** Tear down all global listeners. Call when unmounting in SPAs. */\n  destroy(): void {\n    for (const cleanup of this.cleanups) {\n      cleanup();\n    }\n    this.cleanups.length = 0;\n    this.endSession();\n    void this.flushLogs();\n    void this.flushTransactions();\n    void this.flushSessions();\n    void this.flushWebVitals();\n    this.stopReplay();\n    void this.flushReplay();\n  }\n\n  /**\n   * Manually report an API call timing. Use this when `autoTrackRequests`\n   * is off or when you want to track server-side (Node.js) requests explicitly.\n   */\n  trackRequest(method: string, route: string, durationMs: number, statusCode: number): void {\n    void this.sendMetric({ method: method.toUpperCase(), route, duration_ms: durationMs, status_code: statusCode });\n  }\n\n  // ─── Internal: build payloads ────────────────────────────────────────────\n\n  private buildExceptionPayload(\n    error: unknown,\n    extra?: Record<string, unknown>,\n  ): EventPayload {\n    const err = error instanceof Error ? error : new Error(String(error));\n    const frames = parseStack(err);\n\n    const exceptionValue: ExceptionValue = {\n      type: err.name || 'Error',\n      value: err.message,\n      stacktrace: frames.length > 0 ? { frames } : undefined,\n    };\n\n    return this.buildBase({\n      level: 'error',\n      exception: { values: [exceptionValue] },\n      extra,\n    });\n  }\n\n  private buildMessagePayload(\n    message: string,\n    level: string,\n    extra?: Record<string, unknown>,\n  ): EventPayload {\n    return this.buildBase({ level, message, extra });\n  }\n\n  private buildBase(\n    overrides: Partial<EventPayload> & { extra?: Record<string, unknown> },\n  ): EventPayload {\n    const { extra, ...rest } = overrides;\n    const payload: EventPayload = {\n      event_id: uuid(),\n      timestamp: new Date().toISOString(),\n      platform: 'javascript',\n      ...rest,\n    };\n\n    if (this.opts.release) payload.release = this.opts.release;\n    if (this.opts.environment) payload.environment = this.opts.environment;\n\n    // `user`/`tags`/`request` inside `extra` are hoisted to their real\n    // top-level payload fields instead of being buried under `extra`, which\n    // the ingest API never reads them from. A caller coming from Sentry\n    // naturally reaches for `captureException(err, { user, tags, request })`\n    // expecting exactly this - and for a concurrent Node server, passing\n    // `user`/`request` per call here (rather than through the global,\n    // request-unsafe `setUser()`) is the *only* way to get a per-request\n    // `user.ip_address` into an event at all, which is what the ingest API\n    // prioritizes over its own IP detection for exactly this reason.\n    const { user: extraUser, tags: extraTags, request: extraRequest, ...restExtra } =\n      (extra ?? {}) as {\n        user?: UserContext;\n        tags?: Record<string, string>;\n        request?: EventPayload['request'];\n        [key: string]: unknown;\n      };\n\n    const mergedUser = { ...this.user, ...extraUser };\n    if (Object.keys(mergedUser).length > 0) {\n      payload.user = mergedUser;\n    }\n\n    const mergedTags = { ...this.tags, ...extraTags };\n    if (Object.keys(mergedTags).length > 0) {\n      payload.tags = mergedTags;\n    }\n\n    if (Object.keys(restExtra).length > 0) {\n      payload.extra = restExtra;\n    }\n\n    const breadcrumbs = this.crumbs.getAll();\n    if (breadcrumbs.length > 0) {\n      payload.breadcrumbs = breadcrumbs;\n    }\n\n    // Capture browser request context - a caller-supplied `request` (Node,\n    // no `window`) takes over instead of being silently dropped.\n    if (typeof window !== 'undefined') {\n      payload.request = {\n        url: window.location.href,\n        headers: {\n          'user-agent': navigator.userAgent,\n        },\n      };\n    } else if (extraRequest) {\n      payload.request = extraRequest;\n    }\n\n    return payload;\n  }\n\n  // ─── Internal: error handlers ────────────────────────────────────────────\n\n  private installErrorHandlers(): void {\n    if (typeof window === 'undefined') {\n      // Node.js environment\n      const onUncaught = (err: Error) => {\n        this.captureException(err, { handler: 'uncaughtException' });\n      };\n      const onUnhandled = (reason: unknown) => {\n        this.captureException(reason, { handler: 'unhandledRejection' });\n      };\n      process.on('uncaughtException', onUncaught);\n      process.on('unhandledRejection', onUnhandled);\n      this.cleanups.push(() => {\n        process.off('uncaughtException', onUncaught);\n        process.off('unhandledRejection', onUnhandled);\n      });\n      return;\n    }\n\n    // Browser environment\n    const onError = (event: ErrorEvent) => {\n      if (!event.error) return;\n      if (this.shouldIgnore(event.error, event.filename ?? '')) return;\n      this.captureException(event.error, { handler: 'window.onerror' });\n    };\n\n    const onUnhandledRejection = (event: PromiseRejectionEvent) => {\n      const reason = event.reason as unknown;\n      if (this.shouldIgnore(reason, '')) return;\n      this.captureException(reason, { handler: 'unhandledrejection' });\n    };\n\n    window.addEventListener('error', onError);\n    window.addEventListener('unhandledrejection', onUnhandledRejection);\n\n    this.cleanups.push(() => {\n      window.removeEventListener('error', onError);\n      window.removeEventListener('unhandledrejection', onUnhandledRejection);\n    });\n  }\n\n  private shouldIgnore(error: unknown, scriptUrl: string): boolean {\n    const { ignoreUrls, ignoreErrors } = this.opts;\n\n    if (ignoreUrls?.length && scriptUrl) {\n      if (matchesPattern(scriptUrl, ignoreUrls)) return true;\n    }\n\n    if (ignoreErrors?.length) {\n      const message = error instanceof Error ? error.message : String(error);\n      if (matchesPattern(message, ignoreErrors)) return true;\n    }\n\n    return false;\n  }\n\n  // ─── Internal: request tracking ──────────────────────────────────────────\n\n  private installFetchInterceptor(): () => void {\n    if (typeof globalThis.fetch !== 'function') {\n      console.warn('[BugCatch] autoTrackRequests is enabled but globalThis.fetch is not available. Metrics will not be tracked.');\n      return () => {};\n    }\n\n    const original = globalThis.fetch.bind(globalThis);\n    const self = this;\n\n    this.log('autoTrackRequests: fetch interceptor installed');\n\n    globalThis.fetch = async function patchedFetch(\n      input: RequestInfo | URL,\n      init?: RequestInit,\n    ): Promise<Response> {\n      const url = input instanceof Request ? input.url : String(input);\n\n      // Never intercept BugCatch's own ingest/metrics requests\n      if (url.includes(self.dsn.ingestUrl.split('?')[0])) {\n        return original(input, init);\n      }\n\n      if (self.opts.trackIgnoreUrls && matchesPattern(url, self.opts.trackIgnoreUrls)) {\n        self.log('autoTrackRequests: ignored (trackIgnoreUrls match)', url);\n        return original(input, init);\n      }\n\n      const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n      const route = normalizeUrl(url);\n      const start = Date.now();\n      const span = self.currentTransaction?.startChild('http.client', `${method} ${route}`);\n\n      self.log('autoTrackRequests: intercepted', method, url);\n\n      try {\n        const response = await original(input, init);\n        void self.sendMetric({\n          method,\n          route,\n          duration_ms: Date.now() - start,\n          status_code: response.status,\n          user_id: self.user.id,\n        });\n        span?.finish(response.ok ? 'ok' : 'error');\n        return response;\n      } catch (err) {\n        // Network error - report as status 0\n        void self.sendMetric({ method, route, duration_ms: Date.now() - start, status_code: 0 });\n        span?.finish('error');\n        throw err;\n      }\n    };\n\n    // Return cleanup function that restores original fetch\n    return () => {\n      globalThis.fetch = original;\n      this.log('autoTrackRequests: fetch interceptor removed');\n    };\n  }\n\n  private installXhrInterceptor(): () => void {\n    if (typeof XMLHttpRequest === 'undefined') {\n      // Node.js environment - XHR not available\n      return () => {};\n    }\n\n    const self = this;\n    const OriginalXHR = XMLHttpRequest;\n    const ingestBase = this.dsn.ingestUrl.split('?')[0];\n\n    function PatchedXHR(this: XMLHttpRequest) {\n      const xhr = new OriginalXHR();\n\n      let method = 'GET';\n      let url = '';\n      let start = 0;\n\n      const originalOpen = xhr.open.bind(xhr);\n      const originalSend = xhr.send.bind(xhr);\n\n      (this as any).open = function (m: string, u: string, async?: boolean, user?: string, password?: string) {\n        method = m ? m.toUpperCase() : 'GET';\n        url = u || '';\n        return originalOpen(m, u, async ?? true, user, password);\n      };\n\n      (this as any).send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n        // Skip BugCatch's own requests and ignored URLs\n        const skip =\n          url.includes(ingestBase) ||\n          (self.opts.trackIgnoreUrls ? matchesPattern(url, self.opts.trackIgnoreUrls) : false);\n\n        if (!skip) {\n          start = Date.now();\n          const route = normalizeUrl(url);\n          const span = self.currentTransaction?.startChild('http.client', `${method} ${route}`);\n          self.log('autoTrackRequests: XHR intercepted', method, url);\n\n          xhr.addEventListener('loadend', () => {\n            void self.sendMetric({\n              method,\n              route,\n              duration_ms: Date.now() - start,\n              status_code: xhr.status || 0,\n              user_id: self.user.id,\n            });\n            span?.finish(xhr.status && xhr.status < 400 ? 'ok' : 'error');\n          });\n        }\n\n        return originalSend(body);\n      };\n\n      // Proxy all other properties/methods to the real XHR instance\n      return new Proxy(this, {\n        get(_target, prop) {\n          if (prop === 'open') return (this as any).open;\n          if (prop === 'send') return (this as any).send;\n          const val = (xhr as any)[prop];\n          return typeof val === 'function' ? val.bind(xhr) : val;\n        },\n        set(_target, prop, value) {\n          (xhr as any)[prop] = value;\n          return true;\n        },\n      });\n    }\n\n    PatchedXHR.prototype = OriginalXHR.prototype;\n    (window as any).XMLHttpRequest = PatchedXHR;\n\n    this.log('autoTrackRequests: XHR interceptor installed');\n\n    return () => {\n      (window as any).XMLHttpRequest = OriginalXHR;\n      this.log('autoTrackRequests: XHR interceptor removed');\n    };\n  }\n\n  private async sendMetric(metric: MetricPayload): Promise<void> {\n    this.log('autoTrackRequests: sending metric', metric.method, metric.route, metric.duration_ms + 'ms', metric.status_code);\n    try {\n      const res = await fetch(this.dsn.metricsUrl, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(metric),\n      });\n      if (!res.ok) {\n        this.log('autoTrackRequests: metric rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('autoTrackRequests: failed to send metric -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: logs ───────────────────────────────────────────────────────\n\n  /**\n   * Patches console.trace/debug/log/info/warn/error to also queue a\n   * structured log. Composes with `installConsoleBreadcrumbs` (warn/error) -\n   * each wrap captures whatever the console method currently is at install\n   * time and calls it at the end, so both run.\n   */\n  private installConsoleLogCapture(): () => void {\n    if (typeof console === 'undefined') return () => undefined;\n\n    const original = {\n      trace: console.trace?.bind(console),\n      debug: console.debug?.bind(console),\n      log: console.log.bind(console),\n      info: console.info.bind(console),\n      warn: console.warn.bind(console),\n      error: console.error.bind(console),\n    };\n\n    const formatArgs = (args: unknown[]): string =>\n      args\n        .map((a) => {\n          if (typeof a === 'string') return a;\n          try {\n            return JSON.stringify(a);\n          } catch {\n            return String(a);\n          }\n        })\n        .join(' ')\n        .slice(0, 5000);\n\n    const wrap =\n      (level: LogLevel, fn: (...args: unknown[]) => void) =>\n      (...args: unknown[]) => {\n        this.captureLog(level, formatArgs(args));\n        fn(...args);\n      };\n\n    if (original.trace) console.trace = wrap('trace', original.trace);\n    if (original.debug) console.debug = wrap('debug', original.debug);\n    console.log = wrap('info', original.log);\n    console.info = wrap('info', original.info);\n    console.warn = wrap('warn', original.warn);\n    console.error = wrap('error', original.error);\n\n    this.log('autoCaptureLogs: console capture installed');\n\n    return () => {\n      if (original.trace) console.trace = original.trace;\n      if (original.debug) console.debug = original.debug;\n      console.log = original.log;\n      console.info = original.info;\n      console.warn = original.warn;\n      console.error = original.error;\n      this.log('autoCaptureLogs: console capture removed');\n    };\n  }\n\n  /** Drains the queue, one request per 100 lines (the server's batch cap). */\n  private async flushLogs(useBeacon = false): Promise<void> {\n    while (this.logQueue.length > 0) {\n      const batch = this.logQueue.splice(0, 100);\n      await this.sendLogBatch(batch, useBeacon);\n    }\n  }\n\n  private async sendLogBatch(batch: LogPayload[], useBeacon: boolean): Promise<void> {\n    const body = JSON.stringify({ logs: batch });\n\n    if (useBeacon && typeof navigator !== 'undefined' && navigator.sendBeacon) {\n      const ok = navigator.sendBeacon(this.dsn.logsUrl, new Blob([body], { type: 'application/json' }));\n      if (!ok) this.log(`Failed to beacon ${batch.length} log(s) on unload`);\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n      if (typeof window !== 'undefined') fetchOptions.keepalive = true;\n\n      const res = await fetch(this.dsn.logsUrl, fetchOptions);\n      if (!res.ok) {\n        this.log('Logs rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send logs -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: tracing ────────────────────────────────────────────────────\n\n  /** Drains the queue, one request per 20 transactions (the server's batch cap). */\n  private async flushTransactions(useBeacon = false): Promise<void> {\n    while (this.transactionQueue.length > 0) {\n      const batch = this.transactionQueue.splice(0, 20);\n      await this.sendTransactionBatch(batch, useBeacon);\n    }\n  }\n\n  private async sendTransactionBatch(\n    batch: TransactionPayload[],\n    useBeacon: boolean,\n  ): Promise<void> {\n    const body = JSON.stringify({ transactions: batch });\n\n    if (useBeacon && typeof navigator !== 'undefined' && navigator.sendBeacon) {\n      const ok = navigator.sendBeacon(\n        this.dsn.transactionsUrl,\n        new Blob([body], { type: 'application/json' }),\n      );\n      if (!ok) this.log(`Failed to beacon ${batch.length} transaction(s) on unload`);\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n      if (typeof window !== 'undefined') fetchOptions.keepalive = true;\n\n      const res = await fetch(this.dsn.transactionsUrl, fetchOptions);\n      if (!res.ok) {\n        this.log('Transactions rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send transactions -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: sessions ───────────────────────────────────────────────────\n\n  private startSession(): void {\n    this.sessionId = uuid();\n    this.sessionStartedAt = new Date().toISOString();\n    this.sessionStatus = 'ok';\n    this.sessionErrorCount = 0;\n    this.queueSessionUpdate({});\n  }\n\n  /**\n   * Called from `captureException()`. Escalates the session's status - never\n   * ends it, since a handled error doesn't mean the app stopped running.\n   * `fatal` (from `installErrorHandlers()`'s uncaught/unhandled paths) marks\n   * the session \"crashed\" and flushes immediately rather than waiting for\n   * the timer, since the process may be about to exit.\n   */\n  private recordSessionError(fatal: boolean): void {\n    if (!this.sessionId) return;\n\n    this.sessionErrorCount++;\n    const candidate: SessionStatus = fatal ? 'crashed' : 'errored';\n    if (SESSION_SEVERITY[candidate] > SESSION_SEVERITY[this.sessionStatus]) {\n      this.sessionStatus = candidate;\n    }\n    this.queueSessionUpdate({});\n\n    if (fatal) void this.flushSessions();\n  }\n\n  private endSession(): void {\n    if (!this.sessionId) return;\n    this.queueSessionUpdate({ ended_at: new Date().toISOString() });\n    this.sessionId = undefined;\n  }\n\n  private queueSessionUpdate(overrides: Partial<SessionPayload>): void {\n    if (!this.sessionId || !this.sessionStartedAt) return;\n\n    this.sessionQueue.push({\n      session_id: this.sessionId,\n      started_at: this.sessionStartedAt,\n      status: this.sessionStatus,\n      errors: this.sessionErrorCount,\n      environment: this.opts.environment,\n      release: this.opts.release,\n      user_id: this.user.id,\n      ...overrides,\n    });\n  }\n\n  /** Drains the queue, one request per 100 updates (the server's batch cap). */\n  private async flushSessions(useBeacon = false): Promise<void> {\n    while (this.sessionQueue.length > 0) {\n      const batch = this.sessionQueue.splice(0, 100);\n      await this.sendSessionBatch(batch, useBeacon);\n    }\n  }\n\n  private async sendSessionBatch(batch: SessionPayload[], useBeacon: boolean): Promise<void> {\n    const body = JSON.stringify({ sessions: batch });\n\n    if (useBeacon && typeof navigator !== 'undefined' && navigator.sendBeacon) {\n      const ok = navigator.sendBeacon(\n        this.dsn.sessionsUrl,\n        new Blob([body], { type: 'application/json' }),\n      );\n      if (!ok) this.log(`Failed to beacon ${batch.length} session update(s) on unload`);\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n      if (typeof window !== 'undefined') fetchOptions.keepalive = true;\n\n      const res = await fetch(this.dsn.sessionsUrl, fetchOptions);\n      if (!res.ok) {\n        this.log('Sessions rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send sessions -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: web vitals ─────────────────────────────────────────────────\n\n  /**\n   * Dynamically imported so Node consumers (same bundle, no browser APIs)\n   * never pay for parsing a browser-only library they can't use - this\n   * method itself is only ever called when `typeof window !== 'undefined'`.\n   */\n  private installWebVitalsCapture(): void {\n    import('web-vitals')\n      .then(({ onLCP, onINP, onCLS, onFCP, onTTFB }) => {\n        const report = (metric: WebVitalMetric) => (entry: { value: number }) => {\n          this.queueWebVital(metric, entry.value);\n        };\n        onLCP(report('LCP'));\n        onINP(report('INP'));\n        onCLS(report('CLS'));\n        onFCP(report('FCP'));\n        onTTFB(report('TTFB'));\n      })\n      .catch((err) => {\n        this.log('Failed to load web-vitals -', (err as Error).message);\n      });\n  }\n\n  private queueWebVital(metric: WebVitalMetric, value: number): void {\n    this.webVitalsQueue.push({\n      metric,\n      value,\n      route: normalizeUrl(window.location.pathname),\n      timestamp: new Date().toISOString(),\n      environment: this.opts.environment,\n      release: this.opts.release,\n      user_id: this.user.id,\n    });\n\n    if (this.webVitalsQueue.length >= 20) {\n      void this.flushWebVitals();\n    }\n  }\n\n  /** Drains the queue, one request per 100 readings (the server's batch cap). */\n  private async flushWebVitals(useBeacon = false): Promise<void> {\n    while (this.webVitalsQueue.length > 0) {\n      const batch = this.webVitalsQueue.splice(0, 100);\n      await this.sendWebVitalBatch(batch, useBeacon);\n    }\n  }\n\n  private async sendWebVitalBatch(batch: WebVitalPayload[], useBeacon: boolean): Promise<void> {\n    const body = JSON.stringify({ vitals: batch });\n\n    if (useBeacon && typeof navigator !== 'undefined' && navigator.sendBeacon) {\n      const ok = navigator.sendBeacon(\n        this.dsn.webVitalsUrl,\n        new Blob([body], { type: 'application/json' }),\n      );\n      if (!ok) this.log(`Failed to beacon ${batch.length} web vital reading(s) on unload`);\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n      if (typeof window !== 'undefined') fetchOptions.keepalive = true;\n\n      const res = await fetch(this.dsn.webVitalsUrl, fetchOptions);\n      if (!res.ok) {\n        this.log('Web vitals rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send web vitals -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: session replay ─────────────────────────────────────────────\n\n  /**\n   * Checks the project's session-replay privacy allowlist for a user (see\n   * `ProjectEntity.replayUserAllowlist` on the API). Fails *closed* - a\n   * network error or non-200 response means \"don't record\", since the whole\n   * point is that a disallowed user's DOM never gets captured, and a\n   * transient check failure shouldn't be the thing that decides otherwise.\n   * Exposed publicly so a caller can gate its own `startReplayNow()` call\n   * too, not just rely on the automatic check inside `startReplay()`.\n   */\n  async isReplayAllowed(userId?: string): Promise<boolean> {\n    const uid = userId ?? this.user.id;\n    try {\n      const url = uid ? `${this.dsn.replayAllowedUrl}&userId=${encodeURIComponent(uid)}` : this.dsn.replayAllowedUrl;\n      const res = await fetch(url);\n      if (!res.ok) return false;\n      const data = (await res.json()) as { allowed?: boolean };\n      return !!data.allowed;\n    } catch (err) {\n      this.log('Failed to check replay allowlist -', (err as Error).message);\n      return false;\n    }\n  }\n\n  /**\n   * Dynamically imported, same reasoning as `installWebVitalsCapture()` -\n   * `rrweb` assumes browser globals and this package ships one bundle for\n   * both browser and Node, so a static import would force every Node\n   * consumer to pay for parsing a library they can never use.\n   *\n   * Gated behind `isReplayAllowed()` - recording only actually starts once\n   * the allowlist check resolves, so a disallowed user's DOM is never\n   * captured to begin with (not just dropped after ingest).\n   */\n  private startReplay(): void {\n    if (this.replayId || this.replayStarting) return;\n    this.replayStarting = true;\n    this.replayStopRequested = false;\n\n    void this.isReplayAllowed()\n      .then((allowed) => {\n        this.replayStarting = false;\n        // stopReplay() can't touch replayId while the check is still in\n        // flight (nothing's recording yet), so it sets this flag instead -\n        // check it here rather than `this.replayId`.\n        if (!allowed || this.replayStopRequested) {\n          if (!allowed) this.log('Session replay not started - user is not in the project replay allowlist');\n          this.replayStopRequested = false;\n          return;\n        }\n\n        this.replayId = uuid();\n        this.replaySequence = 0;\n        this.replayStartedAt = new Date().toISOString();\n\n        import('rrweb')\n          .then(({ record }) => {\n            // Re-check in case stopReplay() ran while the import was in flight.\n            if (!this.replayId) return;\n            this.stopRecording = record({\n              emit: (event) => this.queueReplayEvent(event),\n              maskAllInputs: true,\n              ...(this.opts.replayMaskTextSelector\n                ? { maskTextSelector: this.opts.replayMaskTextSelector }\n                : {}),\n            });\n          })\n          .catch((err) => {\n            this.log('Failed to load rrweb -', (err as Error).message);\n            this.replayId = undefined;\n          });\n      })\n      .catch(() => {\n        this.replayStarting = false;\n      });\n  }\n\n  private stopReplay(useBeacon = false): void {\n    this.replayStopRequested = true;\n    if (!this.replayId) return;\n    this.stopRecording?.();\n    this.stopRecording = undefined;\n    const endingReplayId = this.replayId;\n    this.replayId = undefined;\n    this.queueReplayChunk({ replay_id: endingReplayId, ended_at: new Date().toISOString() }, useBeacon);\n  }\n\n  private queueReplayEvent(event: unknown): void {\n    this.replayQueue.push(event);\n    if (this.replayQueue.length >= 200) {\n      void this.flushReplay();\n    }\n  }\n\n  /** Drains the queue into one chunk, tagged with whatever's pending (e.g. an `ended_at` from `stopReplay()`). */\n  private async flushReplay(useBeacon = false, overrides: Partial<ReplayChunkPayload> = {}): Promise<void> {\n    if (this.replayQueue.length === 0 && Object.keys(overrides).length === 0) return;\n    if (!this.replayId && Object.keys(overrides).length === 0) return;\n\n    // Beacon sends (pagehide) fire-and-forget and must go out immediately -\n    // the page is already unloading, there's nothing to serialize behind.\n    // A normal fetch send waits for any in-flight chunk to land first, so a\n    // busy page emitting events faster than one chunk round-trips never has\n    // more than one replay request open at once.\n    if (!useBeacon && this.replaySendInFlight) {\n      this.replayFlushPending = true;\n      return;\n    }\n\n    const events = this.replayQueue.splice(0, this.replayQueue.length);\n    if (events.length === 0 && Object.keys(overrides).length === 0) return;\n\n    const chunk = {\n      replay_id: overrides.replay_id ?? this.replayId!,\n      sequence: this.replaySequence++,\n      events,\n      ...(this.replaySequence === 1 ? { started_at: this.replayStartedAt, url: window.location.href } : {}),\n      environment: this.opts.environment,\n      release: this.opts.release,\n      user_id: this.user.id,\n      ...overrides,\n    };\n\n    if (useBeacon) {\n      await this.sendReplayChunk(chunk, true);\n      return;\n    }\n\n    this.replaySendInFlight = true;\n    try {\n      await this.sendReplayChunk(chunk, false);\n    } finally {\n      this.replaySendInFlight = false;\n      if (this.replayFlushPending) {\n        this.replayFlushPending = false;\n        void this.flushReplay();\n      }\n    }\n  }\n\n  /** Queues an out-of-band chunk (e.g. the closing `ended_at` marker) through the same flush path. */\n  private queueReplayChunk(overrides: Partial<ReplayChunkPayload>, useBeacon = false): void {\n    void this.flushReplay(useBeacon, overrides);\n  }\n\n  private async sendReplayChunk(chunk: ReplayChunkPayload, useBeacon: boolean): Promise<void> {\n    const body = JSON.stringify(chunk);\n\n    if (useBeacon && typeof navigator !== 'undefined' && navigator.sendBeacon) {\n      const ok = navigator.sendBeacon(this.dsn.replayUrl, new Blob([body], { type: 'application/json' }));\n      if (!ok) this.log('Failed to beacon a replay chunk on unload');\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n      // No `keepalive` here - that's only for requests that must survive page\n      // teardown, already handled by the `sendBeacon` branch above. Setting it\n      // on a normal in-page fetch instead exposes replay chunks (easily\n      // several hundred KB+ for a full DOM snapshot) to Chrome's combined 64KB\n      // body quota for keepalive requests - one oversized chunk gets stuck\n      // against that quota and every keepalive request queued behind it on\n      // this origin sits stuck too, never resolving.\n      //\n      // Replay chunks are still the largest payloads this SDK ever sends - a\n      // request stuck on a slow network hop or a misbehaving proxy would\n      // otherwise hold a browser connection slot open forever, and once\n      // enough chunks queue up behind it, that can exhaust the per-origin\n      // connection limit and stall every other request the page makes to the\n      // same API, not just replay ones. Self-abort so a single bad chunk\n      // can't cascade into that.\n      if (typeof AbortSignal !== 'undefined' && AbortSignal.timeout) {\n        fetchOptions.signal = AbortSignal.timeout(this.opts.replayRequestTimeout);\n      }\n\n      const res = await fetch(this.dsn.replayUrl, fetchOptions);\n      if (!res.ok) {\n        this.log('Replay chunk rejected by server -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send replay chunk -', (err as Error).message);\n    }\n  }\n\n  // ─── Internal: transport ─────────────────────────────────────────────────\n\n  private async send(event: EventPayload): Promise<void> {\n    let finalEvent: EventPayload | false = event;\n\n    if (this.opts.beforeSend) {\n      finalEvent = this.opts.beforeSend(event);\n      if (finalEvent === false) {\n        this.log('Event dropped by beforeSend hook');\n        return;\n      }\n    }\n\n    this.log('Sending event:', finalEvent.event_id, finalEvent.level);\n\n    let body: string;\n    try {\n      body = JSON.stringify(finalEvent);\n    } catch (err) {\n      console.warn('[BugCatch] Failed to serialize event:', err);\n      return;\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body,\n      };\n\n      // keepalive is browser-only; Node.js fetch (undici) enforces a 64 KB body\n      // limit with keepalive: true, which silently drops large payloads.\n      if (typeof window !== 'undefined') {\n        fetchOptions.keepalive = true;\n      }\n\n      const res = await fetch(this.dsn.ingestUrl, fetchOptions);\n\n      if (!res.ok) {\n        console.warn(`[BugCatch] Ingest responded with ${res.status}:`, await res.text());\n      }\n    } catch (err) {\n      console.warn('[BugCatch] Failed to send event:', err);\n    }\n  }\n\n  private log(...args: unknown[]): void {\n    if (this.opts.debug) {\n      console.debug('[BugCatch]', ...args);\n    }\n  }\n}\n","import * as os from 'node:os';\n\n/**\n * Collects Node.js process metrics (memory, CPU, event loop lag) and reports\n * them periodically to the BugCatch server-metrics ingest endpoint.\n *\n * Framework-agnostic - wrap it in any lifecycle hooks (NestJS, Express, etc.)\n *\n * @example NestJS\n * ```ts\n * \\@Injectable()\n * export class BugCatchMetricsService implements OnModuleInit, OnModuleDestroy {\n *   private readonly reporter = new BugCatchServerReporter({\n *     dsn: process.env.BUGCATCH_DSN!,\n *   });\n *   onModuleInit()    { this.reporter.start(); }\n *   onModuleDestroy() { this.reporter.stop();  }\n * }\n * ```\n */\nexport interface ServerReporterOptions {\n  /** DSN copied from the BugCatch dashboard (same as used for error capture). */\n  dsn: string;\n  /**\n   * How often to send a snapshot in milliseconds.\n   * @default 30_000\n   */\n  reportInterval?: number;\n  /**\n   * Identifier for the reporting server/instance, shown in the dashboard and\n   * alert emails so you can tell which process a snapshot came from.\n   * @default os.hostname()\n   */\n  instanceId?: string;\n  /** Print debug logs. @default false */\n  debug?: boolean;\n}\n\nfunction parseDsnForServerMetrics(dsn: string): string {\n  let url: URL;\n  try {\n    url = new URL(dsn);\n  } catch {\n    throw new Error(`[BugCatch/ServerReporter] Invalid DSN: \"${dsn}\"`);\n  }\n\n  const sdkKey = url.searchParams.get('key');\n  if (!sdkKey) throw new Error(`[BugCatch/ServerReporter] DSN missing \"key\" param: \"${dsn}\"`);\n\n  const segments = url.pathname.split('/').filter(Boolean);\n  const projectId = segments[segments.length - 1];\n  if (!projectId) throw new Error(`[BugCatch/ServerReporter] Cannot extract projectId from DSN: \"${dsn}\"`);\n\n  return `${url.origin}${url.pathname}/server-metrics?key=${sdkKey}`;\n}\n\nfunction measureEventLoopLag(): Promise<number> {\n  const start = Date.now();\n  return new Promise<number>((resolve) => {\n    setImmediate(() => resolve(Date.now() - start));\n  });\n}\n\nexport class BugCatchServerReporter {\n  private timer: ReturnType<typeof setInterval> | null = null;\n  private readonly serverMetricsUrl: string;\n  private readonly interval: number;\n  private readonly instanceId: string;\n  private readonly debug: boolean;\n  private prevCpuUsage = process.cpuUsage();\n  private prevCpuTime = Date.now();\n\n  constructor(opts: ServerReporterOptions) {\n    this.serverMetricsUrl = parseDsnForServerMetrics(opts.dsn);\n    this.interval = opts.reportInterval ?? 30_000;\n    this.instanceId = opts.instanceId ?? os.hostname();\n    this.debug = opts.debug ?? false;\n  }\n\n  start(): void {\n    if (this.timer) return;\n    // send immediately, then on each interval\n    void this.report();\n    this.timer = setInterval(() => void this.report(), this.interval);\n    // unref so the timer doesn't prevent the process from exiting naturally\n    if (typeof this.timer.unref === 'function') this.timer.unref();\n    this.log(`Started - reporting every ${this.interval}ms`);\n  }\n\n  stop(): void {\n    if (this.timer) {\n      clearInterval(this.timer);\n      this.timer = null;\n      this.log('Stopped');\n    }\n  }\n\n  private async report(): Promise<void> {\n    try {\n      const mem = process.memoryUsage();\n      const heapUsedMb  = +(mem.heapUsed  / 1024 / 1024).toFixed(2);\n      const heapTotalMb = +(mem.heapTotal / 1024 / 1024).toFixed(2);\n      const rssMb       = +(mem.rss       / 1024 / 1024).toFixed(2);\n      const uptimeSeconds = Math.floor(process.uptime());\n\n      // CPU delta over the last interval\n      const now = Date.now();\n      const elapsed = (now - this.prevCpuTime) * 1000; // µs\n      const cpuDelta = process.cpuUsage(this.prevCpuUsage);\n      const cpuPercent = elapsed > 0\n        ? +((cpuDelta.user + cpuDelta.system) / elapsed * 100).toFixed(2)\n        : null;\n      this.prevCpuUsage = process.cpuUsage();\n      this.prevCpuTime = now;\n\n      const eventLoopLagMs = +(await measureEventLoopLag()).toFixed(2);\n\n      const payload = {\n        instance_id:       this.instanceId,\n        heap_used_mb:      heapUsedMb,\n        heap_total_mb:     heapTotalMb,\n        rss_mb:            rssMb,\n        cpu_percent:       cpuPercent,\n        event_loop_lag_ms: eventLoopLagMs,\n        uptime_seconds:    uptimeSeconds,\n      };\n\n      this.log('Sending snapshot', payload);\n\n      const res = await fetch(this.serverMetricsUrl, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(payload),\n      });\n\n      if (!res.ok) {\n        this.log('Server rejected snapshot -', res.status, await res.text().catch(() => ''));\n      }\n    } catch (err) {\n      this.log('Failed to send snapshot -', (err as Error).message);\n    }\n  }\n\n  private log(...args: unknown[]): void {\n    if (this.debug) console.debug('[BugCatch/ServerReporter]', ...args);\n  }\n}\n","import { BugCatchClient } from './client.js';\nimport type { BugCatchOptions, UserContext, BreadcrumbEntry, LogLevel } from './types.js';\nimport type { BugCatchTransaction } from './tracing.js';\n\nexport type { BugCatchOptions, UserContext, BreadcrumbEntry };\nexport type {\n  EventPayload,\n  StackFrame,\n  ParsedDsn,\n  LogLevel,\n  LogPayload,\n  TransactionPayload,\n  SpanPayload,\n  SessionPayload,\n  SessionStatus,\n  WebVitalPayload,\n  WebVitalMetric,\n  ReplayChunkPayload,\n} from './types.js';\nexport { BugCatchTransaction, BugCatchSpan } from './tracing.js';\nexport { BugCatchClient };\nexport { BugCatchServerReporter } from './server-reporter.js';\nexport type { ServerReporterOptions } from './server-reporter.js';\n\n// ─── Singleton instance ───────────────────────────────────────────────────────\n\nlet _client: BugCatchClient | null = null;\n\nfunction getClient(): BugCatchClient {\n  if (!_client) {\n    throw new Error('[BugCatch] SDK not initialized. Call BugCatch.init(options) first.');\n  }\n  return _client;\n}\n\n// ─── Public singleton API ─────────────────────────────────────────────────────\n\nconst BugCatch = {\n  /**\n   * Initialize the SDK. Call this once, as early as possible in your app.\n   *\n   * @example\n   * BugCatch.init({\n   *   dsn: 'http://localhost:3000/ingest/project-id?key=sdk-key',\n   *   release: '1.0.0',\n   *   environment: 'production',\n   * });\n   */\n  init(options: BugCatchOptions): BugCatchClient {\n    if (_client) {\n      console.warn('[BugCatch] init() called more than once. Ignoring.');\n      return _client;\n    }\n    _client = new BugCatchClient(options);\n    return _client;\n  },\n\n  /**\n   * Capture an Error object or any value as an error event.\n   * Returns the generated event_id.\n   */\n  captureException(error: unknown, extra?: Record<string, unknown>): string {\n    return getClient().captureException(error, extra);\n  },\n\n  /**\n   * Capture a plain text message as an event.\n   * Returns the generated event_id.\n   */\n  captureMessage(message: string, level?: string, extra?: Record<string, unknown>): string {\n    return getClient().captureMessage(message, level, extra);\n  },\n\n  /**\n   * Set the current user context. Attached to all subsequent events.\n   */\n  setUser(user: UserContext): void {\n    getClient().setUser(user);\n  },\n\n  /**\n   * Clear the current user context (e.g. on logout).\n   */\n  clearUser(): void {\n    getClient().clearUser();\n  },\n\n  /**\n   * Set a tag that will be attached to all subsequent events.\n   */\n  setTag(key: string, value: string): void {\n    getClient().setTag(key, value);\n  },\n\n  /**\n   * Manually add a breadcrumb.\n   */\n  addBreadcrumb(crumb: BreadcrumbEntry): void {\n    getClient().addBreadcrumb(crumb);\n  },\n\n  /**\n   * Queue a structured log line. Batched and flushed automatically -\n   * does not send a request per call.\n   *\n   * @example\n   * BugCatch.captureLog('info', 'Checkout completed', { orderId: '4821' });\n   */\n  captureLog(\n    level: LogLevel,\n    message: string,\n    attributes?: Record<string, unknown>,\n    traceId?: string,\n  ): void {\n    getClient().captureLog(level, message, attributes, traceId);\n  },\n\n  /**\n   * Set the trace id attached to every subsequent `captureLog()` call that\n   * doesn't pass its own. Global mutable state - a Node server handling\n   * concurrent requests should pass `traceId` explicitly to `captureLog()`\n   * instead.\n   */\n  setTraceId(traceId: string): void {\n    getClient().setTraceId(traceId);\n  },\n\n  /** Clear the trace id set via `setTraceId()`. */\n  clearTraceId(): void {\n    getClient().clearTraceId();\n  },\n\n  /** Send any queued log lines immediately instead of waiting for the next flush. */\n  flushLogsNow(): Promise<void> {\n    return getClient().flushLogsNow();\n  },\n\n  /**\n   * Send any queued session updates immediately instead of waiting for the\n   * next flush. Useful before a short-lived script exits.\n   */\n  flushSessionsNow(): Promise<void> {\n    return getClient().flushSessionsNow();\n  },\n\n  /**\n   * Send any queued Web Vitals readings immediately instead of waiting for\n   * the next flush. Web Vitals capture is automatic in the browser\n   * (`autoCaptureWebVitals: true` by default) - you rarely need this.\n   */\n  flushWebVitalsNow(): Promise<void> {\n    return getClient().flushWebVitalsNow();\n  },\n\n  /**\n   * Start recording session replay if it isn't already running. Only needed\n   * when `sessionReplay: true` wasn't set at `init()` - e.g. starting a\n   * recording after a user opts in. No-op outside the browser.\n   *\n   * @example\n   * BugCatch.startReplayNow();\n   */\n  startReplayNow(): void {\n    getClient().startReplayNow();\n  },\n\n  /** Stop the active session replay recording (if any) and flush what's queued. */\n  stopReplayNow(): void {\n    getClient().stopReplayNow();\n  },\n\n  /** Send any queued session replay chunks immediately instead of waiting for the next flush. */\n  flushReplayNow(): Promise<void> {\n    return getClient().flushReplayNow();\n  },\n\n  /** The active replay recording's id, if session replay is currently running. */\n  getReplayId(): string | undefined {\n    return getClient().getReplayId();\n  },\n\n  /**\n   * Whether the given user (or the currently `setUser()`-set one) may be\n   * session-replay recorded under this project's privacy allowlist. Fails\n   * closed - a network error counts as \"not allowed\". `startReplayNow()`\n   * and the `sessionReplay: true` init option already check this before\n   * recording starts; call it directly if your app wants to decide first\n   * (e.g. to show/hide a \"recording\" indicator) rather than find out only\n   * after attempting to start.\n   *\n   * @example\n   * if (await BugCatch.isReplayAllowed()) BugCatch.startReplayNow();\n   */\n  isReplayAllowed(userId?: string): Promise<boolean> {\n    return getClient().isReplayAllowed(userId);\n  },\n\n  /**\n   * Start a new traced transaction. Queue for delivery by calling\n   * `.finish()` on it (and on any spans you started).\n   *\n   * @example\n   * const txn = BugCatch.startTransaction('GET /api/orders/:id', 'http.server');\n   * const span = txn.startChild('db.query', 'SELECT * FROM orders WHERE id = ?');\n   * span.finish();\n   * txn.setHttpStatus(200);\n   * txn.finish();\n   */\n  startTransaction(name: string, op?: string): BugCatchTransaction {\n    return getClient().startTransaction(name, op);\n  },\n\n  /**\n   * Set the transaction that fetch/XHR auto-instrumentation attaches child\n   * spans to. Global mutable state - a Node server handling concurrent\n   * requests should use `req.bugcatchTransaction` (set by\n   * `tracingMiddleware()`) instead of relying on this.\n   */\n  setCurrentTransaction(transaction: BugCatchTransaction | undefined): void {\n    getClient().setCurrentTransaction(transaction);\n  },\n\n  /** The transaction set via `setCurrentTransaction`, if any. */\n  getCurrentTransaction(): BugCatchTransaction | undefined {\n    return getClient().getCurrentTransaction();\n  },\n\n  /** Send any queued transactions immediately instead of waiting for the next flush. */\n  flushTransactionsNow(): Promise<void> {\n    return getClient().flushTransactionsNow();\n  },\n\n  /**\n   * Express/Connect-style middleware: starts an `http.server` transaction\n   * per request, finishes it when the response ends.\n   * Drops 404s by default, and any route you name via `ignoreRoutes` (e.g.\n   * health checks) - see `BugCatchClient.tracingMiddleware()`.\n   *\n   * @example\n   * app.use(BugCatch.tracingMiddleware());\n   * app.use(BugCatch.tracingMiddleware({ ignoreRoutes: ['/health'] }));\n   */\n  tracingMiddleware(options?: { ignoreStatusCodes?: number[]; ignoreRoutes?: Array<string | RegExp> }) {\n    return getClient().tracingMiddleware(options);\n  },\n\n  /**\n   * Auto-instrument TypeORM: every query run through the given `DataSource`\n   * becomes a `db.query` child span on the current transaction.\n   *\n   * @example\n   * BugCatch.instrumentTypeOrm(dataSource); // the TypeORM DataSource\n   */\n  instrumentTypeOrm(\n    dataSource: Parameters<BugCatchClient['instrumentTypeOrm']>[0],\n  ): () => void {\n    return getClient().instrumentTypeOrm(dataSource);\n  },\n\n  /**\n   * Auto-instrument ioredis: every command sent through the given `Redis`\n   * class becomes a `cache.command` child span on the current transaction.\n   *\n   * @example\n   * import Redis from 'ioredis';\n   * BugCatch.instrumentIoredis(Redis);\n   */\n  instrumentIoredis(\n    RedisClass: Parameters<BugCatchClient['instrumentIoredis']>[0],\n  ): () => void {\n    return getClient().instrumentIoredis(RedisClass);\n  },\n\n  /**\n   * Manually report an API call timing to BugCatch.\n   * Use when `autoTrackRequests` is off or for server-side tracking.\n   *\n   * @example\n   * const start = Date.now();\n   * await fetch('/api/orders');\n   * BugCatch.trackRequest('GET', '/api/orders', Date.now() - start, 200);\n   */\n  trackRequest(method: string, route: string, durationMs: number, statusCode: number): void {\n    getClient().trackRequest(method, route, durationMs, statusCode);\n  },\n\n  /**\n   * Tear down all listeners. Useful in SPA cleanup or hot-reload scenarios.\n   */\n  destroy(): void {\n    _client?.destroy();\n    _client = null;\n  },\n};\n\n// Named export for CJS consumers: const { BugCatch } = require('bugcatch-sdk')\nexport { BugCatch };\n\n// Default export for ESM consumers: import BugCatch from 'bugcatch-sdk'\nexport default BugCatch;\n"]}