@botim/mp-debug-sdk 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +91 -147
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -7
- package/dist/index.d.ts +16 -7
- package/dist/index.js +91 -147
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/buffer.ts","../src/transport.ts","../src/attach.ts","../src/redact.ts","../src/serialize.ts","../src/interceptors/console.ts","../src/interceptors/errors.ts","../src/interceptors/network.ts","../src/commands/registry.ts","../src/commands/builtins.ts","../src/dedup.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const SCHEMA_VERSION = 2 as const;\n\nexport type EventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport type EventType =\n | 'console'\n | 'network'\n | 'error'\n | 'lifecycle'\n | 'bridge'\n | 'perf'\n | 'command-ack'\n | 'command-rejected';\n\nexport interface DebugEventBase {\n v: typeof SCHEMA_VERSION;\n sid: string;\n seq: number;\n ts: number;\n type: EventType;\n level: EventLevel;\n meta?: EventMeta;\n}\n\nexport interface EventMeta {\n route?: string;\n build?: string;\n appVersion?: string;\n deviceId?: string;\n userIdHash?: string;\n /** Set on command-ack / command-rejected events to correlate with the originating CommandRequest. */\n commandId?: string;\n /**\n * Set ONLY on synthesized rollup events emitted by the SDK's deduper.\n * Carries the count of suppressed identical events in the just-closed\n * window. Original (non-suppressed) events do NOT carry this field.\n */\n dedup?: {\n /** Stable signature used to bucket the suppressed events. */\n signature: string;\n /** Number of suppressed occurrences (excludes the leading event that was already emitted). */\n count: number;\n /** Timestamp of the first occurrence in the window. */\n firstTs: number;\n /** Timestamp of the last occurrence in the window. */\n lastTs: number;\n };\n}\n\nexport type SerializedValue =\n | { k: 'primitive'; v: string | number | boolean | null }\n | { k: 'undefined' }\n | { k: 'string'; v: string; truncated?: boolean }\n | { k: 'json'; v: string; truncated?: boolean }\n | { k: 'error'; name: string; message: string; stack?: string }\n | { k: 'circular' }\n | { k: 'function'; name?: string }\n | { k: 'unserializable'; reason: string };\n\nexport interface ConsolePayload {\n method: 'log' | 'info' | 'warn' | 'error' | 'debug';\n args: SerializedValue[];\n}\n\nexport type NetworkPhase = 'request' | 'response' | 'error';\n\nexport interface NetworkPayload {\n phase: NetworkPhase;\n reqId: string;\n method: string;\n url: string;\n status?: number;\n durationMs?: number;\n reqHeaders?: Record<string, string>;\n reqBody?: string;\n reqBodyTruncated?: boolean;\n resHeaders?: Record<string, string>;\n resBody?: string;\n resBodyTruncated?: boolean;\n errorMessage?: string;\n errorName?: string;\n}\n\nexport type ErrorSource = 'window.error' | 'unhandledrejection' | 'manual';\n\nexport interface ErrorPayload {\n message: string;\n name?: string;\n stack?: string;\n source: ErrorSource;\n filename?: string;\n lineno?: number;\n colno?: number;\n}\n\nexport type LifecycleEvent =\n | 'launch'\n | 'pageShow'\n | 'pageHide'\n | 'route'\n | 'background'\n | 'foreground'\n | 'visibilityChange';\n\nexport interface LifecyclePayload {\n event: LifecycleEvent;\n data?: Record<string, unknown>;\n}\n\nexport interface BridgePayload {\n fn: string;\n argsPreview?: string;\n result?: 'ok' | 'error';\n durationMs?: number;\n errorMessage?: string;\n}\n\nexport interface PerfPayload {\n metric: string;\n value: number;\n unit?: string;\n}\n\n/** Payload for command-ack: the handler ran, here's its result. */\nexport interface CommandAckPayload {\n command: string;\n ok: boolean;\n /** Handler return value, JSON-serializable. */\n result?: unknown;\n durationMs?: number;\n}\n\n/** Payload for command-rejected: relay sent a command we won't run. */\nexport interface CommandRejectedPayload {\n command: string;\n reason:\n | 'unknown-command'\n | 'rate-limited'\n | 'invalid-args'\n | 'handler-threw'\n | 'overridden';\n details?: string;\n}\n\nexport type DebugEvent =\n | (DebugEventBase & { type: 'console'; payload: ConsolePayload })\n | (DebugEventBase & { type: 'network'; payload: NetworkPayload })\n | (DebugEventBase & { type: 'error'; payload: ErrorPayload })\n | (DebugEventBase & { type: 'lifecycle'; payload: LifecyclePayload })\n | (DebugEventBase & { type: 'bridge'; payload: BridgePayload })\n | (DebugEventBase & { type: 'perf'; payload: PerfPayload })\n | (DebugEventBase & { type: 'command-ack'; payload: CommandAckPayload })\n | (DebugEventBase & { type: 'command-rejected'; payload: CommandRejectedPayload });\n\nexport interface UploadBatch {\n sessionToken: string;\n events: DebugEvent[];\n}\n\nexport interface UploadAck {\n acceptedSeq: number;\n rejected?: Array<{ seq: number; reason: string }>;\n}\n\nexport type StreamFrame =\n | { kind: 'hello'; sid: string; devices: number }\n | { kind: 'event'; event: DebugEvent }\n | { kind: 'device-join'; deviceInfo: DeviceInfo }\n | { kind: 'device-leave'; deviceId: string }\n | { kind: 'gap'; deviceId: string; expectedSeq: number; gotSeq: number }\n | { kind: 'session-end'; reason: string };\n\nexport interface DeviceInfo {\n deviceId: string;\n platform: 'ios' | 'android' | 'web' | 'unknown';\n osVersion?: string;\n appName?: string;\n appVersion?: string;\n appBuild?: string;\n userAgent?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Build-time identity (resolved by the Vite plugin from `botim.{env}.json`)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type BotimEnv = 'dev' | 'uat' | 'beta' | 'prod';\n\n/**\n * The contents of `botim.{env}.json`, resolved at build time and injected\n * into the bundle via the virtual module `virtual:botim/config`.\n */\nexport interface BotimConfig {\n miniProgramId: string;\n env: BotimEnv;\n /** Short hash of the resolved config or the build, set by the plugin. */\n buildSignature: string;\n appName?: string;\n appVersion?: string;\n /** Forward-compatible bag for fields the relay may add later. */\n [extra: string]: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Consent\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ConsentInput {\n /** JWT issued by the BOTIM host runtime — strongest form. */\n hostToken?: string;\n /** Explicit user opt-in (e.g., set after a privacy dialog). */\n userOptIn?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Wire protocol — attach\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AttachRequest {\n miniProgramId: string;\n env: BotimEnv;\n buildSignature: string;\n deviceInfo: DeviceInfo;\n consent: ConsentInput;\n schemaVersion: typeof SCHEMA_VERSION;\n}\n\nexport interface AttachResponse {\n sid: string;\n deviceToken: string;\n expiresAt: number;\n ingestUrl: string;\n /** Endpoint the device long-polls for AI-issued commands. */\n commandPollUrl: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Wire protocol — commands (relay → device → ack)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CommandRequest {\n /** Relay-issued unique id, echoed in the resulting ack/rejected event. */\n id: string;\n /** Registered command name (kebab-case). */\n name: string;\n /** Arbitrary JSON args, validated by the handler. */\n args?: Record<string, unknown>;\n /** Optional deadline; handlers SHOULD respect it. */\n deadlineTs?: number;\n}\n\n/** Long-poll response shape from `commandPollUrl`. */\nexport interface CommandPollResponse {\n commands: CommandRequest[];\n /** Suggested seconds until the next poll. */\n nextDelayMs?: number;\n}\n\nexport type CommandHandler = (\n args: Record<string, unknown>,\n ctx: CommandContext,\n) => unknown | Promise<unknown>;\n\nexport interface CommandContext {\n commandId: string;\n command: string;\n signal: AbortSignal;\n}\n","/**\n * Errors that escape the SDK into host code.\n *\n * The SDK's no-throw invariant has exactly two carve-outs:\n * - `BotimConfigError` — thrown synchronously by `enableRemoteDebug` when the\n * resolved `BotimConfig` is missing or invalid. Prevents any I/O.\n * - `BotimConsentError` — thrown synchronously by `enableRemoteDebug` when\n * consent has not been granted in a `prod` build. Prevents any I/O.\n *\n * Both are intentionally synchronous and pre-installation: at the moment they\n * fire, no globals have been wrapped, no listeners installed, no network sent.\n */\n\nconst BRAND = '@botim/debug-sdk' as const;\n\nexport class BotimConfigError extends Error {\n readonly name = 'BotimConfigError';\n readonly code: string;\n readonly path?: string;\n\n constructor(message: string, opts: { code: string; path?: string } = { code: 'invalid-config' }) {\n super(`[${BRAND}] ${message}`);\n this.code = opts.code;\n this.path = opts.path;\n }\n}\n\nexport class BotimConsentError extends Error {\n readonly name = 'BotimConsentError';\n constructor(message: string) {\n super(`[${BRAND}] ${message}`);\n }\n}\n","import type { DebugEvent } from './types.js';\n\nexport interface RingBufferOptions {\n capacity: number;\n onDrop?: (count: number) => void;\n}\n\nexport class RingBuffer {\n private items: DebugEvent[] = [];\n private dropped = 0;\n\n constructor(private opts: RingBufferOptions) {}\n\n push(event: DebugEvent): void {\n if (this.items.length >= this.opts.capacity) {\n this.items.shift();\n this.dropped++;\n this.opts.onDrop?.(1);\n }\n this.items.push(event);\n }\n\n drain(max: number): DebugEvent[] {\n if (max >= this.items.length) {\n const out = this.items;\n this.items = [];\n return out;\n }\n return this.items.splice(0, max);\n }\n\n size(): number {\n return this.items.length;\n }\n\n droppedCount(): number {\n return this.dropped;\n }\n}\n","import type {\n CommandPollResponse,\n CommandRequest,\n UploadBatch,\n} from './types.js';\nimport { RingBuffer } from './buffer.js';\n\nexport interface TransportOptions {\n ingestUrl: string;\n deviceToken: string;\n buffer: RingBuffer;\n flushIntervalMs: number;\n maxBatchSize: number;\n maxRetries?: number;\n onError?: (err: unknown) => void;\n}\n\nexport interface CommandLoopOptions {\n commandPollUrl: string;\n /** Fired for each command pulled from the relay. Must not throw. */\n onCommand: (req: CommandRequest) => Promise<void> | void;\n /** Long-poll request timeout in ms. Server may finish sooner. */\n pollTimeoutMs?: number;\n /** Min/max backoff bounds on poll errors. */\n minBackoffMs?: number;\n maxBackoffMs?: number;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_POLL_TIMEOUT_MS = 25_000;\nconst DEFAULT_MIN_BACKOFF_MS = 500;\nconst DEFAULT_MAX_BACKOFF_MS = 30_000;\n\nexport class Transport {\n private timer: ReturnType<typeof setInterval> | null = null;\n private inflightUpload: AbortController | null = null;\n private inflightPoll: AbortController | null = null;\n private commandLoopRunning = false;\n private stopped = false;\n private flushing = false;\n /**\n * Pre-interception `fetch` reference, captured at construction so the\n * SDK's own ingest POSTs and command-poll GETs are NOT routed back through\n * the network interceptor. Without this, every ingest request would emit\n * a `network` event whose flush would emit another `network` event, ad\n * infinitum — and the AI command channel's long-polls would flood the\n * logs with one entry every ~25s of nothing happening.\n *\n * The interceptor is installed AFTER the Transport is constructed (see\n * src/index.ts:enableRemoteDebug), so this reference is the un-patched fn.\n */\n private readonly internalFetch: typeof fetch;\n\n constructor(private opts: TransportOptions) {\n this.internalFetch =\n typeof fetch === \"function\"\n ? fetch.bind(globalThis as unknown as { fetch: typeof fetch })\n : (((..._args: Parameters<typeof fetch>) => {\n throw new Error(\"[@botim/debug-sdk] fetch is not available in this environment\");\n }) as typeof fetch);\n }\n\n start(): void {\n if (this.timer) return;\n // Use `flush()` (which loops until the buffer is empty), NOT `flushOnce()`\n // which only sends a single batch per tick. Otherwise a flush interval of\n // several seconds combined with a burst of N events (where N > maxBatchSize)\n // would leave (N - maxBatchSize) events stuck in the buffer for ANOTHER\n // full cycle. With flush(), each tick fully drains, possibly via several\n // back-to-back POSTs, each still capped at maxBatchSize for HTTP body size.\n this.timer = setInterval(\n () => void this.flush().catch((err) => this.opts.onError?.(err)),\n this.opts.flushIntervalMs,\n );\n }\n\n async flush(): Promise<void> {\n while (!this.stopped && this.opts.buffer.size() > 0) {\n await this.flushOnce();\n }\n }\n\n private async flushOnce(): Promise<void> {\n if (this.flushing || this.opts.buffer.size() === 0) return;\n this.flushing = true;\n try {\n const events = this.opts.buffer.drain(this.opts.maxBatchSize);\n if (events.length === 0) return;\n const batch: UploadBatch = {\n sessionToken: this.opts.deviceToken,\n events,\n };\n await this.send(batch, 0);\n } finally {\n this.flushing = false;\n }\n }\n\n private async send(batch: UploadBatch, attempt: number): Promise<void> {\n if (this.stopped) return;\n this.inflightUpload = new AbortController();\n try {\n // NOTE: do NOT set `keepalive: true` here. The Fetch spec lets\n // browsers reject keepalive bodies over ~64 KiB, and a single\n // screenshot batch (JPEG base64 = 100–300 KiB) blows past that\n // every time, surfacing as `TypeError: Failed to fetch` before\n // any HTTP traffic leaves the tab. keepalive only matters at\n // page-unload time — see `stop()` for that path, which sends a\n // separate small drain request.\n const res = await this.internalFetch(this.opts.ingestUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.opts.deviceToken}`,\n },\n body: JSON.stringify(batch),\n signal: this.inflightUpload.signal,\n });\n if (!res.ok) {\n throw new Error(`ingest http ${res.status}`);\n }\n } catch (err) {\n if (this.stopped) return;\n const max = this.opts.maxRetries ?? DEFAULT_MAX_RETRIES;\n if (attempt >= max) {\n this.opts.onError?.(err);\n return;\n }\n const backoff = 250 * Math.pow(4, attempt);\n await new Promise((r) => setTimeout(r, backoff));\n return this.send(batch, attempt + 1);\n } finally {\n this.inflightUpload = null;\n }\n }\n\n /**\n * Start the AI command long-poll loop. Maintains AT MOST ONE in-flight\n * request to `commandPollUrl` at any time. Errors are reported via\n * `onError` and trigger exponential backoff. Stop with `transport.stop()`.\n */\n startCommandLoop(opts: CommandLoopOptions): void {\n if (this.commandLoopRunning) return;\n this.commandLoopRunning = true;\n\n const pollTimeout = opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const minBackoff = opts.minBackoffMs ?? DEFAULT_MIN_BACKOFF_MS;\n const maxBackoff = opts.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\n let attempt = 0;\n\n const loop = async (): Promise<void> => {\n while (!this.stopped) {\n this.inflightPoll = new AbortController();\n // Compose the long-poll abort with a hard timeout so a stalled relay\n // doesn't pin us forever. Using a manual setTimeout is portable across\n // environments where AbortSignal.timeout may be missing.\n const timeoutId = setTimeout(() => {\n this.inflightPoll?.abort();\n }, pollTimeout);\n\n try {\n const res = await this.internalFetch(opts.commandPollUrl, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.opts.deviceToken}` },\n signal: this.inflightPoll.signal,\n });\n if (!res.ok) {\n throw new Error(`command-poll http ${res.status}`);\n }\n // 204 = nothing pending; loop with a small spacing so we don't busy-loop.\n if (res.status === 204) {\n await sleep(minBackoff);\n attempt = 0;\n continue;\n }\n const json = (await res.json()) as CommandPollResponse;\n attempt = 0;\n for (const cmd of json.commands ?? []) {\n try {\n await opts.onCommand(cmd);\n } catch (err) {\n // onCommand is expected to never throw; if it does, surface but\n // keep the loop alive — one bad command must not kill the channel.\n this.opts.onError?.(err);\n }\n }\n if (typeof json.nextDelayMs === 'number' && json.nextDelayMs > 0) {\n await sleep(Math.min(json.nextDelayMs, maxBackoff));\n }\n } catch (err) {\n if (this.stopped) return;\n // AbortError on our own timeout is not a real error — treat as \"no commands\".\n const aborted =\n err instanceof Error &&\n (err.name === 'AbortError' || /aborted/i.test(err.message));\n if (!aborted) {\n this.opts.onError?.(err);\n attempt += 1;\n } else {\n attempt = 0;\n }\n const backoff = Math.min(\n maxBackoff,\n minBackoff * Math.pow(2, Math.max(0, attempt - 1)),\n );\n await sleep(backoff);\n } finally {\n clearTimeout(timeoutId);\n this.inflightPoll = null;\n }\n }\n };\n\n void loop();\n }\n\n async stop(): Promise<void> {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.opts.buffer.size() > 0) {\n const events = this.opts.buffer.drain(this.opts.buffer.size());\n const body = JSON.stringify({\n sessionToken: this.opts.deviceToken,\n events,\n });\n // `keepalive: true` is what lets a final flush survive page unload,\n // but browsers reject keepalive bodies over ~64 KiB. Only set it\n // when we're under the limit; otherwise fall back to a regular\n // fetch (which might be cancelled at unload, but that's strictly\n // better than rejecting outright and losing every event).\n const KEEPALIVE_BODY_LIMIT = 60 * 1024; // leave headroom under 64 KiB\n const useKeepalive = body.length <= KEEPALIVE_BODY_LIMIT;\n try {\n await this.internalFetch(this.opts.ingestUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.opts.deviceToken}`,\n },\n body,\n ...(useKeepalive ? { keepalive: true } : {}),\n });\n } catch (err) {\n this.opts.onError?.(err);\n }\n }\n this.stopped = true;\n this.commandLoopRunning = false;\n this.inflightUpload?.abort();\n this.inflightPoll?.abort();\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import {\n SCHEMA_VERSION,\n type AttachRequest,\n type AttachResponse,\n type BotimConfig,\n type ConsentInput,\n type DeviceInfo,\n} from './types.js';\n\n/**\n * Exchange a build-time `BotimConfig` + freshly-detected device info for a\n * server-issued `(sid, deviceToken, ingestUrl, commandPollUrl)` tuple.\n *\n * The relay anchors the resulting session to the `(miniProgramId, deviceId)`\n * pair so AI agents can discover this session via\n * `GET /v1/mp/{miniProgramId}/sessions`.\n */\nexport async function attachDevice(\n endpoint: string,\n config: BotimConfig,\n deviceInfo: DeviceInfo,\n consent: ConsentInput,\n): Promise<AttachResponse> {\n const base = endpoint.replace(/\\/$/, '');\n const url = `${base}/v1/attach`;\n\n const body: AttachRequest = {\n miniProgramId: config.miniProgramId,\n env: config.env,\n buildSignature: config.buildSignature,\n deviceInfo,\n consent,\n schemaVersion: SCHEMA_VERSION,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `[@botim/debug-sdk] attach failed: ${res.status} ${res.statusText} ${text}`.trim(),\n );\n }\n\n const json = (await res.json()) as AttachResponse;\n if (!json?.sid || !json?.deviceToken || !json?.ingestUrl || !json?.commandPollUrl) {\n throw new Error('[@botim/debug-sdk] attach response missing required fields');\n }\n // Normalize: path-only URLs (the recommended form, since v0.1.1) get\n // joined to the configured endpoint. Already-absolute URLs (legacy or\n // explicit) pass through. Result: the SDK never makes a direct cross-\n // origin call when the configured endpoint is behind a proxy.\n return {\n ...json,\n ingestUrl: resolveAgainstEndpoint(json.ingestUrl, base),\n commandPollUrl: resolveAgainstEndpoint(json.commandPollUrl, base),\n };\n}\n\nfunction resolveAgainstEndpoint(url: string, base: string): string {\n if (/^https?:\\/\\//i.test(url)) return url;\n // Ensure exactly one '/' between base and path.\n const path = url.startsWith('/') ? url : '/' + url;\n return base + path;\n}\n\nexport interface AppForDetection {\n name: string;\n version: string;\n build?: string;\n}\n\nexport function detectDeviceInfo(\n app: AppForDetection,\n override?: Partial<DeviceInfo>,\n): DeviceInfo {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;\n return {\n deviceId: override?.deviceId ?? generateDeviceId(),\n platform: override?.platform ?? detectPlatform(ua),\n osVersion: override?.osVersion,\n appName: override?.appName ?? app.name,\n appVersion: override?.appVersion ?? app.version,\n appBuild: override?.appBuild ?? app.build,\n userAgent: override?.userAgent ?? ua,\n };\n}\n\nfunction detectPlatform(ua: string | undefined): DeviceInfo['platform'] {\n if (!ua) return 'unknown';\n if (/Android/i.test(ua)) return 'android';\n if (/iPhone|iPad|iPod/i.test(ua)) return 'ios';\n if (/Mozilla|Chrome|Safari|Firefox/i.test(ua)) return 'web';\n return 'unknown';\n}\n\nfunction generateDeviceId(): string {\n const c: { randomUUID?: () => string } | undefined =\n typeof crypto !== 'undefined' ? (crypto as unknown as { randomUUID?: () => string }) : undefined;\n if (c?.randomUUID) return c.randomUUID();\n return 'dev-' + Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","const REDACTED = '[REDACTED]';\n\nexport function redactHeaders(\n headers: Record<string, string> | undefined,\n redactList: readonly string[],\n): Record<string, string> | undefined {\n if (!headers) return headers;\n const lower = new Set(redactList.map((h) => h.toLowerCase()));\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = lower.has(k.toLowerCase()) ? REDACTED : v;\n }\n return out;\n}\n\nexport function redactBody(\n body: string | undefined,\n patterns: readonly RegExp[],\n maxBytes: number,\n): { body: string | undefined; truncated: boolean } {\n if (body === undefined) return { body: undefined, truncated: false };\n let out = body;\n for (const pat of patterns) {\n if (pat.global) pat.lastIndex = 0;\n out = out.replace(pat, REDACTED);\n }\n let truncated = false;\n if (out.length > maxBytes) {\n out = out.slice(0, maxBytes);\n truncated = true;\n }\n return { body: out, truncated };\n}\n\nexport function headersFromInit(\n init: HeadersInit | undefined,\n): Record<string, string> | undefined {\n if (!init) return undefined;\n const out: Record<string, string> = {};\n if (init instanceof Headers) {\n init.forEach((v, k) => (out[k] = v));\n } else if (Array.isArray(init)) {\n for (const [k, v] of init) out[k] = v;\n } else {\n Object.assign(out, init);\n }\n return out;\n}\n\nexport function headersFromResponse(res: Response): Record<string, string> {\n const out: Record<string, string> = {};\n res.headers.forEach((v, k) => (out[k] = v));\n return out;\n}\n\nexport async function readBodyForCapture(\n body: BodyInit | null | undefined,\n): Promise<string | undefined> {\n if (body == null) return undefined;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n try {\n return new TextDecoder().decode(body as ArrayBuffer);\n } catch {\n return '[binary]';\n }\n }\n if (body instanceof Blob) {\n try {\n return await body.text();\n } catch {\n return '[blob]';\n }\n }\n if (body instanceof FormData) {\n const parts: string[] = [];\n body.forEach((v, k) => parts.push(`${k}=${typeof v === 'string' ? v : '[file]'}`));\n return parts.join('&');\n }\n return undefined;\n}\n","import type { SerializedValue } from './types.js';\n\nconst MAX_STRING_LEN = 2048;\nconst MAX_OBJECT_BYTES = 4096;\n\nexport function serializeArg(value: unknown): SerializedValue {\n if (value === undefined) return { k: 'undefined' };\n if (value === null) return { k: 'primitive', v: null };\n\n const t = typeof value;\n if (t === 'boolean' || t === 'number') {\n return { k: 'primitive', v: value as boolean | number };\n }\n if (t === 'bigint') {\n return { k: 'primitive', v: (value as bigint).toString() + 'n' };\n }\n if (t === 'string') {\n const s = value as string;\n if (s.length > MAX_STRING_LEN) {\n return { k: 'string', v: s.slice(0, MAX_STRING_LEN), truncated: true };\n }\n return { k: 'string', v: s };\n }\n if (t === 'function') {\n return { k: 'function', name: (value as { name?: string }).name || undefined };\n }\n if (value instanceof Error) {\n return { k: 'error', name: value.name, message: value.message, stack: value.stack };\n }\n\n try {\n const seen = new WeakSet<object>();\n const json = JSON.stringify(value, function replacer(_k, v) {\n if (typeof v === 'bigint') return v.toString() + 'n';\n if (typeof v === 'function') return `[Function: ${v.name || 'anonymous'}]`;\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n });\n if (json === undefined) {\n return { k: 'unserializable', reason: 'undefined-result' };\n }\n if (json.length > MAX_OBJECT_BYTES) {\n return { k: 'json', v: json.slice(0, MAX_OBJECT_BYTES), truncated: true };\n }\n return { k: 'json', v: json };\n } catch (err) {\n return {\n k: 'unserializable',\n reason: err instanceof Error ? err.message : 'unknown',\n };\n }\n}\n","import type { ConsolePayload, EventLevel } from '../types.js';\nimport { serializeArg } from '../serialize.js';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype Method = (typeof METHODS)[number];\n\nconst LEVEL: Record<Method, EventLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\nexport interface ConsoleInterceptorOptions {\n emit: (level: EventLevel, payload: ConsolePayload) => void;\n sample: number;\n}\n\ntype ConsoleFn = (...args: unknown[]) => void;\n\nexport function installConsoleInterceptor(\n opts: ConsoleInterceptorOptions,\n): () => void {\n const originals: Partial<Record<Method, ConsoleFn>> = {};\n let active = false;\n\n for (const m of METHODS) {\n const original = console[m] as ConsoleFn;\n originals[m] = original;\n (console as unknown as Record<Method, ConsoleFn>)[m] = function patched(\n ...args: unknown[]\n ) {\n original.apply(console, args);\n if (active) return;\n if (opts.sample < 1 && Math.random() > opts.sample) return;\n active = true;\n try {\n const payload: ConsolePayload = {\n method: m,\n args: args.map(serializeArg),\n };\n opts.emit(LEVEL[m], payload);\n } catch {\n // Never surface SDK errors back through console — would loop.\n } finally {\n active = false;\n }\n };\n }\n\n return () => {\n for (const m of METHODS) {\n const original = originals[m];\n if (original) {\n (console as unknown as Record<Method, ConsoleFn>)[m] = original;\n }\n }\n };\n}\n","import type { ErrorPayload } from '../types.js';\n\nexport interface ErrorInterceptorOptions {\n emit: (payload: ErrorPayload) => void;\n}\n\ninterface ListenerTarget {\n addEventListener: (type: string, listener: (ev: Event) => void) => void;\n removeEventListener: (type: string, listener: (ev: Event) => void) => void;\n}\n\nexport function installErrorInterceptor(\n opts: ErrorInterceptorOptions,\n): () => void {\n const target: ListenerTarget | undefined = resolveTarget();\n if (!target) return () => {};\n\n const onError = (ev: Event) => {\n const e = ev as ErrorEvent;\n const err = e.error;\n opts.emit({\n message:\n e.message ||\n (err instanceof Error ? err.message : 'unknown error'),\n name: err instanceof Error ? err.name : undefined,\n stack: err instanceof Error ? err.stack : undefined,\n source: 'window.error',\n filename: e.filename,\n lineno: e.lineno,\n colno: e.colno,\n });\n };\n\n const onRejection = (ev: Event) => {\n const e = ev as PromiseRejectionEvent;\n const reason: unknown = e.reason;\n opts.emit({\n message:\n reason instanceof Error ? reason.message : safeString(reason),\n name: reason instanceof Error ? reason.name : undefined,\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'unhandledrejection',\n });\n };\n\n target.addEventListener('error', onError);\n target.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n target.removeEventListener('error', onError);\n target.removeEventListener('unhandledrejection', onRejection);\n };\n}\n\nfunction resolveTarget(): ListenerTarget | undefined {\n const w: unknown =\n typeof window !== 'undefined' ? window : (globalThis as unknown);\n if (\n w &&\n typeof (w as ListenerTarget).addEventListener === 'function' &&\n typeof (w as ListenerTarget).removeEventListener === 'function'\n ) {\n return w as ListenerTarget;\n }\n return undefined;\n}\n\nfunction safeString(v: unknown): string {\n try {\n return typeof v === 'string' ? v : JSON.stringify(v) ?? String(v);\n } catch {\n return String(v);\n }\n}\n","import type { NetworkPayload } from '../types.js';\nimport {\n headersFromInit,\n headersFromResponse,\n readBodyForCapture,\n} from '../redact.js';\n\n/**\n * Captures fetch + XHR traffic. Emits *raw* NetworkPayloads — redaction is\n * applied by the SDK's central emit pipeline (see src/index.ts) so that\n * every event in the ring buffer has the same redaction guarantees.\n *\n * Note: the SDK's own internal traffic (POSTs to ingestUrl, GETs to the\n * command-poll long-poll) is NOT seen by this interceptor — Transport\n * captures the un-patched `fetch` reference at construction time and uses\n * that for its own requests. The optional `shouldSkip` hook below is a\n * second line of defense for hosts that want to silence other known-noisy\n * endpoints (analytics beacons, heartbeat URLs, etc).\n */\nexport interface NetworkInterceptorOptions {\n emit: (payload: NetworkPayload) => void;\n sample: number;\n /**\n * Optional predicate: return true to skip emitting any event for this\n * request. Receives the resolved URL string and the HTTP method.\n */\n shouldSkip?: (url: string, method: string) => boolean;\n}\n\nexport function installNetworkInterceptor(\n opts: NetworkInterceptorOptions,\n): () => void {\n const restoreFetch = wrapFetch(opts);\n const restoreXHR = wrapXHR(opts);\n return () => {\n restoreFetch();\n restoreXHR();\n };\n}\n\nfunction shouldSample(rate: number): boolean {\n return rate >= 1 || Math.random() < rate;\n}\n\nfunction newReqId(): string {\n return 'r_' + Math.random().toString(36).slice(2, 10);\n}\n\nfunction wrapFetch(opts: NetworkInterceptorOptions): () => void {\n if (typeof fetch !== 'function') return () => {};\n const original = fetch;\n const target = globalThis as unknown as { fetch: typeof fetch };\n\n target.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n if (!shouldSample(opts.sample)) return original.call(this, input, init);\n\n const reqId = newReqId();\n const start = Date.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Bail early if the host has marked this URL as one to ignore. We pass\n // through to the original fetch without ever invoking opts.emit so the\n // request is fully transparent to the relay.\n if (opts.shouldSkip && opts.shouldSkip(url, method)) {\n return original.call(this, input, init);\n }\n\n let reqHeaders: Record<string, string> | undefined;\n let reqBody: string | undefined;\n try {\n if (input instanceof Request) {\n reqHeaders = headersFromResponse(input.clone() as unknown as Response);\n reqBody = await input.clone().text().catch(() => undefined);\n } else {\n reqHeaders = headersFromInit(init?.headers);\n reqBody = await readBodyForCapture(init?.body);\n }\n } catch {\n // ignore capture failures\n }\n\n opts.emit({ phase: 'request', reqId, method, url, reqHeaders, reqBody });\n\n try {\n const res = await original.call(this, input, init);\n let resBody: string | undefined;\n try {\n resBody = await res.clone().text();\n } catch {\n resBody = undefined;\n }\n opts.emit({\n phase: 'response',\n reqId,\n method,\n url,\n status: res.status,\n durationMs: Date.now() - start,\n resHeaders: headersFromResponse(res),\n resBody,\n });\n return res;\n } catch (err) {\n opts.emit({\n phase: 'error',\n reqId,\n method,\n url,\n durationMs: Date.now() - start,\n errorMessage: err instanceof Error ? err.message : String(err),\n errorName: err instanceof Error ? err.name : undefined,\n });\n throw err;\n }\n };\n\n return () => {\n target.fetch = original;\n };\n}\n\ninterface XhrState {\n reqId: string;\n start: number;\n method: string;\n url: string;\n reqHeaders: Record<string, string>;\n reqBody?: string;\n sampled: boolean;\n}\n\nfunction wrapXHR(opts: NetworkInterceptorOptions): () => void {\n if (typeof XMLHttpRequest === 'undefined') return () => {};\n const proto = XMLHttpRequest.prototype;\n const states = new WeakMap<XMLHttpRequest, XhrState>();\n\n const origOpen = proto.open;\n const origSend = proto.send;\n const origSetReqHeader = proto.setRequestHeader;\n\n proto.open = function patchedOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n const resolvedUrl = typeof url === 'string' ? url : url.toString();\n const upperMethod = method.toUpperCase();\n const skipped = opts.shouldSkip ? opts.shouldSkip(resolvedUrl, upperMethod) : false;\n const state: XhrState = {\n reqId: newReqId(),\n start: 0,\n method: upperMethod,\n url: resolvedUrl,\n reqHeaders: {},\n sampled: !skipped && shouldSample(opts.sample),\n };\n states.set(this, state);\n return (origOpen as (...a: unknown[]) => void).apply(this, [method, url, ...rest]);\n };\n\n proto.setRequestHeader = function patchedSetHeader(\n this: XMLHttpRequest,\n name: string,\n value: string,\n ) {\n const s = states.get(this);\n if (s) s.reqHeaders[name] = value;\n return origSetReqHeader.call(this, name, value);\n };\n\n proto.send = function patchedSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const s = states.get(this);\n if (!s || !s.sampled) {\n return (origSend as (...a: unknown[]) => void).apply(this, [body]);\n }\n\n s.start = Date.now();\n s.reqBody = typeof body === 'string' ? body : undefined;\n\n opts.emit({\n phase: 'request',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n reqHeaders: s.reqHeaders,\n reqBody: s.reqBody,\n });\n\n const onLoad = () => {\n const headers = parseXhrHeaders(this.getAllResponseHeaders());\n const resBody = typeof this.response === 'string' ? this.response : undefined;\n opts.emit({\n phase: 'response',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n status: this.status,\n durationMs: Date.now() - s.start,\n resHeaders: headers,\n resBody,\n });\n };\n const onError = () => {\n opts.emit({\n phase: 'error',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n durationMs: Date.now() - s.start,\n errorMessage: this.statusText || 'xhr error',\n });\n };\n\n this.addEventListener('load', onLoad);\n this.addEventListener('error', onError);\n this.addEventListener('timeout', onError);\n this.addEventListener('abort', onError);\n\n return (origSend as (...a: unknown[]) => void).apply(this, [body]);\n };\n\n return () => {\n proto.open = origOpen;\n proto.send = origSend;\n proto.setRequestHeader = origSetReqHeader;\n };\n}\n\nfunction parseXhrHeaders(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n if (!raw) return out;\n for (const line of raw.split(/\\r?\\n/)) {\n const idx = line.indexOf(':');\n if (idx < 0) continue;\n const k = line.slice(0, idx).trim();\n const v = line.slice(idx + 1).trim();\n if (k) out[k] = v;\n }\n return out;\n}\n","/**\n * Command allowlist registry.\n *\n * Design contract:\n * - The SDK NEVER executes a command that isn't registered, even if the\n * relay/agent claims it's trusted. This is the core safety invariant.\n * - Re-registering an existing name replaces the handler and emits an\n * `info`-level `command-overridden` event exactly once.\n * - Names are kebab-case; bad names are rejected synchronously (programmer\n * error, not a runtime error path).\n * - Dispatch never throws into the caller. Handler errors return a typed\n * failure result the long-poll loop turns into a `command-rejected` event.\n */\n\nimport type {\n CommandHandler,\n CommandRequest,\n CommandAckPayload,\n CommandRejectedPayload,\n} from '../types.js';\n\nconst NAME_PATTERN = /^[a-z][a-z0-9-]{1,47}$/;\n\nexport type DispatchResult =\n | { kind: 'ack'; payload: CommandAckPayload }\n | { kind: 'rejected'; payload: CommandRejectedPayload };\n\nexport interface OverrideListener {\n (name: string): void;\n}\n\nexport class CommandRegistry {\n private readonly handlers = new Map<string, CommandHandler>();\n private overrideListeners: OverrideListener[] = [];\n\n register(name: string, handler: CommandHandler): void {\n if (typeof name !== 'string' || !NAME_PATTERN.test(name)) {\n throw new Error(\n `[@botim/debug-sdk] invalid command name ${JSON.stringify(name)}; expected kebab-case matching ${NAME_PATTERN}`,\n );\n }\n if (typeof handler !== 'function') {\n throw new Error(`[@botim/debug-sdk] command \"${name}\" handler must be a function`);\n }\n const isOverride = this.handlers.has(name);\n this.handlers.set(name, handler);\n if (isOverride) {\n for (const fn of this.overrideListeners) {\n try {\n fn(name);\n } catch {\n // Listener errors must never propagate; consent invariant.\n }\n }\n }\n }\n\n unregister(name: string): boolean {\n return this.handlers.delete(name);\n }\n\n has(name: string): boolean {\n return this.handlers.has(name);\n }\n\n /** Subscribe to override events; returns an unsubscribe fn. */\n onOverride(fn: OverrideListener): () => void {\n this.overrideListeners.push(fn);\n return () => {\n this.overrideListeners = this.overrideListeners.filter((f) => f !== fn);\n };\n }\n\n /**\n * Dispatch a single command. Never throws; returns a typed result.\n * Caller is responsible for mapping the result onto an event envelope.\n */\n async dispatch(req: CommandRequest, signal: AbortSignal): Promise<DispatchResult> {\n const handler = this.handlers.get(req.name);\n if (!handler) {\n return {\n kind: 'rejected',\n payload: { command: req.name, reason: 'unknown-command' },\n };\n }\n\n const start = Date.now();\n try {\n const args = req.args ?? {};\n const result = await Promise.resolve(\n handler(args, { commandId: req.id, command: req.name, signal }),\n );\n return {\n kind: 'ack',\n payload: {\n command: req.name,\n ok: true,\n result,\n durationMs: Date.now() - start,\n },\n };\n } catch (err) {\n return {\n kind: 'rejected',\n payload: {\n command: req.name,\n reason: 'handler-threw',\n details: err instanceof Error ? err.message : String(err),\n },\n };\n }\n }\n}\n","/**\n * Built-in commands registered automatically when `enableRemoteDebug` runs.\n *\n * Most are thin shells over host-supplied callbacks: the SDK has no business\n * deciding what \"reload\" means in a given mini-program, so the host registers\n * the callback and the SDK exposes a stable wire-level command name.\n */\n\nimport type { CommandHandler } from '../types.js';\nimport { CommandRegistry } from './registry.js';\n\nconst MAX_DUMP_BYTES = 64 * 1024;\n// 1 MB of base64 chars ≈ 750 KB binary. A typical 1920×1080 JPEG (quality\n// 0.85) of a page UI lands at ~100–300 KB base64, well under this cap.\n// PNG captures of the same page are 3–5× larger; hosts wanting full PNG\n// fidelity should scale the canvas down before encoding.\nconst MAX_SCREENSHOT_BYTES = 1024 * 1024;\n\nexport interface BuiltinHostHooks {\n /** Reload the mini-program. If absent, `reload` returns rejected. */\n reload?: () => void | Promise<void>;\n /** Return a JSON-serializable snapshot of host state. */\n getState?: () => unknown | Promise<unknown>;\n /** Apply a feature flag override. */\n setFeatureFlag?: (key: string, value: unknown) => void | Promise<void>;\n /**\n * Capture a screenshot. Two return shapes are accepted:\n * - a raw base64 string → assumed PNG (legacy form)\n * - `{ data, format }` → format is one of 'png-base64' | 'jpeg-base64'\n * so the admin viewer can pick the right MIME for the data URL.\n * The SDK enforces a 1 MB base64 cap regardless.\n */\n screenshot?: () => ScreenshotResult | Promise<ScreenshotResult>;\n}\n\nexport type ScreenshotResult =\n | string\n | {\n data: string;\n format?:\n | 'png-base64'\n | 'jpeg-base64'\n /**\n * Self-contained HTML+CSS snapshot — `data` is a JSON string with\n * the shape `{ html, viewport, url, capturedAt }`. Admin viewers\n * render `html` inside a sandboxed `<iframe srcdoc>` so the result\n * looks pixel-identical to the live page without any pixel encoding.\n */\n | 'html-snapshot';\n };\n\n/**\n * Default screenshot capture used when the host doesn't provide\n * `builtins.screenshot`. Two strategies, tried in order:\n *\n * 1. SVG-foreignObject → canvas → JPEG.\n * Wraps the live DOM (with all readable stylesheets inlined) inside an\n * SVG `<foreignObject>`, loads that SVG as an image, draws it onto a\n * `<canvas>`, exports as JPEG q=0.85. Result is a self-contained image\n * — no external resources at view time, no iframe / sandbox quirks.\n * This is the same technique html2canvas uses for its fast path, but\n * stripped to ~60 lines. Bundle cost: 0 KB.\n *\n * 2. (Fallback) text-based HTML snapshot.\n * If step 1 throws — usually because the canvas was tainted by a\n * cross-origin image — we fall back to the JSON HTML snapshot. The\n * admin will render that via `<iframe srcdoc>`. Less faithful, but\n * always works.\n *\n * Hosts targeting non-DOM runtimes (native bridges) MUST provide their\n * own `builtins.screenshot` — neither strategy works without `document`.\n */\nasync function defaultDomScreenshot(): Promise<ScreenshotResult> {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n throw new Error(\n '[@botim/debug-sdk] default screenshot requires a DOM. Provide ' +\n 'builtins.screenshot for non-browser runtimes (e.g. native bridge).',\n );\n }\n try {\n return await captureViaSvgForeignObject();\n } catch (err) {\n // Cross-origin image tainted the canvas, foreignObject not supported,\n // or some other rendering quirk. Fall back to a text snapshot.\n // Surface the reason once on the console so hosts can diagnose why the\n // pixel-perfect path failed instead of silently always seeing the HTML\n // fallback.\n try {\n // eslint-disable-next-line no-console\n console.warn(\n '[@botim/debug-sdk] SVG/canvas screenshot failed, falling back to HTML snapshot:',\n err instanceof Error ? err.message : err,\n );\n } catch {\n /* noop */\n }\n return await captureViaHtmlSnapshot();\n }\n}\n\n// ─── Composed-tree HTML serializer (shared by both strategies) ────────────\n//\n// `Element.outerHTML` only emits the *light* DOM. For a Custom Element\n// like `<bot-button>` whose content lives in a shadow root, that means\n// the serialized output is just `<bot-button></bot-button>` — empty.\n//\n// `serializeComposed` walks the COMPOSED tree (light + shadow DOM with\n// `<slot>` resolution) so the serialized HTML is what the user actually\n// sees. This is the only way buckit2 / lit / any web-components-based\n// design system survives the screenshot path.\n//\n// Spec reference: https://dom.spec.whatwg.org/#concept-shadow-including-tree\n\nconst VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'source', 'track', 'wbr',\n]);\n\nconst SKIP_TAGS = new Set([ 'script', 'noscript', 'template' ]);\n\n// Devtool / framework overlays we never want in a snapshot. Everything\n// else with a hyphen is a real Custom Element and should be expanded.\nconst DEVTOOL_OVERLAY_PREFIXES = [ 'vite-', 'astro-dev-', 'next-route-' ];\n\nfunction isDevtoolOverlay(tag: string): boolean {\n return DEVTOOL_OVERLAY_PREFIXES.some((p) => tag.startsWith(p));\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"');\n}\n\ninterface ComposedOptions {\n /** When true, drop cross-origin `<img>` so canvas drawImage can't taint. */\n stripCrossOriginImages: boolean;\n}\n\nfunction serializeComposed(node: Node, opts: ComposedOptions, depth: number): string {\n if (depth > 256) return '';\n\n if (node.nodeType === Node.TEXT_NODE) {\n return escapeText(node.textContent ?? '');\n }\n if (node.nodeType === Node.COMMENT_NODE) return ''; // drop comments\n if (node.nodeType !== Node.ELEMENT_NODE) return '';\n\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n\n if (SKIP_TAGS.has(tag)) return '';\n if (isDevtoolOverlay(tag)) return '';\n\n // <slot>: substitute its assigned light-DOM nodes (or default content).\n // This is what makes `<bot-button>Choose contact</bot-button>` render\n // its text inside the button's shadow `<button><slot/></button>`.\n if (tag === 'slot') {\n const slot = el as HTMLSlotElement;\n let assigned: Node[] = [];\n try {\n assigned = slot.assignedNodes({ flatten: true });\n } catch {\n // Detached slot — fall back to default children below.\n }\n const source = assigned.length > 0 ? assigned : Array.from(el.childNodes);\n return source.map((c) => serializeComposed(c, opts, depth + 1)).join('');\n }\n\n // Stylesheet `<link rel=\"stylesheet\">` would 404 inside the iframe (no\n // network). We inline all CSS separately, so drop the link.\n if (tag === 'link' && (el.getAttribute('rel') || '').toLowerCase() === 'stylesheet') {\n return '';\n }\n\n // <style> textContent is raw CSS — pass through verbatim.\n if (tag === 'style') {\n return `<style>${(el as HTMLStyleElement).textContent ?? ''}</style>`;\n }\n\n // Cross-origin <img> would either fail to load in the iframe or taint\n // the canvas in the SVG path. Drop it when caller asks.\n if (tag === 'img' && opts.stripCrossOriginImages) {\n const src = el.getAttribute('src') || '';\n if (/^(https?:|\\/\\/)/i.test(src)) {\n try {\n const u = new URL(src, location.href);\n if (u.origin !== location.origin) return '';\n } catch {\n return '';\n }\n }\n }\n\n // <canvas> contents aren't preserved by clone — and rasterising it again\n // doesn't help. Drop the bitmap, keep the empty tag for layout fidelity.\n if (tag === 'canvas') return `<canvas></canvas>`;\n\n // Build attribute string. Drop event handlers (on*) — they'd be no-ops\n // in the iframe anyway, and inline JS in srcdoc is sandboxed off.\n const attrs = Array.from(el.attributes)\n .filter((a) => !a.name.startsWith('on'))\n .map((a) => ` ${a.name}=\"${escapeAttr(a.value)}\"`)\n .join('');\n\n if (VOID_ELEMENTS.has(tag)) return `<${tag}${attrs}>`;\n\n // Pivot here: if the element has a shadow root, walk the SHADOW tree;\n // its `<slot>` children will recursively pull in light-DOM content via\n // the slot branch above. Otherwise just walk the light children.\n const childSource: ParentNode = el.shadowRoot ?? el;\n const inner = Array.from(childSource.childNodes)\n .map((c) => serializeComposed(c, opts, depth + 1))\n .join('');\n\n return `<${tag}${attrs}>${inner}</${tag}>`;\n}\n\nfunction readInlineableStyles(): string {\n const chunks: string[] = [];\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n const rules = sheet.cssRules;\n for (const rule of Array.from(rules)) chunks.push(rule.cssText);\n } catch {\n // cross-origin sheet — skip.\n }\n }\n return chunks.join('\\n');\n}\n\n// ─── Strategy 1: SVG-foreignObject → canvas → JPEG ────────────────────────\n\nasync function captureViaSvgForeignObject(): Promise<ScreenshotResult> {\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n // Width: pin to the LAYOUT viewport (innerWidth) — that's what the user\n // actually sees, including on mobile-emulated devices. Using scrollWidth\n // here would inflate to the widest element, defeating responsive layout.\n // Height: scrollHeight so we capture below-the-fold content too, capped\n // so very long pages don't blow the 1 MB base64 cap.\n const w = Math.max(1, Math.min(window.innerWidth || document.documentElement.clientWidth || 1024, 2400));\n const h = Math.max(1, Math.min(document.documentElement.scrollHeight, 4000));\n\n const inlinedCss = readInlineableStyles();\n\n // Composed-tree HTML — shadow DOM expanded, devtool overlays dropped,\n // cross-origin images dropped (to keep the canvas non-tainted).\n const bodyHtml = serializeComposed(document.body, { stripCrossOriginImages: true }, 0);\n\n // We hand-build the XHTML root rather than cloning + serialising so we\n // can place an `xmlns` directly on `<html>` (XMLSerializer is finicky\n // about that on the documentElement) and omit head <link>/<script>.\n const htmlStr = `<html xmlns=\"http://www.w3.org/1999/xhtml\"><body>${bodyHtml}</body></html>`;\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">` +\n `<foreignObject width=\"100%\" height=\"100%\">` +\n (inlinedCss ? `<style xmlns=\"http://www.w3.org/1999/xhtml\">${escapeForXml(inlinedCss)}</style>` : '') +\n htmlStr +\n `</foreignObject>` +\n `</svg>`;\n\n const blobUrl = URL.createObjectURL(\n new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }),\n );\n\n try {\n const img = await loadImage(blobUrl);\n const canvas = document.createElement('canvas');\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('canvas 2D context unavailable');\n\n // Background fill. Avoids transparent regions becoming black in JPEG.\n const pageBg = getComputedStyle(document.body).backgroundColor || '#ffffff';\n ctx.fillStyle = pageBg.startsWith('rgba(0, 0, 0, 0)') ? '#ffffff' : pageBg;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n // toDataURL throws SecurityError if the canvas is tainted by a\n // cross-origin image with no CORS. Caller catches and falls back.\n const dataUrl = canvas.toDataURL('image/jpeg', 0.85);\n return { data: dataUrl.split(',')[1], format: 'jpeg-base64' };\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n // Hint to fetch with CORS so the canvas isn't tainted if the response\n // includes Access-Control-Allow-Origin: *. Browsers ignore this for\n // blob: URLs (which we use), but it doesn't hurt.\n img.crossOrigin = 'anonymous';\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('failed to render snapshot SVG'));\n img.src = src;\n });\n}\n\n// Encode raw CSS so it survives being placed inside an XML <style> element.\n// `<` is the only critical character; `&` we leave alone because we need\n// CSS rules like `&:hover` to round-trip if a host uses CSS-in-JS (rare).\nfunction escapeForXml(s: string): string {\n return s.replace(/]]>/g, ']]>').replace(/<\\//g, '</');\n}\n\n// ─── Strategy 2 (fallback): self-contained HTML snapshot ──────────────────\n\nasync function captureViaHtmlSnapshot(): Promise<ScreenshotResult> {\n const inlinedCss = readInlineableStyles();\n\n // Composed body — shadow DOM expanded so buckit2 web components show\n // their slotted text and inner layout. Cross-origin images are kept\n // here (the iframe will simply fail to load them; that's OK for an\n // approximate visual rather than a tainted canvas error).\n const bodyHtml = serializeComposed(document.body, { stripCrossOriginImages: false }, 0);\n\n const html =\n '<!DOCTYPE html>\\n' +\n '<html lang=\"en\">\\n' +\n '<head>\\n' +\n '<meta charset=\"utf-8\">\\n' +\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\\n' +\n `<base href=\"${escapeAttr(location.href)}\">\\n` +\n (inlinedCss ? `<style data-botim-snapshot=\"1\">${inlinedCss}</style>\\n` : '') +\n '</head>\\n' +\n `<body>${bodyHtml}</body>\\n` +\n '</html>';\n\n return {\n data: JSON.stringify({\n html,\n viewport: { w: window.innerWidth, h: window.innerHeight },\n url: location.href,\n capturedAt: Date.now(),\n }),\n format: 'html-snapshot',\n };\n}\n\nexport function registerBuiltins(\n registry: CommandRegistry,\n hooks: BuiltinHostHooks = {},\n): void {\n registry.register('ping', ping);\n registry.register('reload', makeReload(hooks.reload));\n registry.register('dump-state', makeDumpState(hooks.getState));\n registry.register('set-feature-flag', makeSetFlag(hooks.setFeatureFlag));\n registry.register('screenshot', makeScreenshot(hooks.screenshot));\n}\n\nconst ping: CommandHandler = () => ({ ok: true, ts: Date.now() });\n\nfunction makeReload(reload?: () => void | Promise<void>): CommandHandler {\n return async () => {\n if (!reload) throw new Error('reload hook not registered by host');\n await reload();\n return { reloaded: true };\n };\n}\n\nfunction makeDumpState(getState?: () => unknown | Promise<unknown>): CommandHandler {\n return async () => {\n if (!getState) throw new Error('getState hook not registered by host');\n const snapshot = await getState();\n const json = safeStringify(snapshot);\n const truncated = json.length > MAX_DUMP_BYTES;\n return {\n state: truncated ? json.slice(0, MAX_DUMP_BYTES) : json,\n truncated,\n bytes: json.length,\n };\n };\n}\n\nfunction makeSetFlag(\n setFeatureFlag?: (key: string, value: unknown) => void | Promise<void>,\n): CommandHandler {\n return async (args) => {\n if (!setFeatureFlag) throw new Error('setFeatureFlag hook not registered by host');\n const key = args.key;\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error('args.key must be a non-empty string');\n }\n if (!('value' in args)) {\n throw new Error('args.value is required');\n }\n await setFeatureFlag(key, args.value);\n return { applied: true, key };\n };\n}\n\nfunction makeScreenshot(\n screenshot?: () => ScreenshotResult | Promise<ScreenshotResult>,\n): CommandHandler {\n // Fall back to the zero-dep DOM serializer when the host doesn't provide\n // its own capture. Hosts targeting non-DOM runtimes MUST provide one.\n const capture = screenshot ?? defaultDomScreenshot;\n return async () => {\n const result = await capture();\n let data: string;\n let format: 'png-base64' | 'jpeg-base64' | 'html-snapshot';\n if (typeof result === 'string') {\n data = result;\n format = 'png-base64';\n } else if (result && typeof result.data === 'string') {\n data = result.data;\n format = result.format ?? 'png-base64';\n } else {\n throw new Error(\n \"screenshot hook must return a base64 string or { data, format }\",\n );\n }\n if (data.length === 0) throw new Error('screenshot hook returned empty data');\n if (data.length > MAX_SCREENSHOT_BYTES) {\n throw new Error(\n `screenshot ${data.length} bytes exceeds limit ${MAX_SCREENSHOT_BYTES}`,\n );\n }\n return { format, data, bytes: data.length };\n };\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n const seen = new WeakSet<object>();\n return JSON.stringify(v, function replacer(_k, val) {\n if (typeof val === 'bigint') return val.toString() + 'n';\n if (typeof val === 'function') return `[Function: ${(val as { name?: string }).name ?? 'anonymous'}]`;\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val as object)) return '[Circular]';\n seen.add(val as object);\n }\n return val;\n }) ?? '';\n } catch (err) {\n return JSON.stringify({ __unserializable: err instanceof Error ? err.message : 'unknown' });\n }\n}\n","/**\n * Per-signature sliding-window event deduper.\n *\n * Without this, a `setInterval(() => undefined.foo, 16)` produces ~60\n * `error` events per second; a flaky network endpoint in a tight retry\n * loop can fire hundreds of `network` events per minute. The relay's hot\n * retention is 24-48h — at those rates a single misbehaving session drowns\n * out everything else, and the device's own ingest budget gets eaten by\n * its own bug.\n *\n * Algorithm:\n * - Compute a stable signature for each event (type + key payload bits).\n * - First event with a given signature in a window: emit normally.\n * - Subsequent events with the same signature within `windowMs`: drop +\n * increment a counter.\n * - When the window closes (next same-signature event OR a periodic sweep),\n * emit ONE rollup event whose `meta.dedup` field carries the suppressed\n * count and the time range.\n *\n * Types are carried verbatim — a suppressed `error` produces an `error`-typed\n * rollup with the same level. Admin UIs / agents detect rollups by checking\n * `meta.dedup` rather than a separate event type, so no schema bump is needed.\n *\n * Default behaviour: enabled, 1000 ms window, applies to console / network /\n * error events only. lifecycle / bridge / perf / command-* events bypass.\n */\n\nimport type {\n ConsolePayload,\n DebugEvent,\n ErrorPayload,\n EventLevel,\n EventType,\n NetworkPayload,\n SerializedValue,\n} from './types.js';\n\nexport interface DedupOptions {\n /** Default true. Set false to disable deduping entirely. */\n enabled?: boolean;\n /** Sliding window per signature, in ms. Default 1000. */\n windowMs?: number;\n /** Hard cap on the number of tracked signatures. Default 500. Oldest entries evict on overflow. */\n maxSignatures?: number;\n}\n\nexport interface SuppressionSummary {\n signature: string;\n type: EventType;\n level: EventLevel;\n /** Total suppressed (excludes the leading event that was emitted as a real event). */\n count: number;\n firstTs: number;\n lastTs: number;\n /** Human-readable label describing what was suppressed. */\n label: string;\n /** Original payload of the LAST suppressed occurrence — gives admins a\n * recent-state look at the thing that's been firing in a loop. */\n examplePayload: ConsolePayload | NetworkPayload | ErrorPayload | unknown;\n}\n\nconst DEFAULT_WINDOW_MS = 1000;\nconst DEFAULT_MAX_SIGNATURES = 500;\nconst DEDUPED_TYPES: ReadonlyArray<EventType> = ['console', 'network', 'error'];\n\ninterface Entry {\n type: EventType;\n level: EventLevel;\n firstTs: number;\n lastTs: number;\n count: number;\n label: string;\n /** Last occurrence's payload, used so the rollup carries a representative example. */\n lastPayload: unknown;\n}\n\nexport class EventDeduper {\n private readonly enabled: boolean;\n private readonly windowMs: number;\n private readonly maxSig: number;\n private readonly entries = new Map<string, Entry>();\n private readonly onSummary: (s: SuppressionSummary) => void;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(onSummary: (s: SuppressionSummary) => void, opts: DedupOptions = {}) {\n this.enabled = opts.enabled !== false;\n this.windowMs = opts.windowMs ?? DEFAULT_WINDOW_MS;\n this.maxSig = opts.maxSignatures ?? DEFAULT_MAX_SIGNATURES;\n this.onSummary = onSummary;\n\n if (this.enabled) {\n // Sweep at half the window cadence so a burst that ends silently still\n // produces a rollup within ~1 window of the last occurrence.\n this.timer = setInterval(() => this.sweep(Date.now()), Math.max(250, Math.floor(this.windowMs / 2)));\n }\n }\n\n /**\n * Returns true if the SDK should emit `ev` to the buffer; false if it's a\n * duplicate within the current window and should be suppressed.\n */\n shouldEmit(ev: DebugEvent): boolean {\n if (!this.enabled) return true;\n if (!DEDUPED_TYPES.includes(ev.type)) return true;\n // command-ack / command-rejected are explicitly never deduped — each\n // command has its own commandId so they're inherently unique anyway.\n\n const sig = this.signatureOf(ev);\n const now = ev.ts;\n const existing = this.entries.get(sig);\n\n if (!existing) {\n this.evictIfFull();\n this.entries.set(sig, {\n type: ev.type,\n level: ev.level,\n firstTs: now,\n lastTs: now,\n count: 1,\n label: this.labelOf(ev),\n lastPayload: ev.payload,\n });\n return true;\n }\n\n if (now - existing.firstTs >= this.windowMs) {\n // Window closed: emit a summary for the prior bucket if it had > 1\n // occurrences, then open a fresh window with this event.\n if (existing.count > 1) this.emitSummary(sig, existing);\n this.entries.set(sig, {\n type: ev.type,\n level: ev.level,\n firstTs: now,\n lastTs: now,\n count: 1,\n label: this.labelOf(ev),\n lastPayload: ev.payload,\n });\n return true;\n }\n\n // Same window — suppress and tally.\n existing.lastTs = now;\n existing.count++;\n existing.lastPayload = ev.payload;\n return false;\n }\n\n /**\n * Force-flush any pending rollups (e.g. before stop). After this returns,\n * the internal map is empty.\n */\n flushAll(): void {\n for (const [sig, e] of this.entries) {\n if (e.count > 1) this.emitSummary(sig, e);\n }\n this.entries.clear();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.flushAll();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n\n private sweep(now: number): void {\n for (const [sig, e] of this.entries) {\n if (now - e.firstTs >= this.windowMs) {\n if (e.count > 1) this.emitSummary(sig, e);\n this.entries.delete(sig);\n }\n }\n }\n\n private emitSummary(sig: string, e: Entry): void {\n try {\n this.onSummary({\n signature: sig,\n type: e.type,\n level: e.level,\n count: e.count - 1, // first occurrence already emitted as a real event\n firstTs: e.firstTs,\n lastTs: e.lastTs,\n label: e.label,\n examplePayload: e.lastPayload,\n });\n } catch {\n // Never let a misbehaving summary callback crash the SDK; the no-throw\n // invariant applies here too.\n }\n }\n\n private evictIfFull(): void {\n if (this.entries.size < this.maxSig) return;\n // Drop the oldest entry. Map iteration is insertion-ordered, so the first\n // key returned is the earliest-inserted one. If the evicted entry has\n // pending suppressions, emit its summary first.\n const firstKey = this.entries.keys().next().value;\n if (typeof firstKey === 'string') {\n const e = this.entries.get(firstKey);\n if (e && e.count > 1) this.emitSummary(firstKey, e);\n this.entries.delete(firstKey);\n }\n }\n\n // ─── Signature & label generators ───────────────────────────────────────\n // Signatures are STRUCTURAL: they identify \"the same kind of event\" rather\n // than the same bytes. So `console.error(\"x\" + Date.now())` collapses by\n // method + first-token of args; an HTTP 500 on the same URL collapses\n // regardless of body content.\n\n private signatureOf(ev: DebugEvent): string {\n if (ev.type === 'console') {\n const p = ev.payload as ConsolePayload;\n const args = (p.args || []).map(consoleArgToken).join(' ').slice(0, 240);\n return `c:${p.method}:${args}`;\n }\n if (ev.type === 'network') {\n const p = ev.payload as NetworkPayload;\n // phase is part of the signature so request/response/error of the same\n // call don't collapse into a single bucket.\n return `n:${p.phase}:${p.method}:${p.url}:${p.status ?? ''}:${p.errorName ?? ''}`;\n }\n if (ev.type === 'error') {\n const p = ev.payload as ErrorPayload;\n return `e:${p.source}:${p.name ?? ''}:${(p.message ?? '').slice(0, 240)}`;\n }\n return `${ev.type}:${ev.level}`;\n }\n\n private labelOf(ev: DebugEvent): string {\n if (ev.type === 'console') {\n const p = ev.payload as ConsolePayload;\n return `console.${p.method}: ${(p.args || []).map(consoleArgToken).join(' ').slice(0, 160)}`;\n }\n if (ev.type === 'network') {\n const p = ev.payload as NetworkPayload;\n return `${p.method} ${p.url} (${p.phase}${p.status ? ' ' + p.status : ''})`;\n }\n if (ev.type === 'error') {\n const p = ev.payload as ErrorPayload;\n return `${p.name ?? 'Error'}: ${(p.message ?? '').slice(0, 160)}`;\n }\n return ev.type;\n }\n}\n\nfunction consoleArgToken(a: SerializedValue): string {\n switch (a.k) {\n case 'primitive': return String(a.v);\n case 'string':\n case 'json': return String(a.v).slice(0, 80);\n case 'error': return `${a.name ?? 'Error'}:${a.message ?? ''}`;\n case 'undefined': return 'undefined';\n case 'function': return `[fn:${a.name ?? '?'}]`;\n case 'circular': return '[Circular]';\n case 'unserializable': return `[unser:${a.reason}]`;\n default: return '?';\n }\n}\n","export * from './types.js';\nexport { BotimConfigError, BotimConsentError } from './errors.js';\n\nimport {\n SCHEMA_VERSION,\n type BotimConfig,\n type CommandHandler,\n type CommandRequest,\n type ConsolePayload,\n type ConsentInput,\n type DebugEvent,\n type DeviceInfo,\n type ErrorPayload,\n type EventLevel,\n type EventMeta,\n type NetworkPayload,\n} from './types.js';\nimport { BotimConfigError, BotimConsentError } from './errors.js';\nimport { RingBuffer } from './buffer.js';\nimport { Transport } from './transport.js';\nimport { attachDevice, detectDeviceInfo } from './attach.js';\nimport { redactBody, redactHeaders } from './redact.js';\nimport { installConsoleInterceptor } from './interceptors/console.js';\nimport { installErrorInterceptor } from './interceptors/errors.js';\nimport { installNetworkInterceptor } from './interceptors/network.js';\nimport { CommandRegistry } from './commands/registry.js';\nimport { registerBuiltins, type BuiltinHostHooks } from './commands/builtins.js';\nimport { EventDeduper, type DedupOptions, type SuppressionSummary } from './dedup.js';\n\nexport type { CommandHandler } from './types.js';\nexport type { BuiltinHostHooks } from './commands/builtins.js';\nexport type { DedupOptions, SuppressionSummary } from './dedup.js';\n\nexport interface RedactionConfig {\n headers?: string[];\n bodyPatterns?: RegExp[];\n maxBodyBytes?: number;\n}\n\nexport interface SamplingConfig {\n console?: number;\n network?: number;\n lifecycle?: number;\n bridge?: number;\n}\n\nexport interface AppInfo {\n name: string;\n version: string;\n build?: string;\n}\n\nexport interface RemoteDebugOptions {\n /** When false, returns a no-op handle and installs nothing. */\n enabled?: boolean;\n /** Relay base URL, e.g. \"https://debug.botim.dev\". */\n endpoint: string;\n /**\n * Optional override for the app identity reported in events. When omitted\n * the SDK falls back to `config.appName` / `config.appVersion` resolved by\n * the Vite plugin from `botim.{env}.json`.\n */\n app?: AppInfo;\n /**\n * Build-time-resolved mini-program identity. In typical usage this is\n * `botimConfig` imported from `virtual:botim/config` (provided by the\n * `@botim/debug-sdk/vite` plugin). REQUIRED.\n */\n config: BotimConfig;\n /**\n * Consent for telemetry. Required in `prod`; implicit in non-prod builds.\n */\n consent?: ConsentInput;\n /** Built-in command host hooks (reload, getState, screenshot, etc.). */\n builtins?: BuiltinHostHooks;\n device?: Partial<DeviceInfo>;\n redact?: RedactionConfig;\n sampling?: SamplingConfig;\n /**\n * Sliding-window per-signature dedup. Default: enabled with a 1 s window\n * applied to console / network / error events. Set `false` to disable.\n * Repetitive events (e.g., a render-loop error firing 60×/s) collapse\n * into one leading event + a synthesized rollup event whose\n * `meta.dedup.count` carries the suppressed total.\n */\n dedup?: DedupOptions | false;\n flushIntervalMs?: number;\n bufferSize?: number;\n maxBatchSize?: number;\n maxRetries?: number;\n /** Called for transport-level errors. SDK never throws into app code. */\n onError?: (err: unknown) => void;\n}\n\nexport interface RemoteDebugHandle {\n readonly sid: string | null;\n flush(): Promise<void>;\n stop(): Promise<void>;\n /** Register a custom command handler. Idempotent on the name. */\n registerCommand(name: string, handler: CommandHandler): void;\n /** Remove a previously-registered command. Returns true if it existed. */\n unregisterCommand(name: string): boolean;\n}\n\nexport const DEFAULT_REDACT_HEADERS: readonly string[] = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n];\n\nexport const DEFAULT_BODY_PATTERNS: readonly RegExp[] = [\n /(?:bearer\\s+)?[A-Za-z0-9_-]{20,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}/gi,\n /[A-Za-z0-9_-]{40,}/g,\n];\n\nexport const DEFAULT_MAX_BODY_BYTES = 4096;\n/**\n * How often the transport drains the buffer to the relay.\n *\n * 8 seconds is deliberately slow: this is a debug telemetry channel, not a\n * realtime one. With a 200ms cadence, a busy session producing ~10 events/sec\n * would make ~5 ingest POSTs/second, hammering the device's network stack\n * and the relay's write path for no human-visible benefit (admins poll at\n * 2s anyway, so end-to-end perceived latency is dominated by their poll).\n *\n * The timer fully drains the buffer per tick (multiple POSTs back-to-back if\n * needed, each capped at maxBatchSize), so the only cost of the longer\n * interval is up to 8s of potential delay before an event reaches the relay.\n *\n * Hosts can opt for tighter latency by setting `flushIntervalMs` explicitly.\n */\nexport const DEFAULT_FLUSH_INTERVAL_MS = 8000;\nexport const DEFAULT_BUFFER_SIZE = 1000;\nexport const DEFAULT_MAX_BATCH_SIZE = 50;\n\nconst NOOP_HANDLE: RemoteDebugHandle = {\n sid: null,\n async flush() {},\n async stop() {},\n registerCommand() {\n // no-op handle: silently accept; consumers should branch on `enabled` if they care.\n },\n unregisterCommand() {\n return false;\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Consent gate — synchronous, runs before any I/O or interceptor install.\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction assertConsent(config: BotimConfig, consent: ConsentInput | undefined): void {\n if (config.env !== 'prod') return; // dev/uat/beta are implicitly consented\n const hasHostToken =\n typeof consent?.hostToken === 'string' && consent.hostToken.length > 0;\n const hasOptIn = consent?.userOptIn === true;\n if (hasHostToken || hasOptIn) return;\n throw new BotimConsentError(\n 'prod debug sessions require consent.hostToken or consent.userOptIn === true',\n );\n}\n\nfunction assertConfig(config: BotimConfig | undefined): asserts config is BotimConfig {\n if (!config || typeof config !== 'object') {\n throw new BotimConfigError(\n 'options.config is required (import botimConfig from \"virtual:botim/config\")',\n { code: 'config-missing' },\n );\n }\n if (typeof config.miniProgramId !== 'string' || config.miniProgramId.length === 0) {\n throw new BotimConfigError('options.config.miniProgramId must be a non-empty string', {\n code: 'config-missing-field',\n });\n }\n if (\n config.env !== 'dev' &&\n config.env !== 'uat' &&\n config.env !== 'beta' &&\n config.env !== 'prod'\n ) {\n throw new BotimConfigError(\n `options.config.env must be one of dev|uat|beta|prod (got ${JSON.stringify(config.env)})`,\n { code: 'config-invalid-env' },\n );\n }\n}\n\nexport async function enableRemoteDebug(\n options: RemoteDebugOptions,\n): Promise<RemoteDebugHandle> {\n if (options.enabled === false) return NOOP_HANDLE;\n\n // Synchronous validation gates — must happen before ANY I/O or wrapping.\n assertConfig(options.config);\n assertConsent(options.config, options.consent);\n\n const onError = options.onError ?? (() => {});\n // Fall back to the identity the Vite plugin already resolved from\n // `botim.{env}.json` so consumers don't have to repeat themselves.\n const app: AppInfo = options.app ?? {\n name: options.config.appName ?? options.config.miniProgramId,\n version: options.config.appVersion ?? '0.0.0',\n };\n const deviceInfo = detectDeviceInfo(app, options.device);\n const consent: ConsentInput = options.consent ?? {};\n\n const session = await attachDevice(options.endpoint, options.config, deviceInfo, consent);\n\n const buffer = new RingBuffer({\n capacity: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n });\n\n const transport = new Transport({\n ingestUrl: session.ingestUrl,\n deviceToken: session.deviceToken,\n buffer,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxBatchSize: options.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n maxRetries: options.maxRetries,\n onError,\n });\n\n // Command registry + built-ins.\n const registry = new CommandRegistry();\n registerBuiltins(registry, options.builtins);\n\n let seq = 0;\n const baseMeta: EventMeta = {\n appVersion: app.version,\n build: app.build,\n deviceId: deviceInfo.deviceId,\n };\n\n const sampleConsole = options.sampling?.console ?? 1;\n const sampleNetwork = options.sampling?.network ?? 1;\n\n const redactHeaderList = options.redact?.headers ?? DEFAULT_REDACT_HEADERS;\n const bodyPatterns = options.redact?.bodyPatterns ?? DEFAULT_BODY_PATTERNS;\n const maxBodyBytes = options.redact?.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n // ───────────────────────────────────────────────────────────────────────────\n // Pre-buffer redaction. Every event passes through these helpers BEFORE\n // entering the ring buffer, so even an in-process inspector reading the\n // buffer cannot see raw secrets.\n // ───────────────────────────────────────────────────────────────────────────\n\n const redactNetwork = (p: NetworkPayload): NetworkPayload => {\n if (p.reqHeaders) p.reqHeaders = redactHeaders(p.reqHeaders, redactHeaderList);\n if (p.resHeaders) p.resHeaders = redactHeaders(p.resHeaders, redactHeaderList);\n if (p.reqBody !== undefined) {\n const r = redactBody(p.reqBody, bodyPatterns, maxBodyBytes);\n p.reqBody = r.body;\n p.reqBodyTruncated = r.truncated;\n }\n if (p.resBody !== undefined) {\n const r = redactBody(p.resBody, bodyPatterns, maxBodyBytes);\n p.resBody = r.body;\n p.resBodyTruncated = r.truncated;\n }\n return p;\n };\n\n const redactConsoleArgs = (p: ConsolePayload): ConsolePayload => {\n // Apply body patterns to any stringified arg payloads so accidental\n // `console.log(token)` doesn't leak past the buffer boundary.\n for (const arg of p.args) {\n if (arg.k === 'string' || arg.k === 'json') {\n const r = redactBody(arg.v, bodyPatterns, maxBodyBytes);\n arg.v = r.body ?? '';\n if (r.truncated) arg.truncated = true;\n }\n }\n return p;\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Per-signature sliding-window deduper. A misbehaving page that fires the\n // same console.error 60×/sec collapses into 1 leading event + 1 rollup\n // event per second whose meta.dedup.count carries the suppressed total.\n // Set options.dedup = false to disable.\n // ───────────────────────────────────────────────────────────────────────────\n const deduper =\n options.dedup === false\n ? null\n : new EventDeduper((s: SuppressionSummary) => {\n // Synthesize a rollup event of the SAME type as the suppressed ones,\n // attaching meta.dedup so the relay / admin UI / agents can detect\n // it as a summary rather than a primary event.\n const rollupPayload =\n s.type === 'console'\n ? ({\n method: (s.examplePayload as ConsolePayload | undefined)?.method ?? 'info',\n args: [\n {\n k: 'string' as const,\n v: `[dedup] ${s.label} — repeated ${s.count} more time${s.count === 1 ? '' : 's'} in ${s.lastTs - s.firstTs}ms`,\n },\n ],\n } as ConsolePayload)\n : (s.examplePayload as DebugEvent['payload']);\n\n const ev = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: s.lastTs,\n type: s.type,\n level: s.level,\n payload: rollupPayload,\n meta: {\n ...baseMeta,\n dedup: {\n signature: s.signature,\n count: s.count,\n firstTs: s.firstTs,\n lastTs: s.lastTs,\n },\n },\n } as DebugEvent;\n buffer.push(ev);\n }, options.dedup || undefined);\n\n const pushOrSuppress = (ev: DebugEvent): void => {\n if (!deduper || deduper.shouldEmit(ev)) buffer.push(ev);\n };\n\n const emitConsole = (level: EventLevel, payload: ConsolePayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'console',\n level,\n payload: redactConsoleArgs(payload),\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitError = (payload: ErrorPayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'error',\n level: 'error',\n payload,\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitNetwork = (payload: NetworkPayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'network',\n level: payload.phase === 'error' ? 'error' : 'info',\n payload: redactNetwork(payload),\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitCommandResult = (\n req: CommandRequest,\n kind: 'command-ack' | 'command-rejected',\n payload: DebugEvent['payload'],\n ): void => {\n const ev = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: kind,\n level: kind === 'command-rejected' ? 'warn' : 'info',\n payload,\n meta: { ...baseMeta, commandId: req.id },\n } as DebugEvent;\n buffer.push(ev);\n };\n\n // Surface command override events as informational entries so AI agents can\n // see when a host has redefined a command they thought they knew.\n registry.onOverride((name) => {\n emitCommandResult(\n { id: 'override-' + name + '-' + Date.now(), name },\n 'command-rejected',\n { command: name, reason: 'overridden' },\n );\n });\n\n const uninstallConsole = installConsoleInterceptor({\n emit: emitConsole,\n sample: sampleConsole,\n });\n const uninstallErrors = installErrorInterceptor({ emit: emitError });\n // Belt-and-suspenders: Transport already uses an un-patched fetch reference\n // for its own ingest + command-poll traffic, so the interceptor never sees\n // those calls. We *also* wire shouldSkip with the relay URLs so a future\n // change that adds another internal request (e.g. an /attach refresh) is\n // automatically silent without revisiting this code.\n const internalEndpoints = [session.ingestUrl, session.commandPollUrl];\n const uninstallNetwork = installNetworkInterceptor({\n emit: emitNetwork,\n sample: sampleNetwork,\n shouldSkip: (url) => internalEndpoints.some((ep) => ep && url.startsWith(ep)),\n });\n\n transport.start();\n transport.startCommandLoop({\n commandPollUrl: session.commandPollUrl,\n onCommand: async (req) => {\n const ctl = new AbortController();\n const result = await registry.dispatch(req, ctl.signal);\n emitCommandResult(req, result.kind === 'ack' ? 'command-ack' : 'command-rejected', result.payload);\n },\n });\n\n return {\n sid: session.sid,\n async flush() {\n await transport.flush();\n },\n async stop() {\n uninstallConsole();\n uninstallErrors();\n uninstallNetwork();\n // Stop the deduper FIRST so any pending rollups are flushed into the\n // buffer before transport.stop() drains it. Otherwise a long-running\n // session shutting down with suppressed events in flight would lose\n // the suppression-summary rows.\n if (deduper) deduper.stop();\n await transport.stop();\n },\n registerCommand(name, handler) {\n registry.register(name, handler);\n },\n unregisterCommand(name) {\n return registry.unregister(name);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/buffer.ts","../src/transport.ts","../src/attach.ts","../src/redact.ts","../src/serialize.ts","../src/interceptors/console.ts","../src/interceptors/errors.ts","../src/interceptors/network.ts","../src/commands/registry.ts","../src/commands/builtins.ts","../src/dedup.ts","../src/index.ts"],"names":["rrwebSnapshot"],"mappings":"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","file":"index.cjs","sourcesContent":["export const SCHEMA_VERSION = 2 as const;\n\nexport type EventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport type EventType =\n | 'console'\n | 'network'\n | 'error'\n | 'lifecycle'\n | 'bridge'\n | 'perf'\n | 'command-ack'\n | 'command-rejected';\n\nexport interface DebugEventBase {\n v: typeof SCHEMA_VERSION;\n sid: string;\n seq: number;\n ts: number;\n type: EventType;\n level: EventLevel;\n meta?: EventMeta;\n}\n\nexport interface EventMeta {\n route?: string;\n build?: string;\n appVersion?: string;\n deviceId?: string;\n userIdHash?: string;\n /** Set on command-ack / command-rejected events to correlate with the originating CommandRequest. */\n commandId?: string;\n /**\n * Set ONLY on synthesized rollup events emitted by the SDK's deduper.\n * Carries the count of suppressed identical events in the just-closed\n * window. Original (non-suppressed) events do NOT carry this field.\n */\n dedup?: {\n /** Stable signature used to bucket the suppressed events. */\n signature: string;\n /** Number of suppressed occurrences (excludes the leading event that was already emitted). */\n count: number;\n /** Timestamp of the first occurrence in the window. */\n firstTs: number;\n /** Timestamp of the last occurrence in the window. */\n lastTs: number;\n };\n}\n\nexport type SerializedValue =\n | { k: 'primitive'; v: string | number | boolean | null }\n | { k: 'undefined' }\n | { k: 'string'; v: string; truncated?: boolean }\n | { k: 'json'; v: string; truncated?: boolean }\n | { k: 'error'; name: string; message: string; stack?: string }\n | { k: 'circular' }\n | { k: 'function'; name?: string }\n | { k: 'unserializable'; reason: string };\n\nexport interface ConsolePayload {\n method: 'log' | 'info' | 'warn' | 'error' | 'debug';\n args: SerializedValue[];\n}\n\nexport type NetworkPhase = 'request' | 'response' | 'error';\n\nexport interface NetworkPayload {\n phase: NetworkPhase;\n reqId: string;\n method: string;\n url: string;\n status?: number;\n durationMs?: number;\n reqHeaders?: Record<string, string>;\n reqBody?: string;\n reqBodyTruncated?: boolean;\n resHeaders?: Record<string, string>;\n resBody?: string;\n resBodyTruncated?: boolean;\n errorMessage?: string;\n errorName?: string;\n}\n\nexport type ErrorSource = 'window.error' | 'unhandledrejection' | 'manual';\n\nexport interface ErrorPayload {\n message: string;\n name?: string;\n stack?: string;\n source: ErrorSource;\n filename?: string;\n lineno?: number;\n colno?: number;\n}\n\nexport type LifecycleEvent =\n | 'launch'\n | 'pageShow'\n | 'pageHide'\n | 'route'\n | 'background'\n | 'foreground'\n | 'visibilityChange';\n\nexport interface LifecyclePayload {\n event: LifecycleEvent;\n data?: Record<string, unknown>;\n}\n\nexport interface BridgePayload {\n fn: string;\n argsPreview?: string;\n result?: 'ok' | 'error';\n durationMs?: number;\n errorMessage?: string;\n}\n\nexport interface PerfPayload {\n metric: string;\n value: number;\n unit?: string;\n}\n\n/** Payload for command-ack: the handler ran, here's its result. */\nexport interface CommandAckPayload {\n command: string;\n ok: boolean;\n /** Handler return value, JSON-serializable. */\n result?: unknown;\n durationMs?: number;\n}\n\n/** Payload for command-rejected: relay sent a command we won't run. */\nexport interface CommandRejectedPayload {\n command: string;\n reason:\n | 'unknown-command'\n | 'rate-limited'\n | 'invalid-args'\n | 'handler-threw'\n | 'overridden';\n details?: string;\n}\n\nexport type DebugEvent =\n | (DebugEventBase & { type: 'console'; payload: ConsolePayload })\n | (DebugEventBase & { type: 'network'; payload: NetworkPayload })\n | (DebugEventBase & { type: 'error'; payload: ErrorPayload })\n | (DebugEventBase & { type: 'lifecycle'; payload: LifecyclePayload })\n | (DebugEventBase & { type: 'bridge'; payload: BridgePayload })\n | (DebugEventBase & { type: 'perf'; payload: PerfPayload })\n | (DebugEventBase & { type: 'command-ack'; payload: CommandAckPayload })\n | (DebugEventBase & { type: 'command-rejected'; payload: CommandRejectedPayload });\n\nexport interface UploadBatch {\n sessionToken: string;\n events: DebugEvent[];\n}\n\nexport interface UploadAck {\n acceptedSeq: number;\n rejected?: Array<{ seq: number; reason: string }>;\n}\n\nexport type StreamFrame =\n | { kind: 'hello'; sid: string; devices: number }\n | { kind: 'event'; event: DebugEvent }\n | { kind: 'device-join'; deviceInfo: DeviceInfo }\n | { kind: 'device-leave'; deviceId: string }\n | { kind: 'gap'; deviceId: string; expectedSeq: number; gotSeq: number }\n | { kind: 'session-end'; reason: string };\n\nexport interface DeviceInfo {\n deviceId: string;\n platform: 'ios' | 'android' | 'web' | 'unknown';\n osVersion?: string;\n appName?: string;\n appVersion?: string;\n appBuild?: string;\n userAgent?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Build-time identity (resolved by the Vite plugin from `botim.{env}.json`)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type BotimEnv = 'dev' | 'uat' | 'beta' | 'prod';\n\n/**\n * The contents of `botim.{env}.json`, resolved at build time and injected\n * into the bundle via the virtual module `virtual:botim/config`.\n */\nexport interface BotimConfig {\n miniProgramId: string;\n env: BotimEnv;\n /** Short hash of the resolved config or the build, set by the plugin. */\n buildSignature: string;\n appName?: string;\n appVersion?: string;\n /** Forward-compatible bag for fields the relay may add later. */\n [extra: string]: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Consent\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ConsentInput {\n /** JWT issued by the BOTIM host runtime — strongest form. */\n hostToken?: string;\n /** Explicit user opt-in (e.g., set after a privacy dialog). */\n userOptIn?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Wire protocol — attach\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AttachRequest {\n miniProgramId: string;\n env: BotimEnv;\n buildSignature: string;\n deviceInfo: DeviceInfo;\n consent: ConsentInput;\n schemaVersion: typeof SCHEMA_VERSION;\n}\n\nexport interface AttachResponse {\n sid: string;\n deviceToken: string;\n expiresAt: number;\n ingestUrl: string;\n /** Endpoint the device long-polls for AI-issued commands. */\n commandPollUrl: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Wire protocol — commands (relay → device → ack)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CommandRequest {\n /** Relay-issued unique id, echoed in the resulting ack/rejected event. */\n id: string;\n /** Registered command name (kebab-case). */\n name: string;\n /** Arbitrary JSON args, validated by the handler. */\n args?: Record<string, unknown>;\n /** Optional deadline; handlers SHOULD respect it. */\n deadlineTs?: number;\n}\n\n/** Long-poll response shape from `commandPollUrl`. */\nexport interface CommandPollResponse {\n commands: CommandRequest[];\n /** Suggested seconds until the next poll. */\n nextDelayMs?: number;\n}\n\nexport type CommandHandler = (\n args: Record<string, unknown>,\n ctx: CommandContext,\n) => unknown | Promise<unknown>;\n\nexport interface CommandContext {\n commandId: string;\n command: string;\n signal: AbortSignal;\n}\n","/**\n * Errors that escape the SDK into host code.\n *\n * The SDK's no-throw invariant has exactly two carve-outs:\n * - `BotimConfigError` — thrown synchronously by `enableRemoteDebug` when the\n * resolved `BotimConfig` is missing or invalid. Prevents any I/O.\n * - `BotimConsentError` — thrown synchronously by `enableRemoteDebug` when\n * consent has not been granted in a `prod` build. Prevents any I/O.\n *\n * Both are intentionally synchronous and pre-installation: at the moment they\n * fire, no globals have been wrapped, no listeners installed, no network sent.\n */\n\nconst BRAND = '@botim/debug-sdk' as const;\n\nexport class BotimConfigError extends Error {\n readonly name = 'BotimConfigError';\n readonly code: string;\n readonly path?: string;\n\n constructor(message: string, opts: { code: string; path?: string } = { code: 'invalid-config' }) {\n super(`[${BRAND}] ${message}`);\n this.code = opts.code;\n this.path = opts.path;\n }\n}\n\nexport class BotimConsentError extends Error {\n readonly name = 'BotimConsentError';\n constructor(message: string) {\n super(`[${BRAND}] ${message}`);\n }\n}\n","import type { DebugEvent } from './types.js';\n\nexport interface RingBufferOptions {\n capacity: number;\n onDrop?: (count: number) => void;\n}\n\nexport class RingBuffer {\n private items: DebugEvent[] = [];\n private dropped = 0;\n\n constructor(private opts: RingBufferOptions) {}\n\n push(event: DebugEvent): void {\n if (this.items.length >= this.opts.capacity) {\n this.items.shift();\n this.dropped++;\n this.opts.onDrop?.(1);\n }\n this.items.push(event);\n }\n\n drain(max: number): DebugEvent[] {\n if (max >= this.items.length) {\n const out = this.items;\n this.items = [];\n return out;\n }\n return this.items.splice(0, max);\n }\n\n size(): number {\n return this.items.length;\n }\n\n droppedCount(): number {\n return this.dropped;\n }\n}\n","import type {\n CommandPollResponse,\n CommandRequest,\n UploadBatch,\n} from './types.js';\nimport { RingBuffer } from './buffer.js';\n\nexport interface TransportOptions {\n ingestUrl: string;\n deviceToken: string;\n buffer: RingBuffer;\n flushIntervalMs: number;\n maxBatchSize: number;\n maxRetries?: number;\n onError?: (err: unknown) => void;\n}\n\nexport interface CommandLoopOptions {\n commandPollUrl: string;\n /** Fired for each command pulled from the relay. Must not throw. */\n onCommand: (req: CommandRequest) => Promise<void> | void;\n /** Long-poll request timeout in ms. Server may finish sooner. */\n pollTimeoutMs?: number;\n /** Min/max backoff bounds on poll errors. */\n minBackoffMs?: number;\n maxBackoffMs?: number;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_POLL_TIMEOUT_MS = 25_000;\nconst DEFAULT_MIN_BACKOFF_MS = 500;\nconst DEFAULT_MAX_BACKOFF_MS = 30_000;\n\nexport class Transport {\n private timer: ReturnType<typeof setInterval> | null = null;\n private inflightUpload: AbortController | null = null;\n private inflightPoll: AbortController | null = null;\n private commandLoopRunning = false;\n private stopped = false;\n private flushing = false;\n /**\n * Pre-interception `fetch` reference, captured at construction so the\n * SDK's own ingest POSTs and command-poll GETs are NOT routed back through\n * the network interceptor. Without this, every ingest request would emit\n * a `network` event whose flush would emit another `network` event, ad\n * infinitum — and the AI command channel's long-polls would flood the\n * logs with one entry every ~25s of nothing happening.\n *\n * The interceptor is installed AFTER the Transport is constructed (see\n * src/index.ts:enableRemoteDebug), so this reference is the un-patched fn.\n */\n private readonly internalFetch: typeof fetch;\n\n constructor(private opts: TransportOptions) {\n this.internalFetch =\n typeof fetch === \"function\"\n ? fetch.bind(globalThis as unknown as { fetch: typeof fetch })\n : (((..._args: Parameters<typeof fetch>) => {\n throw new Error(\"[@botim/debug-sdk] fetch is not available in this environment\");\n }) as typeof fetch);\n }\n\n start(): void {\n if (this.timer) return;\n // Use `flush()` (which loops until the buffer is empty), NOT `flushOnce()`\n // which only sends a single batch per tick. Otherwise a flush interval of\n // several seconds combined with a burst of N events (where N > maxBatchSize)\n // would leave (N - maxBatchSize) events stuck in the buffer for ANOTHER\n // full cycle. With flush(), each tick fully drains, possibly via several\n // back-to-back POSTs, each still capped at maxBatchSize for HTTP body size.\n this.timer = setInterval(\n () => void this.flush().catch((err) => this.opts.onError?.(err)),\n this.opts.flushIntervalMs,\n );\n }\n\n async flush(): Promise<void> {\n while (!this.stopped && this.opts.buffer.size() > 0) {\n await this.flushOnce();\n }\n }\n\n private async flushOnce(): Promise<void> {\n if (this.flushing || this.opts.buffer.size() === 0) return;\n this.flushing = true;\n try {\n const events = this.opts.buffer.drain(this.opts.maxBatchSize);\n if (events.length === 0) return;\n const batch: UploadBatch = {\n sessionToken: this.opts.deviceToken,\n events,\n };\n await this.send(batch, 0);\n } finally {\n this.flushing = false;\n }\n }\n\n private async send(batch: UploadBatch, attempt: number): Promise<void> {\n if (this.stopped) return;\n this.inflightUpload = new AbortController();\n try {\n // NOTE: do NOT set `keepalive: true` here. The Fetch spec lets\n // browsers reject keepalive bodies over ~64 KiB, and a single\n // screenshot batch (JPEG base64 = 100–300 KiB) blows past that\n // every time, surfacing as `TypeError: Failed to fetch` before\n // any HTTP traffic leaves the tab. keepalive only matters at\n // page-unload time — see `stop()` for that path, which sends a\n // separate small drain request.\n const res = await this.internalFetch(this.opts.ingestUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.opts.deviceToken}`,\n },\n body: JSON.stringify(batch),\n signal: this.inflightUpload.signal,\n });\n if (!res.ok) {\n throw new Error(`ingest http ${res.status}`);\n }\n } catch (err) {\n if (this.stopped) return;\n const max = this.opts.maxRetries ?? DEFAULT_MAX_RETRIES;\n if (attempt >= max) {\n this.opts.onError?.(err);\n return;\n }\n const backoff = 250 * Math.pow(4, attempt);\n await new Promise((r) => setTimeout(r, backoff));\n return this.send(batch, attempt + 1);\n } finally {\n this.inflightUpload = null;\n }\n }\n\n /**\n * Start the AI command long-poll loop. Maintains AT MOST ONE in-flight\n * request to `commandPollUrl` at any time. Errors are reported via\n * `onError` and trigger exponential backoff. Stop with `transport.stop()`.\n */\n startCommandLoop(opts: CommandLoopOptions): void {\n if (this.commandLoopRunning) return;\n this.commandLoopRunning = true;\n\n const pollTimeout = opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const minBackoff = opts.minBackoffMs ?? DEFAULT_MIN_BACKOFF_MS;\n const maxBackoff = opts.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\n let attempt = 0;\n\n const loop = async (): Promise<void> => {\n while (!this.stopped) {\n this.inflightPoll = new AbortController();\n // Compose the long-poll abort with a hard timeout so a stalled relay\n // doesn't pin us forever. Using a manual setTimeout is portable across\n // environments where AbortSignal.timeout may be missing.\n const timeoutId = setTimeout(() => {\n this.inflightPoll?.abort();\n }, pollTimeout);\n\n try {\n const res = await this.internalFetch(opts.commandPollUrl, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.opts.deviceToken}` },\n signal: this.inflightPoll.signal,\n });\n if (!res.ok) {\n throw new Error(`command-poll http ${res.status}`);\n }\n // 204 = nothing pending; loop with a small spacing so we don't busy-loop.\n if (res.status === 204) {\n await sleep(minBackoff);\n attempt = 0;\n continue;\n }\n const json = (await res.json()) as CommandPollResponse;\n attempt = 0;\n for (const cmd of json.commands ?? []) {\n try {\n await opts.onCommand(cmd);\n } catch (err) {\n // onCommand is expected to never throw; if it does, surface but\n // keep the loop alive — one bad command must not kill the channel.\n this.opts.onError?.(err);\n }\n }\n if (typeof json.nextDelayMs === 'number' && json.nextDelayMs > 0) {\n await sleep(Math.min(json.nextDelayMs, maxBackoff));\n }\n } catch (err) {\n if (this.stopped) return;\n // AbortError on our own timeout is not a real error — treat as \"no commands\".\n const aborted =\n err instanceof Error &&\n (err.name === 'AbortError' || /aborted/i.test(err.message));\n if (!aborted) {\n this.opts.onError?.(err);\n attempt += 1;\n } else {\n attempt = 0;\n }\n const backoff = Math.min(\n maxBackoff,\n minBackoff * Math.pow(2, Math.max(0, attempt - 1)),\n );\n await sleep(backoff);\n } finally {\n clearTimeout(timeoutId);\n this.inflightPoll = null;\n }\n }\n };\n\n void loop();\n }\n\n async stop(): Promise<void> {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.opts.buffer.size() > 0) {\n const events = this.opts.buffer.drain(this.opts.buffer.size());\n const body = JSON.stringify({\n sessionToken: this.opts.deviceToken,\n events,\n });\n // `keepalive: true` is what lets a final flush survive page unload,\n // but browsers reject keepalive bodies over ~64 KiB. Only set it\n // when we're under the limit; otherwise fall back to a regular\n // fetch (which might be cancelled at unload, but that's strictly\n // better than rejecting outright and losing every event).\n const KEEPALIVE_BODY_LIMIT = 60 * 1024; // leave headroom under 64 KiB\n const useKeepalive = body.length <= KEEPALIVE_BODY_LIMIT;\n try {\n await this.internalFetch(this.opts.ingestUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.opts.deviceToken}`,\n },\n body,\n ...(useKeepalive ? { keepalive: true } : {}),\n });\n } catch (err) {\n this.opts.onError?.(err);\n }\n }\n this.stopped = true;\n this.commandLoopRunning = false;\n this.inflightUpload?.abort();\n this.inflightPoll?.abort();\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import {\n SCHEMA_VERSION,\n type AttachRequest,\n type AttachResponse,\n type BotimConfig,\n type ConsentInput,\n type DeviceInfo,\n} from './types.js';\n\n/**\n * Exchange a build-time `BotimConfig` + freshly-detected device info for a\n * server-issued `(sid, deviceToken, ingestUrl, commandPollUrl)` tuple.\n *\n * The relay anchors the resulting session to the `(miniProgramId, deviceId)`\n * pair so AI agents can discover this session via\n * `GET /v1/mp/{miniProgramId}/sessions`.\n */\nexport async function attachDevice(\n endpoint: string,\n config: BotimConfig,\n deviceInfo: DeviceInfo,\n consent: ConsentInput,\n): Promise<AttachResponse> {\n const base = endpoint.replace(/\\/$/, '');\n const url = `${base}/v1/attach`;\n\n const body: AttachRequest = {\n miniProgramId: config.miniProgramId,\n env: config.env,\n buildSignature: config.buildSignature,\n deviceInfo,\n consent,\n schemaVersion: SCHEMA_VERSION,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `[@botim/debug-sdk] attach failed: ${res.status} ${res.statusText} ${text}`.trim(),\n );\n }\n\n const json = (await res.json()) as AttachResponse;\n if (!json?.sid || !json?.deviceToken || !json?.ingestUrl || !json?.commandPollUrl) {\n throw new Error('[@botim/debug-sdk] attach response missing required fields');\n }\n // Normalize: path-only URLs (the recommended form, since v0.1.1) get\n // joined to the configured endpoint. Already-absolute URLs (legacy or\n // explicit) pass through. Result: the SDK never makes a direct cross-\n // origin call when the configured endpoint is behind a proxy.\n return {\n ...json,\n ingestUrl: resolveAgainstEndpoint(json.ingestUrl, base),\n commandPollUrl: resolveAgainstEndpoint(json.commandPollUrl, base),\n };\n}\n\nfunction resolveAgainstEndpoint(url: string, base: string): string {\n if (/^https?:\\/\\//i.test(url)) return url;\n // Ensure exactly one '/' between base and path.\n const path = url.startsWith('/') ? url : '/' + url;\n return base + path;\n}\n\nexport interface AppForDetection {\n name: string;\n version: string;\n build?: string;\n}\n\nexport function detectDeviceInfo(\n app: AppForDetection,\n override?: Partial<DeviceInfo>,\n): DeviceInfo {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;\n return {\n deviceId: override?.deviceId ?? generateDeviceId(),\n platform: override?.platform ?? detectPlatform(ua),\n osVersion: override?.osVersion,\n appName: override?.appName ?? app.name,\n appVersion: override?.appVersion ?? app.version,\n appBuild: override?.appBuild ?? app.build,\n userAgent: override?.userAgent ?? ua,\n };\n}\n\nfunction detectPlatform(ua: string | undefined): DeviceInfo['platform'] {\n if (!ua) return 'unknown';\n if (/Android/i.test(ua)) return 'android';\n if (/iPhone|iPad|iPod/i.test(ua)) return 'ios';\n if (/Mozilla|Chrome|Safari|Firefox/i.test(ua)) return 'web';\n return 'unknown';\n}\n\nfunction generateDeviceId(): string {\n const c: { randomUUID?: () => string } | undefined =\n typeof crypto !== 'undefined' ? (crypto as unknown as { randomUUID?: () => string }) : undefined;\n if (c?.randomUUID) return c.randomUUID();\n return 'dev-' + Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","const REDACTED = '[REDACTED]';\n\nexport function redactHeaders(\n headers: Record<string, string> | undefined,\n redactList: readonly string[],\n): Record<string, string> | undefined {\n if (!headers) return headers;\n const lower = new Set(redactList.map((h) => h.toLowerCase()));\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = lower.has(k.toLowerCase()) ? REDACTED : v;\n }\n return out;\n}\n\nexport function redactBody(\n body: string | undefined,\n patterns: readonly RegExp[],\n maxBytes: number,\n): { body: string | undefined; truncated: boolean } {\n if (body === undefined) return { body: undefined, truncated: false };\n let out = body;\n for (const pat of patterns) {\n if (pat.global) pat.lastIndex = 0;\n out = out.replace(pat, REDACTED);\n }\n let truncated = false;\n if (out.length > maxBytes) {\n out = out.slice(0, maxBytes);\n truncated = true;\n }\n return { body: out, truncated };\n}\n\nexport function headersFromInit(\n init: HeadersInit | undefined,\n): Record<string, string> | undefined {\n if (!init) return undefined;\n const out: Record<string, string> = {};\n if (init instanceof Headers) {\n init.forEach((v, k) => (out[k] = v));\n } else if (Array.isArray(init)) {\n for (const [k, v] of init) out[k] = v;\n } else {\n Object.assign(out, init);\n }\n return out;\n}\n\nexport function headersFromResponse(res: Response): Record<string, string> {\n const out: Record<string, string> = {};\n res.headers.forEach((v, k) => (out[k] = v));\n return out;\n}\n\nexport async function readBodyForCapture(\n body: BodyInit | null | undefined,\n): Promise<string | undefined> {\n if (body == null) return undefined;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n try {\n return new TextDecoder().decode(body as ArrayBuffer);\n } catch {\n return '[binary]';\n }\n }\n if (body instanceof Blob) {\n try {\n return await body.text();\n } catch {\n return '[blob]';\n }\n }\n if (body instanceof FormData) {\n const parts: string[] = [];\n body.forEach((v, k) => parts.push(`${k}=${typeof v === 'string' ? v : '[file]'}`));\n return parts.join('&');\n }\n return undefined;\n}\n","import type { SerializedValue } from './types.js';\n\nconst MAX_STRING_LEN = 2048;\nconst MAX_OBJECT_BYTES = 4096;\n\nexport function serializeArg(value: unknown): SerializedValue {\n if (value === undefined) return { k: 'undefined' };\n if (value === null) return { k: 'primitive', v: null };\n\n const t = typeof value;\n if (t === 'boolean' || t === 'number') {\n return { k: 'primitive', v: value as boolean | number };\n }\n if (t === 'bigint') {\n return { k: 'primitive', v: (value as bigint).toString() + 'n' };\n }\n if (t === 'string') {\n const s = value as string;\n if (s.length > MAX_STRING_LEN) {\n return { k: 'string', v: s.slice(0, MAX_STRING_LEN), truncated: true };\n }\n return { k: 'string', v: s };\n }\n if (t === 'function') {\n return { k: 'function', name: (value as { name?: string }).name || undefined };\n }\n if (value instanceof Error) {\n return { k: 'error', name: value.name, message: value.message, stack: value.stack };\n }\n\n try {\n const seen = new WeakSet<object>();\n const json = JSON.stringify(value, function replacer(_k, v) {\n if (typeof v === 'bigint') return v.toString() + 'n';\n if (typeof v === 'function') return `[Function: ${v.name || 'anonymous'}]`;\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n });\n if (json === undefined) {\n return { k: 'unserializable', reason: 'undefined-result' };\n }\n if (json.length > MAX_OBJECT_BYTES) {\n return { k: 'json', v: json.slice(0, MAX_OBJECT_BYTES), truncated: true };\n }\n return { k: 'json', v: json };\n } catch (err) {\n return {\n k: 'unserializable',\n reason: err instanceof Error ? err.message : 'unknown',\n };\n }\n}\n","import type { ConsolePayload, EventLevel } from '../types.js';\nimport { serializeArg } from '../serialize.js';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype Method = (typeof METHODS)[number];\n\nconst LEVEL: Record<Method, EventLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\nexport interface ConsoleInterceptorOptions {\n emit: (level: EventLevel, payload: ConsolePayload) => void;\n sample: number;\n}\n\ntype ConsoleFn = (...args: unknown[]) => void;\n\nexport function installConsoleInterceptor(\n opts: ConsoleInterceptorOptions,\n): () => void {\n const originals: Partial<Record<Method, ConsoleFn>> = {};\n let active = false;\n\n for (const m of METHODS) {\n const original = console[m] as ConsoleFn;\n originals[m] = original;\n (console as unknown as Record<Method, ConsoleFn>)[m] = function patched(\n ...args: unknown[]\n ) {\n original.apply(console, args);\n if (active) return;\n if (opts.sample < 1 && Math.random() > opts.sample) return;\n active = true;\n try {\n const payload: ConsolePayload = {\n method: m,\n args: args.map(serializeArg),\n };\n opts.emit(LEVEL[m], payload);\n } catch {\n // Never surface SDK errors back through console — would loop.\n } finally {\n active = false;\n }\n };\n }\n\n return () => {\n for (const m of METHODS) {\n const original = originals[m];\n if (original) {\n (console as unknown as Record<Method, ConsoleFn>)[m] = original;\n }\n }\n };\n}\n","import type { ErrorPayload } from '../types.js';\n\nexport interface ErrorInterceptorOptions {\n emit: (payload: ErrorPayload) => void;\n}\n\ninterface ListenerTarget {\n addEventListener: (type: string, listener: (ev: Event) => void) => void;\n removeEventListener: (type: string, listener: (ev: Event) => void) => void;\n}\n\nexport function installErrorInterceptor(\n opts: ErrorInterceptorOptions,\n): () => void {\n const target: ListenerTarget | undefined = resolveTarget();\n if (!target) return () => {};\n\n const onError = (ev: Event) => {\n const e = ev as ErrorEvent;\n const err = e.error;\n opts.emit({\n message:\n e.message ||\n (err instanceof Error ? err.message : 'unknown error'),\n name: err instanceof Error ? err.name : undefined,\n stack: err instanceof Error ? err.stack : undefined,\n source: 'window.error',\n filename: e.filename,\n lineno: e.lineno,\n colno: e.colno,\n });\n };\n\n const onRejection = (ev: Event) => {\n const e = ev as PromiseRejectionEvent;\n const reason: unknown = e.reason;\n opts.emit({\n message:\n reason instanceof Error ? reason.message : safeString(reason),\n name: reason instanceof Error ? reason.name : undefined,\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'unhandledrejection',\n });\n };\n\n target.addEventListener('error', onError);\n target.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n target.removeEventListener('error', onError);\n target.removeEventListener('unhandledrejection', onRejection);\n };\n}\n\nfunction resolveTarget(): ListenerTarget | undefined {\n const w: unknown =\n typeof window !== 'undefined' ? window : (globalThis as unknown);\n if (\n w &&\n typeof (w as ListenerTarget).addEventListener === 'function' &&\n typeof (w as ListenerTarget).removeEventListener === 'function'\n ) {\n return w as ListenerTarget;\n }\n return undefined;\n}\n\nfunction safeString(v: unknown): string {\n try {\n return typeof v === 'string' ? v : JSON.stringify(v) ?? String(v);\n } catch {\n return String(v);\n }\n}\n","import type { NetworkPayload } from '../types.js';\nimport {\n headersFromInit,\n headersFromResponse,\n readBodyForCapture,\n} from '../redact.js';\n\n/**\n * Captures fetch + XHR traffic. Emits *raw* NetworkPayloads — redaction is\n * applied by the SDK's central emit pipeline (see src/index.ts) so that\n * every event in the ring buffer has the same redaction guarantees.\n *\n * Note: the SDK's own internal traffic (POSTs to ingestUrl, GETs to the\n * command-poll long-poll) is NOT seen by this interceptor — Transport\n * captures the un-patched `fetch` reference at construction time and uses\n * that for its own requests. The optional `shouldSkip` hook below is a\n * second line of defense for hosts that want to silence other known-noisy\n * endpoints (analytics beacons, heartbeat URLs, etc).\n */\nexport interface NetworkInterceptorOptions {\n emit: (payload: NetworkPayload) => void;\n sample: number;\n /**\n * Optional predicate: return true to skip emitting any event for this\n * request. Receives the resolved URL string and the HTTP method.\n */\n shouldSkip?: (url: string, method: string) => boolean;\n}\n\nexport function installNetworkInterceptor(\n opts: NetworkInterceptorOptions,\n): () => void {\n const restoreFetch = wrapFetch(opts);\n const restoreXHR = wrapXHR(opts);\n return () => {\n restoreFetch();\n restoreXHR();\n };\n}\n\nfunction shouldSample(rate: number): boolean {\n return rate >= 1 || Math.random() < rate;\n}\n\nfunction newReqId(): string {\n return 'r_' + Math.random().toString(36).slice(2, 10);\n}\n\nfunction wrapFetch(opts: NetworkInterceptorOptions): () => void {\n if (typeof fetch !== 'function') return () => {};\n const original = fetch;\n const target = globalThis as unknown as { fetch: typeof fetch };\n\n target.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n if (!shouldSample(opts.sample)) return original.call(this, input, init);\n\n const reqId = newReqId();\n const start = Date.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Bail early if the host has marked this URL as one to ignore. We pass\n // through to the original fetch without ever invoking opts.emit so the\n // request is fully transparent to the relay.\n if (opts.shouldSkip && opts.shouldSkip(url, method)) {\n return original.call(this, input, init);\n }\n\n let reqHeaders: Record<string, string> | undefined;\n let reqBody: string | undefined;\n try {\n if (input instanceof Request) {\n reqHeaders = headersFromResponse(input.clone() as unknown as Response);\n reqBody = await input.clone().text().catch(() => undefined);\n } else {\n reqHeaders = headersFromInit(init?.headers);\n reqBody = await readBodyForCapture(init?.body);\n }\n } catch {\n // ignore capture failures\n }\n\n opts.emit({ phase: 'request', reqId, method, url, reqHeaders, reqBody });\n\n try {\n const res = await original.call(this, input, init);\n let resBody: string | undefined;\n try {\n resBody = await res.clone().text();\n } catch {\n resBody = undefined;\n }\n opts.emit({\n phase: 'response',\n reqId,\n method,\n url,\n status: res.status,\n durationMs: Date.now() - start,\n resHeaders: headersFromResponse(res),\n resBody,\n });\n return res;\n } catch (err) {\n opts.emit({\n phase: 'error',\n reqId,\n method,\n url,\n durationMs: Date.now() - start,\n errorMessage: err instanceof Error ? err.message : String(err),\n errorName: err instanceof Error ? err.name : undefined,\n });\n throw err;\n }\n };\n\n return () => {\n target.fetch = original;\n };\n}\n\ninterface XhrState {\n reqId: string;\n start: number;\n method: string;\n url: string;\n reqHeaders: Record<string, string>;\n reqBody?: string;\n sampled: boolean;\n}\n\nfunction wrapXHR(opts: NetworkInterceptorOptions): () => void {\n if (typeof XMLHttpRequest === 'undefined') return () => {};\n const proto = XMLHttpRequest.prototype;\n const states = new WeakMap<XMLHttpRequest, XhrState>();\n\n const origOpen = proto.open;\n const origSend = proto.send;\n const origSetReqHeader = proto.setRequestHeader;\n\n proto.open = function patchedOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n const resolvedUrl = typeof url === 'string' ? url : url.toString();\n const upperMethod = method.toUpperCase();\n const skipped = opts.shouldSkip ? opts.shouldSkip(resolvedUrl, upperMethod) : false;\n const state: XhrState = {\n reqId: newReqId(),\n start: 0,\n method: upperMethod,\n url: resolvedUrl,\n reqHeaders: {},\n sampled: !skipped && shouldSample(opts.sample),\n };\n states.set(this, state);\n return (origOpen as (...a: unknown[]) => void).apply(this, [method, url, ...rest]);\n };\n\n proto.setRequestHeader = function patchedSetHeader(\n this: XMLHttpRequest,\n name: string,\n value: string,\n ) {\n const s = states.get(this);\n if (s) s.reqHeaders[name] = value;\n return origSetReqHeader.call(this, name, value);\n };\n\n proto.send = function patchedSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const s = states.get(this);\n if (!s || !s.sampled) {\n return (origSend as (...a: unknown[]) => void).apply(this, [body]);\n }\n\n s.start = Date.now();\n s.reqBody = typeof body === 'string' ? body : undefined;\n\n opts.emit({\n phase: 'request',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n reqHeaders: s.reqHeaders,\n reqBody: s.reqBody,\n });\n\n const onLoad = () => {\n const headers = parseXhrHeaders(this.getAllResponseHeaders());\n const resBody = typeof this.response === 'string' ? this.response : undefined;\n opts.emit({\n phase: 'response',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n status: this.status,\n durationMs: Date.now() - s.start,\n resHeaders: headers,\n resBody,\n });\n };\n const onError = () => {\n opts.emit({\n phase: 'error',\n reqId: s.reqId,\n method: s.method,\n url: s.url,\n durationMs: Date.now() - s.start,\n errorMessage: this.statusText || 'xhr error',\n });\n };\n\n this.addEventListener('load', onLoad);\n this.addEventListener('error', onError);\n this.addEventListener('timeout', onError);\n this.addEventListener('abort', onError);\n\n return (origSend as (...a: unknown[]) => void).apply(this, [body]);\n };\n\n return () => {\n proto.open = origOpen;\n proto.send = origSend;\n proto.setRequestHeader = origSetReqHeader;\n };\n}\n\nfunction parseXhrHeaders(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n if (!raw) return out;\n for (const line of raw.split(/\\r?\\n/)) {\n const idx = line.indexOf(':');\n if (idx < 0) continue;\n const k = line.slice(0, idx).trim();\n const v = line.slice(idx + 1).trim();\n if (k) out[k] = v;\n }\n return out;\n}\n","/**\n * Command allowlist registry.\n *\n * Design contract:\n * - The SDK NEVER executes a command that isn't registered, even if the\n * relay/agent claims it's trusted. This is the core safety invariant.\n * - Re-registering an existing name replaces the handler and emits an\n * `info`-level `command-overridden` event exactly once.\n * - Names are kebab-case; bad names are rejected synchronously (programmer\n * error, not a runtime error path).\n * - Dispatch never throws into the caller. Handler errors return a typed\n * failure result the long-poll loop turns into a `command-rejected` event.\n */\n\nimport type {\n CommandHandler,\n CommandRequest,\n CommandAckPayload,\n CommandRejectedPayload,\n} from '../types.js';\n\nconst NAME_PATTERN = /^[a-z][a-z0-9-]{1,47}$/;\n\nexport type DispatchResult =\n | { kind: 'ack'; payload: CommandAckPayload }\n | { kind: 'rejected'; payload: CommandRejectedPayload };\n\nexport interface OverrideListener {\n (name: string): void;\n}\n\nexport class CommandRegistry {\n private readonly handlers = new Map<string, CommandHandler>();\n private overrideListeners: OverrideListener[] = [];\n\n register(name: string, handler: CommandHandler): void {\n if (typeof name !== 'string' || !NAME_PATTERN.test(name)) {\n throw new Error(\n `[@botim/debug-sdk] invalid command name ${JSON.stringify(name)}; expected kebab-case matching ${NAME_PATTERN}`,\n );\n }\n if (typeof handler !== 'function') {\n throw new Error(`[@botim/debug-sdk] command \"${name}\" handler must be a function`);\n }\n const isOverride = this.handlers.has(name);\n this.handlers.set(name, handler);\n if (isOverride) {\n for (const fn of this.overrideListeners) {\n try {\n fn(name);\n } catch {\n // Listener errors must never propagate; consent invariant.\n }\n }\n }\n }\n\n unregister(name: string): boolean {\n return this.handlers.delete(name);\n }\n\n has(name: string): boolean {\n return this.handlers.has(name);\n }\n\n /** Subscribe to override events; returns an unsubscribe fn. */\n onOverride(fn: OverrideListener): () => void {\n this.overrideListeners.push(fn);\n return () => {\n this.overrideListeners = this.overrideListeners.filter((f) => f !== fn);\n };\n }\n\n /**\n * Dispatch a single command. Never throws; returns a typed result.\n * Caller is responsible for mapping the result onto an event envelope.\n */\n async dispatch(req: CommandRequest, signal: AbortSignal): Promise<DispatchResult> {\n const handler = this.handlers.get(req.name);\n if (!handler) {\n return {\n kind: 'rejected',\n payload: { command: req.name, reason: 'unknown-command' },\n };\n }\n\n const start = Date.now();\n try {\n const args = req.args ?? {};\n const result = await Promise.resolve(\n handler(args, { commandId: req.id, command: req.name, signal }),\n );\n return {\n kind: 'ack',\n payload: {\n command: req.name,\n ok: true,\n result,\n durationMs: Date.now() - start,\n },\n };\n } catch (err) {\n return {\n kind: 'rejected',\n payload: {\n command: req.name,\n reason: 'handler-threw',\n details: err instanceof Error ? err.message : String(err),\n },\n };\n }\n }\n}\n","/**\n * Built-in commands registered automatically when `enableRemoteDebug` runs.\n *\n * Most are thin shells over host-supplied callbacks: the SDK has no business\n * deciding what \"reload\" means in a given mini-program, so the host registers\n * the callback and the SDK exposes a stable wire-level command name.\n */\n\nimport { snapshot as rrwebSnapshot } from 'rrweb-snapshot';\n\nimport type { CommandHandler } from '../types.js';\nimport { CommandRegistry } from './registry.js';\n\nconst MAX_DUMP_BYTES = 64 * 1024;\n// Screenshots — both pixel (jpeg-base64) and rrweb-snapshot (JSON) flavours\n// share this cap. A 1920×1080 JPEG q=0.85 ≈ 100–300 KB. An rrweb snapshot of\n// a typical mini-program page (with inlined CSS and image data URLs) lands at\n// ~150–400 KB JSON. Either way, well under 1 MB.\nconst MAX_SCREENSHOT_BYTES = 1024 * 1024;\n\nexport interface BuiltinHostHooks {\n /** Reload the mini-program. If absent, `reload` returns rejected. */\n reload?: () => void | Promise<void>;\n /** Return a JSON-serializable snapshot of host state. */\n getState?: () => unknown | Promise<unknown>;\n /** Apply a feature flag override. */\n setFeatureFlag?: (key: string, value: unknown) => void | Promise<void>;\n /**\n * Capture a screenshot. Two return shapes are accepted:\n * - a raw base64 string → assumed PNG (legacy form)\n * - `{ data, format }` → format is one of:\n * 'png-base64' | 'jpeg-base64' — raw bitmap, viewer renders as <img>\n * 'rrweb-snapshot' — `data` is JSON the viewer rebuilds\n * 'html-snapshot' — legacy `data` JSON: { html, … }\n * The SDK enforces a 1 MB base64/JSON cap regardless.\n */\n screenshot?: () => ScreenshotResult | Promise<ScreenshotResult>;\n}\n\nexport type ScreenshotResult =\n | string\n | {\n data: string;\n format?:\n | 'png-base64'\n | 'jpeg-base64'\n /**\n * rrweb-snapshot tree, JSON-stringified. `data` parses to:\n * { snapshot, viewport: { w, h }, url, capturedAt }\n * The admin viewer calls `rrwebSnapshot.rebuild(snapshot, …)` into\n * an iframe to re-materialize the page with full shadow DOM /\n * adoptedStyleSheets / cross-origin CSS fidelity.\n */\n | 'rrweb-snapshot'\n /**\n * Legacy self-contained HTML snapshot (pre-0.4). `data` JSON shape\n * is `{ html, viewport, url, capturedAt }`. Kept on the wire for\n * back-compat; admin viewers still know how to render it.\n */\n | 'html-snapshot';\n };\n\n/**\n * Default screenshot capture used when the host doesn't provide\n * `builtins.screenshot`. Uses `rrweb-snapshot.snapshot()` to serialize the\n * full document — including:\n *\n * - `adoptedStyleSheets` on `document` and every shadow root (Lit /\n * constructable-stylesheet CSS that `document.styleSheets` MISSES),\n * - shadow DOM + `<slot>` resolution with `:host` / `::slotted()` rules\n * preserved through to rebuild,\n * - cross-origin stylesheets (best-effort — rrweb falls back to fetch\n * where the browser refuses to expose `cssRules`),\n * - images as data URLs (`inlineImages: true`) so the rebuild iframe\n * doesn't 404 on every asset,\n * - canvas snapshots (`recordCanvas: true`) — bitmap captured at\n * snapshot time and re-rendered on rebuild.\n *\n * The hand-rolled SVG-foreignObject → canvas → JPEG path that this\n * replaced was lossy on every one of those points (constructable\n * stylesheets invisible to `document.styleSheets`, `:host` selectors lost\n * during light-DOM flattening, cross-origin sheets silently dropped).\n *\n * Hosts that NEED a literal pixel image (e.g. PDF report inclusion, image\n * diff tooling) can still wire their own `builtins.screenshot` returning\n * `{ format: 'jpeg-base64', data }` from a html2canvas / dom-to-image-style\n * library — the wire format leaves room for both.\n *\n * Non-DOM runtimes (native bridges) MUST provide `builtins.screenshot` —\n * `rrweb-snapshot` is browser-only and will throw without `document`.\n */\nasync function defaultDomScreenshot(): Promise<ScreenshotResult> {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n throw new Error(\n '[@botim/debug-sdk] default screenshot requires a DOM. Provide ' +\n 'builtins.screenshot for non-browser runtimes (e.g. native bridge).',\n );\n }\n\n // ── Pre-pass: materialize adoptedStyleSheets as real <style> tags ───────\n //\n // rrweb-snapshot v2 walks shadow roots and inlines <style>/<link> CSS,\n // but it does NOT serialize `adoptedStyleSheets` (constructable\n // stylesheets) — that logic lives in the rrweb record/replay bundle, not\n // in the standalone snapshot lib. Modern web-component design systems\n // (Lit, buckit2, FAST, …) ship their CSS via `static styles = css\\`…\\``\n // which compiles to a CSSStyleSheet on `shadowRoot.adoptedStyleSheets`.\n // Without this pre-pass, every such component renders unstyled in the\n // rebuild — the \"buttons broken in screenshot\" bug.\n //\n // Walk the document, find every shadow root + the document itself,\n // serialize their adoptedStyleSheets as a single injected <style data-\n // botim-adopted>, then snapshot. Remove the injected nodes afterwards\n // (try/finally) so we don't leak fake nodes back into the live page.\n const injected = injectAdoptedStyleSheets();\n\n let tree;\n try {\n tree = rrwebSnapshot(document, {\n inlineStylesheet: true,\n inlineImages: true,\n recordCanvas: true,\n // Deliberately NOT slimming. SlimDOM drops <link rel=\"preload\">,\n // hidden form metadata, and other \"noise\" that's actually relevant\n // when reproducing a layout bug.\n slimDOM: false,\n // Don't mask anything by default — debug-relay already runs a\n // top-level redactor on console payloads, and on-screen text is the\n // whole point of capturing a screenshot. Hosts that need PII masking\n // can wire their own builtins.screenshot using rrweb-snapshot's\n // `maskTextSelector` / `maskInputOptions`.\n maskAllInputs: false,\n });\n } finally {\n for (const node of injected) {\n try { node.remove(); } catch { /* already gone */ }\n }\n }\n\n if (!tree) {\n throw new Error('[@botim/debug-sdk] rrweb-snapshot returned null tree');\n }\n\n const payload = {\n snapshot: tree,\n viewport: {\n w: window.innerWidth || document.documentElement.clientWidth || 0,\n h: window.innerHeight || document.documentElement.clientHeight || 0,\n },\n url: location.href,\n capturedAt: Date.now(),\n };\n\n return {\n data: JSON.stringify(payload),\n format: 'rrweb-snapshot',\n };\n}\n\n/**\n * Walk every shadow root reachable from `document` and materialize its\n * `adoptedStyleSheets` as a `<style data-botim-adopted=\"1\">` injected as\n * the first child of that root. Also handles `document.adoptedStyleSheets`\n * by injecting into `<head>`. Returns the list of nodes the caller must\n * remove after snapshotting completes.\n *\n * Closed shadow roots are unreachable by spec — nothing we can do there.\n * Components using `attachShadow({ mode: 'closed' })` will still render\n * unstyled. In practice almost every modern WC library uses 'open'.\n *\n * Errors per-sheet are swallowed individually: if one constructable sheet\n * raises (e.g. cross-realm CSSStyleSheet from an iframe), we still want to\n * capture every other sheet on the page.\n */\nfunction injectAdoptedStyleSheets(): Element[] {\n const injected: Element[] = [];\n\n const collect = (\n sheets: ReadonlyArray<CSSStyleSheet> | undefined,\n ): string => {\n if (!sheets || sheets.length === 0) return '';\n const chunks: string[] = [];\n for (const sheet of sheets) {\n try {\n const rules = sheet.cssRules;\n for (const rule of Array.from(rules)) chunks.push(rule.cssText);\n } catch {\n // cross-realm or otherwise opaque — skip just this sheet.\n }\n }\n return chunks.join('\\n');\n };\n\n const inject = (parent: Document | ShadowRoot, css: string): void => {\n if (!css) return;\n const ownerDoc = parent instanceof Document ? parent : parent.ownerDocument;\n if (!ownerDoc) return;\n const style = ownerDoc.createElement('style');\n style.setAttribute('data-botim-adopted', '1');\n style.textContent = css;\n // Inject as FIRST child so subsequent <style>/<link> can still\n // override (matches normal cascade order: adopted < later sheets).\n const target = parent instanceof Document\n ? (parent.head ?? parent.documentElement ?? parent.body)\n : parent;\n if (target) {\n target.insertBefore(style, target.firstChild);\n injected.push(style);\n }\n };\n\n // 1) Top-level document.adoptedStyleSheets (Tailwind v4, some HMR setups).\n try {\n inject(\n document,\n collect((document as Document & { adoptedStyleSheets?: CSSStyleSheet[] }).adoptedStyleSheets),\n );\n } catch { /* noop */ }\n\n // 2) Walk every element via TreeWalker; for each, follow shadowRoot if\n // present (open mode only; closed roots return null) and recurse.\n const walkRoot = (root: Document | ShadowRoot): void => {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n let n: Node | null = walker.currentNode;\n while (n) {\n const el = n as Element & { shadowRoot?: ShadowRoot | null };\n const sr = el.shadowRoot;\n if (sr) {\n // Materialize this shadow root's adoptedStyleSheets…\n try {\n inject(\n sr,\n collect((sr as ShadowRoot & { adoptedStyleSheets?: CSSStyleSheet[] }).adoptedStyleSheets),\n );\n } catch { /* noop */ }\n // …then descend into it to find nested shadow roots.\n walkRoot(sr);\n }\n n = walker.nextNode();\n }\n };\n try { walkRoot(document); } catch { /* noop */ }\n\n return injected;\n}\n\nexport function registerBuiltins(\n registry: CommandRegistry,\n hooks: BuiltinHostHooks = {},\n): void {\n registry.register('ping', ping);\n registry.register('reload', makeReload(hooks.reload));\n registry.register('dump-state', makeDumpState(hooks.getState));\n registry.register('set-feature-flag', makeSetFlag(hooks.setFeatureFlag));\n registry.register('screenshot', makeScreenshot(hooks.screenshot));\n}\n\nconst ping: CommandHandler = () => ({ ok: true, ts: Date.now() });\n\nfunction makeReload(reload?: () => void | Promise<void>): CommandHandler {\n return async () => {\n if (!reload) throw new Error('reload hook not registered by host');\n await reload();\n return { reloaded: true };\n };\n}\n\nfunction makeDumpState(getState?: () => unknown | Promise<unknown>): CommandHandler {\n return async () => {\n if (!getState) throw new Error('getState hook not registered by host');\n const snapshot = await getState();\n const json = safeStringify(snapshot);\n const truncated = json.length > MAX_DUMP_BYTES;\n return {\n state: truncated ? json.slice(0, MAX_DUMP_BYTES) : json,\n truncated,\n bytes: json.length,\n };\n };\n}\n\nfunction makeSetFlag(\n setFeatureFlag?: (key: string, value: unknown) => void | Promise<void>,\n): CommandHandler {\n return async (args) => {\n if (!setFeatureFlag) throw new Error('setFeatureFlag hook not registered by host');\n const key = args.key;\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error('args.key must be a non-empty string');\n }\n if (!('value' in args)) {\n throw new Error('args.value is required');\n }\n await setFeatureFlag(key, args.value);\n return { applied: true, key };\n };\n}\n\nfunction makeScreenshot(\n screenshot?: () => ScreenshotResult | Promise<ScreenshotResult>,\n): CommandHandler {\n // Fall back to the rrweb-snapshot-based capture when the host doesn't\n // provide its own. Hosts targeting non-DOM runtimes MUST provide one.\n const capture = screenshot ?? defaultDomScreenshot;\n return async () => {\n const result = await capture();\n let data: string;\n let format: 'png-base64' | 'jpeg-base64' | 'html-snapshot' | 'rrweb-snapshot';\n if (typeof result === 'string') {\n data = result;\n format = 'png-base64';\n } else if (result && typeof result.data === 'string') {\n data = result.data;\n format = result.format ?? 'png-base64';\n } else {\n throw new Error(\n \"screenshot hook must return a base64 string or { data, format }\",\n );\n }\n if (data.length === 0) throw new Error('screenshot hook returned empty data');\n if (data.length > MAX_SCREENSHOT_BYTES) {\n throw new Error(\n `screenshot ${data.length} bytes exceeds limit ${MAX_SCREENSHOT_BYTES}`,\n );\n }\n return { format, data, bytes: data.length };\n };\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n const seen = new WeakSet<object>();\n return JSON.stringify(v, function replacer(_k, val) {\n if (typeof val === 'bigint') return val.toString() + 'n';\n if (typeof val === 'function') return `[Function: ${(val as { name?: string }).name ?? 'anonymous'}]`;\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val as object)) return '[Circular]';\n seen.add(val as object);\n }\n return val;\n }) ?? '';\n } catch (err) {\n return JSON.stringify({ __unserializable: err instanceof Error ? err.message : 'unknown' });\n }\n}\n","/**\n * Per-signature sliding-window event deduper.\n *\n * Without this, a `setInterval(() => undefined.foo, 16)` produces ~60\n * `error` events per second; a flaky network endpoint in a tight retry\n * loop can fire hundreds of `network` events per minute. The relay's hot\n * retention is 24-48h — at those rates a single misbehaving session drowns\n * out everything else, and the device's own ingest budget gets eaten by\n * its own bug.\n *\n * Algorithm:\n * - Compute a stable signature for each event (type + key payload bits).\n * - First event with a given signature in a window: emit normally.\n * - Subsequent events with the same signature within `windowMs`: drop +\n * increment a counter.\n * - When the window closes (next same-signature event OR a periodic sweep),\n * emit ONE rollup event whose `meta.dedup` field carries the suppressed\n * count and the time range.\n *\n * Types are carried verbatim — a suppressed `error` produces an `error`-typed\n * rollup with the same level. Admin UIs / agents detect rollups by checking\n * `meta.dedup` rather than a separate event type, so no schema bump is needed.\n *\n * Default behaviour: enabled, 1000 ms window, applies to console / network /\n * error events only. lifecycle / bridge / perf / command-* events bypass.\n */\n\nimport type {\n ConsolePayload,\n DebugEvent,\n ErrorPayload,\n EventLevel,\n EventType,\n NetworkPayload,\n SerializedValue,\n} from './types.js';\n\nexport interface DedupOptions {\n /** Default true. Set false to disable deduping entirely. */\n enabled?: boolean;\n /** Sliding window per signature, in ms. Default 1000. */\n windowMs?: number;\n /** Hard cap on the number of tracked signatures. Default 500. Oldest entries evict on overflow. */\n maxSignatures?: number;\n}\n\nexport interface SuppressionSummary {\n signature: string;\n type: EventType;\n level: EventLevel;\n /** Total suppressed (excludes the leading event that was emitted as a real event). */\n count: number;\n firstTs: number;\n lastTs: number;\n /** Human-readable label describing what was suppressed. */\n label: string;\n /** Original payload of the LAST suppressed occurrence — gives admins a\n * recent-state look at the thing that's been firing in a loop. */\n examplePayload: ConsolePayload | NetworkPayload | ErrorPayload | unknown;\n}\n\nconst DEFAULT_WINDOW_MS = 1000;\nconst DEFAULT_MAX_SIGNATURES = 500;\nconst DEDUPED_TYPES: ReadonlyArray<EventType> = ['console', 'network', 'error'];\n\ninterface Entry {\n type: EventType;\n level: EventLevel;\n firstTs: number;\n lastTs: number;\n count: number;\n label: string;\n /** Last occurrence's payload, used so the rollup carries a representative example. */\n lastPayload: unknown;\n}\n\nexport class EventDeduper {\n private readonly enabled: boolean;\n private readonly windowMs: number;\n private readonly maxSig: number;\n private readonly entries = new Map<string, Entry>();\n private readonly onSummary: (s: SuppressionSummary) => void;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(onSummary: (s: SuppressionSummary) => void, opts: DedupOptions = {}) {\n this.enabled = opts.enabled !== false;\n this.windowMs = opts.windowMs ?? DEFAULT_WINDOW_MS;\n this.maxSig = opts.maxSignatures ?? DEFAULT_MAX_SIGNATURES;\n this.onSummary = onSummary;\n\n if (this.enabled) {\n // Sweep at half the window cadence so a burst that ends silently still\n // produces a rollup within ~1 window of the last occurrence.\n this.timer = setInterval(() => this.sweep(Date.now()), Math.max(250, Math.floor(this.windowMs / 2)));\n }\n }\n\n /**\n * Returns true if the SDK should emit `ev` to the buffer; false if it's a\n * duplicate within the current window and should be suppressed.\n */\n shouldEmit(ev: DebugEvent): boolean {\n if (!this.enabled) return true;\n if (!DEDUPED_TYPES.includes(ev.type)) return true;\n // command-ack / command-rejected are explicitly never deduped — each\n // command has its own commandId so they're inherently unique anyway.\n\n const sig = this.signatureOf(ev);\n const now = ev.ts;\n const existing = this.entries.get(sig);\n\n if (!existing) {\n this.evictIfFull();\n this.entries.set(sig, {\n type: ev.type,\n level: ev.level,\n firstTs: now,\n lastTs: now,\n count: 1,\n label: this.labelOf(ev),\n lastPayload: ev.payload,\n });\n return true;\n }\n\n if (now - existing.firstTs >= this.windowMs) {\n // Window closed: emit a summary for the prior bucket if it had > 1\n // occurrences, then open a fresh window with this event.\n if (existing.count > 1) this.emitSummary(sig, existing);\n this.entries.set(sig, {\n type: ev.type,\n level: ev.level,\n firstTs: now,\n lastTs: now,\n count: 1,\n label: this.labelOf(ev),\n lastPayload: ev.payload,\n });\n return true;\n }\n\n // Same window — suppress and tally.\n existing.lastTs = now;\n existing.count++;\n existing.lastPayload = ev.payload;\n return false;\n }\n\n /**\n * Force-flush any pending rollups (e.g. before stop). After this returns,\n * the internal map is empty.\n */\n flushAll(): void {\n for (const [sig, e] of this.entries) {\n if (e.count > 1) this.emitSummary(sig, e);\n }\n this.entries.clear();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.flushAll();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n\n private sweep(now: number): void {\n for (const [sig, e] of this.entries) {\n if (now - e.firstTs >= this.windowMs) {\n if (e.count > 1) this.emitSummary(sig, e);\n this.entries.delete(sig);\n }\n }\n }\n\n private emitSummary(sig: string, e: Entry): void {\n try {\n this.onSummary({\n signature: sig,\n type: e.type,\n level: e.level,\n count: e.count - 1, // first occurrence already emitted as a real event\n firstTs: e.firstTs,\n lastTs: e.lastTs,\n label: e.label,\n examplePayload: e.lastPayload,\n });\n } catch {\n // Never let a misbehaving summary callback crash the SDK; the no-throw\n // invariant applies here too.\n }\n }\n\n private evictIfFull(): void {\n if (this.entries.size < this.maxSig) return;\n // Drop the oldest entry. Map iteration is insertion-ordered, so the first\n // key returned is the earliest-inserted one. If the evicted entry has\n // pending suppressions, emit its summary first.\n const firstKey = this.entries.keys().next().value;\n if (typeof firstKey === 'string') {\n const e = this.entries.get(firstKey);\n if (e && e.count > 1) this.emitSummary(firstKey, e);\n this.entries.delete(firstKey);\n }\n }\n\n // ─── Signature & label generators ───────────────────────────────────────\n // Signatures are STRUCTURAL: they identify \"the same kind of event\" rather\n // than the same bytes. So `console.error(\"x\" + Date.now())` collapses by\n // method + first-token of args; an HTTP 500 on the same URL collapses\n // regardless of body content.\n\n private signatureOf(ev: DebugEvent): string {\n if (ev.type === 'console') {\n const p = ev.payload as ConsolePayload;\n const args = (p.args || []).map(consoleArgToken).join(' ').slice(0, 240);\n return `c:${p.method}:${args}`;\n }\n if (ev.type === 'network') {\n const p = ev.payload as NetworkPayload;\n // phase is part of the signature so request/response/error of the same\n // call don't collapse into a single bucket.\n return `n:${p.phase}:${p.method}:${p.url}:${p.status ?? ''}:${p.errorName ?? ''}`;\n }\n if (ev.type === 'error') {\n const p = ev.payload as ErrorPayload;\n return `e:${p.source}:${p.name ?? ''}:${(p.message ?? '').slice(0, 240)}`;\n }\n return `${ev.type}:${ev.level}`;\n }\n\n private labelOf(ev: DebugEvent): string {\n if (ev.type === 'console') {\n const p = ev.payload as ConsolePayload;\n return `console.${p.method}: ${(p.args || []).map(consoleArgToken).join(' ').slice(0, 160)}`;\n }\n if (ev.type === 'network') {\n const p = ev.payload as NetworkPayload;\n return `${p.method} ${p.url} (${p.phase}${p.status ? ' ' + p.status : ''})`;\n }\n if (ev.type === 'error') {\n const p = ev.payload as ErrorPayload;\n return `${p.name ?? 'Error'}: ${(p.message ?? '').slice(0, 160)}`;\n }\n return ev.type;\n }\n}\n\nfunction consoleArgToken(a: SerializedValue): string {\n switch (a.k) {\n case 'primitive': return String(a.v);\n case 'string':\n case 'json': return String(a.v).slice(0, 80);\n case 'error': return `${a.name ?? 'Error'}:${a.message ?? ''}`;\n case 'undefined': return 'undefined';\n case 'function': return `[fn:${a.name ?? '?'}]`;\n case 'circular': return '[Circular]';\n case 'unserializable': return `[unser:${a.reason}]`;\n default: return '?';\n }\n}\n","export * from './types.js';\nexport { BotimConfigError, BotimConsentError } from './errors.js';\n\nimport {\n SCHEMA_VERSION,\n type BotimConfig,\n type CommandHandler,\n type CommandRequest,\n type ConsolePayload,\n type ConsentInput,\n type DebugEvent,\n type DeviceInfo,\n type ErrorPayload,\n type EventLevel,\n type EventMeta,\n type NetworkPayload,\n} from './types.js';\nimport { BotimConfigError, BotimConsentError } from './errors.js';\nimport { RingBuffer } from './buffer.js';\nimport { Transport } from './transport.js';\nimport { attachDevice, detectDeviceInfo } from './attach.js';\nimport { redactBody, redactHeaders } from './redact.js';\nimport { installConsoleInterceptor } from './interceptors/console.js';\nimport { installErrorInterceptor } from './interceptors/errors.js';\nimport { installNetworkInterceptor } from './interceptors/network.js';\nimport { CommandRegistry } from './commands/registry.js';\nimport { registerBuiltins, type BuiltinHostHooks } from './commands/builtins.js';\nimport { EventDeduper, type DedupOptions, type SuppressionSummary } from './dedup.js';\n\nexport type { CommandHandler } from './types.js';\nexport type { BuiltinHostHooks } from './commands/builtins.js';\nexport type { DedupOptions, SuppressionSummary } from './dedup.js';\n\nexport interface RedactionConfig {\n headers?: string[];\n bodyPatterns?: RegExp[];\n maxBodyBytes?: number;\n}\n\nexport interface SamplingConfig {\n console?: number;\n network?: number;\n lifecycle?: number;\n bridge?: number;\n}\n\nexport interface AppInfo {\n name: string;\n version: string;\n build?: string;\n}\n\nexport interface RemoteDebugOptions {\n /** When false, returns a no-op handle and installs nothing. */\n enabled?: boolean;\n /** Relay base URL, e.g. \"https://debug.botim.dev\". */\n endpoint: string;\n /**\n * Optional override for the app identity reported in events. When omitted\n * the SDK falls back to `config.appName` / `config.appVersion` resolved by\n * the Vite plugin from `botim.{env}.json`.\n */\n app?: AppInfo;\n /**\n * Build-time-resolved mini-program identity. In typical usage this is\n * `botimConfig` imported from `virtual:botim/config` (provided by the\n * `@botim/debug-sdk/vite` plugin). REQUIRED.\n */\n config: BotimConfig;\n /**\n * Consent for telemetry. Required in `prod`; implicit in non-prod builds.\n */\n consent?: ConsentInput;\n /** Built-in command host hooks (reload, getState, screenshot, etc.). */\n builtins?: BuiltinHostHooks;\n device?: Partial<DeviceInfo>;\n redact?: RedactionConfig;\n sampling?: SamplingConfig;\n /**\n * Sliding-window per-signature dedup. Default: enabled with a 1 s window\n * applied to console / network / error events. Set `false` to disable.\n * Repetitive events (e.g., a render-loop error firing 60×/s) collapse\n * into one leading event + a synthesized rollup event whose\n * `meta.dedup.count` carries the suppressed total.\n */\n dedup?: DedupOptions | false;\n flushIntervalMs?: number;\n bufferSize?: number;\n maxBatchSize?: number;\n maxRetries?: number;\n /** Called for transport-level errors. SDK never throws into app code. */\n onError?: (err: unknown) => void;\n}\n\nexport interface RemoteDebugHandle {\n readonly sid: string | null;\n flush(): Promise<void>;\n stop(): Promise<void>;\n /** Register a custom command handler. Idempotent on the name. */\n registerCommand(name: string, handler: CommandHandler): void;\n /** Remove a previously-registered command. Returns true if it existed. */\n unregisterCommand(name: string): boolean;\n}\n\nexport const DEFAULT_REDACT_HEADERS: readonly string[] = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n];\n\nexport const DEFAULT_BODY_PATTERNS: readonly RegExp[] = [\n /(?:bearer\\s+)?[A-Za-z0-9_-]{20,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}/gi,\n /[A-Za-z0-9_-]{40,}/g,\n];\n\nexport const DEFAULT_MAX_BODY_BYTES = 4096;\n/**\n * How often the transport drains the buffer to the relay.\n *\n * 8 seconds is deliberately slow: this is a debug telemetry channel, not a\n * realtime one. With a 200ms cadence, a busy session producing ~10 events/sec\n * would make ~5 ingest POSTs/second, hammering the device's network stack\n * and the relay's write path for no human-visible benefit (admins poll at\n * 2s anyway, so end-to-end perceived latency is dominated by their poll).\n *\n * The timer fully drains the buffer per tick (multiple POSTs back-to-back if\n * needed, each capped at maxBatchSize), so the only cost of the longer\n * interval is up to 8s of potential delay before an event reaches the relay.\n *\n * Hosts can opt for tighter latency by setting `flushIntervalMs` explicitly.\n */\nexport const DEFAULT_FLUSH_INTERVAL_MS = 8000;\nexport const DEFAULT_BUFFER_SIZE = 1000;\nexport const DEFAULT_MAX_BATCH_SIZE = 50;\n\nconst NOOP_HANDLE: RemoteDebugHandle = {\n sid: null,\n async flush() {},\n async stop() {},\n registerCommand() {\n // no-op handle: silently accept; consumers should branch on `enabled` if they care.\n },\n unregisterCommand() {\n return false;\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Consent gate — synchronous, runs before any I/O or interceptor install.\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction assertConsent(config: BotimConfig, consent: ConsentInput | undefined): void {\n if (config.env !== 'prod') return; // dev/uat/beta are implicitly consented\n const hasHostToken =\n typeof consent?.hostToken === 'string' && consent.hostToken.length > 0;\n const hasOptIn = consent?.userOptIn === true;\n if (hasHostToken || hasOptIn) return;\n throw new BotimConsentError(\n 'prod debug sessions require consent.hostToken or consent.userOptIn === true',\n );\n}\n\nfunction assertConfig(config: BotimConfig | undefined): asserts config is BotimConfig {\n if (!config || typeof config !== 'object') {\n throw new BotimConfigError(\n 'options.config is required (import botimConfig from \"virtual:botim/config\")',\n { code: 'config-missing' },\n );\n }\n if (typeof config.miniProgramId !== 'string' || config.miniProgramId.length === 0) {\n throw new BotimConfigError('options.config.miniProgramId must be a non-empty string', {\n code: 'config-missing-field',\n });\n }\n if (\n config.env !== 'dev' &&\n config.env !== 'uat' &&\n config.env !== 'beta' &&\n config.env !== 'prod'\n ) {\n throw new BotimConfigError(\n `options.config.env must be one of dev|uat|beta|prod (got ${JSON.stringify(config.env)})`,\n { code: 'config-invalid-env' },\n );\n }\n}\n\nexport async function enableRemoteDebug(\n options: RemoteDebugOptions,\n): Promise<RemoteDebugHandle> {\n if (options.enabled === false) return NOOP_HANDLE;\n\n // Synchronous validation gates — must happen before ANY I/O or wrapping.\n assertConfig(options.config);\n assertConsent(options.config, options.consent);\n\n const onError = options.onError ?? (() => {});\n // Fall back to the identity the Vite plugin already resolved from\n // `botim.{env}.json` so consumers don't have to repeat themselves.\n const app: AppInfo = options.app ?? {\n name: options.config.appName ?? options.config.miniProgramId,\n version: options.config.appVersion ?? '0.0.0',\n };\n const deviceInfo = detectDeviceInfo(app, options.device);\n const consent: ConsentInput = options.consent ?? {};\n\n const session = await attachDevice(options.endpoint, options.config, deviceInfo, consent);\n\n const buffer = new RingBuffer({\n capacity: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n });\n\n const transport = new Transport({\n ingestUrl: session.ingestUrl,\n deviceToken: session.deviceToken,\n buffer,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxBatchSize: options.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n maxRetries: options.maxRetries,\n onError,\n });\n\n // Command registry + built-ins.\n const registry = new CommandRegistry();\n registerBuiltins(registry, options.builtins);\n\n let seq = 0;\n const baseMeta: EventMeta = {\n appVersion: app.version,\n build: app.build,\n deviceId: deviceInfo.deviceId,\n };\n\n const sampleConsole = options.sampling?.console ?? 1;\n const sampleNetwork = options.sampling?.network ?? 1;\n\n const redactHeaderList = options.redact?.headers ?? DEFAULT_REDACT_HEADERS;\n const bodyPatterns = options.redact?.bodyPatterns ?? DEFAULT_BODY_PATTERNS;\n const maxBodyBytes = options.redact?.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n // ───────────────────────────────────────────────────────────────────────────\n // Pre-buffer redaction. Every event passes through these helpers BEFORE\n // entering the ring buffer, so even an in-process inspector reading the\n // buffer cannot see raw secrets.\n // ───────────────────────────────────────────────────────────────────────────\n\n const redactNetwork = (p: NetworkPayload): NetworkPayload => {\n if (p.reqHeaders) p.reqHeaders = redactHeaders(p.reqHeaders, redactHeaderList);\n if (p.resHeaders) p.resHeaders = redactHeaders(p.resHeaders, redactHeaderList);\n if (p.reqBody !== undefined) {\n const r = redactBody(p.reqBody, bodyPatterns, maxBodyBytes);\n p.reqBody = r.body;\n p.reqBodyTruncated = r.truncated;\n }\n if (p.resBody !== undefined) {\n const r = redactBody(p.resBody, bodyPatterns, maxBodyBytes);\n p.resBody = r.body;\n p.resBodyTruncated = r.truncated;\n }\n return p;\n };\n\n const redactConsoleArgs = (p: ConsolePayload): ConsolePayload => {\n // Apply body patterns to any stringified arg payloads so accidental\n // `console.log(token)` doesn't leak past the buffer boundary.\n for (const arg of p.args) {\n if (arg.k === 'string' || arg.k === 'json') {\n const r = redactBody(arg.v, bodyPatterns, maxBodyBytes);\n arg.v = r.body ?? '';\n if (r.truncated) arg.truncated = true;\n }\n }\n return p;\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Per-signature sliding-window deduper. A misbehaving page that fires the\n // same console.error 60×/sec collapses into 1 leading event + 1 rollup\n // event per second whose meta.dedup.count carries the suppressed total.\n // Set options.dedup = false to disable.\n // ───────────────────────────────────────────────────────────────────────────\n const deduper =\n options.dedup === false\n ? null\n : new EventDeduper((s: SuppressionSummary) => {\n // Synthesize a rollup event of the SAME type as the suppressed ones,\n // attaching meta.dedup so the relay / admin UI / agents can detect\n // it as a summary rather than a primary event.\n const rollupPayload =\n s.type === 'console'\n ? ({\n method: (s.examplePayload as ConsolePayload | undefined)?.method ?? 'info',\n args: [\n {\n k: 'string' as const,\n v: `[dedup] ${s.label} — repeated ${s.count} more time${s.count === 1 ? '' : 's'} in ${s.lastTs - s.firstTs}ms`,\n },\n ],\n } as ConsolePayload)\n : (s.examplePayload as DebugEvent['payload']);\n\n const ev = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: s.lastTs,\n type: s.type,\n level: s.level,\n payload: rollupPayload,\n meta: {\n ...baseMeta,\n dedup: {\n signature: s.signature,\n count: s.count,\n firstTs: s.firstTs,\n lastTs: s.lastTs,\n },\n },\n } as DebugEvent;\n buffer.push(ev);\n }, options.dedup || undefined);\n\n const pushOrSuppress = (ev: DebugEvent): void => {\n if (!deduper || deduper.shouldEmit(ev)) buffer.push(ev);\n };\n\n const emitConsole = (level: EventLevel, payload: ConsolePayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'console',\n level,\n payload: redactConsoleArgs(payload),\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitError = (payload: ErrorPayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'error',\n level: 'error',\n payload,\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitNetwork = (payload: NetworkPayload): void => {\n const ev: DebugEvent = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: 'network',\n level: payload.phase === 'error' ? 'error' : 'info',\n payload: redactNetwork(payload),\n meta: baseMeta,\n };\n pushOrSuppress(ev);\n };\n\n const emitCommandResult = (\n req: CommandRequest,\n kind: 'command-ack' | 'command-rejected',\n payload: DebugEvent['payload'],\n ): void => {\n const ev = {\n v: SCHEMA_VERSION,\n sid: session.sid,\n seq: ++seq,\n ts: Date.now(),\n type: kind,\n level: kind === 'command-rejected' ? 'warn' : 'info',\n payload,\n meta: { ...baseMeta, commandId: req.id },\n } as DebugEvent;\n buffer.push(ev);\n };\n\n // Surface command override events as informational entries so AI agents can\n // see when a host has redefined a command they thought they knew.\n registry.onOverride((name) => {\n emitCommandResult(\n { id: 'override-' + name + '-' + Date.now(), name },\n 'command-rejected',\n { command: name, reason: 'overridden' },\n );\n });\n\n const uninstallConsole = installConsoleInterceptor({\n emit: emitConsole,\n sample: sampleConsole,\n });\n const uninstallErrors = installErrorInterceptor({ emit: emitError });\n // Belt-and-suspenders: Transport already uses an un-patched fetch reference\n // for its own ingest + command-poll traffic, so the interceptor never sees\n // those calls. We *also* wire shouldSkip with the relay URLs so a future\n // change that adds another internal request (e.g. an /attach refresh) is\n // automatically silent without revisiting this code.\n const internalEndpoints = [session.ingestUrl, session.commandPollUrl];\n const uninstallNetwork = installNetworkInterceptor({\n emit: emitNetwork,\n sample: sampleNetwork,\n shouldSkip: (url) => internalEndpoints.some((ep) => ep && url.startsWith(ep)),\n });\n\n transport.start();\n transport.startCommandLoop({\n commandPollUrl: session.commandPollUrl,\n onCommand: async (req) => {\n const ctl = new AbortController();\n const result = await registry.dispatch(req, ctl.signal);\n emitCommandResult(req, result.kind === 'ack' ? 'command-ack' : 'command-rejected', result.payload);\n },\n });\n\n return {\n sid: session.sid,\n async flush() {\n await transport.flush();\n },\n async stop() {\n uninstallConsole();\n uninstallErrors();\n uninstallNetwork();\n // Stop the deduper FIRST so any pending rollups are flushed into the\n // buffer before transport.stop() drains it. Otherwise a long-running\n // session shutting down with suppressed events in flight would lose\n // the suppression-summary rows.\n if (deduper) deduper.stop();\n await transport.stop();\n },\n registerCommand(name, handler) {\n registry.register(name, handler);\n },\n unregisterCommand(name) {\n return registry.unregister(name);\n },\n };\n}\n"]}
|