@botim/mp-debug-sdk 0.6.2 → 0.7.0
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 +227 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -2
- package/dist/index.d.ts +58 -2
- package/dist/index.js +224 -1
- package/dist/index.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +31 -1
- package/dist/types.d.ts +31 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
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":["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 /** HTTP status text (e.g., \"OK\", \"Not Found\"). Lets the admin show \"200 OK\". */\n statusText?: string;\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 /** Stack trace for the failing call. Captured at the failure site so\n * operators can locate the originating code path. For fetch this is\n * `err.stack` from the rejected promise; for XHR (which doesn't carry\n * an Error object on `error`/`timeout`/`abort`) we synthesise a stack\n * from the call site of `xhr.send()`. */\n errorStack?: string;\n /** Flattened cause chain (`err.cause.cause...`) — undici-style fetch\n * failures frequently wrap the useful reason here (e.g. `ECONNREFUSED`\n * inside a generic `TypeError: fetch failed`). One line per cause. */\n errorCause?: 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 ?? loadOrCreateDeviceId(),\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\n/**\n * Persistent device-identity key. The relay anchors sessions to\n * `(mp_id, deviceId)` — without persistence, every page reload generates a\n * fresh UUID and the relay sees a brand-new device, which then spawns a\n * brand-new `sid`. Net effect: the admin Sessions tab fills with one row\n * per page-load instead of one row per real device.\n *\n * Scoping: per-origin. A user with the mp open on multiple devices /\n * profiles correctly gets distinct deviceIds. localStorage is the right\n * store here (sessionStorage clears on tab close; cookies need a domain).\n */\nconst DEVICE_ID_STORAGE_KEY = 'botim-debug-sdk:device-id';\n\nfunction loadOrCreateDeviceId(): string {\n // Try persisted value first. Catches cover (a) localStorage missing\n // entirely (SSR / native bridges / Workers), (b) the user's\n // localStorage being full or quota-blocked, (c) a malformed prior write.\n try {\n const ls = typeof localStorage !== 'undefined' ? localStorage : null;\n if (ls) {\n const stored = ls.getItem(DEVICE_ID_STORAGE_KEY);\n if (stored && stored.length > 0) return stored;\n const fresh = generateDeviceId();\n ls.setItem(DEVICE_ID_STORAGE_KEY, fresh);\n return fresh;\n }\n } catch {\n /* fall through to ephemeral generation */\n }\n // No persistent store available — caller will get a fresh id every\n // boot, but at least the call doesn't throw. Hosts that NEED stable\n // device identity in those environments should pass deviceId via the\n // override.\n return generateDeviceId();\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 // statusText carries the human label (\"OK\", \"Not Found\"). Pre-HTTP/2\n // responses always have it; HTTP/2+ defines it as empty by spec but\n // most browsers synthesize one from the code, so this is reliable\n // enough to display alongside the status code.\n statusText: res.statusText || undefined,\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 // Stack from the rejected promise — points into fetch internals\n // and (when present) the call site that issued the request.\n errorStack: err instanceof Error ? err.stack : undefined,\n // undici frequently wraps the real reason in `cause` (e.g.\n // `TypeError: fetch failed` outside, `Error: ECONNREFUSED` inside).\n // Flatten the chain so operators don't have to dig.\n errorCause: collectCauseChain(err),\n });\n throw err;\n }\n };\n\n return () => {\n target.fetch = original;\n };\n}\n\n/** Walk the `err.cause.cause...` chain and emit one summary line per\n * link. Returns undefined if there's no chain. Bounded depth so a\n * pathologically self-referencing cause graph can't loop. */\nfunction collectCauseChain(err: unknown): string | undefined {\n if (!err || typeof err !== 'object') return undefined;\n const lines: string[] = [];\n let cur: unknown = (err as { cause?: unknown }).cause;\n const seen = new Set<unknown>();\n while (cur && lines.length < 5) {\n if (seen.has(cur)) break;\n seen.add(cur);\n if (cur instanceof Error) {\n lines.push(`${cur.name}: ${cur.message}`);\n cur = (cur as { cause?: unknown }).cause;\n } else {\n lines.push(String(cur));\n cur = (cur as { cause?: unknown })?.cause;\n }\n }\n return lines.length ? lines.join('\\n') : undefined;\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 // XHR's `error`/`timeout`/`abort` events fire WITHOUT an Error object,\n // so by the time `onError` runs there's no stack to capture. Snapshot\n // a synthetic stack here at the call site of `xhr.send()` — it's the\n // last frame we control and the most useful one for triage.\n const sendSiteStack = captureCallSiteStack();\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 // XHR exposes statusText directly; same display purpose as fetch.\n statusText: this.statusText || undefined,\n durationMs: Date.now() - s.start,\n resHeaders: headers,\n resBody,\n });\n };\n const onError = (kind: 'error' | 'timeout' | 'abort') => () => {\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 // Distinguish error/timeout/abort in the message — the standard\n // XHR `statusText` is empty for `error` and unhelpful for the\n // others, so we synthesise a clear label.\n errorMessage: this.statusText || `xhr ${kind}`,\n errorName: `XHR${kind[0].toUpperCase()}${kind.slice(1)}`,\n errorStack: sendSiteStack,\n });\n };\n\n this.addEventListener('load', onLoad);\n this.addEventListener('error', onError('error'));\n this.addEventListener('timeout', onError('timeout'));\n this.addEventListener('abort', onError('abort'));\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\n/** Synthesise a stack at the call site by throwing-and-catching an Error.\n * We strip the top frame (this helper itself) so the first visible frame\n * is the caller — typically the patched `xhr.send` wrapper, with the\n * user's code right beneath it. */\nfunction captureCallSiteStack(): string | undefined {\n try {\n throw new Error('xhr-callsite');\n } catch (err) {\n if (!(err instanceof Error) || !err.stack) return undefined;\n const lines = err.stack.split('\\n');\n // Drop the message line and the first frame (this helper). What\n // remains begins with the caller of captureCallSiteStack().\n return lines.slice(2).join('\\n') || undefined;\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// Maximum bytes of source code accepted by `exec`. Big enough for ~150\n// lines of typical debug code; small enough that no agent can ship a\n// 10 MB minified attack payload through the long-poll channel. Above\n// this we reject before instantiating AsyncFunction.\nconst MAX_EXEC_CODE_BYTES = 8 * 1024;\nconst DEFAULT_EXEC_TIMEOUT_MS = 5_000;\nconst MIN_EXEC_TIMEOUT_MS = 250;\nconst MAX_EXEC_TIMEOUT_MS = 30_000;\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 * Default-enabled remote-eval command (`exec`). Pass `false` to opt out\n * of registration entirely; pass an object to inject extra locals into\n * every snippet's scope.\n *\n * builtins: { exec: false }\n * → exec NOT registered; agents calling exec see `unknown-command`.\n *\n * builtins: { exec: { globals: { app, store } } }\n * → exec registered; snippets can reference `app` and `store` as\n * bare identifiers. Default locals (`BOT`, `window`, `document`)\n * are always present.\n *\n * builtins.exec is undefined / not set\n * → default behaviour: exec registered with default locals only.\n *\n * See `openspec/changes/add-default-exec-builtin/design.md` for the\n * security rationale (no prod-specific gating in MVP; relies on the\n * existing `enableRemoteDebug` consent gate).\n */\n exec?: false | ExecOptions;\n}\n\nexport interface ExecOptions {\n /**\n * Additional locals bound into every snippet's scope. Keys MUST be\n * valid identifier names (the SDK does not validate this — passing a\n * key like \"1foo\" or \"a-b\" will throw at AsyncFunction construction\n * time and surface as a `command-rejected`).\n */\n globals?: Record<string, unknown>;\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 // `exec` is on by default — pass `builtins: { exec: false }` to skip.\n if (hooks.exec !== false) {\n registry.register('exec', makeExec(hooks.exec ?? {}));\n }\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\n// ─────────────────────────────────────────────────────────────────────────────\n// `exec` — remote-eval a JS snippet with console capture, top-level await,\n// timeout, and best-effort BOT injection.\n//\n// Threat model & defenses (MVP):\n// - Code-size cap (8 KB) and timeout cap (30 s) bound worst-case load.\n// - Pre-buffer redaction in src/index.ts still applies to result.value\n// and result.logs before they leave the device buffer.\n// - The existing consent gate gates whether attach happens at all in\n// prod; we layer no exec-specific gate here. See\n// openspec/changes/add-default-exec-builtin/design.md §2.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Best-effort `BOT` resolver. Tries (in order):\n * 1. `window.BOT` — set by the lite framework or by hosts that\n * explicitly publish the Angular service onto the global.\n * 2. `angular.element(document).injector().get('BOT')` — the standard\n * mp-framework full-build form.\n * 3. `null` — non-MP environments. Snippets see `BOT === null` and can\n * still introspect `window` / `document`.\n *\n * Cached after the first non-null resolution so we pay the DI lookup at\n * most once per session. Wrapped in try/catch on every step — Angular\n * internals are not part of our API surface.\n */\nlet cachedBOT: unknown = undefined; // sentinel: undefined = not yet resolved\nexport function getBOT(): unknown {\n if (cachedBOT !== undefined) return cachedBOT;\n if (typeof window === 'undefined') {\n cachedBOT = null;\n return null;\n }\n try {\n const w = window as unknown as { BOT?: unknown };\n if (w.BOT) {\n cachedBOT = w.BOT;\n return cachedBOT;\n }\n } catch { /* noop */ }\n try {\n const w = window as unknown as {\n angular?: { element?: (el: unknown) => { injector?: () => { get?: (name: string) => unknown } | undefined } };\n };\n const ng = w.angular;\n if (ng?.element && typeof document !== 'undefined') {\n const injector = ng.element(document).injector?.();\n const bot = injector?.get?.('BOT');\n if (bot != null) {\n cachedBOT = bot;\n return cachedBOT;\n }\n }\n } catch { /* noop */ }\n // Don't cache a null result — framework boot may finish later in the\n // session and a subsequent exec call should pick it up.\n return null;\n}\n\n/** Test-only hook: clear the BOT cache so unit tests can exercise both\n * resolved and unresolved paths without a fresh module load. */\nexport function __resetBOTCache(): void {\n cachedBOT = undefined;\n}\n\ninterface ExecLogEntry {\n method: 'log' | 'info' | 'warn' | 'error' | 'debug';\n args: unknown[];\n ts: number;\n}\n\nfunction makeExec(opts: ExecOptions): CommandHandler {\n const extraGlobalNames = Object.keys(opts.globals ?? {});\n const extraGlobalValues = extraGlobalNames.map((k) => (opts.globals as Record<string, unknown>)[k]);\n\n return async (args, ctx) => {\n if (typeof args.code !== 'string' || args.code.length === 0) {\n throw new Error('args.code (non-empty string) is required');\n }\n if (args.code.length > MAX_EXEC_CODE_BYTES) {\n throw new Error(`args.code ${args.code.length} bytes exceeds limit ${MAX_EXEC_CODE_BYTES}`);\n }\n const timeoutMs = clamp(\n typeof args.timeoutMs === 'number' ? args.timeoutMs : DEFAULT_EXEC_TIMEOUT_MS,\n MIN_EXEC_TIMEOUT_MS,\n MAX_EXEC_TIMEOUT_MS,\n );\n\n const start = Date.now();\n const logs: ExecLogEntry[] = [];\n\n // ── Console capture: replace methods, push to per-call buffer, ALSO\n // call the original so the SDK's console interceptor still sees it.\n // We store the raw method reference (no `.bind`) so the restore step\n // in `finally` puts back the *exact same function value* the slot\n // held before — important for `===`-comparison restoration tests and\n // for any other code that captured `console.log` before us.\n const consoleMethods = ['log', 'info', 'warn', 'error', 'debug'] as const;\n type ConsoleMethod = (typeof consoleMethods)[number];\n const originals: Partial<Record<ConsoleMethod, (...a: unknown[]) => void>> = {};\n if (typeof console !== 'undefined') {\n for (const m of consoleMethods) {\n const orig = console[m];\n if (typeof orig !== 'function') continue;\n originals[m] = orig;\n const captured = (...callArgs: unknown[]) => {\n logs.push({ method: m, args: callArgs.map(execSafeClone), ts: Date.now() });\n try { orig.call(console, ...callArgs); } catch { /* keep going */ }\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (console as any)[m] = captured;\n }\n }\n\n let value: unknown;\n let threw: unknown = undefined;\n try {\n // Build an AsyncFunction so top-level `await` works. Try the\n // expression form first — `console.log(\"hi\")` is an expression that\n // returns undefined; `1 + 1` is an expression that returns 2; both\n // produce sensible `value` outputs. If parsing as an expression\n // raises SyntaxError (statements like `const x = 1; return x;`),\n // fall through to the statement form.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const AsyncFunction = (Object.getPrototypeOf(async function () { /* */ }) as { constructor: any }).constructor;\n const localNames: string[] = ['BOT', 'window', 'document', ...extraGlobalNames];\n const localValues: unknown[] = [\n getBOT(),\n typeof window !== 'undefined' ? window : undefined,\n typeof document !== 'undefined' ? document : undefined,\n ...extraGlobalValues,\n ];\n\n let fnTry: ((...a: unknown[]) => Promise<unknown>) | null = null;\n try {\n fnTry = new AsyncFunction(...localNames, `return (${args.code});`);\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e;\n // Fall through to statement form.\n }\n const fn: (...a: unknown[]) => Promise<unknown> =\n fnTry ?? (new AsyncFunction(...localNames, args.code) as (...a: unknown[]) => Promise<unknown>);\n\n // Race against timeout so a never-resolving promise can't pin the\n // long-poll loop. Honour ctx.signal so an agent that drops the\n // request gets the snippet cancelled (best-effort — JS can't\n // actually preempt running code; this just unblocks the dispatch).\n let timer: ReturnType<typeof setTimeout> | null = null;\n let abortReject: ((e: Error) => void) | null = null;\n const onAbort = () => abortReject?.(new Error('exec cancelled'));\n ctx.signal?.addEventListener?.('abort', onAbort);\n\n try {\n value = await Promise.race([\n fn(...localValues),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`exec exceeded ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n new Promise<never>((_, reject) => { abortReject = reject; }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n ctx.signal?.removeEventListener?.('abort', onAbort);\n }\n } catch (err) {\n threw = err;\n } finally {\n // Always restore console — this MUST run before we throw or return,\n // otherwise the wrapper leaks into ambient page console calls.\n if (typeof console !== 'undefined') {\n for (const m of consoleMethods) {\n if (originals[m]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (console as any)[m] = originals[m];\n }\n }\n }\n }\n\n if (threw !== undefined) {\n const e = threw instanceof Error ? threw : new Error(String(threw));\n const stackTruncated =\n typeof e.stack === 'string' ? e.stack.split('\\n').slice(0, 20).join('\\n') : undefined;\n const detail = {\n name: e.name,\n message: e.message,\n stack: stackTruncated,\n logs,\n durationMs: Date.now() - start,\n };\n // Surface the structured detail through registry's String(err)\n // serialization by stringifying it as the message. Agents parsing\n // command-rejected.details get JSON they can inspect.\n const wrapped = new Error(JSON.stringify(detail));\n // Also attach as a property in case future code wants typed access.\n (wrapped as Error & { detail?: unknown }).detail = detail;\n throw wrapped;\n }\n\n return {\n ok: true,\n value: execSafeClone(value),\n logs,\n durationMs: Date.now() - start,\n };\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n if (!Number.isFinite(n)) return lo;\n return Math.min(Math.max(n, lo), hi);\n}\n\n/** JSON-safe clone for exec results & log args. Distinct from the\n * module-level `safeStringify` because exec returns objects (not\n * strings) for the wire layer to serialize. */\nfunction execSafeClone(v: unknown): unknown {\n try {\n return JSON.parse(JSON.stringify(v, (_k, val) => {\n if (typeof val === 'function') {\n return `[Function: ${(val as { name?: string }).name || 'anonymous'}]`;\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n if (typeof val === 'bigint') return val.toString() + 'n';\n if (typeof val === 'undefined') return null; // JSON.stringify drops these otherwise\n // Element / Node detection without instanceof to avoid SSR breakage.\n if (val && typeof val === 'object' && (val as { nodeType?: number }).nodeType === 1) {\n const el = val as { tagName?: string; id?: string };\n return `[${el.tagName ?? 'Element'}${el.id ? '#' + el.id : ''}]`;\n }\n return val;\n }));\n } catch {\n return { __unserializable: typeof v };\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, ExecOptions } from './commands/builtins.js';\nexport { getBOT } 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/consent-ui.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 /** HTTP status text (e.g., \"OK\", \"Not Found\"). Lets the admin show \"200 OK\". */\n statusText?: string;\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 /** Stack trace for the failing call. Captured at the failure site so\n * operators can locate the originating code path. For fetch this is\n * `err.stack` from the rejected promise; for XHR (which doesn't carry\n * an Error object on `error`/`timeout`/`abort`) we synthesise a stack\n * from the call site of `xhr.send()`. */\n errorStack?: string;\n /** Flattened cause chain (`err.cause.cause...`) — undici-style fetch\n * failures frequently wrap the useful reason here (e.g. `ECONNREFUSED`\n * inside a generic `TypeError: fetch failed`). One line per cause. */\n errorCause?: 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 * If true, the SDK shows an in-app consent modal on first load and\n * persists the user's choice in `localStorage` (key\n * `__botim_debug_consent_<mpId>`). On subsequent loads the cached\n * decision is honored without re-prompting. The modal sets\n * `userOptIn: true` if the user accepts, or short-circuits attach if\n * they decline. Mutually orthogonal to `hostToken`/`userOptIn`: those\n * still take effect if explicitly set.\n *\n * No-op when `document` / `window` are unavailable (non-DOM runtimes).\n */\n promptUser?: boolean;\n /**\n * Optional copy override for the consent modal. Keys map to the\n * default English strings; provide any subset to localize.\n */\n promptCopy?: ConsentPromptCopy;\n}\n\nexport interface ConsentPromptCopy {\n /** Short headline. Default: \"Enable BOTIM debug logging?\" */\n title?: string;\n /**\n * Body paragraphs (rendered as separate <p> elements). Default\n * explains what data is collected and that the user can revoke.\n */\n body?: string[];\n /** Default: \"Allow\" */\n acceptLabel?: string;\n /** Default: \"Skip\" */\n declineLabel?: string;\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","/**\n * In-app consent modal for the debug SDK.\n *\n * Shown on first load when the host opts in via `consent.promptUser:\n * true`. Persists the user's choice in `localStorage` so subsequent\n * loads attach silently (or stay disabled, if declined).\n *\n * Why hand-rolled DOM/CSS instead of pulling in a UI library:\n * • The SDK ships into BOTIM mini-programs whose own bundles already\n * include framework code — adding React/Vue/Lit just for this one\n * dialog would inflate the SDK by an order of magnitude.\n * • The modal must work on any host (Angular, vanilla, Web\n * Components, future frameworks). Plain DOM is the universal\n * baseline.\n * • Style isolation via inline styles + a unique class prefix\n * (`__botim-debug-consent-`) avoids collisions with whatever\n * stylesheet the host has loaded. We deliberately avoid the\n * simpler `style=\"\"` attribute on every element — bundles using\n * CSP `style-src` directives without `'unsafe-inline'` would\n * reject those, breaking the very debug flow we're trying to\n * enable. Instead we inject one <style> with `!important` rules\n * into <head>, which CSP `style-src 'self'` allows.\n *\n * Trust model: this UI is for user-facing transparency, NOT a\n * cryptographic gate. A motivated attacker who controls the page can\n * trivially write to `localStorage` and fake `granted`. The actual\n * defence against unauthorized debug attach is \"the SDK isn't shipped\n * in production builds.\" Treat the consent record like a \"remember\n * me\" cookie, not a session token.\n */\n\nimport type { ConsentPromptCopy } from './types.js';\n\nconst STORAGE_PREFIX = '__botim_debug_consent_';\nconst CSS_PREFIX = '__botim-debug-consent';\n\n// Style sheet ID used for de-dup — multiple SDK instances on the same\n// page (e.g., HMR during dev) must not pile up <style> tags.\nconst STYLE_ELEMENT_ID = `${CSS_PREFIX}-styles`;\n\nconst DEFAULT_COPY: Required<ConsentPromptCopy> = {\n title: 'Enable BOTIM debug logging?',\n body: [\n 'This shares your screen content, console logs, and network calls ' +\n 'with the BOTIM team to help debug this mini-program.',\n 'No data leaves your device unless you agree. You can revoke this ' +\n 'anytime by clearing site data or via developer tools.',\n ],\n acceptLabel: 'Allow',\n declineLabel: 'Skip',\n};\n\nexport type ConsentDecision = 'granted' | 'denied';\n\n/**\n * Read the cached consent decision for this mp_id. Returns `null` when\n * no decision has been recorded — the caller should prompt.\n *\n * `localStorage.getItem` can throw in some sandboxed contexts (Safari\n * Private Mode historically; some embedded WebViews). Failures are\n * coerced to `null` so the prompt re-shows rather than crashing the\n * SDK on storage hiccups.\n */\nexport function readConsentDecision(mpId: string): ConsentDecision | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + mpId);\n if (raw === 'granted' || raw === 'denied') return raw;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Persist a decision. Failures are swallowed for the same reason as\n * `readConsentDecision` — on storage-hostile platforms the SDK should\n * still function for the current session, even if the prompt re-shows\n * next time.\n */\nexport function writeConsentDecision(\n mpId: string,\n decision: ConsentDecision,\n): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_PREFIX + mpId, decision);\n } catch {\n /* swallow — caller already has the in-memory decision */\n }\n}\n\n/**\n * Clear the cached decision for an mp_id. Exposed so a host can wire\n * a \"Revoke debug consent\" button into its own settings UI.\n */\nexport function clearConsentDecision(mpId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(STORAGE_PREFIX + mpId);\n } catch {\n /* swallow */\n }\n}\n\n/**\n * Show the consent modal and resolve with the user's choice. Persists\n * the decision before resolving. Idempotent: calling twice in parallel\n * (e.g. two SDK instances) returns the same in-flight promise instead\n * of stacking modals.\n *\n * Returns `'granted'` or `'denied'`. Does NOT throw.\n */\nlet inflightPrompt: Promise<ConsentDecision> | null = null;\n\nexport async function promptForConsent(\n mpId: string,\n copy: ConsentPromptCopy = {},\n): Promise<ConsentDecision> {\n // Reuse an in-flight prompt rather than stacking duplicate modals.\n if (inflightPrompt) return inflightPrompt;\n\n // No DOM → can't prompt. Default to denied so the SDK stays silent\n // rather than attaching without consent in a non-DOM runtime.\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return 'denied';\n }\n\n const merged: Required<ConsentPromptCopy> = {\n title: copy.title ?? DEFAULT_COPY.title,\n body: copy.body ?? DEFAULT_COPY.body,\n acceptLabel: copy.acceptLabel ?? DEFAULT_COPY.acceptLabel,\n declineLabel: copy.declineLabel ?? DEFAULT_COPY.declineLabel,\n };\n\n inflightPrompt = new Promise<ConsentDecision>((resolve) => {\n injectStylesheet();\n const overlay = buildOverlay(merged, (decision) => {\n writeConsentDecision(mpId, decision);\n // Animate-out is overkill for a debug UI — just remove.\n try { overlay.remove(); } catch { /* already gone */ }\n inflightPrompt = null;\n resolve(decision);\n });\n document.body.appendChild(overlay);\n });\n\n return inflightPrompt;\n}\n\n// ─── Internals ───────────────────────────────────────────────────────────────\n\nfunction injectStylesheet(): void {\n if (document.getElementById(STYLE_ELEMENT_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ELEMENT_ID;\n // Every property has !important so the host's CSS reset can't crater\n // legibility (mini-programs frequently include `* { margin: 0 }` etc).\n // We use a single class prefix for everything so CSP `style-src 'self'`\n // accepts it without needing `'unsafe-inline'`.\n style.textContent = `\n .${CSS_PREFIX}-overlay {\n position: fixed !important;\n inset: 0 !important;\n z-index: 2147483647 !important;\n display: flex !important;\n align-items: flex-end !important;\n justify-content: center !important;\n background: rgba(0, 0, 0, 0.45) !important;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n Roboto, \"Helvetica Neue\", sans-serif !important;\n animation: ${CSS_PREFIX}-fade-in 160ms ease-out !important;\n box-sizing: border-box !important;\n padding: 16px !important;\n }\n @media (min-width: 480px) {\n .${CSS_PREFIX}-overlay {\n align-items: center !important;\n }\n }\n @keyframes ${CSS_PREFIX}-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n .${CSS_PREFIX}-card {\n background: #ffffff !important;\n color: #0e1116 !important;\n border-radius: 16px !important;\n max-width: 420px !important;\n width: 100% !important;\n padding: 20px 20px 16px !important;\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.18) !important;\n box-sizing: border-box !important;\n }\n .${CSS_PREFIX}-title {\n font-size: 17px !important;\n font-weight: 600 !important;\n margin: 0 0 12px !important;\n line-height: 1.3 !important;\n }\n .${CSS_PREFIX}-body {\n font-size: 14px !important;\n line-height: 1.5 !important;\n color: #4a5160 !important;\n margin: 0 0 8px !important;\n }\n .${CSS_PREFIX}-actions {\n display: flex !important;\n justify-content: flex-end !important;\n gap: 8px !important;\n margin-top: 16px !important;\n }\n .${CSS_PREFIX}-btn {\n font-family: inherit !important;\n font-size: 14px !important;\n font-weight: 500 !important;\n padding: 9px 16px !important;\n border-radius: 10px !important;\n border: none !important;\n cursor: pointer !important;\n line-height: 1 !important;\n min-height: 36px !important;\n box-sizing: border-box !important;\n }\n .${CSS_PREFIX}-btn-decline {\n background: transparent !important;\n color: #4a5160 !important;\n }\n .${CSS_PREFIX}-btn-decline:hover {\n background: #f3f4f6 !important;\n }\n .${CSS_PREFIX}-btn-accept {\n background: #0066ff !important;\n color: #ffffff !important;\n }\n .${CSS_PREFIX}-btn-accept:hover {\n background: #0055d4 !important;\n }\n @media (prefers-color-scheme: dark) {\n .${CSS_PREFIX}-card {\n background: #1c1f24 !important;\n color: #e8eaed !important;\n }\n .${CSS_PREFIX}-body {\n color: #b9bec7 !important;\n }\n .${CSS_PREFIX}-btn-decline {\n color: #b9bec7 !important;\n }\n .${CSS_PREFIX}-btn-decline:hover {\n background: #2a2e35 !important;\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction buildOverlay(\n copy: Required<ConsentPromptCopy>,\n onDecision: (decision: ConsentDecision) => void,\n): HTMLElement {\n const overlay = document.createElement('div');\n overlay.className = `${CSS_PREFIX}-overlay`;\n // role=dialog + aria-modal for screen readers; dismissing via overlay\n // click is intentionally NOT supported — the user must make an\n // explicit choice (otherwise we'd record an implicit \"denied\" without\n // them realizing).\n overlay.setAttribute('role', 'dialog');\n overlay.setAttribute('aria-modal', 'true');\n overlay.setAttribute('aria-labelledby', `${CSS_PREFIX}-title`);\n\n const card = document.createElement('div');\n card.className = `${CSS_PREFIX}-card`;\n\n const title = document.createElement('h2');\n title.id = `${CSS_PREFIX}-title`;\n title.className = `${CSS_PREFIX}-title`;\n title.textContent = copy.title;\n card.appendChild(title);\n\n for (const para of copy.body) {\n const p = document.createElement('p');\n p.className = `${CSS_PREFIX}-body`;\n p.textContent = para;\n card.appendChild(p);\n }\n\n const actions = document.createElement('div');\n actions.className = `${CSS_PREFIX}-actions`;\n\n const declineBtn = document.createElement('button');\n declineBtn.type = 'button';\n declineBtn.className = `${CSS_PREFIX}-btn ${CSS_PREFIX}-btn-decline`;\n declineBtn.textContent = copy.declineLabel;\n declineBtn.addEventListener('click', () => onDecision('denied'));\n\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = `${CSS_PREFIX}-btn ${CSS_PREFIX}-btn-accept`;\n acceptBtn.textContent = copy.acceptLabel;\n acceptBtn.addEventListener('click', () => onDecision('granted'));\n\n actions.appendChild(declineBtn);\n actions.appendChild(acceptBtn);\n card.appendChild(actions);\n overlay.appendChild(card);\n\n // Auto-focus the accept button so keyboard users (Enter / Space) can\n // confirm without tab. Decline still requires deliberate action.\n // requestAnimationFrame ensures the element is in the DOM before\n // focus() — calling pre-attach silently no-ops in some browsers.\n requestAnimationFrame(() => {\n try { acceptBtn.focus(); } catch { /* noop */ }\n });\n\n return overlay;\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 ?? loadOrCreateDeviceId(),\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\n/**\n * Persistent device-identity key. The relay anchors sessions to\n * `(mp_id, deviceId)` — without persistence, every page reload generates a\n * fresh UUID and the relay sees a brand-new device, which then spawns a\n * brand-new `sid`. Net effect: the admin Sessions tab fills with one row\n * per page-load instead of one row per real device.\n *\n * Scoping: per-origin. A user with the mp open on multiple devices /\n * profiles correctly gets distinct deviceIds. localStorage is the right\n * store here (sessionStorage clears on tab close; cookies need a domain).\n */\nconst DEVICE_ID_STORAGE_KEY = 'botim-debug-sdk:device-id';\n\nfunction loadOrCreateDeviceId(): string {\n // Try persisted value first. Catches cover (a) localStorage missing\n // entirely (SSR / native bridges / Workers), (b) the user's\n // localStorage being full or quota-blocked, (c) a malformed prior write.\n try {\n const ls = typeof localStorage !== 'undefined' ? localStorage : null;\n if (ls) {\n const stored = ls.getItem(DEVICE_ID_STORAGE_KEY);\n if (stored && stored.length > 0) return stored;\n const fresh = generateDeviceId();\n ls.setItem(DEVICE_ID_STORAGE_KEY, fresh);\n return fresh;\n }\n } catch {\n /* fall through to ephemeral generation */\n }\n // No persistent store available — caller will get a fresh id every\n // boot, but at least the call doesn't throw. Hosts that NEED stable\n // device identity in those environments should pass deviceId via the\n // override.\n return generateDeviceId();\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 // statusText carries the human label (\"OK\", \"Not Found\"). Pre-HTTP/2\n // responses always have it; HTTP/2+ defines it as empty by spec but\n // most browsers synthesize one from the code, so this is reliable\n // enough to display alongside the status code.\n statusText: res.statusText || undefined,\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 // Stack from the rejected promise — points into fetch internals\n // and (when present) the call site that issued the request.\n errorStack: err instanceof Error ? err.stack : undefined,\n // undici frequently wraps the real reason in `cause` (e.g.\n // `TypeError: fetch failed` outside, `Error: ECONNREFUSED` inside).\n // Flatten the chain so operators don't have to dig.\n errorCause: collectCauseChain(err),\n });\n throw err;\n }\n };\n\n return () => {\n target.fetch = original;\n };\n}\n\n/** Walk the `err.cause.cause...` chain and emit one summary line per\n * link. Returns undefined if there's no chain. Bounded depth so a\n * pathologically self-referencing cause graph can't loop. */\nfunction collectCauseChain(err: unknown): string | undefined {\n if (!err || typeof err !== 'object') return undefined;\n const lines: string[] = [];\n let cur: unknown = (err as { cause?: unknown }).cause;\n const seen = new Set<unknown>();\n while (cur && lines.length < 5) {\n if (seen.has(cur)) break;\n seen.add(cur);\n if (cur instanceof Error) {\n lines.push(`${cur.name}: ${cur.message}`);\n cur = (cur as { cause?: unknown }).cause;\n } else {\n lines.push(String(cur));\n cur = (cur as { cause?: unknown })?.cause;\n }\n }\n return lines.length ? lines.join('\\n') : undefined;\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 // XHR's `error`/`timeout`/`abort` events fire WITHOUT an Error object,\n // so by the time `onError` runs there's no stack to capture. Snapshot\n // a synthetic stack here at the call site of `xhr.send()` — it's the\n // last frame we control and the most useful one for triage.\n const sendSiteStack = captureCallSiteStack();\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 // XHR exposes statusText directly; same display purpose as fetch.\n statusText: this.statusText || undefined,\n durationMs: Date.now() - s.start,\n resHeaders: headers,\n resBody,\n });\n };\n const onError = (kind: 'error' | 'timeout' | 'abort') => () => {\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 // Distinguish error/timeout/abort in the message — the standard\n // XHR `statusText` is empty for `error` and unhelpful for the\n // others, so we synthesise a clear label.\n errorMessage: this.statusText || `xhr ${kind}`,\n errorName: `XHR${kind[0].toUpperCase()}${kind.slice(1)}`,\n errorStack: sendSiteStack,\n });\n };\n\n this.addEventListener('load', onLoad);\n this.addEventListener('error', onError('error'));\n this.addEventListener('timeout', onError('timeout'));\n this.addEventListener('abort', onError('abort'));\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\n/** Synthesise a stack at the call site by throwing-and-catching an Error.\n * We strip the top frame (this helper itself) so the first visible frame\n * is the caller — typically the patched `xhr.send` wrapper, with the\n * user's code right beneath it. */\nfunction captureCallSiteStack(): string | undefined {\n try {\n throw new Error('xhr-callsite');\n } catch (err) {\n if (!(err instanceof Error) || !err.stack) return undefined;\n const lines = err.stack.split('\\n');\n // Drop the message line and the first frame (this helper). What\n // remains begins with the caller of captureCallSiteStack().\n return lines.slice(2).join('\\n') || undefined;\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// Maximum bytes of source code accepted by `exec`. Big enough for ~150\n// lines of typical debug code; small enough that no agent can ship a\n// 10 MB minified attack payload through the long-poll channel. Above\n// this we reject before instantiating AsyncFunction.\nconst MAX_EXEC_CODE_BYTES = 8 * 1024;\nconst DEFAULT_EXEC_TIMEOUT_MS = 5_000;\nconst MIN_EXEC_TIMEOUT_MS = 250;\nconst MAX_EXEC_TIMEOUT_MS = 30_000;\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 * Default-enabled remote-eval command (`exec`). Pass `false` to opt out\n * of registration entirely; pass an object to inject extra locals into\n * every snippet's scope.\n *\n * builtins: { exec: false }\n * → exec NOT registered; agents calling exec see `unknown-command`.\n *\n * builtins: { exec: { globals: { app, store } } }\n * → exec registered; snippets can reference `app` and `store` as\n * bare identifiers. Default locals (`BOT`, `window`, `document`)\n * are always present.\n *\n * builtins.exec is undefined / not set\n * → default behaviour: exec registered with default locals only.\n *\n * See `openspec/changes/add-default-exec-builtin/design.md` for the\n * security rationale (no prod-specific gating in MVP; relies on the\n * existing `enableRemoteDebug` consent gate).\n */\n exec?: false | ExecOptions;\n}\n\nexport interface ExecOptions {\n /**\n * Additional locals bound into every snippet's scope. Keys MUST be\n * valid identifier names (the SDK does not validate this — passing a\n * key like \"1foo\" or \"a-b\" will throw at AsyncFunction construction\n * time and surface as a `command-rejected`).\n */\n globals?: Record<string, unknown>;\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 // `exec` is on by default — pass `builtins: { exec: false }` to skip.\n if (hooks.exec !== false) {\n registry.register('exec', makeExec(hooks.exec ?? {}));\n }\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\n// ─────────────────────────────────────────────────────────────────────────────\n// `exec` — remote-eval a JS snippet with console capture, top-level await,\n// timeout, and best-effort BOT injection.\n//\n// Threat model & defenses (MVP):\n// - Code-size cap (8 KB) and timeout cap (30 s) bound worst-case load.\n// - Pre-buffer redaction in src/index.ts still applies to result.value\n// and result.logs before they leave the device buffer.\n// - The existing consent gate gates whether attach happens at all in\n// prod; we layer no exec-specific gate here. See\n// openspec/changes/add-default-exec-builtin/design.md §2.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Best-effort `BOT` resolver. Tries (in order):\n * 1. `window.BOT` — set by the lite framework or by hosts that\n * explicitly publish the Angular service onto the global.\n * 2. `angular.element(document).injector().get('BOT')` — the standard\n * mp-framework full-build form.\n * 3. `null` — non-MP environments. Snippets see `BOT === null` and can\n * still introspect `window` / `document`.\n *\n * Cached after the first non-null resolution so we pay the DI lookup at\n * most once per session. Wrapped in try/catch on every step — Angular\n * internals are not part of our API surface.\n */\nlet cachedBOT: unknown = undefined; // sentinel: undefined = not yet resolved\nexport function getBOT(): unknown {\n if (cachedBOT !== undefined) return cachedBOT;\n if (typeof window === 'undefined') {\n cachedBOT = null;\n return null;\n }\n try {\n const w = window as unknown as { BOT?: unknown };\n if (w.BOT) {\n cachedBOT = w.BOT;\n return cachedBOT;\n }\n } catch { /* noop */ }\n try {\n const w = window as unknown as {\n angular?: { element?: (el: unknown) => { injector?: () => { get?: (name: string) => unknown } | undefined } };\n };\n const ng = w.angular;\n if (ng?.element && typeof document !== 'undefined') {\n const injector = ng.element(document).injector?.();\n const bot = injector?.get?.('BOT');\n if (bot != null) {\n cachedBOT = bot;\n return cachedBOT;\n }\n }\n } catch { /* noop */ }\n // Don't cache a null result — framework boot may finish later in the\n // session and a subsequent exec call should pick it up.\n return null;\n}\n\n/** Test-only hook: clear the BOT cache so unit tests can exercise both\n * resolved and unresolved paths without a fresh module load. */\nexport function __resetBOTCache(): void {\n cachedBOT = undefined;\n}\n\ninterface ExecLogEntry {\n method: 'log' | 'info' | 'warn' | 'error' | 'debug';\n args: unknown[];\n ts: number;\n}\n\nfunction makeExec(opts: ExecOptions): CommandHandler {\n const extraGlobalNames = Object.keys(opts.globals ?? {});\n const extraGlobalValues = extraGlobalNames.map((k) => (opts.globals as Record<string, unknown>)[k]);\n\n return async (args, ctx) => {\n if (typeof args.code !== 'string' || args.code.length === 0) {\n throw new Error('args.code (non-empty string) is required');\n }\n if (args.code.length > MAX_EXEC_CODE_BYTES) {\n throw new Error(`args.code ${args.code.length} bytes exceeds limit ${MAX_EXEC_CODE_BYTES}`);\n }\n const timeoutMs = clamp(\n typeof args.timeoutMs === 'number' ? args.timeoutMs : DEFAULT_EXEC_TIMEOUT_MS,\n MIN_EXEC_TIMEOUT_MS,\n MAX_EXEC_TIMEOUT_MS,\n );\n\n const start = Date.now();\n const logs: ExecLogEntry[] = [];\n\n // ── Console capture: replace methods, push to per-call buffer, ALSO\n // call the original so the SDK's console interceptor still sees it.\n // We store the raw method reference (no `.bind`) so the restore step\n // in `finally` puts back the *exact same function value* the slot\n // held before — important for `===`-comparison restoration tests and\n // for any other code that captured `console.log` before us.\n const consoleMethods = ['log', 'info', 'warn', 'error', 'debug'] as const;\n type ConsoleMethod = (typeof consoleMethods)[number];\n const originals: Partial<Record<ConsoleMethod, (...a: unknown[]) => void>> = {};\n if (typeof console !== 'undefined') {\n for (const m of consoleMethods) {\n const orig = console[m];\n if (typeof orig !== 'function') continue;\n originals[m] = orig;\n const captured = (...callArgs: unknown[]) => {\n logs.push({ method: m, args: callArgs.map(execSafeClone), ts: Date.now() });\n try { orig.call(console, ...callArgs); } catch { /* keep going */ }\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (console as any)[m] = captured;\n }\n }\n\n let value: unknown;\n let threw: unknown = undefined;\n try {\n // Build an AsyncFunction so top-level `await` works. Try the\n // expression form first — `console.log(\"hi\")` is an expression that\n // returns undefined; `1 + 1` is an expression that returns 2; both\n // produce sensible `value` outputs. If parsing as an expression\n // raises SyntaxError (statements like `const x = 1; return x;`),\n // fall through to the statement form.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const AsyncFunction = (Object.getPrototypeOf(async function () { /* */ }) as { constructor: any }).constructor;\n const localNames: string[] = ['BOT', 'window', 'document', ...extraGlobalNames];\n const localValues: unknown[] = [\n getBOT(),\n typeof window !== 'undefined' ? window : undefined,\n typeof document !== 'undefined' ? document : undefined,\n ...extraGlobalValues,\n ];\n\n let fnTry: ((...a: unknown[]) => Promise<unknown>) | null = null;\n try {\n fnTry = new AsyncFunction(...localNames, `return (${args.code});`);\n } catch (e) {\n if (!(e instanceof SyntaxError)) throw e;\n // Fall through to statement form.\n }\n const fn: (...a: unknown[]) => Promise<unknown> =\n fnTry ?? (new AsyncFunction(...localNames, args.code) as (...a: unknown[]) => Promise<unknown>);\n\n // Race against timeout so a never-resolving promise can't pin the\n // long-poll loop. Honour ctx.signal so an agent that drops the\n // request gets the snippet cancelled (best-effort — JS can't\n // actually preempt running code; this just unblocks the dispatch).\n let timer: ReturnType<typeof setTimeout> | null = null;\n let abortReject: ((e: Error) => void) | null = null;\n const onAbort = () => abortReject?.(new Error('exec cancelled'));\n ctx.signal?.addEventListener?.('abort', onAbort);\n\n try {\n value = await Promise.race([\n fn(...localValues),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`exec exceeded ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n new Promise<never>((_, reject) => { abortReject = reject; }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n ctx.signal?.removeEventListener?.('abort', onAbort);\n }\n } catch (err) {\n threw = err;\n } finally {\n // Always restore console — this MUST run before we throw or return,\n // otherwise the wrapper leaks into ambient page console calls.\n if (typeof console !== 'undefined') {\n for (const m of consoleMethods) {\n if (originals[m]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (console as any)[m] = originals[m];\n }\n }\n }\n }\n\n if (threw !== undefined) {\n const e = threw instanceof Error ? threw : new Error(String(threw));\n const stackTruncated =\n typeof e.stack === 'string' ? e.stack.split('\\n').slice(0, 20).join('\\n') : undefined;\n const detail = {\n name: e.name,\n message: e.message,\n stack: stackTruncated,\n logs,\n durationMs: Date.now() - start,\n };\n // Surface the structured detail through registry's String(err)\n // serialization by stringifying it as the message. Agents parsing\n // command-rejected.details get JSON they can inspect.\n const wrapped = new Error(JSON.stringify(detail));\n // Also attach as a property in case future code wants typed access.\n (wrapped as Error & { detail?: unknown }).detail = detail;\n throw wrapped;\n }\n\n return {\n ok: true,\n value: execSafeClone(value),\n logs,\n durationMs: Date.now() - start,\n };\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n if (!Number.isFinite(n)) return lo;\n return Math.min(Math.max(n, lo), hi);\n}\n\n/** JSON-safe clone for exec results & log args. Distinct from the\n * module-level `safeStringify` because exec returns objects (not\n * strings) for the wire layer to serialize. */\nfunction execSafeClone(v: unknown): unknown {\n try {\n return JSON.parse(JSON.stringify(v, (_k, val) => {\n if (typeof val === 'function') {\n return `[Function: ${(val as { name?: string }).name || 'anonymous'}]`;\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n if (typeof val === 'bigint') return val.toString() + 'n';\n if (typeof val === 'undefined') return null; // JSON.stringify drops these otherwise\n // Element / Node detection without instanceof to avoid SSR breakage.\n if (val && typeof val === 'object' && (val as { nodeType?: number }).nodeType === 1) {\n const el = val as { tagName?: string; id?: string };\n return `[${el.tagName ?? 'Element'}${el.id ? '#' + el.id : ''}]`;\n }\n return val;\n }));\n } catch {\n return { __unserializable: typeof v };\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';\nexport {\n promptForConsent,\n readConsentDecision,\n writeConsentDecision,\n clearConsentDecision,\n type ConsentDecision,\n} from './consent-ui.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';\nimport { promptForConsent, readConsentDecision } from './consent-ui.js';\n\nexport type { CommandHandler } from './types.js';\nexport type { BuiltinHostHooks, ExecOptions } from './commands/builtins.js';\nexport { getBOT } 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\n // Interactive consent prompt. Runs BEFORE assertConsent so the\n // user's tap can populate userOptIn for the gate that follows.\n // Honors a cached decision from a previous load (no re-prompting on\n // every page navigation). If the user declined, return the no-op\n // handle — same shape as `enabled: false`, no I/O, no interceptors.\n if (options.consent?.promptUser) {\n const cached = readConsentDecision(options.config.miniProgramId);\n let decision = cached;\n if (decision === null) {\n decision = await promptForConsent(\n options.config.miniProgramId,\n options.consent.promptCopy,\n );\n }\n if (decision === 'denied') return NOOP_HANDLE;\n // Mutate a shallow copy rather than the caller's options object —\n // hosts may reuse the same options for multiple SDK instances.\n options = {\n ...options,\n consent: { ...options.consent, userOptIn: true },\n };\n }\n\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"]}
|