{"version":3,"sources":["../../src/errors/index.ts","../../src/client/sse.ts","../../src/client/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Typed error hierarchy for `@deepidv/chain`.\n *\n * `DeepidvApiError` is the parent class — every error thrown from\n * the client extends it, and consumers can `catch (err instanceof\n * DeepidvApiError)` once for the whole surface. Specific subclasses\n * exist so common failure modes (auth, not-found, rate-limit) can\n * be branched on without inspecting `status`.\n *\n * Design notes:\n *   - Stack traces include the full prototype chain so `instanceof`\n *     works across the dual ESM/CJS build boundaries.\n *   - `cause` is propagated via the standard ES2022 `cause` option\n *     so wrappers can retain the underlying network error.\n *   - Error messages NEVER include claim bodies, salts, or\n *     authentication headers. Privacy is enforced at construction\n *     time, not at logging time.\n */\n\nexport interface DeepidvApiErrorContext {\n  /** Bundle-relative URL path, e.g. `/v1/registry`. Never query string. */\n  path?: string;\n  /** HTTP status when applicable. */\n  status?: number;\n  /** Request id from the `X-Request-Id` response header, if present. */\n  requestId?: string;\n  /** Underlying network or parse error. */\n  cause?: unknown;\n}\n\nexport class DeepidvApiError extends Error {\n  public readonly path?: string;\n  public readonly status?: number;\n  public readonly requestId?: string;\n  public override readonly cause?: unknown;\n\n  constructor(message: string, ctx: DeepidvApiErrorContext = {}) {\n    super(message, ctx.cause === undefined ? undefined : { cause: ctx.cause });\n    this.name = \"DeepidvApiError\";\n    if (ctx.path !== undefined) this.path = ctx.path;\n    if (ctx.status !== undefined) this.status = ctx.status;\n    if (ctx.requestId !== undefined) this.requestId = ctx.requestId;\n    if (ctx.cause !== undefined) this.cause = ctx.cause;\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class DeepidvAuthError extends DeepidvApiError {\n  constructor(message = \"unauthorized\", ctx: DeepidvApiErrorContext = {}) {\n    super(message, { ...ctx, status: ctx.status ?? 401 });\n    this.name = \"DeepidvAuthError\";\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class DeepidvNotFoundError extends DeepidvApiError {\n  constructor(message = \"not found\", ctx: DeepidvApiErrorContext = {}) {\n    super(message, { ...ctx, status: ctx.status ?? 404 });\n    this.name = \"DeepidvNotFoundError\";\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class DeepidvRateLimitError extends DeepidvApiError {\n  /** Seconds, parsed from the `Retry-After` header when available. */\n  public readonly retryAfterSeconds?: number;\n  constructor(\n    message = \"rate limited\",\n    ctx: DeepidvApiErrorContext & { retryAfterSeconds?: number } = {},\n  ) {\n    super(message, { ...ctx, status: ctx.status ?? 429 });\n    this.name = \"DeepidvRateLimitError\";\n    if (ctx.retryAfterSeconds !== undefined) {\n      this.retryAfterSeconds = ctx.retryAfterSeconds;\n    }\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class DeepidvServerError extends DeepidvApiError {\n  constructor(message = \"server error\", ctx: DeepidvApiErrorContext = {}) {\n    super(message, { ...ctx, status: ctx.status ?? 500 });\n    this.name = \"DeepidvServerError\";\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class DeepidvNetworkError extends DeepidvApiError {\n  constructor(message: string, ctx: DeepidvApiErrorContext = {}) {\n    super(message, ctx);\n    this.name = \"DeepidvNetworkError\";\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\n/**\n * Map an HTTP status to the most specific error class.\n *\n * Used by `client.ts::request` to construct the right subclass\n * before throwing. Public so consumers can plug in their own retry\n * policy: `if (mapStatusToError(res.status) === DeepidvRateLimitError) ...`\n */\nexport function statusToErrorClass(status: number): typeof DeepidvApiError {\n  if (status === 401 || status === 403) return DeepidvAuthError;\n  if (status === 404) return DeepidvNotFoundError;\n  if (status === 429) return DeepidvRateLimitError;\n  if (status >= 500) return DeepidvServerError;\n  return DeepidvApiError;\n}\n","/**\n * Server-Sent Events stream consumer.\n *\n * The chain registry exposes `/v1/stream` as a long-lived\n * `text/event-stream` connection emitting one JSON-encoded\n * `StreamEvent` per `data:` frame. This module turns that into an\n * `AsyncIterable<StreamEvent>` with built-in reconnection backoff.\n *\n * Why a hand-rolled SSE consumer rather than EventSource?\n *   - Node 20's `EventSource` is still flagged behind `--experimental`\n *     in some patch versions and skips the `Last-Event-ID` semantics\n *     we want for resumption.\n *   - Keeping the SDK runtime-dep-free rules out `eventsource` /\n *     `@microsoft/fetch-event-source`.\n *   - We only need a parser for the `data:` field — no comments, no\n *     custom event types — so the spec subset is small enough to own.\n *\n * Reconnect policy:\n *   - Connection lost → exponential backoff starting at `initialDelayMs`,\n *     doubling up to `maxDelayMs`, with ±20 % jitter.\n *   - The iterator surfaces every event delivered between reconnects\n *     transparently. Consumers see a continuous stream.\n *   - Stop iterating (`break`, `return`, `throw`) cleanly aborts the\n *     underlying fetch.\n */\n\nimport type { StreamEvent } from \"../types/api.js\";\nimport { DeepidvNetworkError } from \"../errors/index.js\";\n\nexport interface SseStreamOptions {\n  url: string;\n  fetch: typeof fetch;\n  /** Caller-provided abort signal. Iteration stops when it fires. */\n  signal?: AbortSignal | undefined;\n  initialDelayMs?: number;\n  maxDelayMs?: number;\n  /** Optional `Last-Event-ID` for resumption after a reconnect. */\n  lastEventId?: string;\n  /** Custom request headers (e.g. `Accept-Language`). Authorization\n   *  is NOT supported on the public stream — the registry is\n   *  unauthenticated. */\n  headers?: Record<string, string>;\n}\n\nconst DEFAULT_INITIAL_DELAY_MS = 500;\nconst DEFAULT_MAX_DELAY_MS = 30_000;\n\n/**\n * Yields `StreamEvent` values from the registry's `/v1/stream`\n * endpoint. Reconnects automatically; surfaces a final\n * `DeepidvNetworkError` only if the caller's `signal` aborts AND\n * a reconnect was already in flight (clean shutdown is silent).\n *\n * Usage:\n *\n *     for await (const ev of streamAttestations({...})) {\n *       if (ev.type === \"attestation.minted\") console.log(ev.payload.id);\n *     }\n */\nexport async function* sseIterator(\n  opts: SseStreamOptions,\n): AsyncIterableIterator<StreamEvent> {\n  const initial = opts.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS;\n  const max = opts.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n  let delay = initial;\n  let lastEventId = opts.lastEventId;\n\n  while (!opts.signal?.aborted) {\n    let response: Response;\n    try {\n      const headers: Record<string, string> = {\n        Accept: \"text/event-stream\",\n        \"Cache-Control\": \"no-cache\",\n        ...opts.headers,\n      };\n      if (lastEventId) headers[\"Last-Event-ID\"] = lastEventId;\n\n      const init: RequestInit = { method: \"GET\", headers };\n      if (opts.signal) init.signal = opts.signal;\n      response = await opts.fetch(opts.url, init);\n    } catch {\n      if (opts.signal?.aborted) return;\n      await sleep(jitter(delay), opts.signal);\n      delay = Math.min(delay * 2, max);\n      continue;\n    }\n\n    if (!response.ok || !response.body) {\n      // 4xx/5xx — back off, retry. We do NOT throw here; the registry\n      // can transiently 503 during deploys and consumers expect the\n      // iterator to ride through it.\n      try {\n        await response.body?.cancel();\n      } catch {\n        // ignore\n      }\n      await sleep(jitter(delay), opts.signal);\n      delay = Math.min(delay * 2, max);\n      continue;\n    }\n\n    // Connected — reset backoff.\n    delay = initial;\n\n    try {\n      for await (const ev of parseEventStream(response.body, opts.signal)) {\n        if (ev.id) lastEventId = ev.id;\n        if (ev.data === undefined || ev.data === \"\") continue;\n        try {\n          const parsed = JSON.parse(ev.data) as StreamEvent;\n          yield parsed;\n        } catch {\n          // Drop malformed frames silently — the registry guarantees\n          // valid JSON per frame; a malformed frame indicates a wire-\n          // level corruption that the next frame will recover from.\n          continue;\n        }\n      }\n    } catch {\n      if (opts.signal?.aborted) return;\n      // Underlying body iteration threw — fall through to reconnect.\n      await sleep(jitter(delay), opts.signal);\n      delay = Math.min(delay * 2, max);\n      continue;\n    }\n\n    // Stream ended cleanly without abort — reconnect after a small\n    // pause. This handles registry edge proxies that recycle long-\n    // lived connections every few minutes.\n    if (!opts.signal?.aborted) {\n      await sleep(jitter(initial), opts.signal);\n    }\n  }\n}\n\ninterface ParsedFrame {\n  id?: string;\n  event?: string;\n  data?: string;\n}\n\nasync function* parseEventStream(\n  body: ReadableStream<Uint8Array>,\n  signal: AbortSignal | undefined,\n): AsyncIterableIterator<ParsedFrame> {\n  const decoder = new TextDecoder(\"utf-8\");\n  const reader = body.getReader();\n  let buffer = \"\";\n\n  try {\n    while (true) {\n      if (signal?.aborted) return;\n      const { value, done } = await reader.read();\n      if (done) break;\n      buffer += decoder.decode(value, { stream: true });\n\n      let sepIdx: number;\n      while ((sepIdx = buffer.search(/\\r?\\n\\r?\\n/)) >= 0) {\n        const frameText = buffer.slice(0, sepIdx);\n        const matched = buffer.slice(sepIdx).match(/^\\r?\\n\\r?\\n/);\n        buffer = buffer.slice(sepIdx + (matched ? matched[0].length : 2));\n        const frame = parseFrame(frameText);\n        if (frame !== null) yield frame;\n      }\n    }\n\n    // Trailing buffer at clean EOF — only emit if it's a full frame.\n    if (buffer.length > 0) {\n      const frame = parseFrame(buffer);\n      if (frame !== null) yield frame;\n    }\n  } finally {\n    try {\n      reader.releaseLock();\n    } catch {\n      // ignore\n    }\n  }\n}\n\nfunction parseFrame(text: string): ParsedFrame | null {\n  const out: ParsedFrame = {};\n  const dataLines: string[] = [];\n  for (const rawLine of text.split(/\\r?\\n/)) {\n    if (rawLine === \"\" || rawLine.startsWith(\":\")) continue;\n    const colonIdx = rawLine.indexOf(\":\");\n    const field = colonIdx === -1 ? rawLine : rawLine.slice(0, colonIdx);\n    let value = colonIdx === -1 ? \"\" : rawLine.slice(colonIdx + 1);\n    if (value.startsWith(\" \")) value = value.slice(1);\n    if (field === \"data\") dataLines.push(value);\n    else if (field === \"id\") out.id = value;\n    else if (field === \"event\") out.event = value;\n    // retry/everything else: ignored — the SDK manages backoff.\n  }\n  if (dataLines.length > 0) out.data = dataLines.join(\"\\n\");\n  if (\n    out.data === undefined &&\n    out.id === undefined &&\n    out.event === undefined\n  ) {\n    return null;\n  }\n  return out;\n}\n\nfunction jitter(ms: number): number {\n  const j = ms * (0.8 + Math.random() * 0.4);\n  return Math.max(50, Math.min(ms * 2, j));\n}\n\nfunction sleep(ms: number, signal: AbortSignal | undefined): Promise<void> {\n  return new Promise<void>((resolve) => {\n    if (signal?.aborted) {\n      resolve();\n      return;\n    }\n    const timer = setTimeout(() => {\n      cleanup();\n      resolve();\n    }, ms);\n    const onAbort = (): void => {\n      clearTimeout(timer);\n      cleanup();\n      resolve();\n    };\n    const cleanup = (): void => {\n      signal?.removeEventListener(\"abort\", onAbort);\n    };\n    signal?.addEventListener(\"abort\", onAbort);\n  });\n}\n\n// Suppress unused export-only type; keeps the public surface tidy.\nexport type { DeepidvNetworkError };\n","/**\n * `@deepidv/chain/client` — typed wrapper around the public registry\n * API at `api.proof.deepidv.com/v1`.\n *\n * The client is a thin GET-only fetcher: every operation is a read.\n * Mint and revoke are tenant-authenticated operations that don't\n * belong on this SDK in v1 — they live behind tenant-API-key auth on\n * a different surface (see runbook §0.E for credential hygiene).\n *\n * Pluggable `fetch` lets consumers wire in:\n *   - `node-fetch` polyfills (Node <20 — discouraged but supported)\n *   - request signing wrappers\n *   - Cloudflare Workers / Bun / Deno's native fetch\n *\n * SSE streaming is exposed as `streamAttestations()`, which returns\n * an `AsyncIterable<StreamEvent>` with built-in reconnect.\n *\n * Bundle download returns an `ArrayBuffer` ready to be unzipped by\n * the verify module.\n */\n\nimport {\n  DeepidvApiError,\n  DeepidvNetworkError,\n  DeepidvRateLimitError,\n  statusToErrorClass,\n} from \"../errors/index.js\";\nimport type {\n  AttestationDetail,\n  ConsistencyProofResponse,\n  IssuerDetail,\n  RegistryListFilters,\n  RegistryPage,\n  SegmentDetail,\n  StreamEvent,\n  SthListResponse,\n} from \"../types/api.js\";\nimport { sseIterator } from \"./sse.js\";\n\nexport type FetchLike = typeof fetch;\n\nexport interface ClientOptions {\n  /**\n   * Base URL of the registry API. Default:\n   * `https://staging-api.proof.deepidv.com`.\n   *\n   * Production hosts the same surface at\n   * `https://api.proof.deepidv.com`. Override at construction time.\n   * No trailing slash; the client adds `/v1/...` paths.\n   */\n  apiUrl?: string;\n  /**\n   * Custom fetch implementation. Defaults to `globalThis.fetch`.\n   * Pass a wrapped fetch to inject headers, telemetry, or retries.\n   */\n  fetch?: FetchLike;\n  /**\n   * Optional default `User-Agent`. The registry doesn't require one\n   * but identifying SDK versions makes operator triage easier.\n   */\n  userAgent?: string;\n  /**\n   * Default per-request timeout in milliseconds. Default `15_000`.\n   * `0` disables. Plumbed via `AbortSignal.timeout(...)`.\n   */\n  timeoutMs?: number;\n}\n\nconst DEFAULT_API_URL = \"https://staging-api.proof.deepidv.com\";\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst SDK_USER_AGENT = \"deepidv-chain-node/1.1.0\";\n\nexport interface RequestOptions {\n  signal?: AbortSignal;\n  /** Per-request override of the client's default timeout. */\n  timeoutMs?: number;\n}\n\nexport class DeepidvChainClient {\n  public readonly apiUrl: string;\n  private readonly fetchImpl: FetchLike;\n  private readonly userAgent: string;\n  private readonly defaultTimeoutMs: number;\n\n  constructor(opts: ClientOptions = {}) {\n    this.apiUrl = (opts.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\");\n    this.fetchImpl =\n      opts.fetch ??\n      (typeof globalThis.fetch === \"function\"\n        ? globalThis.fetch.bind(globalThis)\n        : (() => {\n            throw new DeepidvNetworkError(\n              \"no fetch available — pass a `fetch` option (Node 20+ has it built in)\",\n            );\n          })());\n    this.userAgent = opts.userAgent ?? SDK_USER_AGENT;\n    this.defaultTimeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n  }\n\n  /* ------------------------------------------------------------ *\n   *  Public read methods\n   * ------------------------------------------------------------ */\n\n  async getAttestation(\n    id: string,\n    opts: RequestOptions = {},\n  ): Promise<AttestationDetail> {\n    return this.requestJson<AttestationDetail>(\n      `/v1/attestation/${encodeURIComponent(id)}`,\n      opts,\n    );\n  }\n\n  async listRegistry(\n    filters: RegistryListFilters & { page?: number; cursor?: string } = {},\n    opts: RequestOptions = {},\n  ): Promise<RegistryPage> {\n    const search = new URLSearchParams();\n    if (typeof filters.page === \"number\") {\n      search.set(\"page\", String(filters.page));\n    }\n    if (filters.cursor) search.set(\"cursor\", filters.cursor);\n    if (filters.type) search.set(\"type\", filters.type);\n    if (filters.issuer) search.set(\"issuer\", filters.issuer);\n    if (filters.q) search.set(\"q\", filters.q);\n    const qs = search.toString();\n    return this.requestJson<RegistryPage>(\n      `/v1/registry${qs ? `?${qs}` : \"\"}`,\n      opts,\n    );\n  }\n\n  async getIssuer(\n    id: string,\n    opts: RequestOptions = {},\n  ): Promise<IssuerDetail> {\n    return this.requestJson<IssuerDetail>(\n      `/v1/issuer/${encodeURIComponent(id)}`,\n      opts,\n    );\n  }\n\n  async getSegment(\n    n: number,\n    opts: RequestOptions = {},\n  ): Promise<SegmentDetail> {\n    return this.requestJson<SegmentDetail>(`/v1/segment/${n}`, opts);\n  }\n\n  async listSths(\n    segment: number,\n    opts: RequestOptions = {},\n  ): Promise<SthListResponse> {\n    return this.requestJson<SthListResponse>(\n      `/v1/sth?segment=${segment}`,\n      opts,\n    );\n  }\n\n  async getConsistencyProof(\n    fromTreeSize: number,\n    toTreeSize: number,\n    segment: number,\n    opts: RequestOptions = {},\n  ): Promise<ConsistencyProofResponse> {\n    const search = new URLSearchParams({\n      from: String(fromTreeSize),\n      to: String(toTreeSize),\n      segment: String(segment),\n    });\n    return this.requestJson<ConsistencyProofResponse>(\n      `/v1/consistency?${search.toString()}`,\n      opts,\n    );\n  }\n\n  /**\n   * The transparency log viewer endpoint — returns the latest\n   * checkpoint for every open segment plus the current head's STH.\n   * Shape is the same as `getSegment` for each entry.\n   */\n  async getLog(\n    opts: RequestOptions = {},\n  ): Promise<{ segments: SegmentDetail[] }> {\n    return this.requestJson<{ segments: SegmentDetail[] }>(`/v1/log`, opts);\n  }\n\n  /**\n   * Download a `.dpiv-bundle` zip as raw bytes. The caller unzips\n   * and feeds the result to `verifyBundle()` from\n   * `@deepidv/chain/verify`.\n   */\n  async downloadBundle(\n    id: string,\n    opts: RequestOptions = {},\n  ): Promise<ArrayBuffer> {\n    const path = `/v1/bundle/${encodeURIComponent(id)}`;\n    const res = await this.rawRequest(path, {\n      ...opts,\n      headers: { Accept: \"application/octet-stream\" },\n    });\n    return await res.arrayBuffer();\n  }\n\n  /**\n   * Subscribe to live attestation events.\n   *\n   * Returns an `AsyncIterable<StreamEvent>`. The iterator manages\n   * reconnection internally (exponential backoff, jittered, capped\n   * at 30s). Pass `signal` to stop iterating cleanly.\n   *\n   *     const ctrl = new AbortController();\n   *     for await (const ev of client.streamAttestations({ signal: ctrl.signal })) {\n   *       if (ev.type === \"attestation.minted\") {\n   *         console.log(ev.payload.id);\n   *       }\n   *     }\n   */\n  streamAttestations(\n    opts: { signal?: AbortSignal | undefined } = {},\n  ): AsyncIterable<StreamEvent> {\n    const url = `${this.apiUrl}/v1/stream`;\n    return sseIterator({\n      url,\n      fetch: this.fetchImpl,\n      signal: opts.signal,\n      headers: { \"User-Agent\": this.userAgent },\n    });\n  }\n\n  /* ------------------------------------------------------------ *\n   *  Internal request plumbing\n   * ------------------------------------------------------------ */\n\n  private async requestJson<T>(path: string, opts: RequestOptions): Promise<T> {\n    const res = await this.rawRequest(path, {\n      ...opts,\n      headers: { Accept: \"application/json\" },\n    });\n    try {\n      return (await res.json()) as T;\n    } catch (err) {\n      throw new DeepidvApiError(\"invalid JSON in response\", {\n        path,\n        status: res.status,\n        cause: err,\n      });\n    }\n  }\n\n  private async rawRequest(\n    path: string,\n    opts: RequestOptions & { headers?: Record<string, string> },\n  ): Promise<Response> {\n    const url = `${this.apiUrl}${path}`;\n    const timeoutMs = opts.timeoutMs ?? this.defaultTimeoutMs;\n\n    const headers: Record<string, string> = {\n      \"User-Agent\": this.userAgent,\n      ...(opts.headers ?? {}),\n    };\n\n    const signal = combineSignals(opts.signal, timeoutMs);\n\n    let res: Response;\n    try {\n      const init: RequestInit = { method: \"GET\", headers };\n      if (signal) init.signal = signal;\n      res = await this.fetchImpl(url, init);\n    } catch (err) {\n      throw new DeepidvNetworkError(\n        `network error fetching ${path}: ${describeError(err)}`,\n        { path, cause: err },\n      );\n    }\n\n    if (!res.ok) {\n      const requestId =\n        res.headers.get(\"x-request-id\") ??\n        res.headers.get(\"x-amzn-requestid\") ??\n        undefined;\n      const body = await res.text().catch(() => \"\");\n      const ErrorClass = statusToErrorClass(res.status);\n      const ctx: { path: string; status: number; requestId?: string } = {\n        path,\n        status: res.status,\n      };\n      if (requestId !== undefined) ctx.requestId = requestId;\n      if (ErrorClass === DeepidvRateLimitError) {\n        const retryAfter = res.headers.get(\"retry-after\");\n        const retryAfterSeconds = retryAfter\n          ? Number.parseInt(retryAfter, 10)\n          : undefined;\n        const rlCtx: typeof ctx & { retryAfterSeconds?: number } = ctx;\n        if (\n          retryAfterSeconds !== undefined &&\n          Number.isFinite(retryAfterSeconds)\n        ) {\n          rlCtx.retryAfterSeconds = retryAfterSeconds;\n        }\n        throw new DeepidvRateLimitError(\n          truncateBody(body) || \"rate limited\",\n          rlCtx,\n        );\n      }\n      throw new ErrorClass(truncateBody(body) || `HTTP ${res.status}`, ctx);\n    }\n    return res;\n  }\n}\n\n/**\n * Convenience constructor — many consumers prefer\n * `createClient({...})` over `new DeepidvChainClient({...})`.\n */\nexport function createClient(opts: ClientOptions = {}): DeepidvChainClient {\n  return new DeepidvChainClient(opts);\n}\n\nfunction combineSignals(\n  caller: AbortSignal | undefined,\n  timeoutMs: number,\n): AbortSignal | undefined {\n  if (timeoutMs <= 0) return caller;\n  const timeoutSignal = AbortSignal.timeout(timeoutMs);\n  if (!caller) return timeoutSignal;\n  if (typeof AbortSignal.any === \"function\") {\n    return AbortSignal.any([caller, timeoutSignal]);\n  }\n  // Fallback for runtimes without AbortSignal.any.\n  const ctrl = new AbortController();\n  const onAbort = (sig: AbortSignal): void => {\n    ctrl.abort(sig.reason);\n  };\n  caller.addEventListener(\"abort\", () => onAbort(caller), { once: true });\n  timeoutSignal.addEventListener(\"abort\", () => onAbort(timeoutSignal), {\n    once: true,\n  });\n  return ctrl.signal;\n}\n\nfunction describeError(err: unknown): string {\n  if (err instanceof Error) return err.message;\n  return String(err);\n}\n\nfunction truncateBody(body: string): string {\n  const trimmed = body.trim();\n  if (trimmed.length === 0) return \"\";\n  if (trimmed.length <= 200) return trimmed;\n  return trimmed.slice(0, 200) + \"…\";\n}\n"]}