{"version":3,"sources":["../../../packages/daemon-core/src/config/index.ts","../../../packages/daemon-core/src/logger.ts","../../../packages/daemon-core/src/http/index.ts","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/symbols.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/timers.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/errors.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/constants.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/tree.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/stats.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/diagnostics.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/request.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/wrap-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/dispatcher.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/unwrap-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/dispatcher-base.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/connect.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/llhttp/utils.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/llhttp/constants.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/llhttp/llhttp-wasm.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/constants.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/global.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/encoding/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/infra/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/data-url.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/runtime-features.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/webidl/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/formdata.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/formdata-parser.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/promise.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/body.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/client-h1.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/client-h2.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/client.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/fixed-queue.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/pool-base.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/pool.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/balanced-pool.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/round-robin-pool.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/socks5-utils.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/core/socks5-client.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/proxy-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/retry-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/retry-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/dispatcher/h2c-client.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/readable.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/api-request.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/abort-signal.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/api-stream.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/api-pipeline.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/api-upgrade.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/api-connect.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/api/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-errors.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-symbols.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-utils.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-interceptor.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-client.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-call-history.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-pool.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/pending-interceptors-formatter.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/mock-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/snapshot-utils.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/snapshot-recorder.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/mock/snapshot-agent.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/global.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/decorator-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/redirect-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/redirect.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/response-error.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/retry.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/dump.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/dns.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/cache.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/util/date.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/cache-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/cache/memory-cache-store.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/cache-revalidation-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/cache.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/decompress.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/handler/deduplication-handler.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/interceptor/deduplicate.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/cache/sqlite-cache-store.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/headers.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/response.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/request.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/fetch/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cache/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cache/cache.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cache/cachestorage.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cookies/constants.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cookies/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cookies/parse.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/cookies/index.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/events.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/constants.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/frame.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/connection.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/permessage-deflate.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/receiver.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/sender.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/websocket.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/stream/websocketerror.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/websocket/stream/websocketstream.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/eventsource/util.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/eventsource/eventsource-stream.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/lib/web/eventsource/eventsource.js","../../../node_modules/.pnpm/undici@7.25.0/node_modules/undici/index.js","../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/package.json","../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/lib/main.js","../src/paths.ts","../src/identity.ts","../src/runtime-state.ts","../src/config.ts","../src/machine-key.ts","../src/api.ts","../src/lock.ts","../src/update.ts","../../../packages/daemon-core/src/node/file-queue-store.ts","../../../packages/daemon-core/src/pipeline/cognition.ts","../../../packages/daemon-core/src/pipeline/prompts.ts","../../../packages/daemon-core/src/pipeline/script-summary.ts","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/typeAliases.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js","../../../packages/core/src/session-metadata.ts","../../../packages/core/src/redact-floor.ts","../../../packages/core/src/redact.ts","../../../packages/daemon-core/src/pipeline/title.ts","../../../packages/daemon-core/src/pipeline/session-metadata.ts","../../../packages/daemon-core/src/pipeline/thinking.ts","../../../packages/daemon-core/src/pipeline/passes.ts","../../../packages/daemon-core/src/pipeline/redaction.ts","../../../packages/daemon-core/src/node/llama.ts","../../../packages/daemon-core/src/node/ollama.ts","../../../packages/daemon-core/src/node/openai-compat.ts","../../../packages/daemon-core/src/optional-module.ts","../../../packages/daemon-core/src/node/transformersjs-embed.ts","../../../packages/daemon-core/src/node/index.ts","../src/claude-settings.ts","../../../packages/parsers/src/types.ts","../../../packages/parsers/src/git.ts","../../../packages/parsers/src/git-outcome.ts","../../../packages/parsers/src/git-files.ts","../../../packages/core/src/billing.ts","../../../packages/core/src/enums.ts","../../../packages/core/src/ids.ts","../../../packages/core/src/policies.ts","../../../packages/core/src/schemas.ts","../../../packages/core/src/index.ts","../../../packages/parsers/src/tool-action/executable.ts","../../../packages/parsers/src/tool-action/scripts.ts","../../../packages/parsers/src/tool-action/index.ts","../../../packages/parsers/src/tool-hash/index.ts","../../../packages/parsers/src/claude-code/index.ts","../../../packages/parsers/src/codex/index.ts","../../../node_modules/.pnpm/sql.js@1.14.1/node_modules/sql.js/dist/sql-wasm.js","../../../packages/parsers/src/cursor/index.ts","../../../packages/parsers/src/pi/index.ts","../../../packages/parsers/src/discovery/index.ts","../../../packages/parsers/src/index.ts","../src/insights.ts","../../../packages/daemon-core/src/ids.ts","../../../packages/daemon-core/src/queue/index.ts","../../../packages/daemon-core/src/pipeline/heuristic-summary.ts","../../../packages/daemon-core/src/pipeline/index.ts","../../../packages/daemon-core/src/redact/privacy-filter.ts","../src/enrich-scripts.ts","../src/pipeline.ts","../src/receiver.ts","../../../packages/daemon-core/src/contracts/index.ts","../../../packages/daemon-core/src/index.ts","../src/git-enrich.ts","../src/scan.ts","../src/reconcile.ts","../src/single-flight.ts","../src/processing-version.ts","../../../packages/remote-config/src/loader.ts","../../../packages/remote-config/src/schema.ts","../../../packages/remote-config/src/types.ts","../../../packages/remote-config/src/index.ts","../../../packages/remote-config/src/node.ts","../../../packages/daemon-core/src/policies/index.ts","../../../node_modules/.pnpm/readdirp@4.1.2/node_modules/readdirp/esm/index.js","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/handler.js","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/index.js","../src/daemon.ts","../src/watch.ts","../src/statusline.ts","../src/cli.ts","../src/service.ts","../src/supervise.ts"],"sourcesContent":["/**\n * Defaults and sizing constants shared across daemons.\n *\n * One source of truth so CLI and extension stop drifting. The\n * daemon-unification doc spells out the rationale for each choice.\n */\n\n/** Upload cadence: every 5 s. */\nexport const INGEST_BATCH_INTERVAL_MS = 5_000 as const;\n\n/** Max events per batch. 1000 splits the old CLI (2000) and extension\n * (500) figures — gives both sides an identical rate-limit profile. */\nexport const INGEST_BATCH_MAX_EVENTS = 1_000 as const;\n\n/** Hold back events until the session has been quiet this long. Keeps\n * related turns together, gives the summariser meaningful windows. */\nexport const SESSION_DEBOUNCE_MS = 7_000 as const;\n\n/** Even if the session isn't quiet yet, force a ship if this many\n * unsent events have accumulated on it. */\nexport const FORCE_SHIP_THRESHOLD = 200 as const;\n\n/** Retry backoff schedule for 429/5xx. Capped at 60 s. */\nexport const BACKOFF_MS = [1_000, 2_500, 5_000, 10_000, 20_000, 60_000] as const;\nexport function expBackoff(attempt: number): number {\n  const i = Math.min(Math.max(attempt, 0), BACKOFF_MS.length - 1);\n  // TypeScript can't prove `i` is in range with noUncheckedIndexedAccess;\n  // we clamped above so the non-null assertion is safe.\n  // biome-ignore lint/style/noNonNullAssertion: clamped above\n  return BACKOFF_MS[i]!;\n}\n\n/** How long the CLI waits between filesystem-watcher backstop scans. */\nexport const BACKSTOP_SCAN_MS = 5 * 60_000;\n\n/** Heartbeat intervals differ by runtime (progress granularity differs).\n * Keep them visible in one place so drift is deliberate. */\nexport const HEARTBEAT_INTERVAL_MS_CLI = 10_000 as const;\nexport const HEARTBEAT_INTERVAL_MS_EXTENSION = 60_000 as const;\n","/**\n * Shared logger contract for daemons.\n *\n * Runtime-agnostic interface with a default `consoleLogger` implementation\n * that works in both Node (stdout) and the browser (devtools). Node can\n * swap in pino via `createNodeLogger()` from\n * `@modelstat/daemon-core/node/logger-pino` (declared in the daemon-\n * unification doc; implementation arrives when the CLI is rewired).\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface Logger {\n  debug(msg: string, fields?: Record<string, unknown>): void;\n  info(msg: string, fields?: Record<string, unknown>): void;\n  warn(msg: string, fields?: Record<string, unknown>): void;\n  error(msg: string, fields?: Record<string, unknown> | Error): void;\n  child(scope: string): Logger;\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n  debug: 10,\n  info: 20,\n  warn: 30,\n  error: 40,\n};\n\n/**\n * Resolve the default log level from env. Node reads `LOG_LEVEL`;\n * extensions override via the options page. Falls back to \"info\" in\n * production (NODE_ENV=production) and \"debug\" everywhere else.\n */\nexport function defaultLevel(): LogLevel {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const env = (globalThis as any).process?.env ?? {};\n  const raw = (env.LOG_LEVEL ?? \"\").toLowerCase();\n  if (raw === \"debug\" || raw === \"info\" || raw === \"warn\" || raw === \"error\") return raw;\n  return env.NODE_ENV === \"production\" ? \"info\" : \"debug\";\n}\n\nexport interface ConsoleLoggerOpts {\n  scope?: string;\n  level?: LogLevel;\n}\n\n/**\n * Default logger — emits scoped, level-gated messages via console.* with\n * a `[modelstat:scope]` prefix. Lifted from\n * apps/extension/src/common/logger.ts and generalised; works unchanged\n * in Node.\n */\nexport function consoleLogger(opts: ConsoleLoggerOpts = {}): Logger {\n  const scope = opts.scope ?? \"main\";\n  const level = opts.level ?? defaultLevel();\n  const threshold = LEVEL_RANK[level];\n  const emit = (lvl: LogLevel, msg: string, fields?: unknown): void => {\n    if (LEVEL_RANK[lvl] < threshold) return;\n    const prefix = `[modelstat:${scope}]`;\n    const args = fields !== undefined ? [prefix, msg, fields] : [prefix, msg];\n    const fn: \"log\" | \"warn\" | \"error\" =\n      lvl === \"warn\" ? \"warn\" : lvl === \"error\" ? \"error\" : \"log\";\n    // biome-ignore lint/suspicious/noConsole: intentional\n    console[fn](...args);\n  };\n  return {\n    debug: (msg, fields) => emit(\"debug\", msg, fields),\n    info: (msg, fields) => emit(\"info\", msg, fields),\n    warn: (msg, fields) => emit(\"warn\", msg, fields),\n    error: (msg, fields) => emit(\"error\", msg, fields),\n    child: (childScope: string) =>\n      consoleLogger({ scope: `${scope}:${childScope}`, level }),\n  };\n}\n\n/**\n * Standard factory — daemons should call this rather than constructing\n * loggers directly, so we can swap in a pino-backed impl in Node without\n * touching call sites.\n */\nexport function createLogger(scope: string, opts: { level?: LogLevel } = {}): Logger {\n  return consoleLogger({ scope, ...opts });\n}\n\n/**\n * Unwrap an Error's `cause` chain into a single-line summary. Undici's\n * global fetch throws `TypeError: fetch failed` with the real cause\n * buried in `.cause` (and sometimes `.cause.errors[0]` for\n * AggregateErrors). Without this the daemon just shows \"fetch failed\"\n * to the user, which is useless for diagnosing ECONNREFUSED /\n * ENOTFOUND / cert issues / etc.\n *\n * Output shape: \"OuterMsg → code=CODE msg=InnerMsg [→ …]\"\n * Bounded to a few levels to avoid runaway chains.\n */\nexport function describeErrorWithCause(err: unknown, depth = 4): string {\n  if (!err) return \"unknown\";\n  if (!(err instanceof Error)) return String(err);\n  const parts: string[] = [err.message || err.name];\n  let cur: unknown = (err as { cause?: unknown }).cause;\n  let left = depth;\n  while (cur && left-- > 0) {\n    if (cur instanceof AggregateError && Array.isArray(cur.errors) && cur.errors[0]) {\n      cur = cur.errors[0];\n      continue;\n    }\n    if (cur instanceof Error) {\n      const code = (cur as NodeJS.ErrnoException).code;\n      parts.push(`${code ? `code=${code} ` : \"\"}msg=${cur.message || cur.name}`);\n      cur = (cur as { cause?: unknown }).cause;\n      continue;\n    }\n    parts.push(String(cur));\n    break;\n  }\n  return parts.join(\" → \");\n}\n","/**\n * Shared ingest HTTP client + retry matrix.\n *\n * Replaces:\n *   - CLI's `uploadBatch()` in apps/daemon/src/api.ts (throws on any non-2xx)\n *   - Extension's inline fetch in apps/extension/src/background/ingest-queue.ts\n *\n * Both daemons now call `IngestClient.upload(batch)` with identical\n * retry semantics, identical auth header shape, and an explicit\n * reauth hook that runs when the server rejects the token.\n */\nimport type { IngestBatch } from \"@modelstat/core/schemas\";\nimport { expBackoff } from \"../config/index.js\";\nimport type { Logger } from \"../logger.js\";\nimport { describeErrorWithCause } from \"../logger.js\";\n\nexport type UploadDecision =\n  | { type: \"commit\" }\n  | { type: \"reauth\" }\n  | { type: \"backoff\"; delayMs: number };\n\n/**\n * Classify an HTTP status into the next action to take. Shared across\n * daemons so \"what happens on 401\" is answered in exactly one place.\n */\nexport function classifyStatus(status: number, attempt: number): UploadDecision {\n  if (status >= 200 && status < 300) return { type: \"commit\" };\n  if (status === 401 || status === 403) return { type: \"reauth\" };\n  // EVERYTHING else HOLDS + retries until it succeeds — the daemon never discards a\n  // batch, so an outage or misconfig is a pause, never a gap in the data.\n  //\n  // We used to quarantine \"permanent\" 4xx (400/422) as un-acceptable payloads, but\n  // in practice even those are usually transient or environmental — and the cost of\n  // guessing wrong is unrecoverable data loss:\n  //   · 400 / 403 / 429 can come from a Cloudflare/WAF edge, not our origin.\n  //   · 404 / 405 — the route isn't reachable RIGHT NOW: undeployed, mis-proxied\n  //     (observed live 2026-07-08: a Caddy exact-path matcher 405'd every cloud-mode\n  //     POST /v1/ingest/raw), or renamed mid-rollout.\n  //   · 413 / 415 / 422 usually clear once a server-side clamp/parse fix lands.\n  //   · 408 / 426 / 429 — timeout; version-gate (daemon self-updates via heartbeat);\n  //     rate-limit. 5xx — server down / restarting / bad gateway.\n  // A held batch stalls only its own file's cursor — visible in the logs and it\n  // drains once the server is healthy; a dropped batch is gone for good. So we hold.\n  return { type: \"backoff\", delayMs: expBackoff(attempt) };\n}\n\n/** What a daemon provides so the ingest client can mint + refresh\n * bearer tokens. Token storage details stay in the daemon\n * (Conf file on Node, IndexedDB on browser). */\nexport interface AuthProvider {\n  getToken(): Promise<string | null>;\n  /** Called exactly when the server returns 401/403. The daemon\n   * should attempt a reauth (e.g. self-register + claim rotation) and\n   * return `true` if a fresh token is now available via `getToken()`. */\n  onInvalidToken(): Promise<boolean>;\n}\n\nexport interface IngestResponse {\n  accepted: number;\n  new_sessions: number;\n  updated_sessions: number;\n  batch_id: string;\n  raw_s3_key: string | null;\n}\n\nexport interface IngestClientOpts {\n  apiUrl: string;\n  auth: AuthProvider;\n  logger: Logger;\n  /** Override fetch for tests; defaults to global fetch. */\n  fetchImpl?: typeof fetch;\n  /** Upper bound on retry attempts for one upload call. Default 3. */\n  maxAttempts?: number;\n}\n\n/**\n * JSON.stringify that never emits lone UTF-16 surrogates.\n *\n * Excerpts and abstracts are truncated with `.slice(0, N)` in several\n * places (parsers, pipeline); a slice that lands mid-emoji leaves a\n * lone leading surrogate at the end of the string. JS tolerates it and\n * JSON.stringify dutifully emits `\"\\ud83d\"` — but the ingest server's\n * strict JSON decoder rejects the escape (\"unexpected end of hex\n * escape\", invalid_json, HTTP 400) and the WHOLE batch is dropped.\n * Because the same event re-parses on every scan, one sliced emoji\n * wedged ingestion permanently (observed live 2026-06-12). Mapping\n * every string through toWellFormed() (lone surrogate → U+FFFD) at the\n * wire boundary makes the payload parseable by any strict decoder.\n */\nexport function wellFormedStringify(value: unknown): string {\n  return JSON.stringify(value, (_key, v) => (typeof v === \"string\" ? v.toWellFormed() : v));\n}\n\nexport class IngestClient {\n  private readonly fetchImpl: typeof fetch;\n  private readonly maxAttempts: number;\n  constructor(private readonly opts: IngestClientOpts) {\n    this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n    this.maxAttempts = opts.maxAttempts ?? 3;\n  }\n\n  /**\n   * Upload a batch. `opts.raw` targets `/v1/ingest/raw` — the endpoint for\n   * cleaned FULL turns the server summarises itself (cloud mode), as opposed to\n   * `/v1/ingest` for pre-summarised abstracts. Same auth, retry, and reauth\n   * matrix either way.\n   */\n  async upload(batch: IngestBatch, opts: { raw?: boolean } = {}): Promise<UploadResult> {\n    const path = opts.raw ? \"/v1/ingest/raw\" : \"/v1/ingest\";\n    const url = `${this.opts.apiUrl.replace(/\\/+$/, \"\")}${path}`;\n    // Track the last network-level failure so we can surface its real\n    // cause chain (ENOTFOUND, ECONNREFUSED, CERT_HAS_EXPIRED, etc)\n    // instead of the useless \"fetch failed\" message undici wraps.\n    let lastFetchError: string | null = null;\n    for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n      const token = await this.opts.auth.getToken();\n      if (!token) {\n        const reauthed = await this.opts.auth.onInvalidToken();\n        if (!reauthed) return { kind: \"drop\", reason: \"no_token\", permanent: false };\n        continue;\n      }\n      let res: Response;\n      try {\n        res = await this.fetchImpl(url, {\n          method: \"POST\",\n          headers: {\n            \"content-type\": \"application/json\",\n            authorization: `Bearer ${token}`,\n          },\n          // wellFormedStringify, not JSON.stringify: a truncated-emoji\n          // lone surrogate in any excerpt 400s the whole batch on the\n          // ingest server's strict JSON decoder. See the helper's doc comment.\n          body: wellFormedStringify(batch),\n        });\n      } catch (err) {\n        const detail = describeErrorWithCause(err);\n        lastFetchError = detail;\n        this.opts.logger.warn(\"ingest fetch failed\", {\n          err: detail,\n          url,\n          attempt,\n        });\n        await sleep(expBackoff(attempt));\n        continue;\n      }\n      const decision = classifyStatus(res.status, attempt);\n      if (decision.type === \"commit\") {\n        const body = (await res.json().catch(() => ({}))) as IngestResponse;\n        return { kind: \"commit\", response: body };\n      }\n      if (decision.type === \"reauth\") {\n        // Release the unread body before retrying — with global fetch\n        // (undici) an unconsumed body keeps the connection + its\n        // buffered bytes alive until GC, which leaks across a reauth\n        // loop during a long backfill.\n        await res.body?.cancel().catch(() => {});\n        const ok = await this.opts.auth.onInvalidToken();\n        if (!ok) return { kind: \"drop\", reason: \"reauth_failed\", permanent: false };\n        continue; // retry with new token\n      }\n      // backoff + HOLD (we never drop). For a 4xx the body usually says WHY the\n      // batch was rejected (a WAF/edge notice, a validation message) — surface it so\n      // a batch that's genuinely stuck is diagnosable, not an opaque repeating\n      // \"backoff 400\". For 5xx/429 the body is noise, and a backfill looping here on\n      // sustained 429s would pile un-cancelled bodies on the heap, so drain it unread\n      // (see reauth note).\n      let body: string | undefined;\n      if (res.status >= 400 && res.status < 500) {\n        body = (await res.text().catch(() => \"\")).slice(0, 500) || undefined;\n      } else {\n        await res.body?.cancel().catch(() => {});\n      }\n      this.opts.logger.warn(\"ingest backoff\", {\n        status: res.status,\n        delay_ms: decision.delayMs,\n        attempt,\n        ...(body ? { body } : {}),\n      });\n      await sleep(decision.delayMs);\n    }\n    // Out of attempts. If every attempt failed at the fetch layer,\n    // surface the underlying cause in the drop reason so the daemon's\n    // \"Upload failed: X\" message becomes actionable\n    // (ECONNREFUSED/ENOTFOUND/etc) instead of \"fetch failed\".\n    const reason = lastFetchError ? `network: ${lastFetchError}` : \"max_attempts_exceeded\";\n    // Transient: the batch is fine, the server/network wasn't — HOLD + retry.\n    return { kind: \"drop\", reason, permanent: false };\n  }\n}\n\nexport type UploadResult =\n  | { kind: \"commit\"; response: IngestResponse }\n  // A non-commit is always a HOLD: the batch wasn't accepted (no token / reauth\n  // failed / retries exhausted on any 4xx/5xx / network), so the caller retries it\n  // next cycle — good data is NEVER discarded. `permanent` is retained for wire\n  // compatibility but is now ALWAYS `false`: classifyStatus no longer marks any\n  // response as un-retryable (see its comment), so the scan loop's quarantine branch\n  // is dormant. Deleting that path (and this field) end-to-end is a follow-up.\n  | { kind: \"drop\"; reason: string; permanent: boolean };\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((r) => {\n    setTimeout(r, ms);\n  });\n}\n","'use strict'\n\nmodule.exports = {\n  kClose: Symbol('close'),\n  kDestroy: Symbol('destroy'),\n  kDispatch: Symbol('dispatch'),\n  kUrl: Symbol('url'),\n  kWriting: Symbol('writing'),\n  kResuming: Symbol('resuming'),\n  kQueue: Symbol('queue'),\n  kConnect: Symbol('connect'),\n  kConnecting: Symbol('connecting'),\n  kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),\n  kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),\n  kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),\n  kKeepAliveTimeoutValue: Symbol('keep alive timeout'),\n  kKeepAlive: Symbol('keep alive'),\n  kHeadersTimeout: Symbol('headers timeout'),\n  kBodyTimeout: Symbol('body timeout'),\n  kServerName: Symbol('server name'),\n  kLocalAddress: Symbol('local address'),\n  kHost: Symbol('host'),\n  kNoRef: Symbol('no ref'),\n  kBodyUsed: Symbol('used'),\n  kBody: Symbol('abstracted request body'),\n  kRunning: Symbol('running'),\n  kBlocking: Symbol('blocking'),\n  kPending: Symbol('pending'),\n  kSize: Symbol('size'),\n  kBusy: Symbol('busy'),\n  kQueued: Symbol('queued'),\n  kFree: Symbol('free'),\n  kConnected: Symbol('connected'),\n  kClosed: Symbol('closed'),\n  kNeedDrain: Symbol('need drain'),\n  kReset: Symbol('reset'),\n  kDestroyed: Symbol.for('nodejs.stream.destroyed'),\n  kResume: Symbol('resume'),\n  kOnError: Symbol('on error'),\n  kMaxHeadersSize: Symbol('max headers size'),\n  kRunningIdx: Symbol('running index'),\n  kPendingIdx: Symbol('pending index'),\n  kError: Symbol('error'),\n  kClients: Symbol('clients'),\n  kClient: Symbol('client'),\n  kParser: Symbol('parser'),\n  kOnDestroyed: Symbol('destroy callbacks'),\n  kPipelining: Symbol('pipelining'),\n  kSocket: Symbol('socket'),\n  kHostHeader: Symbol('host header'),\n  kConnector: Symbol('connector'),\n  kStrictContentLength: Symbol('strict content length'),\n  kMaxRedirections: Symbol('maxRedirections'),\n  kMaxRequests: Symbol('maxRequestsPerClient'),\n  kProxy: Symbol('proxy agent options'),\n  kCounter: Symbol('socket request counter'),\n  kMaxResponseSize: Symbol('max response size'),\n  kHTTP2Session: Symbol('http2Session'),\n  kHTTP2SessionState: Symbol('http2Session state'),\n  kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),\n  kConstruct: Symbol('constructable'),\n  kListeners: Symbol('listeners'),\n  kHTTPContext: Symbol('http context'),\n  kMaxConcurrentStreams: Symbol('max concurrent streams'),\n  kHTTP2InitialWindowSize: Symbol('http2 initial window size'),\n  kHTTP2ConnectionWindowSize: Symbol('http2 connection window size'),\n  kEnableConnectProtocol: Symbol('http2session connect protocol'),\n  kRemoteSettings: Symbol('http2session remote settings'),\n  kHTTP2Stream: Symbol('http2session client stream'),\n  kPingInterval: Symbol('ping interval'),\n  kNoProxyAgent: Symbol('no proxy agent'),\n  kHttpProxyAgent: Symbol('http proxy agent'),\n  kHttpsProxyAgent: Symbol('https proxy agent'),\n  kSocks5ProxyAgent: Symbol('socks5 proxy agent')\n}\n","'use strict'\n\n/**\n * This module offers an optimized timer implementation designed for scenarios\n * where high precision is not critical.\n *\n * The timer achieves faster performance by using a low-resolution approach,\n * with an accuracy target of within 500ms. This makes it particularly useful\n * for timers with delays of 1 second or more, where exact timing is less\n * crucial.\n *\n * It's important to note that Node.js timers are inherently imprecise, as\n * delays can occur due to the event loop being blocked by other operations.\n * Consequently, timers may trigger later than their scheduled time.\n */\n\n/**\n * The fastNow variable contains the internal fast timer clock value.\n *\n * @type {number}\n */\nlet fastNow = 0\n\n/**\n * RESOLUTION_MS represents the target resolution time in milliseconds.\n *\n * @type {number}\n * @default 1000\n */\nconst RESOLUTION_MS = 1e3\n\n/**\n * TICK_MS defines the desired interval in milliseconds between each tick.\n * The target value is set to half the resolution time, minus 1 ms, to account\n * for potential event loop overhead.\n *\n * @type {number}\n * @default 499\n */\nconst TICK_MS = (RESOLUTION_MS >> 1) - 1\n\n/**\n * fastNowTimeout is a Node.js timer used to manage and process\n * the FastTimers stored in the `fastTimers` array.\n *\n * @type {NodeJS.Timeout}\n */\nlet fastNowTimeout\n\n/**\n * The kFastTimer symbol is used to identify FastTimer instances.\n *\n * @type {Symbol}\n */\nconst kFastTimer = Symbol('kFastTimer')\n\n/**\n * The fastTimers array contains all active FastTimers.\n *\n * @type {FastTimer[]}\n */\nconst fastTimers = []\n\n/**\n * These constants represent the various states of a FastTimer.\n */\n\n/**\n * The `NOT_IN_LIST` constant indicates that the FastTimer is not included\n * in the `fastTimers` array. Timers with this status will not be processed\n * during the next tick by the `onTick` function.\n *\n * A FastTimer can be re-added to the `fastTimers` array by invoking the\n * `refresh` method on the FastTimer instance.\n *\n * @type {-2}\n */\nconst NOT_IN_LIST = -2\n\n/**\n * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled\n * for removal from the `fastTimers` array. A FastTimer in this state will\n * be removed in the next tick by the `onTick` function and will no longer\n * be processed.\n *\n * This status is also set when the `clear` method is called on the FastTimer instance.\n *\n * @type {-1}\n */\nconst TO_BE_CLEARED = -1\n\n/**\n * The `PENDING` constant signifies that the FastTimer is awaiting processing\n * in the next tick by the `onTick` function. Timers with this status will have\n * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick.\n *\n * @type {0}\n */\nconst PENDING = 0\n\n/**\n * The `ACTIVE` constant indicates that the FastTimer is active and waiting\n * for its timer to expire. During the next tick, the `onTick` function will\n * check if the timer has expired, and if so, it will execute the associated callback.\n *\n * @type {1}\n */\nconst ACTIVE = 1\n\n/**\n * The onTick function processes the fastTimers array.\n *\n * @returns {void}\n */\nfunction onTick () {\n  /**\n   * Increment the fastNow value by the TICK_MS value, despite the actual time\n   * that has passed since the last tick. This approach ensures independence\n   * from the system clock and delays caused by a blocked event loop.\n   *\n   * @type {number}\n   */\n  fastNow += TICK_MS\n\n  /**\n   * The `idx` variable is used to iterate over the `fastTimers` array.\n   * Expired timers are removed by replacing them with the last element in the array.\n   * Consequently, `idx` is only incremented when the current element is not removed.\n   *\n   * @type {number}\n   */\n  let idx = 0\n\n  /**\n   * The len variable will contain the length of the fastTimers array\n   * and will be decremented when a FastTimer should be removed from the\n   * fastTimers array.\n   *\n   * @type {number}\n   */\n  let len = fastTimers.length\n\n  while (idx < len) {\n    /**\n     * @type {FastTimer}\n     */\n    const timer = fastTimers[idx]\n\n    // If the timer is in the ACTIVE state and the timer has expired, it will\n    // be processed in the next tick.\n    if (timer._state === PENDING) {\n      // Set the _idleStart value to the fastNow value minus the TICK_MS value\n      // to account for the time the timer was in the PENDING state.\n      timer._idleStart = fastNow - TICK_MS\n      timer._state = ACTIVE\n    } else if (\n      timer._state === ACTIVE &&\n      fastNow >= timer._idleStart + timer._idleTimeout\n    ) {\n      timer._state = TO_BE_CLEARED\n      timer._idleStart = -1\n      timer._onTimeout(timer._timerArg)\n    }\n\n    if (timer._state === TO_BE_CLEARED) {\n      timer._state = NOT_IN_LIST\n\n      // Move the last element to the current index and decrement len if it is\n      // not the only element in the array.\n      if (--len !== 0) {\n        fastTimers[idx] = fastTimers[len]\n      }\n    } else {\n      ++idx\n    }\n  }\n\n  // Set the length of the fastTimers array to the new length and thus\n  // removing the excess FastTimers elements from the array.\n  fastTimers.length = len\n\n  // If there are still active FastTimers in the array, refresh the Timer.\n  // If there are no active FastTimers, the timer will be refreshed again\n  // when a new FastTimer is instantiated.\n  if (fastTimers.length !== 0) {\n    refreshTimeout()\n  }\n}\n\nfunction refreshTimeout () {\n  // If the fastNowTimeout is already set and the Timer has the refresh()-\n  // method available, call it to refresh the timer.\n  // Some timer objects returned by setTimeout may not have a .refresh()\n  // method (e.g. mocked timers in tests).\n  if (fastNowTimeout?.refresh) {\n    fastNowTimeout.refresh()\n    // fastNowTimeout is not instantiated yet or refresh is not availabe,\n    // create a new Timer.\n  } else {\n    clearTimeout(fastNowTimeout)\n    fastNowTimeout = setTimeout(onTick, TICK_MS)\n    // If the Timer has an unref method, call it to allow the process to exit,\n    // if there are no other active handles. When using fake timers or mocked\n    // environments (like Jest), .unref() may not be defined,\n    fastNowTimeout?.unref()\n  }\n}\n\n/**\n * The `FastTimer` class is a data structure designed to store and manage\n * timer information.\n */\nclass FastTimer {\n  [kFastTimer] = true\n\n  /**\n   * The state of the timer, which can be one of the following:\n   * - NOT_IN_LIST (-2)\n   * - TO_BE_CLEARED (-1)\n   * - PENDING (0)\n   * - ACTIVE (1)\n   *\n   * @type {-2|-1|0|1}\n   * @private\n   */\n  _state = NOT_IN_LIST\n\n  /**\n   * The number of milliseconds to wait before calling the callback.\n   *\n   * @type {number}\n   * @private\n   */\n  _idleTimeout = -1\n\n  /**\n   * The time in milliseconds when the timer was started. This value is used to\n   * calculate when the timer should expire.\n   *\n   * @type {number}\n   * @default -1\n   * @private\n   */\n  _idleStart = -1\n\n  /**\n   * The function to be executed when the timer expires.\n   * @type {Function}\n   * @private\n   */\n  _onTimeout\n\n  /**\n   * The argument to be passed to the callback when the timer expires.\n   *\n   * @type {*}\n   * @private\n   */\n  _timerArg\n\n  /**\n   * @constructor\n   * @param {Function} callback A function to be executed after the timer\n   * expires.\n   * @param {number} delay The time, in milliseconds that the timer should wait\n   * before the specified function or code is executed.\n   * @param {*} arg\n   */\n  constructor (callback, delay, arg) {\n    this._onTimeout = callback\n    this._idleTimeout = delay\n    this._timerArg = arg\n\n    this.refresh()\n  }\n\n  /**\n   * Sets the timer's start time to the current time, and reschedules the timer\n   * to call its callback at the previously specified duration adjusted to the\n   * current time.\n   * Using this on a timer that has already called its callback will reactivate\n   * the timer.\n   *\n   * @returns {void}\n   */\n  refresh () {\n    // In the special case that the timer is not in the list of active timers,\n    // add it back to the array to be processed in the next tick by the onTick\n    // function.\n    if (this._state === NOT_IN_LIST) {\n      fastTimers.push(this)\n    }\n\n    // If the timer is the only active timer, refresh the fastNowTimeout for\n    // better resolution.\n    if (!fastNowTimeout || fastTimers.length === 1) {\n      refreshTimeout()\n    }\n\n    // Setting the state to PENDING will cause the timer to be reset in the\n    // next tick by the onTick function.\n    this._state = PENDING\n  }\n\n  /**\n   * The `clear` method cancels the timer, preventing it from executing.\n   *\n   * @returns {void}\n   * @private\n   */\n  clear () {\n    // Set the state to TO_BE_CLEARED to mark the timer for removal in the next\n    // tick by the onTick function.\n    this._state = TO_BE_CLEARED\n\n    // Reset the _idleStart value to -1 to indicate that the timer is no longer\n    // active.\n    this._idleStart = -1\n  }\n}\n\n/**\n * This module exports a setTimeout and clearTimeout function that can be\n * used as a drop-in replacement for the native functions.\n */\nmodule.exports = {\n  /**\n   * The setTimeout() method sets a timer which executes a function once the\n   * timer expires.\n   * @param {Function} callback A function to be executed after the timer\n   * expires.\n   * @param {number} delay The time, in milliseconds that the timer should\n   * wait before the specified function or code is executed.\n   * @param {*} [arg] An optional argument to be passed to the callback function\n   * when the timer expires.\n   * @returns {NodeJS.Timeout|FastTimer}\n   */\n  setTimeout (callback, delay, arg) {\n    // If the delay is less than or equal to the RESOLUTION_MS value return a\n    // native Node.js Timer instance.\n    return delay <= RESOLUTION_MS\n      ? setTimeout(callback, delay, arg)\n      : new FastTimer(callback, delay, arg)\n  },\n  /**\n   * The clearTimeout method cancels an instantiated Timer previously created\n   * by calling setTimeout.\n   *\n   * @param {NodeJS.Timeout|FastTimer} timeout\n   */\n  clearTimeout (timeout) {\n    // If the timeout is a FastTimer, call its own clear method.\n    if (timeout[kFastTimer]) {\n      /**\n       * @type {FastTimer}\n       */\n      timeout.clear()\n      // Otherwise it is an instance of a native NodeJS.Timeout, so call the\n      // Node.js native clearTimeout function.\n    } else {\n      clearTimeout(timeout)\n    }\n  },\n  /**\n   * The setFastTimeout() method sets a fastTimer which executes a function once\n   * the timer expires.\n   * @param {Function} callback A function to be executed after the timer\n   * expires.\n   * @param {number} delay The time, in milliseconds that the timer should\n   * wait before the specified function or code is executed.\n   * @param {*} [arg] An optional argument to be passed to the callback function\n   * when the timer expires.\n   * @returns {FastTimer}\n   */\n  setFastTimeout (callback, delay, arg) {\n    return new FastTimer(callback, delay, arg)\n  },\n  /**\n   * The clearTimeout method cancels an instantiated FastTimer previously\n   * created by calling setFastTimeout.\n   *\n   * @param {FastTimer} timeout\n   */\n  clearFastTimeout (timeout) {\n    timeout.clear()\n  },\n  /**\n   * The now method returns the value of the internal fast timer clock.\n   *\n   * @returns {number}\n   */\n  now () {\n    return fastNow\n  },\n  /**\n   * Trigger the onTick function to process the fastTimers array.\n   * Exported for testing purposes only.\n   * Marking as deprecated to discourage any use outside of testing.\n   * @deprecated\n   * @param {number} [delay=0] The delay in milliseconds to add to the now value.\n   */\n  tick (delay = 0) {\n    fastNow += delay - RESOLUTION_MS + 1\n    onTick()\n    onTick()\n  },\n  /**\n   * Reset FastTimers.\n   * Exported for testing purposes only.\n   * Marking as deprecated to discourage any use outside of testing.\n   * @deprecated\n   */\n  reset () {\n    fastNow = 0\n    fastTimers.length = 0\n    clearTimeout(fastNowTimeout)\n    fastNowTimeout = null\n  },\n  /**\n   * Exporting for testing purposes only.\n   * Marking as deprecated to discourage any use outside of testing.\n   * @deprecated\n   */\n  kFastTimer\n}\n","'use strict'\n\nconst kUndiciError = Symbol.for('undici.error.UND_ERR')\nclass UndiciError extends Error {\n  constructor (message, options) {\n    super(message, options)\n    this.name = 'UndiciError'\n    this.code = 'UND_ERR'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kUndiciError] === true\n  }\n\n  get [kUndiciError] () {\n    return true\n  }\n}\n\nconst kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT')\nclass ConnectTimeoutError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'ConnectTimeoutError'\n    this.message = message || 'Connect Timeout Error'\n    this.code = 'UND_ERR_CONNECT_TIMEOUT'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kConnectTimeoutError] === true\n  }\n\n  get [kConnectTimeoutError] () {\n    return true\n  }\n}\n\nconst kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT')\nclass HeadersTimeoutError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'HeadersTimeoutError'\n    this.message = message || 'Headers Timeout Error'\n    this.code = 'UND_ERR_HEADERS_TIMEOUT'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kHeadersTimeoutError] === true\n  }\n\n  get [kHeadersTimeoutError] () {\n    return true\n  }\n}\n\nconst kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW')\nclass HeadersOverflowError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'HeadersOverflowError'\n    this.message = message || 'Headers Overflow Error'\n    this.code = 'UND_ERR_HEADERS_OVERFLOW'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kHeadersOverflowError] === true\n  }\n\n  get [kHeadersOverflowError] () {\n    return true\n  }\n}\n\nconst kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT')\nclass BodyTimeoutError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'BodyTimeoutError'\n    this.message = message || 'Body Timeout Error'\n    this.code = 'UND_ERR_BODY_TIMEOUT'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kBodyTimeoutError] === true\n  }\n\n  get [kBodyTimeoutError] () {\n    return true\n  }\n}\n\nconst kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG')\nclass InvalidArgumentError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'InvalidArgumentError'\n    this.message = message || 'Invalid Argument Error'\n    this.code = 'UND_ERR_INVALID_ARG'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kInvalidArgumentError] === true\n  }\n\n  get [kInvalidArgumentError] () {\n    return true\n  }\n}\n\nconst kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE')\nclass InvalidReturnValueError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'InvalidReturnValueError'\n    this.message = message || 'Invalid Return Value Error'\n    this.code = 'UND_ERR_INVALID_RETURN_VALUE'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kInvalidReturnValueError] === true\n  }\n\n  get [kInvalidReturnValueError] () {\n    return true\n  }\n}\n\nconst kAbortError = Symbol.for('undici.error.UND_ERR_ABORT')\nclass AbortError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'AbortError'\n    this.message = message || 'The operation was aborted'\n    this.code = 'UND_ERR_ABORT'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kAbortError] === true\n  }\n\n  get [kAbortError] () {\n    return true\n  }\n}\n\nconst kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED')\nclass RequestAbortedError extends AbortError {\n  constructor (message) {\n    super(message)\n    this.name = 'AbortError'\n    this.message = message || 'Request aborted'\n    this.code = 'UND_ERR_ABORTED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kRequestAbortedError] === true\n  }\n\n  get [kRequestAbortedError] () {\n    return true\n  }\n}\n\nconst kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')\nclass InformationalError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'InformationalError'\n    this.message = message || 'Request information'\n    this.code = 'UND_ERR_INFO'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kInformationalError] === true\n  }\n\n  get [kInformationalError] () {\n    return true\n  }\n}\n\nconst kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH')\nclass RequestContentLengthMismatchError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'RequestContentLengthMismatchError'\n    this.message = message || 'Request body length does not match content-length header'\n    this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kRequestContentLengthMismatchError] === true\n  }\n\n  get [kRequestContentLengthMismatchError] () {\n    return true\n  }\n}\n\nconst kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH')\nclass ResponseContentLengthMismatchError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'ResponseContentLengthMismatchError'\n    this.message = message || 'Response body length does not match content-length header'\n    this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kResponseContentLengthMismatchError] === true\n  }\n\n  get [kResponseContentLengthMismatchError] () {\n    return true\n  }\n}\n\nconst kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED')\nclass ClientDestroyedError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'ClientDestroyedError'\n    this.message = message || 'The client is destroyed'\n    this.code = 'UND_ERR_DESTROYED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kClientDestroyedError] === true\n  }\n\n  get [kClientDestroyedError] () {\n    return true\n  }\n}\n\nconst kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED')\nclass ClientClosedError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'ClientClosedError'\n    this.message = message || 'The client is closed'\n    this.code = 'UND_ERR_CLOSED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kClientClosedError] === true\n  }\n\n  get [kClientClosedError] () {\n    return true\n  }\n}\n\nconst kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET')\nclass SocketError extends UndiciError {\n  constructor (message, socket) {\n    super(message)\n    this.name = 'SocketError'\n    this.message = message || 'Socket error'\n    this.code = 'UND_ERR_SOCKET'\n    this.socket = socket\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kSocketError] === true\n  }\n\n  get [kSocketError] () {\n    return true\n  }\n}\n\nconst kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED')\nclass NotSupportedError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'NotSupportedError'\n    this.message = message || 'Not supported error'\n    this.code = 'UND_ERR_NOT_SUPPORTED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kNotSupportedError] === true\n  }\n\n  get [kNotSupportedError] () {\n    return true\n  }\n}\n\nconst kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM')\nclass BalancedPoolMissingUpstreamError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'MissingUpstreamError'\n    this.message = message || 'No upstream has been added to the BalancedPool'\n    this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kBalancedPoolMissingUpstreamError] === true\n  }\n\n  get [kBalancedPoolMissingUpstreamError] () {\n    return true\n  }\n}\n\nconst kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER')\nclass HTTPParserError extends Error {\n  constructor (message, code, data) {\n    super(message)\n    this.name = 'HTTPParserError'\n    this.code = code ? `HPE_${code}` : undefined\n    this.data = data ? data.toString() : undefined\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kHTTPParserError] === true\n  }\n\n  get [kHTTPParserError] () {\n    return true\n  }\n}\n\nconst kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE')\nclass ResponseExceededMaxSizeError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'ResponseExceededMaxSizeError'\n    this.message = message || 'Response content exceeded max size'\n    this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kResponseExceededMaxSizeError] === true\n  }\n\n  get [kResponseExceededMaxSizeError] () {\n    return true\n  }\n}\n\nconst kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY')\nclass RequestRetryError extends UndiciError {\n  constructor (message, code, { headers, data }) {\n    super(message)\n    this.name = 'RequestRetryError'\n    this.message = message || 'Request retry error'\n    this.code = 'UND_ERR_REQ_RETRY'\n    this.statusCode = code\n    this.data = data\n    this.headers = headers\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kRequestRetryError] === true\n  }\n\n  get [kRequestRetryError] () {\n    return true\n  }\n}\n\nconst kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE')\nclass ResponseError extends UndiciError {\n  constructor (message, code, { headers, body }) {\n    super(message)\n    this.name = 'ResponseError'\n    this.message = message || 'Response error'\n    this.code = 'UND_ERR_RESPONSE'\n    this.statusCode = code\n    this.body = body\n    this.headers = headers\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kResponseError] === true\n  }\n\n  get [kResponseError] () {\n    return true\n  }\n}\n\nconst kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS')\nclass SecureProxyConnectionError extends UndiciError {\n  constructor (cause, message, options = {}) {\n    super(message, { cause, ...options })\n    this.name = 'SecureProxyConnectionError'\n    this.message = message || 'Secure Proxy Connection failed'\n    this.code = 'UND_ERR_PRX_TLS'\n    this.cause = cause\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kSecureProxyConnectionError] === true\n  }\n\n  get [kSecureProxyConnectionError] () {\n    return true\n  }\n}\n\nconst kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')\nclass MaxOriginsReachedError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'MaxOriginsReachedError'\n    this.message = message || 'Maximum allowed origins reached'\n    this.code = 'UND_ERR_MAX_ORIGINS_REACHED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kMaxOriginsReachedError] === true\n  }\n\n  get [kMaxOriginsReachedError] () {\n    return true\n  }\n}\n\nclass Socks5ProxyError extends UndiciError {\n  constructor (message, code) {\n    super(message)\n    this.name = 'Socks5ProxyError'\n    this.message = message || 'SOCKS5 proxy error'\n    this.code = code || 'UND_ERR_SOCKS5'\n  }\n}\n\nconst kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED')\nclass MessageSizeExceededError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'MessageSizeExceededError'\n    this.message = message || 'Max decompressed message size exceeded'\n    this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kMessageSizeExceededError] === true\n  }\n\n  get [kMessageSizeExceededError] () {\n    return true\n  }\n}\n\nmodule.exports = {\n  AbortError,\n  HTTPParserError,\n  UndiciError,\n  HeadersTimeoutError,\n  HeadersOverflowError,\n  BodyTimeoutError,\n  RequestContentLengthMismatchError,\n  ConnectTimeoutError,\n  InvalidArgumentError,\n  InvalidReturnValueError,\n  RequestAbortedError,\n  ClientDestroyedError,\n  ClientClosedError,\n  InformationalError,\n  SocketError,\n  NotSupportedError,\n  ResponseContentLengthMismatchError,\n  BalancedPoolMissingUpstreamError,\n  ResponseExceededMaxSizeError,\n  RequestRetryError,\n  ResponseError,\n  SecureProxyConnectionError,\n  MaxOriginsReachedError,\n  Socks5ProxyError,\n  MessageSizeExceededError\n}\n","'use strict'\n\n/**\n * @see https://developer.mozilla.org/docs/Web/HTTP/Headers\n */\nconst wellknownHeaderNames = /** @type {const} */ ([\n  'Accept',\n  'Accept-Encoding',\n  'Accept-Language',\n  'Accept-Ranges',\n  'Access-Control-Allow-Credentials',\n  'Access-Control-Allow-Headers',\n  'Access-Control-Allow-Methods',\n  'Access-Control-Allow-Origin',\n  'Access-Control-Expose-Headers',\n  'Access-Control-Max-Age',\n  'Access-Control-Request-Headers',\n  'Access-Control-Request-Method',\n  'Age',\n  'Allow',\n  'Alt-Svc',\n  'Alt-Used',\n  'Authorization',\n  'Cache-Control',\n  'Clear-Site-Data',\n  'Connection',\n  'Content-Disposition',\n  'Content-Encoding',\n  'Content-Language',\n  'Content-Length',\n  'Content-Location',\n  'Content-Range',\n  'Content-Security-Policy',\n  'Content-Security-Policy-Report-Only',\n  'Content-Type',\n  'Cookie',\n  'Cross-Origin-Embedder-Policy',\n  'Cross-Origin-Opener-Policy',\n  'Cross-Origin-Resource-Policy',\n  'Date',\n  'Device-Memory',\n  'Downlink',\n  'ECT',\n  'ETag',\n  'Expect',\n  'Expect-CT',\n  'Expires',\n  'Forwarded',\n  'From',\n  'Host',\n  'If-Match',\n  'If-Modified-Since',\n  'If-None-Match',\n  'If-Range',\n  'If-Unmodified-Since',\n  'Keep-Alive',\n  'Last-Modified',\n  'Link',\n  'Location',\n  'Max-Forwards',\n  'Origin',\n  'Permissions-Policy',\n  'Pragma',\n  'Proxy-Authenticate',\n  'Proxy-Authorization',\n  'RTT',\n  'Range',\n  'Referer',\n  'Referrer-Policy',\n  'Refresh',\n  'Retry-After',\n  'Sec-WebSocket-Accept',\n  'Sec-WebSocket-Extensions',\n  'Sec-WebSocket-Key',\n  'Sec-WebSocket-Protocol',\n  'Sec-WebSocket-Version',\n  'Server',\n  'Server-Timing',\n  'Service-Worker-Allowed',\n  'Service-Worker-Navigation-Preload',\n  'Set-Cookie',\n  'SourceMap',\n  'Strict-Transport-Security',\n  'Supports-Loading-Mode',\n  'TE',\n  'Timing-Allow-Origin',\n  'Trailer',\n  'Transfer-Encoding',\n  'Upgrade',\n  'Upgrade-Insecure-Requests',\n  'User-Agent',\n  'Vary',\n  'Via',\n  'WWW-Authenticate',\n  'X-Content-Type-Options',\n  'X-DNS-Prefetch-Control',\n  'X-Frame-Options',\n  'X-Permitted-Cross-Domain-Policies',\n  'X-Powered-By',\n  'X-Requested-With',\n  'X-XSS-Protection'\n])\n\n/** @type {Record<typeof wellknownHeaderNames[number]|Lowercase<typeof wellknownHeaderNames[number]>, string>} */\nconst headerNameLowerCasedRecord = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(headerNameLowerCasedRecord, null)\n\n/**\n * @type {Record<Lowercase<typeof wellknownHeaderNames[number]>, Buffer>}\n */\nconst wellknownHeaderNameBuffers = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(wellknownHeaderNameBuffers, null)\n\n/**\n * @param {string} header Lowercased header\n * @returns {Buffer}\n */\nfunction getHeaderNameAsBuffer (header) {\n  let buffer = wellknownHeaderNameBuffers[header]\n\n  if (buffer === undefined) {\n    buffer = Buffer.from(header)\n  }\n\n  return buffer\n}\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n  const key = wellknownHeaderNames[i]\n  const lowerCasedKey = key.toLowerCase()\n  headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] =\n    lowerCasedKey\n}\n\nmodule.exports = {\n  wellknownHeaderNames,\n  headerNameLowerCasedRecord,\n  getHeaderNameAsBuffer\n}\n","'use strict'\n\nconst {\n  wellknownHeaderNames,\n  headerNameLowerCasedRecord\n} = require('./constants')\n\nclass TstNode {\n  /** @type {any} */\n  value = null\n  /** @type {null | TstNode} */\n  left = null\n  /** @type {null | TstNode} */\n  middle = null\n  /** @type {null | TstNode} */\n  right = null\n  /** @type {number} */\n  code\n  /**\n   * @param {string} key\n   * @param {any} value\n   * @param {number} index\n   */\n  constructor (key, value, index) {\n    if (index === undefined || index >= key.length) {\n      throw new TypeError('Unreachable')\n    }\n    const code = this.code = key.charCodeAt(index)\n    // check code is ascii string\n    if (code > 0x7F) {\n      throw new TypeError('key must be ascii string')\n    }\n    if (key.length !== ++index) {\n      this.middle = new TstNode(key, value, index)\n    } else {\n      this.value = value\n    }\n  }\n\n  /**\n   * @param {string} key\n   * @param {any} value\n   * @returns {void}\n   */\n  add (key, value) {\n    const length = key.length\n    if (length === 0) {\n      throw new TypeError('Unreachable')\n    }\n    let index = 0\n    /**\n     * @type {TstNode}\n     */\n    let node = this\n    while (true) {\n      const code = key.charCodeAt(index)\n      // check code is ascii string\n      if (code > 0x7F) {\n        throw new TypeError('key must be ascii string')\n      }\n      if (node.code === code) {\n        if (length === ++index) {\n          node.value = value\n          break\n        } else if (node.middle !== null) {\n          node = node.middle\n        } else {\n          node.middle = new TstNode(key, value, index)\n          break\n        }\n      } else if (node.code < code) {\n        if (node.left !== null) {\n          node = node.left\n        } else {\n          node.left = new TstNode(key, value, index)\n          break\n        }\n      } else if (node.right !== null) {\n        node = node.right\n      } else {\n        node.right = new TstNode(key, value, index)\n        break\n      }\n    }\n  }\n\n  /**\n   * @param {Uint8Array} key\n   * @returns {TstNode | null}\n   */\n  search (key) {\n    const keylength = key.length\n    let index = 0\n    /**\n     * @type {TstNode|null}\n     */\n    let node = this\n    while (node !== null && index < keylength) {\n      let code = key[index]\n      // A-Z\n      // First check if it is bigger than 0x5a.\n      // Lowercase letters have higher char codes than uppercase ones.\n      // Also we assume that headers will mostly contain lowercase characters.\n      if (code <= 0x5a && code >= 0x41) {\n        // Lowercase for uppercase.\n        code |= 32\n      }\n      while (node !== null) {\n        if (code === node.code) {\n          if (keylength === ++index) {\n            // Returns Node since it is the last key.\n            return node\n          }\n          node = node.middle\n          break\n        }\n        node = node.code < code ? node.left : node.right\n      }\n    }\n    return null\n  }\n}\n\nclass TernarySearchTree {\n  /** @type {TstNode | null} */\n  node = null\n\n  /**\n   * @param {string} key\n   * @param {any} value\n   * @returns {void}\n   * */\n  insert (key, value) {\n    if (this.node === null) {\n      this.node = new TstNode(key, value, 0)\n    } else {\n      this.node.add(key, value)\n    }\n  }\n\n  /**\n   * @param {Uint8Array} key\n   * @returns {any}\n   */\n  lookup (key) {\n    return this.node?.search(key)?.value ?? null\n  }\n}\n\nconst tree = new TernarySearchTree()\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n  const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]\n  tree.insert(key, key)\n}\n\nmodule.exports = {\n  TernarySearchTree,\n  tree\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { kDestroyed, kBodyUsed, kListeners, kBody } = require('./symbols')\nconst { IncomingMessage } = require('node:http')\nconst stream = require('node:stream')\nconst net = require('node:net')\nconst { stringify } = require('node:querystring')\nconst { EventEmitter: EE } = require('node:events')\nconst timers = require('../util/timers')\nconst { InvalidArgumentError, ConnectTimeoutError } = require('./errors')\nconst { headerNameLowerCasedRecord } = require('./constants')\nconst { tree } = require('./tree')\n\nconst [nodeMajor, nodeMinor] = process.versions.node.split('.', 2).map(v => Number(v))\n\nclass BodyAsyncIterable {\n  constructor (body) {\n    this[kBody] = body\n    this[kBodyUsed] = false\n  }\n\n  async * [Symbol.asyncIterator] () {\n    assert(!this[kBodyUsed], 'disturbed')\n    this[kBodyUsed] = true\n    yield * this[kBody]\n  }\n}\n\nfunction noop () {}\n\n/**\n * @param {*} body\n * @returns {*}\n */\nfunction wrapRequestBody (body) {\n  if (isStream(body)) {\n    // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n    // so that it can be dispatched again?\n    // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n    if (bodyLength(body) === 0) {\n      body\n        .on('data', function () {\n          assert(false)\n        })\n    }\n\n    if (typeof body.readableDidRead !== 'boolean') {\n      body[kBodyUsed] = false\n      EE.prototype.on.call(body, 'data', function () {\n        this[kBodyUsed] = true\n      })\n    }\n\n    return body\n  } else if (body && typeof body.pipeTo === 'function') {\n    // TODO (fix): We can't access ReadableStream internal state\n    // to determine whether or not it has been disturbed. This is just\n    // a workaround.\n    return new BodyAsyncIterable(body)\n  } else if (body && isFormDataLike(body)) {\n    return body\n  } else if (\n    body &&\n    typeof body !== 'string' &&\n    !ArrayBuffer.isView(body) &&\n    isIterable(body)\n  ) {\n    // TODO: Should we allow re-using iterable if !this.opts.idempotent\n    // or through some other flag?\n    return new BodyAsyncIterable(body)\n  } else {\n    return body\n  }\n}\n\n/**\n * @param {*} obj\n * @returns {obj is import('node:stream').Stream}\n */\nfunction isStream (obj) {\n  return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'\n}\n\n/**\n * @param {*} object\n * @returns {object is Blob}\n * based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License)\n */\nfunction isBlobLike (object) {\n  if (object === null) {\n    return false\n  } else if (object instanceof Blob) {\n    return true\n  } else if (typeof object !== 'object') {\n    return false\n  } else {\n    const sTag = object[Symbol.toStringTag]\n\n    return (sTag === 'Blob' || sTag === 'File') && (\n      ('stream' in object && typeof object.stream === 'function') ||\n      ('arrayBuffer' in object && typeof object.arrayBuffer === 'function')\n    )\n  }\n}\n\n/**\n * @param {string} url The path to check for query strings or fragments.\n * @returns {boolean} Returns true if the path contains a query string or fragment.\n */\nfunction pathHasQueryOrFragment (url) {\n  return (\n    url.includes('?') ||\n    url.includes('#')\n  )\n}\n\n/**\n * @param {string} url The URL to add the query params to\n * @param {import('node:querystring').ParsedUrlQueryInput} queryParams The object to serialize into a URL query string\n * @returns {string} The URL with the query params added\n */\nfunction serializePathWithQuery (url, queryParams) {\n  if (pathHasQueryOrFragment(url)) {\n    throw new Error('Query params cannot be passed when url already contains \"?\" or \"#\".')\n  }\n\n  const stringified = stringify(queryParams)\n\n  if (stringified) {\n    url += '?' + stringified\n  }\n\n  return url\n}\n\n/**\n * @param {number|string|undefined} port\n * @returns {boolean}\n */\nfunction isValidPort (port) {\n  const value = parseInt(port, 10)\n  return (\n    value === Number(port) &&\n    value >= 0 &&\n    value <= 65535\n  )\n}\n\n/**\n * Check if the value is a valid http or https prefixed string.\n *\n * @param {string} value\n * @returns {boolean}\n */\nfunction isHttpOrHttpsPrefixed (value) {\n  return (\n    value != null &&\n    value[0] === 'h' &&\n    value[1] === 't' &&\n    value[2] === 't' &&\n    value[3] === 'p' &&\n    (\n      value[4] === ':' ||\n      (\n        value[4] === 's' &&\n        value[5] === ':'\n      )\n    )\n  )\n}\n\n/**\n * @param {string|URL|Record<string,string>} url\n * @returns {URL}\n */\nfunction parseURL (url) {\n  if (typeof url === 'string') {\n    /**\n     * @type {URL}\n     */\n    url = new URL(url)\n\n    if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n      throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n    }\n\n    return url\n  }\n\n  if (!url || typeof url !== 'object') {\n    throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')\n  }\n\n  if (!(url instanceof URL)) {\n    if (url.port != null && url.port !== '' && isValidPort(url.port) === false) {\n      throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')\n    }\n\n    if (url.path != null && typeof url.path !== 'string') {\n      throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')\n    }\n\n    if (url.pathname != null && typeof url.pathname !== 'string') {\n      throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')\n    }\n\n    if (url.hostname != null && typeof url.hostname !== 'string') {\n      throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')\n    }\n\n    if (url.origin != null && typeof url.origin !== 'string') {\n      throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')\n    }\n\n    if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n      throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n    }\n\n    const port = url.port != null\n      ? url.port\n      : (url.protocol === 'https:' ? 443 : 80)\n    let origin = url.origin != null\n      ? url.origin\n      : `${url.protocol || ''}//${url.hostname || ''}:${port}`\n    let path = url.path != null\n      ? url.path\n      : `${url.pathname || ''}${url.search || ''}`\n\n    if (origin[origin.length - 1] === '/') {\n      origin = origin.slice(0, origin.length - 1)\n    }\n\n    if (path && path[0] !== '/') {\n      path = `/${path}`\n    }\n    // new URL(path, origin) is unsafe when `path` contains an absolute URL\n    // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:\n    // If first parameter is a relative URL, second param is required, and will be used as the base URL.\n    // If first parameter is an absolute URL, a given second param will be ignored.\n    return new URL(`${origin}${path}`)\n  }\n\n  if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n    throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n  }\n\n  return url\n}\n\n/**\n * @param {string|URL|Record<string, string>} url\n * @returns {URL}\n */\nfunction parseOrigin (url) {\n  url = parseURL(url)\n\n  if (url.pathname !== '/' || url.search || url.hash) {\n    throw new InvalidArgumentError('invalid url')\n  }\n\n  return url\n}\n\n/**\n * @param {string} host\n * @returns {string}\n */\nfunction getHostname (host) {\n  if (host[0] === '[') {\n    const idx = host.indexOf(']')\n\n    assert(idx !== -1)\n    return host.substring(1, idx)\n  }\n\n  const idx = host.indexOf(':')\n  if (idx === -1) return host\n\n  return host.substring(0, idx)\n}\n\n/**\n * IP addresses are not valid server names per RFC6066\n * Currently, the only server names supported are DNS hostnames\n * @param {string|null} host\n * @returns {string|null}\n */\nfunction getServerName (host) {\n  if (!host) {\n    return null\n  }\n\n  assert(typeof host === 'string')\n\n  const servername = getHostname(host)\n  if (net.isIP(servername)) {\n    return ''\n  }\n\n  return servername\n}\n\n/**\n * @function\n * @template T\n * @param {T} obj\n * @returns {T}\n */\nfunction deepClone (obj) {\n  return JSON.parse(JSON.stringify(obj))\n}\n\n/**\n * @param {*} obj\n * @returns {obj is AsyncIterable}\n */\nfunction isAsyncIterable (obj) {\n  return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')\n}\n\n/**\n * @param {*} obj\n * @returns {obj is Iterable}\n */\nfunction isIterable (obj) {\n  return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))\n}\n\n/**\n * Checks whether an object has a safe Symbol.iterator — i.e. one that is\n * either own or inherited from a non-Object.prototype chain.  This prevents\n * prototype-pollution attacks from injecting a fake iterator on\n * Object.prototype.\n * @param {object} obj\n * @returns {boolean}\n */\nfunction hasSafeIterator (obj) {\n  const prototype = Object.getPrototypeOf(obj)\n  const ownIterator = Object.prototype.hasOwnProperty.call(obj, Symbol.iterator)\n  return ownIterator || (prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === 'function')\n}\n\n/**\n * @param {Blob|Buffer|import ('stream').Stream} body\n * @returns {number|null}\n */\nfunction bodyLength (body) {\n  if (body == null) {\n    return 0\n  } else if (isStream(body)) {\n    const state = body._readableState\n    return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)\n      ? state.length\n      : null\n  } else if (isBlobLike(body)) {\n    return body.size != null ? body.size : null\n  } else if (isBuffer(body)) {\n    return body.byteLength\n  }\n\n  return null\n}\n\n/**\n * @param {import ('stream').Stream} body\n * @returns {boolean}\n */\nfunction isDestroyed (body) {\n  return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body)))\n}\n\n/**\n * @param {import ('stream').Stream} stream\n * @param {Error} [err]\n * @returns {void}\n */\nfunction destroy (stream, err) {\n  if (stream == null || !isStream(stream) || isDestroyed(stream)) {\n    return\n  }\n\n  if (typeof stream.destroy === 'function') {\n    if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {\n      // See: https://github.com/nodejs/node/pull/38505/files\n      stream.socket = null\n    }\n\n    stream.destroy(err)\n  } else if (err) {\n    queueMicrotask(() => {\n      stream.emit('error', err)\n    })\n  }\n\n  if (stream.destroyed !== true) {\n    stream[kDestroyed] = true\n  }\n}\n\nconst KEEPALIVE_TIMEOUT_EXPR = /timeout=(\\d+)/\n/**\n * @param {string} val\n * @returns {number | null}\n */\nfunction parseKeepAliveTimeout (val) {\n  const m = val.match(KEEPALIVE_TIMEOUT_EXPR)\n  return m ? parseInt(m[1], 10) * 1000 : null\n}\n\n/**\n * Retrieves a header name and returns its lowercase value.\n * @param {string | Buffer} value Header name\n * @returns {string}\n */\nfunction headerNameToString (value) {\n  return typeof value === 'string'\n    ? headerNameLowerCasedRecord[value] ?? value.toLowerCase()\n    : tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * Receive the buffer as a string and return its lowercase value.\n * @param {Buffer} value Header name\n * @returns {string}\n */\nfunction bufferToLowerCasedHeaderName (value) {\n  return tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * @param {(Buffer | string)[]} headers\n * @param {Record<string, string | string[]>} [obj]\n * @returns {Record<string, string | string[]>}\n */\nfunction parseHeaders (headers, obj) {\n  if (obj === undefined) obj = {}\n\n  for (let i = 0; i < headers.length; i += 2) {\n    const key = headerNameToString(headers[i])\n    let val = obj[key]\n\n    if (val !== undefined) {\n      if (!Object.hasOwn(obj, key)) {\n        const headersValue = typeof headers[i + 1] === 'string'\n          ? headers[i + 1]\n          : Array.isArray(headers[i + 1])\n            ? headers[i + 1].map(x => x.toString('latin1'))\n            : headers[i + 1].toString('latin1')\n\n        if (key === '__proto__') {\n          Object.defineProperty(obj, key, {\n            value: headersValue,\n            enumerable: true,\n            configurable: true,\n            writable: true\n          })\n        } else {\n          obj[key] = headersValue\n        }\n      } else {\n        if (typeof val === 'string') {\n          val = [val]\n          obj[key] = val\n        }\n        val.push(headers[i + 1].toString('latin1'))\n      }\n    } else {\n      const headersValue = typeof headers[i + 1] === 'string'\n        ? headers[i + 1]\n        : Array.isArray(headers[i + 1])\n          ? headers[i + 1].map(x => x.toString('latin1'))\n          : headers[i + 1].toString('latin1')\n\n      obj[key] = headersValue\n    }\n  }\n\n  return obj\n}\n\n/**\n * @param {Buffer[]} headers\n * @returns {string[]}\n */\nfunction parseRawHeaders (headers) {\n  const headersLength = headers.length\n  /**\n   * @type {string[]}\n   */\n  const ret = new Array(headersLength)\n\n  let key\n  let val\n\n  for (let n = 0; n < headersLength; n += 2) {\n    key = headers[n]\n    val = headers[n + 1]\n\n    typeof key !== 'string' && (key = key.toString())\n    typeof val !== 'string' && (val = val.toString('latin1'))\n\n    ret[n] = key\n    ret[n + 1] = val\n  }\n\n  return ret\n}\n\n/**\n * @param {string[]} headers\n * @param {Buffer[]} headers\n */\nfunction encodeRawHeaders (headers) {\n  if (!Array.isArray(headers)) {\n    throw new TypeError('expected headers to be an array')\n  }\n  return headers.map(x => Buffer.from(x))\n}\n\n/**\n * @param {*} buffer\n * @returns {buffer is Buffer}\n */\nfunction isBuffer (buffer) {\n  // See, https://github.com/mcollina/undici/pull/319\n  return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)\n}\n\n/**\n * Asserts that the handler object is a request handler.\n *\n * @param {object} handler\n * @param {string} method\n * @param {string} [upgrade]\n * @returns {asserts handler is import('../api/api-request').RequestHandler}\n */\nfunction assertRequestHandler (handler, method, upgrade) {\n  if (!handler || typeof handler !== 'object') {\n    throw new InvalidArgumentError('handler must be an object')\n  }\n\n  if (typeof handler.onRequestStart === 'function') {\n    // TODO (fix): More checks...\n    return\n  }\n\n  if (typeof handler.onConnect !== 'function') {\n    throw new InvalidArgumentError('invalid onConnect method')\n  }\n\n  if (typeof handler.onError !== 'function') {\n    throw new InvalidArgumentError('invalid onError method')\n  }\n\n  if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {\n    throw new InvalidArgumentError('invalid onBodySent method')\n  }\n\n  if (upgrade || method === 'CONNECT') {\n    if (typeof handler.onUpgrade !== 'function') {\n      throw new InvalidArgumentError('invalid onUpgrade method')\n    }\n  } else {\n    if (typeof handler.onHeaders !== 'function') {\n      throw new InvalidArgumentError('invalid onHeaders method')\n    }\n\n    if (typeof handler.onData !== 'function') {\n      throw new InvalidArgumentError('invalid onData method')\n    }\n\n    if (typeof handler.onComplete !== 'function') {\n      throw new InvalidArgumentError('invalid onComplete method')\n    }\n  }\n}\n\n/**\n * A body is disturbed if it has been read from and it cannot be re-used without\n * losing state or data.\n * @param {import('node:stream').Readable} body\n * @returns {boolean}\n */\nfunction isDisturbed (body) {\n  // TODO (fix): Why is body[kBodyUsed] needed?\n  return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]))\n}\n\n/**\n * @typedef {object} SocketInfo\n * @property {string} [localAddress]\n * @property {number} [localPort]\n * @property {string} [remoteAddress]\n * @property {number} [remotePort]\n * @property {string} [remoteFamily]\n * @property {number} [timeout]\n * @property {number} bytesWritten\n * @property {number} bytesRead\n */\n\n/**\n * @param {import('net').Socket} socket\n * @returns {SocketInfo}\n */\nfunction getSocketInfo (socket) {\n  return {\n    localAddress: socket.localAddress,\n    localPort: socket.localPort,\n    remoteAddress: socket.remoteAddress,\n    remotePort: socket.remotePort,\n    remoteFamily: socket.remoteFamily,\n    timeout: socket.timeout,\n    bytesWritten: socket.bytesWritten,\n    bytesRead: socket.bytesRead\n  }\n}\n\n/**\n * @param {Iterable} iterable\n * @returns {ReadableStream}\n */\nfunction ReadableStreamFrom (iterable) {\n  // We cannot use ReadableStream.from here because it does not return a byte stream.\n\n  let iterator\n  return new ReadableStream(\n    {\n      start () {\n        iterator = iterable[Symbol.asyncIterator]()\n      },\n      pull (controller) {\n        return iterator.next().then(({ done, value }) => {\n          if (done) {\n            return queueMicrotask(() => {\n              controller.close()\n              controller.byobRequest?.respond(0)\n            })\n          } else {\n            const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)\n            if (buf.byteLength) {\n              return controller.enqueue(new Uint8Array(buf))\n            } else {\n              return this.pull(controller)\n            }\n          }\n        })\n      },\n      cancel () {\n        return iterator.return()\n      },\n      type: 'bytes'\n    }\n  )\n}\n\n/**\n * The object should be a FormData instance and contains all the required\n * methods.\n * @param {*} object\n * @returns {object is FormData}\n */\nfunction isFormDataLike (object) {\n  return (\n    object &&\n    typeof object === 'object' &&\n    typeof object.append === 'function' &&\n    typeof object.delete === 'function' &&\n    typeof object.get === 'function' &&\n    typeof object.getAll === 'function' &&\n    typeof object.has === 'function' &&\n    typeof object.set === 'function' &&\n    object[Symbol.toStringTag] === 'FormData'\n  )\n}\n\nfunction addAbortListener (signal, listener) {\n  if ('addEventListener' in signal) {\n    signal.addEventListener('abort', listener, { once: true })\n    return () => signal.removeEventListener('abort', listener)\n  }\n  signal.once('abort', listener)\n  return () => signal.removeListener('abort', listener)\n}\n\nconst validTokenChars = new Uint8Array([\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31\n  0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32-47 (!\"#$%&'()*+,-./)\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48-63 (0-9:;<=>?)\n  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64-79 (@A-O)\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80-95 (P-Z[\\]^_)\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96-111 (`a-o)\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112-127 (p-z{|}~)\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144-159\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-175\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176-191\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192-207\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208-223\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224-239\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // 240-255\n])\n\n/**\n * @see https://tools.ietf.org/html/rfc7230#section-3.2.6\n * @param {number} c\n * @returns {boolean}\n */\nfunction isTokenCharCode (c) {\n  return (validTokenChars[c] === 1)\n}\n\nconst tokenRegExp = /^[\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]+$/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHTTPToken (characters) {\n  if (characters.length >= 12) return tokenRegExp.test(characters)\n  if (characters.length === 0) return false\n\n  for (let i = 0; i < characters.length; i++) {\n    if (validTokenChars[characters.charCodeAt(i)] !== 1) {\n      return false\n    }\n  }\n  return true\n}\n\n// headerCharRegex have been lifted from\n// https://github.com/nodejs/node/blob/main/lib/_http_common.js\n\n/**\n * Matches if val contains an invalid field-vchar\n *  field-value    = *( field-content / obs-fold )\n *  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n *  field-vchar    = VCHAR / obs-text\n */\nconst headerCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHeaderValue (characters) {\n  return !headerCharRegex.test(characters)\n}\n\nconst rangeHeaderRegex = /^bytes (\\d+)-(\\d+)\\/(\\d+)?$/\n\n/**\n * @typedef {object} RangeHeader\n * @property {number} start\n * @property {number | null} end\n * @property {number | null} size\n */\n\n/**\n * Parse accordingly to RFC 9110\n * @see https://www.rfc-editor.org/rfc/rfc9110#field.content-range\n * @param {string} [range]\n * @returns {RangeHeader|null}\n */\nfunction parseRangeHeader (range) {\n  if (range == null || range === '') return { start: 0, end: null, size: null }\n\n  const m = range ? range.match(rangeHeaderRegex) : null\n  return m\n    ? {\n        start: parseInt(m[1]),\n        end: m[2] ? parseInt(m[2]) : null,\n        size: m[3] ? parseInt(m[3]) : null\n      }\n    : null\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @param {string} name\n * @param {(...args: any[]) => void} listener\n * @returns {T}\n */\nfunction addListener (obj, name, listener) {\n  const listeners = (obj[kListeners] ??= [])\n  listeners.push([name, listener])\n  obj.on(name, listener)\n  return obj\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @returns {T}\n */\nfunction removeAllListeners (obj) {\n  if (obj[kListeners] != null) {\n    for (const [name, listener] of obj[kListeners]) {\n      obj.removeListener(name, listener)\n    }\n    obj[kListeners] = null\n  }\n  return obj\n}\n\n/**\n * @param {import ('../dispatcher/client')} client\n * @param {import ('../core/request')} request\n * @param {Error} err\n */\nfunction errorRequest (client, request, err) {\n  try {\n    request.onError(err)\n    assert(request.aborted)\n  } catch (err) {\n    client.emit('error', err)\n  }\n}\n\n/**\n * @param {WeakRef<net.Socket>} socketWeakRef\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n * @returns {() => void}\n */\nconst setupConnectTimeout = process.platform === 'win32'\n  ? (socketWeakRef, opts) => {\n      if (!opts.timeout) {\n        return noop\n      }\n\n      let s1 = null\n      let s2 = null\n      const fastTimer = timers.setFastTimeout(() => {\n      // setImmediate is added to make sure that we prioritize socket error events over timeouts\n        s1 = setImmediate(() => {\n        // Windows needs an extra setImmediate probably due to implementation differences in the socket logic\n          s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts))\n        })\n      }, opts.timeout)\n      return () => {\n        timers.clearFastTimeout(fastTimer)\n        clearImmediate(s1)\n        clearImmediate(s2)\n      }\n    }\n  : (socketWeakRef, opts) => {\n      if (!opts.timeout) {\n        return noop\n      }\n\n      let s1 = null\n      const fastTimer = timers.setFastTimeout(() => {\n      // setImmediate is added to make sure that we prioritize socket error events over timeouts\n        s1 = setImmediate(() => {\n          onConnectTimeout(socketWeakRef.deref(), opts)\n        })\n      }, opts.timeout)\n      return () => {\n        timers.clearFastTimeout(fastTimer)\n        clearImmediate(s1)\n      }\n    }\n\n/**\n * @param {net.Socket} socket\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n */\nfunction onConnectTimeout (socket, opts) {\n  // The socket could be already garbage collected\n  if (socket == null) {\n    return\n  }\n\n  let message = 'Connect Timeout Error'\n  if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {\n    message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`\n  } else {\n    message += ` (attempted address: ${opts.hostname}:${opts.port},`\n  }\n\n  message += ` timeout: ${opts.timeout}ms)`\n\n  destroy(socket, new ConnectTimeoutError(message))\n}\n\n/**\n * @param {string} urlString\n * @returns {string}\n */\nfunction getProtocolFromUrlString (urlString) {\n  if (\n    urlString[0] === 'h' &&\n    urlString[1] === 't' &&\n    urlString[2] === 't' &&\n    urlString[3] === 'p'\n  ) {\n    switch (urlString[4]) {\n      case ':':\n        return 'http:'\n      case 's':\n        if (urlString[5] === ':') {\n          return 'https:'\n        }\n    }\n  }\n  // fallback if none of the usual suspects\n  return urlString.slice(0, urlString.indexOf(':') + 1)\n}\n\nconst kEnumerableProperty = Object.create(null)\nkEnumerableProperty.enumerable = true\n\nconst normalizedMethodRecordsBase = {\n  delete: 'DELETE',\n  DELETE: 'DELETE',\n  get: 'GET',\n  GET: 'GET',\n  head: 'HEAD',\n  HEAD: 'HEAD',\n  options: 'OPTIONS',\n  OPTIONS: 'OPTIONS',\n  post: 'POST',\n  POST: 'POST',\n  put: 'PUT',\n  PUT: 'PUT'\n}\n\nconst normalizedMethodRecords = {\n  ...normalizedMethodRecordsBase,\n  patch: 'patch',\n  PATCH: 'PATCH'\n}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(normalizedMethodRecordsBase, null)\nObject.setPrototypeOf(normalizedMethodRecords, null)\n\nmodule.exports = {\n  kEnumerableProperty,\n  isDisturbed,\n  isBlobLike,\n  parseOrigin,\n  parseURL,\n  getServerName,\n  isStream,\n  isIterable,\n  hasSafeIterator,\n  isAsyncIterable,\n  isDestroyed,\n  headerNameToString,\n  bufferToLowerCasedHeaderName,\n  addListener,\n  removeAllListeners,\n  errorRequest,\n  parseRawHeaders,\n  encodeRawHeaders,\n  parseHeaders,\n  parseKeepAliveTimeout,\n  destroy,\n  bodyLength,\n  deepClone,\n  ReadableStreamFrom,\n  isBuffer,\n  assertRequestHandler,\n  getSocketInfo,\n  isFormDataLike,\n  pathHasQueryOrFragment,\n  serializePathWithQuery,\n  addAbortListener,\n  isValidHTTPToken,\n  isValidHeaderValue,\n  isTokenCharCode,\n  parseRangeHeader,\n  normalizedMethodRecordsBase,\n  normalizedMethodRecords,\n  isValidPort,\n  isHttpOrHttpsPrefixed,\n  nodeMajor,\n  nodeMinor,\n  safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),\n  wrapRequestBody,\n  setupConnectTimeout,\n  getProtocolFromUrlString\n}\n","'use strict'\n\nconst {\n  kConnected,\n  kPending,\n  kRunning,\n  kSize,\n  kFree,\n  kQueued\n} = require('../core/symbols')\n\nclass ClientStats {\n  constructor (client) {\n    this.connected = client[kConnected]\n    this.pending = client[kPending]\n    this.running = client[kRunning]\n    this.size = client[kSize]\n  }\n}\n\nclass PoolStats {\n  constructor (pool) {\n    this.connected = pool[kConnected]\n    this.free = pool[kFree]\n    this.pending = pool[kPending]\n    this.queued = pool[kQueued]\n    this.running = pool[kRunning]\n    this.size = pool[kSize]\n  }\n}\n\nmodule.exports = { ClientStats, PoolStats }\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('node:util')\n\nconst undiciDebugLog = util.debuglog('undici')\nconst fetchDebuglog = util.debuglog('fetch')\nconst websocketDebuglog = util.debuglog('websocket')\n\nconst channels = {\n  // Client\n  beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'),\n  connected: diagnosticsChannel.channel('undici:client:connected'),\n  connectError: diagnosticsChannel.channel('undici:client:connectError'),\n  sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'),\n  // Request\n  create: diagnosticsChannel.channel('undici:request:create'),\n  bodySent: diagnosticsChannel.channel('undici:request:bodySent'),\n  bodyChunkSent: diagnosticsChannel.channel('undici:request:bodyChunkSent'),\n  bodyChunkReceived: diagnosticsChannel.channel('undici:request:bodyChunkReceived'),\n  headers: diagnosticsChannel.channel('undici:request:headers'),\n  trailers: diagnosticsChannel.channel('undici:request:trailers'),\n  error: diagnosticsChannel.channel('undici:request:error'),\n  // WebSocket\n  open: diagnosticsChannel.channel('undici:websocket:open'),\n  close: diagnosticsChannel.channel('undici:websocket:close'),\n  socketError: diagnosticsChannel.channel('undici:websocket:socket_error'),\n  ping: diagnosticsChannel.channel('undici:websocket:ping'),\n  pong: diagnosticsChannel.channel('undici:websocket:pong'),\n  // ProxyAgent\n  proxyConnected: diagnosticsChannel.channel('undici:proxy:connected')\n}\n\nlet isTrackingClientEvents = false\n\nfunction trackClientEvents (debugLog = undiciDebugLog) {\n  if (isTrackingClientEvents) {\n    return\n  }\n\n  // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n  // This can happen when both Node.js built-in undici and undici as a dependency are present\n  if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers ||\n      channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) {\n    isTrackingClientEvents = true\n    return\n  }\n\n  isTrackingClientEvents = true\n\n  diagnosticsChannel.subscribe('undici:client:beforeConnect',\n    evt => {\n      const {\n        connectParams: { version, protocol, port, host }\n      } = evt\n      debugLog(\n        'connecting to %s%s using %s%s',\n        host,\n        port ? `:${port}` : '',\n        protocol,\n        version\n      )\n    })\n\n  diagnosticsChannel.subscribe('undici:client:connected',\n    evt => {\n      const {\n        connectParams: { version, protocol, port, host }\n      } = evt\n      debugLog(\n        'connected to %s%s using %s%s',\n        host,\n        port ? `:${port}` : '',\n        protocol,\n        version\n      )\n    })\n\n  diagnosticsChannel.subscribe('undici:client:connectError',\n    evt => {\n      const {\n        connectParams: { version, protocol, port, host },\n        error\n      } = evt\n      debugLog(\n        'connection to %s%s using %s%s errored - %s',\n        host,\n        port ? `:${port}` : '',\n        protocol,\n        version,\n        error.message\n      )\n    })\n\n  diagnosticsChannel.subscribe('undici:client:sendHeaders',\n    evt => {\n      const {\n        request: { method, path, origin }\n      } = evt\n      debugLog('sending request to %s %s%s', method, origin, path)\n    })\n}\n\nlet isTrackingRequestEvents = false\n\nfunction trackRequestEvents (debugLog = undiciDebugLog) {\n  if (isTrackingRequestEvents) {\n    return\n  }\n\n  // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n  // This can happen when both Node.js built-in undici and undici as a dependency are present\n  if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers ||\n      channels.error.hasSubscribers) {\n    isTrackingRequestEvents = true\n    return\n  }\n\n  isTrackingRequestEvents = true\n\n  diagnosticsChannel.subscribe('undici:request:headers',\n    evt => {\n      const {\n        request: { method, path, origin },\n        response: { statusCode }\n      } = evt\n      debugLog(\n        'received response to %s %s%s - HTTP %d',\n        method,\n        origin,\n        path,\n        statusCode\n      )\n    })\n\n  diagnosticsChannel.subscribe('undici:request:trailers',\n    evt => {\n      const {\n        request: { method, path, origin }\n      } = evt\n      debugLog('trailers received from %s %s%s', method, origin, path)\n    })\n\n  diagnosticsChannel.subscribe('undici:request:error',\n    evt => {\n      const {\n        request: { method, path, origin },\n        error\n      } = evt\n      debugLog(\n        'request to %s %s%s errored - %s',\n        method,\n        origin,\n        path,\n        error.message\n      )\n    })\n}\n\nlet isTrackingWebSocketEvents = false\n\nfunction trackWebSocketEvents (debugLog = websocketDebuglog) {\n  if (isTrackingWebSocketEvents) {\n    return\n  }\n\n  // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n  // This can happen when both Node.js built-in undici and undici as a dependency are present\n  if (channels.open.hasSubscribers || channels.close.hasSubscribers ||\n      channels.socketError.hasSubscribers || channels.ping.hasSubscribers ||\n      channels.pong.hasSubscribers) {\n    isTrackingWebSocketEvents = true\n    return\n  }\n\n  isTrackingWebSocketEvents = true\n\n  diagnosticsChannel.subscribe('undici:websocket:open',\n    evt => {\n      if (evt.address != null) {\n        const { address, port } = evt.address\n        debugLog('connection opened %s%s', address, port ? `:${port}` : '')\n      } else {\n        debugLog('connection opened')\n      }\n    })\n\n  diagnosticsChannel.subscribe('undici:websocket:close',\n    evt => {\n      const { websocket, code, reason } = evt\n      debugLog(\n        'closed connection to %s - %s %s',\n        websocket.url,\n        code,\n        reason\n      )\n    })\n\n  diagnosticsChannel.subscribe('undici:websocket:socket_error',\n    err => {\n      debugLog('connection errored - %s', err.message)\n    })\n\n  diagnosticsChannel.subscribe('undici:websocket:ping',\n    evt => {\n      debugLog('ping received')\n    })\n\n  diagnosticsChannel.subscribe('undici:websocket:pong',\n    evt => {\n      debugLog('pong received')\n    })\n}\n\nif (undiciDebugLog.enabled || fetchDebuglog.enabled) {\n  trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n  trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n}\n\nif (websocketDebuglog.enabled) {\n  trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog)\n  trackWebSocketEvents(websocketDebuglog)\n}\n\nmodule.exports = {\n  channels\n}\n","'use strict'\n\nconst {\n  InvalidArgumentError,\n  NotSupportedError\n} = require('./errors')\nconst assert = require('node:assert')\nconst {\n  isValidHTTPToken,\n  isValidHeaderValue,\n  isStream,\n  destroy,\n  isBuffer,\n  isFormDataLike,\n  isIterable,\n  hasSafeIterator,\n  isBlobLike,\n  serializePathWithQuery,\n  assertRequestHandler,\n  getServerName,\n  normalizedMethodRecords,\n  getProtocolFromUrlString\n} = require('./util')\nconst { channels } = require('./diagnostics.js')\nconst { headerNameLowerCasedRecord } = require('./constants')\n\n// Verifies that a given path is valid does not contain control chars \\x00 to \\x20\nconst invalidPathRegex = /[^\\u0021-\\u00ff]/\n\nconst kHandler = Symbol('handler')\n\nclass Request {\n  constructor (origin, {\n    path,\n    method,\n    body,\n    headers,\n    query,\n    idempotent,\n    blocking,\n    upgrade,\n    headersTimeout,\n    bodyTimeout,\n    reset,\n    expectContinue,\n    servername,\n    throwOnError,\n    maxRedirections,\n    typeOfService\n  }, handler) {\n    if (typeof path !== 'string') {\n      throw new InvalidArgumentError('path must be a string')\n    } else if (\n      path[0] !== '/' &&\n      !(path.startsWith('http://') || path.startsWith('https://')) &&\n      method !== 'CONNECT'\n    ) {\n      throw new InvalidArgumentError('path must be an absolute URL or start with a slash')\n    } else if (invalidPathRegex.test(path)) {\n      throw new InvalidArgumentError('invalid request path')\n    }\n\n    if (typeof method !== 'string') {\n      throw new InvalidArgumentError('method must be a string')\n    } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) {\n      throw new InvalidArgumentError('invalid request method')\n    }\n\n    if (upgrade && typeof upgrade !== 'string') {\n      throw new InvalidArgumentError('upgrade must be a string')\n    }\n\n    if (upgrade && !isValidHeaderValue(upgrade)) {\n      throw new InvalidArgumentError('invalid upgrade header')\n    }\n\n    if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {\n      throw new InvalidArgumentError('invalid headersTimeout')\n    }\n\n    if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {\n      throw new InvalidArgumentError('invalid bodyTimeout')\n    }\n\n    if (reset != null && typeof reset !== 'boolean') {\n      throw new InvalidArgumentError('invalid reset')\n    }\n\n    if (expectContinue != null && typeof expectContinue !== 'boolean') {\n      throw new InvalidArgumentError('invalid expectContinue')\n    }\n\n    if (throwOnError != null) {\n      throw new InvalidArgumentError('invalid throwOnError')\n    }\n\n    if (maxRedirections != null && maxRedirections !== 0) {\n      throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')\n    }\n\n    if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {\n      throw new InvalidArgumentError('typeOfService must be an integer between 0 and 255')\n    }\n\n    this.headersTimeout = headersTimeout\n\n    this.bodyTimeout = bodyTimeout\n\n    this.method = method\n\n    this.typeOfService = typeOfService ?? 0\n\n    this.abort = null\n\n    if (body == null) {\n      this.body = null\n    } else if (isStream(body)) {\n      this.body = body\n\n      const rState = this.body._readableState\n      if (!rState || !rState.autoDestroy) {\n        this.endHandler = function autoDestroy () {\n          destroy(this)\n        }\n        this.body.on('end', this.endHandler)\n      }\n\n      this.errorHandler = err => {\n        if (this.abort) {\n          this.abort(err)\n        } else {\n          this.error = err\n        }\n      }\n      this.body.on('error', this.errorHandler)\n    } else if (isBuffer(body)) {\n      this.body = body.byteLength ? body : null\n    } else if (ArrayBuffer.isView(body)) {\n      this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null\n    } else if (body instanceof ArrayBuffer) {\n      this.body = body.byteLength ? Buffer.from(body) : null\n    } else if (typeof body === 'string') {\n      this.body = body.length ? Buffer.from(body) : null\n    } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) {\n      this.body = body\n    } else {\n      throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')\n    }\n\n    this.completed = false\n    this.aborted = false\n\n    this.upgrade = upgrade || null\n\n    this.path = query ? serializePathWithQuery(path, query) : path\n\n    // TODO: shall we maybe standardize it to an URL object?\n    this.origin = origin\n\n    this.protocol = getProtocolFromUrlString(origin)\n\n    this.idempotent = idempotent == null\n      ? method === 'HEAD' || method === 'GET'\n      : idempotent\n\n    this.blocking = blocking ?? this.method !== 'HEAD'\n\n    this.reset = reset == null ? null : reset\n\n    this.host = null\n\n    this.contentLength = null\n\n    this.contentType = null\n\n    this.headers = []\n\n    // Only for H2\n    this.expectContinue = expectContinue != null ? expectContinue : false\n\n    if (Array.isArray(headers)) {\n      if (headers.length % 2 !== 0) {\n        throw new InvalidArgumentError('headers array must be even')\n      }\n      for (let i = 0; i < headers.length; i += 2) {\n        processHeader(this, headers[i], headers[i + 1])\n      }\n    } else if (headers && typeof headers === 'object') {\n      if (hasSafeIterator(headers)) {\n        for (const header of headers) {\n          if (!Array.isArray(header) || header.length !== 2) {\n            throw new InvalidArgumentError('headers must be in key-value pair format')\n          }\n          processHeader(this, header[0], header[1])\n        }\n      } else {\n        const keys = Object.keys(headers)\n        for (let i = 0; i < keys.length; ++i) {\n          processHeader(this, keys[i], headers[keys[i]])\n        }\n      }\n    } else if (headers != null) {\n      throw new InvalidArgumentError('headers must be an object or an array')\n    }\n\n    assertRequestHandler(handler, method, upgrade)\n\n    this.servername = servername || getServerName(this.host) || null\n\n    this[kHandler] = handler\n\n    if (channels.create.hasSubscribers) {\n      channels.create.publish({ request: this })\n    }\n  }\n\n  onBodySent (chunk) {\n    if (channels.bodyChunkSent.hasSubscribers) {\n      channels.bodyChunkSent.publish({ request: this, chunk })\n    }\n    if (this[kHandler].onBodySent) {\n      try {\n        return this[kHandler].onBodySent(chunk)\n      } catch (err) {\n        this.abort(err)\n      }\n    }\n  }\n\n  onRequestSent () {\n    if (channels.bodySent.hasSubscribers) {\n      channels.bodySent.publish({ request: this })\n    }\n\n    if (this[kHandler].onRequestSent) {\n      try {\n        return this[kHandler].onRequestSent()\n      } catch (err) {\n        this.abort(err)\n      }\n    }\n  }\n\n  onConnect (abort) {\n    assert(!this.aborted)\n    assert(!this.completed)\n\n    if (this.error) {\n      abort(this.error)\n    } else {\n      this.abort = abort\n      return this[kHandler].onConnect(abort)\n    }\n  }\n\n  onResponseStarted () {\n    return this[kHandler].onResponseStarted?.()\n  }\n\n  onHeaders (statusCode, headers, resume, statusText) {\n    assert(!this.aborted)\n    assert(!this.completed)\n\n    if (channels.headers.hasSubscribers) {\n      channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })\n    }\n\n    try {\n      return this[kHandler].onHeaders(statusCode, headers, resume, statusText)\n    } catch (err) {\n      this.abort(err)\n    }\n  }\n\n  onData (chunk) {\n    assert(!this.aborted)\n    assert(!this.completed)\n\n    if (channels.bodyChunkReceived.hasSubscribers) {\n      channels.bodyChunkReceived.publish({ request: this, chunk })\n    }\n    try {\n      return this[kHandler].onData(chunk)\n    } catch (err) {\n      this.abort(err)\n      return false\n    }\n  }\n\n  onUpgrade (statusCode, headers, socket) {\n    assert(!this.aborted)\n    assert(!this.completed)\n\n    return this[kHandler].onUpgrade(statusCode, headers, socket)\n  }\n\n  onComplete (trailers) {\n    this.onFinally()\n\n    assert(!this.aborted)\n    assert(!this.completed)\n\n    this.completed = true\n    if (channels.trailers.hasSubscribers) {\n      channels.trailers.publish({ request: this, trailers })\n    }\n\n    try {\n      return this[kHandler].onComplete(trailers)\n    } catch (err) {\n      // TODO (fix): This might be a bad idea?\n      this.onError(err)\n    }\n  }\n\n  onError (error) {\n    this.onFinally()\n\n    if (channels.error.hasSubscribers) {\n      channels.error.publish({ request: this, error })\n    }\n\n    if (this.aborted) {\n      return\n    }\n    this.aborted = true\n\n    return this[kHandler].onError(error)\n  }\n\n  onFinally () {\n    if (this.errorHandler) {\n      this.body.off('error', this.errorHandler)\n      this.errorHandler = null\n    }\n\n    if (this.endHandler) {\n      this.body.off('end', this.endHandler)\n      this.endHandler = null\n    }\n  }\n\n  addHeader (key, value) {\n    processHeader(this, key, value)\n    return this\n  }\n}\n\nfunction processHeader (request, key, val) {\n  if (val && (typeof val === 'object' && !Array.isArray(val))) {\n    throw new InvalidArgumentError(`invalid ${key} header`)\n  } else if (val === undefined) {\n    return\n  }\n\n  let headerName = headerNameLowerCasedRecord[key]\n\n  if (headerName === undefined) {\n    headerName = key.toLowerCase()\n    if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) {\n      throw new InvalidArgumentError('invalid header key')\n    }\n  }\n\n  if (Array.isArray(val)) {\n    const arr = []\n    for (let i = 0; i < val.length; i++) {\n      if (typeof val[i] === 'string') {\n        if (!isValidHeaderValue(val[i])) {\n          throw new InvalidArgumentError(`invalid ${key} header`)\n        }\n        arr.push(val[i])\n      } else if (val[i] === null) {\n        arr.push('')\n      } else if (typeof val[i] === 'object') {\n        throw new InvalidArgumentError(`invalid ${key} header`)\n      } else {\n        arr.push(`${val[i]}`)\n      }\n    }\n    val = arr\n  } else if (typeof val === 'string') {\n    if (!isValidHeaderValue(val)) {\n      throw new InvalidArgumentError(`invalid ${key} header`)\n    }\n  } else if (val === null) {\n    val = ''\n  } else {\n    val = `${val}`\n  }\n\n  if (headerName === 'host') {\n    if (request.host !== null) {\n      throw new InvalidArgumentError('duplicate host header')\n    }\n    if (typeof val !== 'string') {\n      throw new InvalidArgumentError('invalid host header')\n    }\n    // Consumed by Client\n    request.host = val\n  } else if (headerName === 'content-length') {\n    if (request.contentLength !== null) {\n      throw new InvalidArgumentError('duplicate content-length header')\n    }\n    request.contentLength = parseInt(val, 10)\n    if (!Number.isFinite(request.contentLength)) {\n      throw new InvalidArgumentError('invalid content-length header')\n    }\n  } else if (request.contentType === null && headerName === 'content-type') {\n    request.contentType = val\n    request.headers.push(key, val)\n  } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {\n    throw new InvalidArgumentError(`invalid ${headerName} header`)\n  } else if (headerName === 'connection') {\n    // Per RFC 7230 Section 6.1, Connection header can contain\n    // a comma-separated list of connection option tokens (header names)\n    const value = typeof val === 'string' ? val : null\n    if (value === null) {\n      throw new InvalidArgumentError('invalid connection header')\n    }\n\n    for (const token of value.toLowerCase().split(',')) {\n      const trimmed = token.trim()\n      if (!isValidHTTPToken(trimmed)) {\n        throw new InvalidArgumentError('invalid connection header')\n      }\n      if (trimmed === 'close') {\n        request.reset = true\n      }\n    }\n  } else if (headerName === 'expect') {\n    throw new NotSupportedError('expect header not supported')\n  } else {\n    request.headers.push(key, val)\n  }\n}\n\nmodule.exports = Request\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\n\nmodule.exports = class WrapHandler {\n  #handler\n\n  constructor (handler) {\n    this.#handler = handler\n  }\n\n  static wrap (handler) {\n    // TODO (fix): More checks...\n    return handler.onRequestStart ? handler : new WrapHandler(handler)\n  }\n\n  // Unwrap Interface\n\n  onConnect (abort, context) {\n    return this.#handler.onConnect?.(abort, context)\n  }\n\n  onResponseStarted () {\n    return this.#handler.onResponseStarted?.()\n  }\n\n  onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n    return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage)\n  }\n\n  onUpgrade (statusCode, rawHeaders, socket) {\n    return this.#handler.onUpgrade?.(statusCode, rawHeaders, socket)\n  }\n\n  onData (data) {\n    return this.#handler.onData?.(data)\n  }\n\n  onComplete (trailers) {\n    return this.#handler.onComplete?.(trailers)\n  }\n\n  onError (err) {\n    if (!this.#handler.onError) {\n      throw err\n    }\n\n    return this.#handler.onError?.(err)\n  }\n\n  // Wrap Interface\n\n  onRequestStart (controller, context) {\n    this.#handler.onConnect?.((reason) => controller.abort(reason), context)\n  }\n\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    const rawHeaders = []\n    for (const [key, val] of Object.entries(headers)) {\n      rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val))\n    }\n\n    this.#handler.onUpgrade?.(statusCode, rawHeaders, socket)\n  }\n\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    const rawHeaders = []\n    for (const [key, val] of Object.entries(headers)) {\n      rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val))\n    }\n\n    if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {\n      controller.pause()\n    }\n  }\n\n  onResponseData (controller, data) {\n    if (this.#handler.onData?.(data) === false) {\n      controller.pause()\n    }\n  }\n\n  onResponseEnd (controller, trailers) {\n    const rawTrailers = []\n    for (const [key, val] of Object.entries(trailers)) {\n      rawTrailers.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val))\n    }\n\n    this.#handler.onComplete?.(rawTrailers)\n  }\n\n  onResponseError (controller, err) {\n    if (!this.#handler.onError) {\n      throw new InvalidArgumentError('invalid onError method')\n    }\n\n    this.#handler.onError?.(err)\n  }\n}\n\nfunction toRawHeaderValue (value) {\n  return Array.isArray(value)\n    ? value.map((item) => Buffer.from(item, 'latin1'))\n    : Buffer.from(value, 'latin1')\n}\n","'use strict'\nconst EventEmitter = require('node:events')\nconst WrapHandler = require('../handler/wrap-handler')\n\nconst wrapInterceptor = (dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler))\n\nclass Dispatcher extends EventEmitter {\n  dispatch () {\n    throw new Error('not implemented')\n  }\n\n  close () {\n    throw new Error('not implemented')\n  }\n\n  destroy () {\n    throw new Error('not implemented')\n  }\n\n  compose (...args) {\n    // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...\n    const interceptors = Array.isArray(args[0]) ? args[0] : args\n    let dispatch = this.dispatch.bind(this)\n\n    for (const interceptor of interceptors) {\n      if (interceptor == null) {\n        continue\n      }\n\n      if (typeof interceptor !== 'function') {\n        throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)\n      }\n\n      dispatch = interceptor(dispatch)\n      dispatch = wrapInterceptor(dispatch)\n\n      if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {\n        throw new TypeError('invalid interceptor')\n      }\n    }\n\n    return new Proxy(this, {\n      get: (target, key) => key === 'dispatch' ? dispatch : target[key]\n    })\n  }\n}\n\nmodule.exports = Dispatcher\n","'use strict'\n\nconst { parseHeaders } = require('../core/util')\nconst { InvalidArgumentError } = require('../core/errors')\n\nconst kResume = Symbol('resume')\n\nclass UnwrapController {\n  #paused = false\n  #reason = null\n  #aborted = false\n  #abort\n\n  [kResume] = null\n\n  constructor (abort) {\n    this.#abort = abort\n  }\n\n  pause () {\n    this.#paused = true\n  }\n\n  resume () {\n    if (this.#paused) {\n      this.#paused = false\n      this[kResume]?.()\n    }\n  }\n\n  abort (reason) {\n    if (!this.#aborted) {\n      this.#aborted = true\n      this.#reason = reason\n      this.#abort(reason)\n    }\n  }\n\n  get aborted () {\n    return this.#aborted\n  }\n\n  get reason () {\n    return this.#reason\n  }\n\n  get paused () {\n    return this.#paused\n  }\n}\n\nmodule.exports = class UnwrapHandler {\n  #handler\n  #controller\n\n  constructor (handler) {\n    this.#handler = handler\n  }\n\n  static unwrap (handler) {\n    // TODO (fix): More checks...\n    return !handler.onRequestStart ? handler : new UnwrapHandler(handler)\n  }\n\n  onConnect (abort, context) {\n    this.#controller = new UnwrapController(abort)\n    this.#handler.onRequestStart?.(this.#controller, context)\n  }\n\n  onResponseStarted () {\n    return this.#handler.onResponseStarted?.()\n  }\n\n  onUpgrade (statusCode, rawHeaders, socket) {\n    this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket)\n  }\n\n  onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n    this.#controller[kResume] = resume\n    this.#handler.onResponseStart?.(this.#controller, statusCode, parseHeaders(rawHeaders), statusMessage)\n    return !this.#controller.paused\n  }\n\n  onData (data) {\n    this.#handler.onResponseData?.(this.#controller, data)\n    return !this.#controller.paused\n  }\n\n  onComplete (rawTrailers) {\n    this.#handler.onResponseEnd?.(this.#controller, parseHeaders(rawTrailers))\n  }\n\n  onError (err) {\n    if (!this.#handler.onResponseError) {\n      throw new InvalidArgumentError('invalid onError method')\n    }\n\n    this.#handler.onResponseError?.(this.#controller, err)\n  }\n}\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst UnwrapHandler = require('../handler/unwrap-handler')\nconst {\n  ClientDestroyedError,\n  ClientClosedError,\n  InvalidArgumentError\n} = require('../core/errors')\nconst { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require('../core/symbols')\n\nconst kOnDestroyed = Symbol('onDestroyed')\nconst kOnClosed = Symbol('onClosed')\n\nclass DispatcherBase extends Dispatcher {\n  /** @type {boolean} */\n  [kDestroyed] = false;\n\n  /** @type {Array<Function|null} */\n  [kOnDestroyed] = null;\n\n  /** @type {boolean} */\n  [kClosed] = false;\n\n  /** @type {Array<Function>|null} */\n  [kOnClosed] = null\n\n  /** @returns {boolean} */\n  get destroyed () {\n    return this[kDestroyed]\n  }\n\n  /** @returns {boolean} */\n  get closed () {\n    return this[kClosed]\n  }\n\n  close (callback) {\n    if (callback === undefined) {\n      return new Promise((resolve, reject) => {\n        this.close((err, data) => {\n          return err ? reject(err) : resolve(data)\n        })\n      })\n    }\n\n    if (typeof callback !== 'function') {\n      throw new InvalidArgumentError('invalid callback')\n    }\n\n    if (this[kDestroyed]) {\n      const err = new ClientDestroyedError()\n      queueMicrotask(() => callback(err, null))\n      return\n    }\n\n    if (this[kClosed]) {\n      if (this[kOnClosed]) {\n        this[kOnClosed].push(callback)\n      } else {\n        queueMicrotask(() => callback(null, null))\n      }\n      return\n    }\n\n    this[kClosed] = true\n    this[kOnClosed] ??= []\n    this[kOnClosed].push(callback)\n\n    const onClosed = () => {\n      const callbacks = this[kOnClosed]\n      this[kOnClosed] = null\n      for (let i = 0; i < callbacks.length; i++) {\n        callbacks[i](null, null)\n      }\n    }\n\n    // Should not error.\n    this[kClose]()\n      .then(() => this.destroy())\n      .then(() => queueMicrotask(onClosed))\n  }\n\n  destroy (err, callback) {\n    if (typeof err === 'function') {\n      callback = err\n      err = null\n    }\n\n    if (callback === undefined) {\n      return new Promise((resolve, reject) => {\n        this.destroy(err, (err, data) => {\n          return err ? reject(err) : resolve(data)\n        })\n      })\n    }\n\n    if (typeof callback !== 'function') {\n      throw new InvalidArgumentError('invalid callback')\n    }\n\n    if (this[kDestroyed]) {\n      if (this[kOnDestroyed]) {\n        this[kOnDestroyed].push(callback)\n      } else {\n        queueMicrotask(() => callback(null, null))\n      }\n      return\n    }\n\n    if (!err) {\n      err = new ClientDestroyedError()\n    }\n\n    this[kDestroyed] = true\n    this[kOnDestroyed] ??= []\n    this[kOnDestroyed].push(callback)\n\n    const onDestroyed = () => {\n      const callbacks = this[kOnDestroyed]\n      this[kOnDestroyed] = null\n      for (let i = 0; i < callbacks.length; i++) {\n        callbacks[i](null, null)\n      }\n    }\n\n    // Should not error.\n    this[kDestroy](err)\n      .then(() => queueMicrotask(onDestroyed))\n  }\n\n  dispatch (opts, handler) {\n    if (!handler || typeof handler !== 'object') {\n      throw new InvalidArgumentError('handler must be an object')\n    }\n\n    handler = UnwrapHandler.unwrap(handler)\n\n    try {\n      if (!opts || typeof opts !== 'object') {\n        throw new InvalidArgumentError('opts must be an object.')\n      }\n\n      if (this[kDestroyed] || this[kOnDestroyed]) {\n        throw new ClientDestroyedError()\n      }\n\n      if (this[kClosed]) {\n        throw new ClientClosedError()\n      }\n\n      return this[kDispatch](opts, handler)\n    } catch (err) {\n      if (typeof handler.onError !== 'function') {\n        throw err\n      }\n\n      handler.onError(err)\n\n      return false\n    }\n  }\n}\n\nmodule.exports = DispatcherBase\n","'use strict'\n\nconst net = require('node:net')\nconst assert = require('node:assert')\nconst util = require('./util')\nconst { InvalidArgumentError } = require('./errors')\n\nlet tls // include tls conditionally since it is not always available\n\n// TODO: session re-use does not wait for the first\n// connection to resolve the session and might therefore\n// resolve the same servername multiple times even when\n// re-use is enabled.\n\nconst SessionCache = class WeakSessionCache {\n  constructor (maxCachedSessions) {\n    this._maxCachedSessions = maxCachedSessions\n    this._sessionCache = new Map()\n    this._sessionRegistry = new FinalizationRegistry((key) => {\n      if (this._sessionCache.size < this._maxCachedSessions) {\n        return\n      }\n\n      const ref = this._sessionCache.get(key)\n      if (ref !== undefined && ref.deref() === undefined) {\n        this._sessionCache.delete(key)\n      }\n    })\n  }\n\n  get (sessionKey) {\n    const ref = this._sessionCache.get(sessionKey)\n    return ref ? ref.deref() : null\n  }\n\n  set (sessionKey, session) {\n    if (this._maxCachedSessions === 0) {\n      return\n    }\n\n    this._sessionCache.set(sessionKey, new WeakRef(session))\n    this._sessionRegistry.register(session, sessionKey)\n  }\n}\n\nfunction buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {\n  if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {\n    throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')\n  }\n\n  const options = { path: socketPath, ...opts }\n  const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)\n  timeout = timeout == null ? 10e3 : timeout\n  allowH2 = allowH2 != null ? allowH2 : false\n  return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {\n    let socket\n    if (protocol === 'https:') {\n      if (!tls) {\n        tls = require('node:tls')\n      }\n      servername = servername || options.servername || util.getServerName(host) || null\n\n      const sessionKey = servername || hostname\n      assert(sessionKey)\n\n      const session = customSession || sessionCache.get(sessionKey) || null\n\n      port = port || 443\n\n      socket = tls.connect({\n        highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...\n        ...options,\n        servername,\n        session,\n        localAddress,\n        ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],\n        socket: httpSocket, // upgrade socket connection\n        port,\n        host: hostname\n      })\n\n      socket\n        .on('session', function (session) {\n          // TODO (fix): Can a session become invalid once established? Don't think so?\n          sessionCache.set(sessionKey, session)\n        })\n    } else {\n      assert(!httpSocket, 'httpSocket can only be sent on TLS update')\n\n      port = port || 80\n\n      socket = net.connect({\n        highWaterMark: 64 * 1024, // Same as nodejs fs streams.\n        ...options,\n        localAddress,\n        port,\n        host: hostname\n      })\n      if (useH2c === true) {\n        socket.alpnProtocol = 'h2'\n      }\n    }\n\n    // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket\n    if (options.keepAlive == null || options.keepAlive) {\n      const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay\n      socket.setKeepAlive(true, keepAliveInitialDelay)\n    }\n\n    const clearConnectTimeout = util.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port })\n\n    socket\n      .setNoDelay(true)\n      .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {\n        queueMicrotask(clearConnectTimeout)\n\n        if (callback) {\n          const cb = callback\n          callback = null\n          cb(null, this)\n        }\n      })\n      .on('error', function (err) {\n        queueMicrotask(clearConnectTimeout)\n\n        if (callback) {\n          const cb = callback\n          callback = null\n          cb(err)\n        }\n      })\n\n    return socket\n  }\n}\n\nmodule.exports = buildConnector\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.enumToMap = enumToMap;\nfunction enumToMap(obj, filter = [], exceptions = []) {\n    const emptyFilter = (filter?.length ?? 0) === 0;\n    const emptyExceptions = (exceptions?.length ?? 0) === 0;\n    return Object.fromEntries(Object.entries(obj).filter(([, value]) => {\n        return (typeof value === 'number' &&\n            (emptyFilter || filter.includes(value)) &&\n            (emptyExceptions || !exceptions.includes(value)));\n    }));\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;\nconst utils_1 = require(\"./utils\");\n// Emums\nexports.ERROR = {\n    OK: 0,\n    INTERNAL: 1,\n    STRICT: 2,\n    CR_EXPECTED: 25,\n    LF_EXPECTED: 3,\n    UNEXPECTED_CONTENT_LENGTH: 4,\n    UNEXPECTED_SPACE: 30,\n    CLOSED_CONNECTION: 5,\n    INVALID_METHOD: 6,\n    INVALID_URL: 7,\n    INVALID_CONSTANT: 8,\n    INVALID_VERSION: 9,\n    INVALID_HEADER_TOKEN: 10,\n    INVALID_CONTENT_LENGTH: 11,\n    INVALID_CHUNK_SIZE: 12,\n    INVALID_STATUS: 13,\n    INVALID_EOF_STATE: 14,\n    INVALID_TRANSFER_ENCODING: 15,\n    CB_MESSAGE_BEGIN: 16,\n    CB_HEADERS_COMPLETE: 17,\n    CB_MESSAGE_COMPLETE: 18,\n    CB_CHUNK_HEADER: 19,\n    CB_CHUNK_COMPLETE: 20,\n    PAUSED: 21,\n    PAUSED_UPGRADE: 22,\n    PAUSED_H2_UPGRADE: 23,\n    USER: 24,\n    CB_URL_COMPLETE: 26,\n    CB_STATUS_COMPLETE: 27,\n    CB_METHOD_COMPLETE: 32,\n    CB_VERSION_COMPLETE: 33,\n    CB_HEADER_FIELD_COMPLETE: 28,\n    CB_HEADER_VALUE_COMPLETE: 29,\n    CB_CHUNK_EXTENSION_NAME_COMPLETE: 34,\n    CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35,\n    CB_RESET: 31,\n    CB_PROTOCOL_COMPLETE: 38,\n};\nexports.TYPE = {\n    BOTH: 0, // default\n    REQUEST: 1,\n    RESPONSE: 2,\n};\nexports.FLAGS = {\n    CONNECTION_KEEP_ALIVE: 1 << 0,\n    CONNECTION_CLOSE: 1 << 1,\n    CONNECTION_UPGRADE: 1 << 2,\n    CHUNKED: 1 << 3,\n    UPGRADE: 1 << 4,\n    CONTENT_LENGTH: 1 << 5,\n    SKIPBODY: 1 << 6,\n    TRAILING: 1 << 7,\n    // 1 << 8 is unused\n    TRANSFER_ENCODING: 1 << 9,\n};\nexports.LENIENT_FLAGS = {\n    HEADERS: 1 << 0,\n    CHUNKED_LENGTH: 1 << 1,\n    KEEP_ALIVE: 1 << 2,\n    TRANSFER_ENCODING: 1 << 3,\n    VERSION: 1 << 4,\n    DATA_AFTER_CLOSE: 1 << 5,\n    OPTIONAL_LF_AFTER_CR: 1 << 6,\n    OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7,\n    OPTIONAL_CR_BEFORE_LF: 1 << 8,\n    SPACES_AFTER_CHUNK_SIZE: 1 << 9,\n};\nexports.METHODS = {\n    'DELETE': 0,\n    'GET': 1,\n    'HEAD': 2,\n    'POST': 3,\n    'PUT': 4,\n    /* pathological */\n    'CONNECT': 5,\n    'OPTIONS': 6,\n    'TRACE': 7,\n    /* WebDAV */\n    'COPY': 8,\n    'LOCK': 9,\n    'MKCOL': 10,\n    'MOVE': 11,\n    'PROPFIND': 12,\n    'PROPPATCH': 13,\n    'SEARCH': 14,\n    'UNLOCK': 15,\n    'BIND': 16,\n    'REBIND': 17,\n    'UNBIND': 18,\n    'ACL': 19,\n    /* subversion */\n    'REPORT': 20,\n    'MKACTIVITY': 21,\n    'CHECKOUT': 22,\n    'MERGE': 23,\n    /* upnp */\n    'M-SEARCH': 24,\n    'NOTIFY': 25,\n    'SUBSCRIBE': 26,\n    'UNSUBSCRIBE': 27,\n    /* RFC-5789 */\n    'PATCH': 28,\n    'PURGE': 29,\n    /* CalDAV */\n    'MKCALENDAR': 30,\n    /* RFC-2068, section 19.6.1.2 */\n    'LINK': 31,\n    'UNLINK': 32,\n    /* icecast */\n    'SOURCE': 33,\n    /* RFC-7540, section 11.6 */\n    'PRI': 34,\n    /* RFC-2326 RTSP */\n    'DESCRIBE': 35,\n    'ANNOUNCE': 36,\n    'SETUP': 37,\n    'PLAY': 38,\n    'PAUSE': 39,\n    'TEARDOWN': 40,\n    'GET_PARAMETER': 41,\n    'SET_PARAMETER': 42,\n    'REDIRECT': 43,\n    'RECORD': 44,\n    /* RAOP */\n    'FLUSH': 45,\n    /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */\n    'QUERY': 46,\n};\nexports.STATUSES = {\n    CONTINUE: 100,\n    SWITCHING_PROTOCOLS: 101,\n    PROCESSING: 102,\n    EARLY_HINTS: 103,\n    RESPONSE_IS_STALE: 110, // Unofficial\n    REVALIDATION_FAILED: 111, // Unofficial\n    DISCONNECTED_OPERATION: 112, // Unofficial\n    HEURISTIC_EXPIRATION: 113, // Unofficial\n    MISCELLANEOUS_WARNING: 199, // Unofficial\n    OK: 200,\n    CREATED: 201,\n    ACCEPTED: 202,\n    NON_AUTHORITATIVE_INFORMATION: 203,\n    NO_CONTENT: 204,\n    RESET_CONTENT: 205,\n    PARTIAL_CONTENT: 206,\n    MULTI_STATUS: 207,\n    ALREADY_REPORTED: 208,\n    TRANSFORMATION_APPLIED: 214, // Unofficial\n    IM_USED: 226,\n    MISCELLANEOUS_PERSISTENT_WARNING: 299, // Unofficial\n    MULTIPLE_CHOICES: 300,\n    MOVED_PERMANENTLY: 301,\n    FOUND: 302,\n    SEE_OTHER: 303,\n    NOT_MODIFIED: 304,\n    USE_PROXY: 305,\n    SWITCH_PROXY: 306, // No longer used\n    TEMPORARY_REDIRECT: 307,\n    PERMANENT_REDIRECT: 308,\n    BAD_REQUEST: 400,\n    UNAUTHORIZED: 401,\n    PAYMENT_REQUIRED: 402,\n    FORBIDDEN: 403,\n    NOT_FOUND: 404,\n    METHOD_NOT_ALLOWED: 405,\n    NOT_ACCEPTABLE: 406,\n    PROXY_AUTHENTICATION_REQUIRED: 407,\n    REQUEST_TIMEOUT: 408,\n    CONFLICT: 409,\n    GONE: 410,\n    LENGTH_REQUIRED: 411,\n    PRECONDITION_FAILED: 412,\n    PAYLOAD_TOO_LARGE: 413,\n    URI_TOO_LONG: 414,\n    UNSUPPORTED_MEDIA_TYPE: 415,\n    RANGE_NOT_SATISFIABLE: 416,\n    EXPECTATION_FAILED: 417,\n    IM_A_TEAPOT: 418,\n    PAGE_EXPIRED: 419, // Unofficial\n    ENHANCE_YOUR_CALM: 420, // Unofficial\n    MISDIRECTED_REQUEST: 421,\n    UNPROCESSABLE_ENTITY: 422,\n    LOCKED: 423,\n    FAILED_DEPENDENCY: 424,\n    TOO_EARLY: 425,\n    UPGRADE_REQUIRED: 426,\n    PRECONDITION_REQUIRED: 428,\n    TOO_MANY_REQUESTS: 429,\n    REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, // Unofficial\n    REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n    LOGIN_TIMEOUT: 440, // Unofficial\n    NO_RESPONSE: 444, // Unofficial\n    RETRY_WITH: 449, // Unofficial\n    BLOCKED_BY_PARENTAL_CONTROL: 450, // Unofficial\n    UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n    CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, // Unofficial\n    INVALID_X_FORWARDED_FOR: 463, // Unofficial\n    REQUEST_HEADER_TOO_LARGE: 494, // Unofficial\n    SSL_CERTIFICATE_ERROR: 495, // Unofficial\n    SSL_CERTIFICATE_REQUIRED: 496, // Unofficial\n    HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, // Unofficial\n    INVALID_TOKEN: 498, // Unofficial\n    CLIENT_CLOSED_REQUEST: 499, // Unofficial\n    INTERNAL_SERVER_ERROR: 500,\n    NOT_IMPLEMENTED: 501,\n    BAD_GATEWAY: 502,\n    SERVICE_UNAVAILABLE: 503,\n    GATEWAY_TIMEOUT: 504,\n    HTTP_VERSION_NOT_SUPPORTED: 505,\n    VARIANT_ALSO_NEGOTIATES: 506,\n    INSUFFICIENT_STORAGE: 507,\n    LOOP_DETECTED: 508,\n    BANDWIDTH_LIMIT_EXCEEDED: 509,\n    NOT_EXTENDED: 510,\n    NETWORK_AUTHENTICATION_REQUIRED: 511,\n    WEB_SERVER_UNKNOWN_ERROR: 520, // Unofficial\n    WEB_SERVER_IS_DOWN: 521, // Unofficial\n    CONNECTION_TIMEOUT: 522, // Unofficial\n    ORIGIN_IS_UNREACHABLE: 523, // Unofficial\n    TIMEOUT_OCCURED: 524, // Unofficial\n    SSL_HANDSHAKE_FAILED: 525, // Unofficial\n    INVALID_SSL_CERTIFICATE: 526, // Unofficial\n    RAILGUN_ERROR: 527, // Unofficial\n    SITE_IS_OVERLOADED: 529, // Unofficial\n    SITE_IS_FROZEN: 530, // Unofficial\n    IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, // Unofficial\n    NETWORK_READ_TIMEOUT: 598, // Unofficial\n    NETWORK_CONNECT_TIMEOUT: 599, // Unofficial\n};\nexports.FINISH = {\n    SAFE: 0,\n    SAFE_WITH_CB: 1,\n    UNSAFE: 2,\n};\nexports.HEADER_STATE = {\n    GENERAL: 0,\n    CONNECTION: 1,\n    CONTENT_LENGTH: 2,\n    TRANSFER_ENCODING: 3,\n    UPGRADE: 4,\n    CONNECTION_KEEP_ALIVE: 5,\n    CONNECTION_CLOSE: 6,\n    CONNECTION_UPGRADE: 7,\n    TRANSFER_ENCODING_CHUNKED: 8,\n};\n// C headers\nexports.METHODS_HTTP = [\n    exports.METHODS.DELETE,\n    exports.METHODS.GET,\n    exports.METHODS.HEAD,\n    exports.METHODS.POST,\n    exports.METHODS.PUT,\n    exports.METHODS.CONNECT,\n    exports.METHODS.OPTIONS,\n    exports.METHODS.TRACE,\n    exports.METHODS.COPY,\n    exports.METHODS.LOCK,\n    exports.METHODS.MKCOL,\n    exports.METHODS.MOVE,\n    exports.METHODS.PROPFIND,\n    exports.METHODS.PROPPATCH,\n    exports.METHODS.SEARCH,\n    exports.METHODS.UNLOCK,\n    exports.METHODS.BIND,\n    exports.METHODS.REBIND,\n    exports.METHODS.UNBIND,\n    exports.METHODS.ACL,\n    exports.METHODS.REPORT,\n    exports.METHODS.MKACTIVITY,\n    exports.METHODS.CHECKOUT,\n    exports.METHODS.MERGE,\n    exports.METHODS['M-SEARCH'],\n    exports.METHODS.NOTIFY,\n    exports.METHODS.SUBSCRIBE,\n    exports.METHODS.UNSUBSCRIBE,\n    exports.METHODS.PATCH,\n    exports.METHODS.PURGE,\n    exports.METHODS.MKCALENDAR,\n    exports.METHODS.LINK,\n    exports.METHODS.UNLINK,\n    exports.METHODS.PRI,\n    // TODO(indutny): should we allow it with HTTP?\n    exports.METHODS.SOURCE,\n    exports.METHODS.QUERY,\n];\nexports.METHODS_ICE = [\n    exports.METHODS.SOURCE,\n];\nexports.METHODS_RTSP = [\n    exports.METHODS.OPTIONS,\n    exports.METHODS.DESCRIBE,\n    exports.METHODS.ANNOUNCE,\n    exports.METHODS.SETUP,\n    exports.METHODS.PLAY,\n    exports.METHODS.PAUSE,\n    exports.METHODS.TEARDOWN,\n    exports.METHODS.GET_PARAMETER,\n    exports.METHODS.SET_PARAMETER,\n    exports.METHODS.REDIRECT,\n    exports.METHODS.RECORD,\n    exports.METHODS.FLUSH,\n    // For AirPlay\n    exports.METHODS.GET,\n    exports.METHODS.POST,\n];\nexports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS);\nexports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith('H')));\nexports.STATUSES_HTTP = [\n    exports.STATUSES.CONTINUE,\n    exports.STATUSES.SWITCHING_PROTOCOLS,\n    exports.STATUSES.PROCESSING,\n    exports.STATUSES.EARLY_HINTS,\n    exports.STATUSES.RESPONSE_IS_STALE,\n    exports.STATUSES.REVALIDATION_FAILED,\n    exports.STATUSES.DISCONNECTED_OPERATION,\n    exports.STATUSES.HEURISTIC_EXPIRATION,\n    exports.STATUSES.MISCELLANEOUS_WARNING,\n    exports.STATUSES.OK,\n    exports.STATUSES.CREATED,\n    exports.STATUSES.ACCEPTED,\n    exports.STATUSES.NON_AUTHORITATIVE_INFORMATION,\n    exports.STATUSES.NO_CONTENT,\n    exports.STATUSES.RESET_CONTENT,\n    exports.STATUSES.PARTIAL_CONTENT,\n    exports.STATUSES.MULTI_STATUS,\n    exports.STATUSES.ALREADY_REPORTED,\n    exports.STATUSES.TRANSFORMATION_APPLIED,\n    exports.STATUSES.IM_USED,\n    exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING,\n    exports.STATUSES.MULTIPLE_CHOICES,\n    exports.STATUSES.MOVED_PERMANENTLY,\n    exports.STATUSES.FOUND,\n    exports.STATUSES.SEE_OTHER,\n    exports.STATUSES.NOT_MODIFIED,\n    exports.STATUSES.USE_PROXY,\n    exports.STATUSES.SWITCH_PROXY,\n    exports.STATUSES.TEMPORARY_REDIRECT,\n    exports.STATUSES.PERMANENT_REDIRECT,\n    exports.STATUSES.BAD_REQUEST,\n    exports.STATUSES.UNAUTHORIZED,\n    exports.STATUSES.PAYMENT_REQUIRED,\n    exports.STATUSES.FORBIDDEN,\n    exports.STATUSES.NOT_FOUND,\n    exports.STATUSES.METHOD_NOT_ALLOWED,\n    exports.STATUSES.NOT_ACCEPTABLE,\n    exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED,\n    exports.STATUSES.REQUEST_TIMEOUT,\n    exports.STATUSES.CONFLICT,\n    exports.STATUSES.GONE,\n    exports.STATUSES.LENGTH_REQUIRED,\n    exports.STATUSES.PRECONDITION_FAILED,\n    exports.STATUSES.PAYLOAD_TOO_LARGE,\n    exports.STATUSES.URI_TOO_LONG,\n    exports.STATUSES.UNSUPPORTED_MEDIA_TYPE,\n    exports.STATUSES.RANGE_NOT_SATISFIABLE,\n    exports.STATUSES.EXPECTATION_FAILED,\n    exports.STATUSES.IM_A_TEAPOT,\n    exports.STATUSES.PAGE_EXPIRED,\n    exports.STATUSES.ENHANCE_YOUR_CALM,\n    exports.STATUSES.MISDIRECTED_REQUEST,\n    exports.STATUSES.UNPROCESSABLE_ENTITY,\n    exports.STATUSES.LOCKED,\n    exports.STATUSES.FAILED_DEPENDENCY,\n    exports.STATUSES.TOO_EARLY,\n    exports.STATUSES.UPGRADE_REQUIRED,\n    exports.STATUSES.PRECONDITION_REQUIRED,\n    exports.STATUSES.TOO_MANY_REQUESTS,\n    exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL,\n    exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE,\n    exports.STATUSES.LOGIN_TIMEOUT,\n    exports.STATUSES.NO_RESPONSE,\n    exports.STATUSES.RETRY_WITH,\n    exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL,\n    exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS,\n    exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST,\n    exports.STATUSES.INVALID_X_FORWARDED_FOR,\n    exports.STATUSES.REQUEST_HEADER_TOO_LARGE,\n    exports.STATUSES.SSL_CERTIFICATE_ERROR,\n    exports.STATUSES.SSL_CERTIFICATE_REQUIRED,\n    exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT,\n    exports.STATUSES.INVALID_TOKEN,\n    exports.STATUSES.CLIENT_CLOSED_REQUEST,\n    exports.STATUSES.INTERNAL_SERVER_ERROR,\n    exports.STATUSES.NOT_IMPLEMENTED,\n    exports.STATUSES.BAD_GATEWAY,\n    exports.STATUSES.SERVICE_UNAVAILABLE,\n    exports.STATUSES.GATEWAY_TIMEOUT,\n    exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED,\n    exports.STATUSES.VARIANT_ALSO_NEGOTIATES,\n    exports.STATUSES.INSUFFICIENT_STORAGE,\n    exports.STATUSES.LOOP_DETECTED,\n    exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED,\n    exports.STATUSES.NOT_EXTENDED,\n    exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED,\n    exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR,\n    exports.STATUSES.WEB_SERVER_IS_DOWN,\n    exports.STATUSES.CONNECTION_TIMEOUT,\n    exports.STATUSES.ORIGIN_IS_UNREACHABLE,\n    exports.STATUSES.TIMEOUT_OCCURED,\n    exports.STATUSES.SSL_HANDSHAKE_FAILED,\n    exports.STATUSES.INVALID_SSL_CERTIFICATE,\n    exports.STATUSES.RAILGUN_ERROR,\n    exports.STATUSES.SITE_IS_OVERLOADED,\n    exports.STATUSES.SITE_IS_FROZEN,\n    exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR,\n    exports.STATUSES.NETWORK_READ_TIMEOUT,\n    exports.STATUSES.NETWORK_CONNECT_TIMEOUT,\n];\nexports.ALPHA = [];\nfor (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {\n    // Upper case\n    exports.ALPHA.push(String.fromCharCode(i));\n    // Lower case\n    exports.ALPHA.push(String.fromCharCode(i + 0x20));\n}\nexports.NUM_MAP = {\n    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n};\nexports.HEX_MAP = {\n    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n    A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,\n    a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,\n};\nexports.NUM = [\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n];\nexports.ALPHANUM = exports.ALPHA.concat(exports.NUM);\nexports.MARK = ['-', '_', '.', '!', '~', '*', '\\'', '(', ')'];\nexports.USERINFO_CHARS = exports.ALPHANUM\n    .concat(exports.MARK)\n    .concat(['%', ';', ':', '&', '=', '+', '$', ',']);\n// TODO(indutny): use RFC\nexports.URL_CHAR = [\n    '!', '\"', '$', '%', '&', '\\'',\n    '(', ')', '*', '+', ',', '-', '.', '/',\n    ':', ';', '<', '=', '>',\n    '@', '[', '\\\\', ']', '^', '_',\n    '`',\n    '{', '|', '}', '~',\n].concat(exports.ALPHANUM);\nexports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);\n/* Tokens as defined by rfc 2616. Also lowercases them.\n *        token       = 1*<any CHAR except CTLs or separators>\n *     separators     = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n *                    | \",\" | \";\" | \":\" | \"\\\" | <\">\n *                    | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n *                    | \"{\" | \"}\" | SP | HT\n */\nexports.TOKEN = [\n    '!', '#', '$', '%', '&', '\\'',\n    '*', '+', '-', '.',\n    '^', '_', '`',\n    '|', '~',\n].concat(exports.ALPHANUM);\n/*\n * Verify that a char is a valid visible (printable) US-ASCII\n * character or %x80-FF\n */\nexports.HEADER_CHARS = ['\\t'];\nfor (let i = 32; i <= 255; i++) {\n    if (i !== 127) {\n        exports.HEADER_CHARS.push(i);\n    }\n}\n// ',' = \\x44\nexports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);\nexports.QUOTED_STRING = ['\\t', ' '];\nfor (let i = 0x21; i <= 0xff; i++) {\n    if (i !== 0x22 && i !== 0x5c) { // All characters in ASCII except \\ and \"\n        exports.QUOTED_STRING.push(i);\n    }\n}\nexports.HTAB_SP_VCHAR_OBS_TEXT = ['\\t', ' '];\n// VCHAR: https://tools.ietf.org/html/rfc5234#appendix-B.1\nfor (let i = 0x21; i <= 0x7E; i++) {\n    exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\n// OBS_TEXT: https://datatracker.ietf.org/doc/html/rfc9110#name-collected-abnf\nfor (let i = 0x80; i <= 0xff; i++) {\n    exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\nexports.MAJOR = exports.NUM_MAP;\nexports.MINOR = exports.MAJOR;\nexports.SPECIAL_HEADERS = {\n    'connection': exports.HEADER_STATE.CONNECTION,\n    'content-length': exports.HEADER_STATE.CONTENT_LENGTH,\n    'proxy-connection': exports.HEADER_STATE.CONNECTION,\n    'transfer-encoding': exports.HEADER_STATE.TRANSFER_ENCODING,\n    'upgrade': exports.HEADER_STATE.UPGRADE,\n};\nexports.default = {\n    ERROR: exports.ERROR,\n    TYPE: exports.TYPE,\n    FLAGS: exports.FLAGS,\n    LENIENT_FLAGS: exports.LENIENT_FLAGS,\n    METHODS: exports.METHODS,\n    STATUSES: exports.STATUSES,\n    FINISH: exports.FINISH,\n    HEADER_STATE: exports.HEADER_STATE,\n    ALPHA: exports.ALPHA,\n    NUM_MAP: exports.NUM_MAP,\n    HEX_MAP: exports.HEX_MAP,\n    NUM: exports.NUM,\n    ALPHANUM: exports.ALPHANUM,\n    MARK: exports.MARK,\n    USERINFO_CHARS: exports.USERINFO_CHARS,\n    URL_CHAR: exports.URL_CHAR,\n    HEX: exports.HEX,\n    TOKEN: exports.TOKEN,\n    HEADER_CHARS: exports.HEADER_CHARS,\n    CONNECTION_TOKEN_CHARS: exports.CONNECTION_TOKEN_CHARS,\n    QUOTED_STRING: exports.QUOTED_STRING,\n    HTAB_SP_VCHAR_OBS_TEXT: exports.HTAB_SP_VCHAR_OBS_TEXT,\n    MAJOR: exports.MAJOR,\n    MINOR: exports.MINOR,\n    SPECIAL_HEADERS: exports.SPECIAL_HEADERS,\n    METHODS_HTTP: exports.METHODS_HTTP,\n    METHODS_ICE: exports.METHODS_ICE,\n    METHODS_RTSP: exports.METHODS_RTSP,\n    METHOD_MAP: exports.METHOD_MAP,\n    H_METHOD_MAP: exports.H_METHOD_MAP,\n    STATUSES_HTTP: exports.STATUSES_HTTP,\n};\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n  get: () => {\n    return wasmBuffer\n      ? wasmBuffer\n      : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n  }\n})\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n  get: () => {\n    return wasmBuffer\n      ? wasmBuffer\n      : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n  }\n})\n","'use strict'\n\nconst corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST'])\nconst corsSafeListedMethodsSet = new Set(corsSafeListedMethods)\n\nconst nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304])\n\nconst redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308])\nconst redirectStatusSet = new Set(redirectStatus)\n\n/**\n * @see https://fetch.spec.whatwg.org/#block-bad-port\n */\nconst badPorts = /** @type {const} */ ([\n  '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',\n  '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',\n  '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',\n  '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',\n  '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679',\n  '6697', '10080'\n])\nconst badPortsSet = new Set(badPorts)\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-header\n */\nconst referrerPolicyTokens = /** @type {const} */ ([\n  'no-referrer',\n  'no-referrer-when-downgrade',\n  'same-origin',\n  'origin',\n  'strict-origin',\n  'origin-when-cross-origin',\n  'strict-origin-when-cross-origin',\n  'unsafe-url'\n])\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies\n */\nconst referrerPolicy = /** @type {const} */ ([\n  '',\n  ...referrerPolicyTokens\n])\nconst referrerPolicyTokensSet = new Set(referrerPolicyTokens)\n\nconst requestRedirect = /** @type {const} */ (['follow', 'manual', 'error'])\n\nconst safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE'])\nconst safeMethodsSet = new Set(safeMethods)\n\nconst requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors'])\n\nconst requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include'])\n\nconst requestCache = /** @type {const} */ ([\n  'default',\n  'no-store',\n  'reload',\n  'no-cache',\n  'force-cache',\n  'only-if-cached'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-body-header-name\n */\nconst requestBodyHeader = /** @type {const} */ ([\n  'content-encoding',\n  'content-language',\n  'content-location',\n  'content-type',\n  // See https://github.com/nodejs/undici/issues/2021\n  // 'Content-Length' is a forbidden header name, which is typically\n  // removed in the Headers implementation. However, undici doesn't\n  // filter out headers, so we add it here.\n  'content-length'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex\n */\nconst requestDuplex = /** @type {const} */ ([\n  'half'\n])\n\n/**\n * @see http://fetch.spec.whatwg.org/#forbidden-method\n */\nconst forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK'])\nconst forbiddenMethodsSet = new Set(forbiddenMethods)\n\nconst subresource = /** @type {const} */ ([\n  'audio',\n  'audioworklet',\n  'font',\n  'image',\n  'manifest',\n  'paintworklet',\n  'script',\n  'style',\n  'track',\n  'video',\n  'xslt',\n  ''\n])\nconst subresourceSet = new Set(subresource)\n\nmodule.exports = {\n  subresource,\n  forbiddenMethods,\n  requestBodyHeader,\n  referrerPolicy,\n  requestRedirect,\n  requestMode,\n  requestCredentials,\n  requestCache,\n  redirectStatus,\n  corsSafeListedMethods,\n  nullBodyStatus,\n  safeMethods,\n  badPorts,\n  requestDuplex,\n  subresourceSet,\n  badPortsSet,\n  redirectStatusSet,\n  corsSafeListedMethodsSet,\n  safeMethodsSet,\n  forbiddenMethodsSet,\n  referrerPolicyTokens: referrerPolicyTokensSet\n}\n","'use strict'\n\n// In case of breaking changes, increase the version\n// number to avoid conflicts.\nconst globalOrigin = Symbol.for('undici.globalOrigin.1')\n\nfunction getGlobalOrigin () {\n  return globalThis[globalOrigin]\n}\n\nfunction setGlobalOrigin (newOrigin) {\n  if (newOrigin === undefined) {\n    Object.defineProperty(globalThis, globalOrigin, {\n      value: undefined,\n      writable: true,\n      enumerable: false,\n      configurable: false\n    })\n\n    return\n  }\n\n  const parsedURL = new URL(newOrigin)\n\n  if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {\n    throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)\n  }\n\n  Object.defineProperty(globalThis, globalOrigin, {\n    value: parsedURL,\n    writable: true,\n    enumerable: false,\n    configurable: false\n  })\n}\n\nmodule.exports = {\n  getGlobalOrigin,\n  setGlobalOrigin\n}\n","'use strict'\n\nconst textDecoder = new TextDecoder()\n\n/**\n * @see https://encoding.spec.whatwg.org/#utf-8-decode\n * @param {Uint8Array} buffer\n */\nfunction utf8DecodeBytes (buffer) {\n  if (buffer.length === 0) {\n    return ''\n  }\n\n  // 1. Let buffer be the result of peeking three bytes from\n  //    ioQueue, converted to a byte sequence.\n\n  // 2. If buffer is 0xEF 0xBB 0xBF, then read three\n  //    bytes from ioQueue. (Do nothing with those bytes.)\n  if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n    buffer = buffer.subarray(3)\n  }\n\n  // 3. Process a queue with an instance of UTF-8’s\n  //    decoder, ioQueue, output, and \"replacement\".\n  const output = textDecoder.decode(buffer)\n\n  // 4. Return output.\n  return output\n}\n\nmodule.exports = {\n  utf8DecodeBytes\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { utf8DecodeBytes } = require('../../encoding')\n\n/**\n * @param {(char: string) => boolean} condition\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePoints (condition, input, position) {\n  // 1. Let result be the empty string.\n  let result = ''\n\n  // 2. While position doesn’t point past the end of input and the\n  // code point at position within input meets the condition condition:\n  while (position.position < input.length && condition(input[position.position])) {\n    // 1. Append that code point to the end of result.\n    result += input[position.position]\n\n    // 2. Advance position by 1.\n    position.position++\n  }\n\n  // 3. Return result.\n  return result\n}\n\n/**\n * A faster collectASequenceOfCodePoints that only works when comparing a single character.\n * @param {string} char\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePointsFast (char, input, position) {\n  const idx = input.indexOf(char, position.position)\n  const start = position.position\n\n  if (idx === -1) {\n    position.position = input.length\n    return input.slice(start)\n  }\n\n  position.position = idx\n  return input.slice(start, position.position)\n}\n\nconst ASCII_WHITESPACE_REPLACE_REGEX = /[\\u0009\\u000A\\u000C\\u000D\\u0020]/g // eslint-disable-line no-control-regex\n\n/**\n * @param {string} data\n * @returns {Uint8Array | 'failure'}\n *\n * @see https://infra.spec.whatwg.org/#forgiving-base64-decode\n */\nfunction forgivingBase64 (data) {\n  // 1. Remove all ASCII whitespace from data.\n  data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '')\n\n  let dataLength = data.length\n  // 2. If data’s code point length divides by 4 leaving\n  // no remainder, then:\n  if (dataLength % 4 === 0) {\n    // 1. If data ends with one or two U+003D (=) code points,\n    // then remove them from data.\n    if (data.charCodeAt(dataLength - 1) === 0x003D) {\n      --dataLength\n      if (data.charCodeAt(dataLength - 1) === 0x003D) {\n        --dataLength\n      }\n    }\n  }\n\n  // 3. If data’s code point length divides by 4 leaving\n  // a remainder of 1, then return failure.\n  if (dataLength % 4 === 1) {\n    return 'failure'\n  }\n\n  // 4. If data contains a code point that is not one of\n  //  U+002B (+)\n  //  U+002F (/)\n  //  ASCII alphanumeric\n  // then return failure.\n  if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {\n    return 'failure'\n  }\n\n  const buffer = Buffer.from(data, 'base64')\n  return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n}\n\n/**\n * @param {number} char\n * @returns {boolean}\n *\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n */\nfunction isASCIIWhitespace (char) {\n  return (\n    char === 0x09 || // \\t\n    char === 0x0a || // \\n\n    char === 0x0c || // \\f\n    char === 0x0d || // \\r\n    char === 0x20    // space\n  )\n}\n\n/**\n * @param {Uint8Array} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-decode\n */\nfunction isomorphicDecode (input) {\n  // 1. To isomorphic decode a byte sequence input, return a string whose code point\n  //    length is equal to input’s length and whose code points have the same values\n  //    as the values of input’s bytes, in the same order.\n  const length = input.length\n  if ((2 << 15) - 1 > length) {\n    return String.fromCharCode.apply(null, input)\n  }\n  let result = ''\n  let i = 0\n  let addition = (2 << 15) - 1\n  while (i < length) {\n    if (i + addition > length) {\n      addition = length - i\n    }\n    result += String.fromCharCode.apply(null, input.subarray(i, i += addition))\n  }\n  return result\n}\n\nconst invalidIsomorphicEncodeValueRegex = /[^\\x00-\\xFF]/ // eslint-disable-line no-control-regex\n\n/**\n * @param {string} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-encode\n */\nfunction isomorphicEncode (input) {\n  // 1. Assert: input contains no code points greater than U+00FF.\n  assert(!invalidIsomorphicEncodeValueRegex.test(input))\n\n  // 2. Return a byte sequence whose length is equal to input’s code\n  //    point length and whose bytes have the same values as the\n  //    values of input’s code points, in the same order\n  return input\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value\n * @param {Uint8Array} bytes\n */\nfunction parseJSONFromBytes (bytes) {\n  return JSON.parse(utf8DecodeBytes(bytes))\n}\n\n/**\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace\n */\nfunction removeASCIIWhitespace (str, leading = true, trailing = true) {\n  return removeChars(str, leading, trailing, isASCIIWhitespace)\n}\n\n/**\n * @param {string} str\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {string}\n */\nfunction removeChars (str, leading, trailing, predicate) {\n  let lead = 0\n  let trail = str.length - 1\n\n  if (leading) {\n    while (lead < str.length && predicate(str.charCodeAt(lead))) lead++\n  }\n\n  if (trailing) {\n    while (trail > 0 && predicate(str.charCodeAt(trail))) trail--\n  }\n\n  return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1)\n}\n\n// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string\nfunction serializeJavascriptValueToJSONString (value) {\n  // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).\n  const result = JSON.stringify(value)\n\n  // 2. If result is undefined, then throw a TypeError.\n  if (result === undefined) {\n    throw new TypeError('Value is not JSON serializable')\n  }\n\n  // 3. Assert: result is a string.\n  assert(typeof result === 'string')\n\n  // 4. Return result.\n  return result\n}\n\nmodule.exports = {\n  collectASequenceOfCodePoints,\n  collectASequenceOfCodePointsFast,\n  forgivingBase64,\n  isASCIIWhitespace,\n  isomorphicDecode,\n  isomorphicEncode,\n  parseJSONFromBytes,\n  removeASCIIWhitespace,\n  removeChars,\n  serializeJavascriptValueToJSONString\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require('../infra')\n\nconst encoder = new TextEncoder()\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-token-code-point\n */\nconst HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u\nconst HTTP_WHITESPACE_REGEX = /[\\u000A\\u000D\\u0009\\u0020]/u // eslint-disable-line\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point\n */\nconst HTTP_QUOTED_STRING_TOKENS = /^[\\u0009\\u0020-\\u007E\\u0080-\\u00FF]+$/u // eslint-disable-line\n\n// https://fetch.spec.whatwg.org/#data-url-processor\n/** @param {URL} dataURL */\nfunction dataURLProcessor (dataURL) {\n  // 1. Assert: dataURL’s scheme is \"data\".\n  assert(dataURL.protocol === 'data:')\n\n  // 2. Let input be the result of running the URL\n  // serializer on dataURL with exclude fragment\n  // set to true.\n  let input = URLSerializer(dataURL, true)\n\n  // 3. Remove the leading \"data:\" string from input.\n  input = input.slice(5)\n\n  // 4. Let position point at the start of input.\n  const position = { position: 0 }\n\n  // 5. Let mimeType be the result of collecting a\n  // sequence of code points that are not equal\n  // to U+002C (,), given position.\n  let mimeType = collectASequenceOfCodePointsFast(\n    ',',\n    input,\n    position\n  )\n\n  // 6. Strip leading and trailing ASCII whitespace\n  // from mimeType.\n  // Undici implementation note: we need to store the\n  // length because if the mimetype has spaces removed,\n  // the wrong amount will be sliced from the input in\n  // step #9\n  const mimeTypeLength = mimeType.length\n  mimeType = removeASCIIWhitespace(mimeType, true, true)\n\n  // 7. If position is past the end of input, then\n  // return failure\n  if (position.position >= input.length) {\n    return 'failure'\n  }\n\n  // 8. Advance position by 1.\n  position.position++\n\n  // 9. Let encodedBody be the remainder of input.\n  const encodedBody = input.slice(mimeTypeLength + 1)\n\n  // 10. Let body be the percent-decoding of encodedBody.\n  let body = stringPercentDecode(encodedBody)\n\n  // 11. If mimeType ends with U+003B (;), followed by\n  // zero or more U+0020 SPACE, followed by an ASCII\n  // case-insensitive match for \"base64\", then:\n  if (/;(?:\\u0020*)base64$/ui.test(mimeType)) {\n    // 1. Let stringBody be the isomorphic decode of body.\n    const stringBody = isomorphicDecode(body)\n\n    // 2. Set body to the forgiving-base64 decode of\n    // stringBody.\n    body = forgivingBase64(stringBody)\n\n    // 3. If body is failure, then return failure.\n    if (body === 'failure') {\n      return 'failure'\n    }\n\n    // 4. Remove the last 6 code points from mimeType.\n    mimeType = mimeType.slice(0, -6)\n\n    // 5. Remove trailing U+0020 SPACE code points from mimeType,\n    // if any.\n    mimeType = mimeType.replace(/(\\u0020+)$/u, '')\n\n    // 6. Remove the last U+003B (;) code point from mimeType.\n    mimeType = mimeType.slice(0, -1)\n  }\n\n  // 12. If mimeType starts with U+003B (;), then prepend\n  // \"text/plain\" to mimeType.\n  if (mimeType.startsWith(';')) {\n    mimeType = 'text/plain' + mimeType\n  }\n\n  // 13. Let mimeTypeRecord be the result of parsing\n  // mimeType.\n  let mimeTypeRecord = parseMIMEType(mimeType)\n\n  // 14. If mimeTypeRecord is failure, then set\n  // mimeTypeRecord to text/plain;charset=US-ASCII.\n  if (mimeTypeRecord === 'failure') {\n    mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')\n  }\n\n  // 15. Return a new data: URL struct whose MIME\n  // type is mimeTypeRecord and body is body.\n  // https://fetch.spec.whatwg.org/#data-url-struct\n  return { mimeType: mimeTypeRecord, body }\n}\n\n// https://url.spec.whatwg.org/#concept-url-serializer\n/**\n * @param {URL} url\n * @param {boolean} excludeFragment\n */\nfunction URLSerializer (url, excludeFragment = false) {\n  if (!excludeFragment) {\n    return url.href\n  }\n\n  const href = url.href\n  const hashLength = url.hash.length\n\n  const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength)\n\n  if (!hashLength && href.endsWith('#')) {\n    return serialized.slice(0, -1)\n  }\n\n  return serialized\n}\n\n// https://url.spec.whatwg.org/#string-percent-decode\n/** @param {string} input */\nfunction stringPercentDecode (input) {\n  // 1. Let bytes be the UTF-8 encoding of input.\n  const bytes = encoder.encode(input)\n\n  // 2. Return the percent-decoding of bytes.\n  return percentDecode(bytes)\n}\n\n/**\n * @param {number} byte\n */\nfunction isHexCharByte (byte) {\n  // 0-9 A-F a-f\n  return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66)\n}\n\n/**\n * @param {number} byte\n */\nfunction hexByteToNumber (byte) {\n  return (\n    // 0-9\n    byte >= 0x30 && byte <= 0x39\n      ? (byte - 48)\n    // Convert to uppercase\n    // ((byte & 0xDF) - 65) + 10\n      : ((byte & 0xDF) - 55)\n  )\n}\n\n// https://url.spec.whatwg.org/#percent-decode\n/** @param {Uint8Array} input */\nfunction percentDecode (input) {\n  const length = input.length\n  // 1. Let output be an empty byte sequence.\n  /** @type {Uint8Array} */\n  const output = new Uint8Array(length)\n  let j = 0\n  let i = 0\n  // 2. For each byte byte in input:\n  while (i < length) {\n    const byte = input[i]\n\n    // 1. If byte is not 0x25 (%), then append byte to output.\n    if (byte !== 0x25) {\n      output[j++] = byte\n\n    // 2. Otherwise, if byte is 0x25 (%) and the next two bytes\n    // after byte in input are not in the ranges\n    // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),\n    // and 0x61 (a) to 0x66 (f), all inclusive, append byte\n    // to output.\n    } else if (\n      byte === 0x25 &&\n      !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))\n    ) {\n      output[j++] = 0x25\n\n    // 3. Otherwise:\n    } else {\n      // 1. Let bytePoint be the two bytes after byte in input,\n      // decoded, and then interpreted as hexadecimal number.\n      // 2. Append a byte whose value is bytePoint to output.\n      output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2])\n\n      // 3. Skip the next two bytes in input.\n      i += 2\n    }\n    ++i\n  }\n\n  // 3. Return output.\n  return length === j ? output : output.subarray(0, j)\n}\n\n// https://mimesniff.spec.whatwg.org/#parse-a-mime-type\n/** @param {string} input */\nfunction parseMIMEType (input) {\n  // 1. Remove any leading and trailing HTTP whitespace\n  // from input.\n  input = removeHTTPWhitespace(input, true, true)\n\n  // 2. Let position be a position variable for input,\n  // initially pointing at the start of input.\n  const position = { position: 0 }\n\n  // 3. Let type be the result of collecting a sequence\n  // of code points that are not U+002F (/) from\n  // input, given position.\n  const type = collectASequenceOfCodePointsFast(\n    '/',\n    input,\n    position\n  )\n\n  // 4. If type is the empty string or does not solely\n  // contain HTTP token code points, then return failure.\n  // https://mimesniff.spec.whatwg.org/#http-token-code-point\n  if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {\n    return 'failure'\n  }\n\n  // 5. If position is past the end of input, then return\n  // failure\n  if (position.position >= input.length) {\n    return 'failure'\n  }\n\n  // 6. Advance position by 1. (This skips past U+002F (/).)\n  position.position++\n\n  // 7. Let subtype be the result of collecting a sequence of\n  // code points that are not U+003B (;) from input, given\n  // position.\n  let subtype = collectASequenceOfCodePointsFast(\n    ';',\n    input,\n    position\n  )\n\n  // 8. Remove any trailing HTTP whitespace from subtype.\n  subtype = removeHTTPWhitespace(subtype, false, true)\n\n  // 9. If subtype is the empty string or does not solely\n  // contain HTTP token code points, then return failure.\n  if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {\n    return 'failure'\n  }\n\n  const typeLowercase = type.toLowerCase()\n  const subtypeLowercase = subtype.toLowerCase()\n\n  // 10. Let mimeType be a new MIME type record whose type\n  // is type, in ASCII lowercase, and subtype is subtype,\n  // in ASCII lowercase.\n  // https://mimesniff.spec.whatwg.org/#mime-type\n  const mimeType = {\n    type: typeLowercase,\n    subtype: subtypeLowercase,\n    /** @type {Map<string, string>} */\n    parameters: new Map(),\n    // https://mimesniff.spec.whatwg.org/#mime-type-essence\n    essence: `${typeLowercase}/${subtypeLowercase}`\n  }\n\n  // 11. While position is not past the end of input:\n  while (position.position < input.length) {\n    // 1. Advance position by 1. (This skips past U+003B (;).)\n    position.position++\n\n    // 2. Collect a sequence of code points that are HTTP\n    // whitespace from input given position.\n    collectASequenceOfCodePoints(\n      // https://fetch.spec.whatwg.org/#http-whitespace\n      char => HTTP_WHITESPACE_REGEX.test(char),\n      input,\n      position\n    )\n\n    // 3. Let parameterName be the result of collecting a\n    // sequence of code points that are not U+003B (;)\n    // or U+003D (=) from input, given position.\n    let parameterName = collectASequenceOfCodePoints(\n      (char) => char !== ';' && char !== '=',\n      input,\n      position\n    )\n\n    // 4. Set parameterName to parameterName, in ASCII\n    // lowercase.\n    parameterName = parameterName.toLowerCase()\n\n    // 5. If position is not past the end of input, then:\n    if (position.position < input.length) {\n      // 1. If the code point at position within input is\n      // U+003B (;), then continue.\n      if (input[position.position] === ';') {\n        continue\n      }\n\n      // 2. Advance position by 1. (This skips past U+003D (=).)\n      position.position++\n    }\n\n    // 6. If position is past the end of input, then break.\n    if (position.position >= input.length) {\n      break\n    }\n\n    // 7. Let parameterValue be null.\n    let parameterValue = null\n\n    // 8. If the code point at position within input is\n    // U+0022 (\"), then:\n    if (input[position.position] === '\"') {\n      // 1. Set parameterValue to the result of collecting\n      // an HTTP quoted string from input, given position\n      // and the extract-value flag.\n      parameterValue = collectAnHTTPQuotedString(input, position, true)\n\n      // 2. Collect a sequence of code points that are not\n      // U+003B (;) from input, given position.\n      collectASequenceOfCodePointsFast(\n        ';',\n        input,\n        position\n      )\n\n    // 9. Otherwise:\n    } else {\n      // 1. Set parameterValue to the result of collecting\n      // a sequence of code points that are not U+003B (;)\n      // from input, given position.\n      parameterValue = collectASequenceOfCodePointsFast(\n        ';',\n        input,\n        position\n      )\n\n      // 2. Remove any trailing HTTP whitespace from parameterValue.\n      parameterValue = removeHTTPWhitespace(parameterValue, false, true)\n\n      // 3. If parameterValue is the empty string, then continue.\n      if (parameterValue.length === 0) {\n        continue\n      }\n    }\n\n    // 10. If all of the following are true\n    // - parameterName is not the empty string\n    // - parameterName solely contains HTTP token code points\n    // - parameterValue solely contains HTTP quoted-string token code points\n    // - mimeType’s parameters[parameterName] does not exist\n    // then set mimeType’s parameters[parameterName] to parameterValue.\n    if (\n      parameterName.length !== 0 &&\n      HTTP_TOKEN_CODEPOINTS.test(parameterName) &&\n      (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&\n      !mimeType.parameters.has(parameterName)\n    ) {\n      mimeType.parameters.set(parameterName, parameterValue)\n    }\n  }\n\n  // 12. Return mimeType.\n  return mimeType\n}\n\n// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string\n// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string\n/**\n * @param {string} input\n * @param {{ position: number }} position\n * @param {boolean} [extractValue=false]\n */\nfunction collectAnHTTPQuotedString (input, position, extractValue = false) {\n  // 1. Let positionStart be position.\n  const positionStart = position.position\n\n  // 2. Let value be the empty string.\n  let value = ''\n\n  // 3. Assert: the code point at position within input\n  // is U+0022 (\").\n  assert(input[position.position] === '\"')\n\n  // 4. Advance position by 1.\n  position.position++\n\n  // 5. While true:\n  while (true) {\n    // 1. Append the result of collecting a sequence of code points\n    // that are not U+0022 (\") or U+005C (\\) from input, given\n    // position, to value.\n    value += collectASequenceOfCodePoints(\n      (char) => char !== '\"' && char !== '\\\\',\n      input,\n      position\n    )\n\n    // 2. If position is past the end of input, then break.\n    if (position.position >= input.length) {\n      break\n    }\n\n    // 3. Let quoteOrBackslash be the code point at position within\n    // input.\n    const quoteOrBackslash = input[position.position]\n\n    // 4. Advance position by 1.\n    position.position++\n\n    // 5. If quoteOrBackslash is U+005C (\\), then:\n    if (quoteOrBackslash === '\\\\') {\n      // 1. If position is past the end of input, then append\n      // U+005C (\\) to value and break.\n      if (position.position >= input.length) {\n        value += '\\\\'\n        break\n      }\n\n      // 2. Append the code point at position within input to value.\n      value += input[position.position]\n\n      // 3. Advance position by 1.\n      position.position++\n\n    // 6. Otherwise:\n    } else {\n      // 1. Assert: quoteOrBackslash is U+0022 (\").\n      assert(quoteOrBackslash === '\"')\n\n      // 2. Break.\n      break\n    }\n  }\n\n  // 6. If the extract-value flag is set, then return value.\n  if (extractValue) {\n    return value\n  }\n\n  // 7. Return the code points from positionStart to position,\n  // inclusive, within input.\n  return input.slice(positionStart, position.position)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type\n */\nfunction serializeAMimeType (mimeType) {\n  assert(mimeType !== 'failure')\n  const { parameters, essence } = mimeType\n\n  // 1. Let serialization be the concatenation of mimeType’s\n  //    type, U+002F (/), and mimeType’s subtype.\n  let serialization = essence\n\n  // 2. For each name → value of mimeType’s parameters:\n  for (let [name, value] of parameters.entries()) {\n    // 1. Append U+003B (;) to serialization.\n    serialization += ';'\n\n    // 2. Append name to serialization.\n    serialization += name\n\n    // 3. Append U+003D (=) to serialization.\n    serialization += '='\n\n    // 4. If value does not solely contain HTTP token code\n    //    points or value is the empty string, then:\n    if (!HTTP_TOKEN_CODEPOINTS.test(value)) {\n      // 1. Precede each occurrence of U+0022 (\") or\n      //    U+005C (\\) in value with U+005C (\\).\n      value = value.replace(/[\\\\\"]/ug, '\\\\$&')\n\n      // 2. Prepend U+0022 (\") to value.\n      value = '\"' + value\n\n      // 3. Append U+0022 (\") to value.\n      value += '\"'\n    }\n\n    // 5. Append value to serialization.\n    serialization += value\n  }\n\n  // 3. Return serialization.\n  return serialization\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {number} char\n */\nfunction isHTTPWhiteSpace (char) {\n  // \"\\r\\n\\t \"\n  return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n */\nfunction removeHTTPWhitespace (str, leading = true, trailing = true) {\n  return removeChars(str, leading, trailing, isHTTPWhiteSpace)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type\n * @param {Exclude<ReturnType<typeof parseMIMEType>, 'failure'>} mimeType\n */\nfunction minimizeSupportedMimeType (mimeType) {\n  switch (mimeType.essence) {\n    case 'application/ecmascript':\n    case 'application/javascript':\n    case 'application/x-ecmascript':\n    case 'application/x-javascript':\n    case 'text/ecmascript':\n    case 'text/javascript':\n    case 'text/javascript1.0':\n    case 'text/javascript1.1':\n    case 'text/javascript1.2':\n    case 'text/javascript1.3':\n    case 'text/javascript1.4':\n    case 'text/javascript1.5':\n    case 'text/jscript':\n    case 'text/livescript':\n    case 'text/x-ecmascript':\n    case 'text/x-javascript':\n      // 1. If mimeType is a JavaScript MIME type, then return \"text/javascript\".\n      return 'text/javascript'\n    case 'application/json':\n    case 'text/json':\n      // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n      return 'application/json'\n    case 'image/svg+xml':\n      // 3. If mimeType’s essence is \"image/svg+xml\", then return \"image/svg+xml\".\n      return 'image/svg+xml'\n    case 'text/xml':\n    case 'application/xml':\n      // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n      return 'application/xml'\n  }\n\n  // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n  if (mimeType.subtype.endsWith('+json')) {\n    return 'application/json'\n  }\n\n  // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n  if (mimeType.subtype.endsWith('+xml')) {\n    return 'application/xml'\n  }\n\n  // 5. If mimeType is supported by the user agent, then return mimeType’s essence.\n  // Technically, node doesn't support any mimetypes.\n\n  // 6. Return the empty string.\n  return ''\n}\n\nmodule.exports = {\n  dataURLProcessor,\n  URLSerializer,\n  stringPercentDecode,\n  parseMIMEType,\n  collectAnHTTPQuotedString,\n  serializeAMimeType,\n  removeHTTPWhitespace,\n  minimizeSupportedMimeType,\n  HTTP_TOKEN_CODEPOINTS\n}\n","'use strict'\n\n/** @typedef {`node:${string}`} NodeModuleName */\n\n/** @type {Record<NodeModuleName, () => any>} */\nconst lazyLoaders = {\n  __proto__: null,\n  'node:crypto': () => require('node:crypto'),\n  'node:sqlite': () => require('node:sqlite'),\n  'node:worker_threads': () => require('node:worker_threads'),\n  'node:zlib': () => require('node:zlib')\n}\n\n/**\n * @param {NodeModuleName} moduleName\n * @returns {boolean}\n */\nfunction detectRuntimeFeatureByNodeModule (moduleName) {\n  try {\n    lazyLoaders[moduleName]()\n    return true\n  } catch (err) {\n    if (err.code !== 'ERR_UNKNOWN_BUILTIN_MODULE' && err.code !== 'ERR_NO_CRYPTO') {\n      throw err\n    }\n    return false\n  }\n}\n\n/**\n * @param {NodeModuleName} moduleName\n * @param {string} property\n * @returns {boolean}\n */\nfunction detectRuntimeFeatureByExportedProperty (moduleName, property) {\n  const module = lazyLoaders[moduleName]()\n  return typeof module[property] !== 'undefined'\n}\n\nconst runtimeFeaturesByExportedProperty = /** @type {const} */ (['markAsUncloneable', 'zstd'])\n\n/** @type {Record<RuntimeFeatureByExportedProperty, [NodeModuleName, string]>} */\nconst exportedPropertyLookup = {\n  markAsUncloneable: ['node:worker_threads', 'markAsUncloneable'],\n  zstd: ['node:zlib', 'createZstdDecompress']\n}\n\n/** @typedef {typeof runtimeFeaturesByExportedProperty[number]} RuntimeFeatureByExportedProperty */\n\nconst runtimeFeaturesAsNodeModule = /** @type {const} */ (['crypto', 'sqlite'])\n/** @typedef {typeof runtimeFeaturesAsNodeModule[number]} RuntimeFeatureByNodeModule */\n\nconst features = /** @type {const} */ ([\n  ...runtimeFeaturesAsNodeModule,\n  ...runtimeFeaturesByExportedProperty\n])\n\n/** @typedef {typeof features[number]} Feature */\n\n/**\n * @param {Feature} feature\n * @returns {boolean}\n */\nfunction detectRuntimeFeature (feature) {\n  if (runtimeFeaturesAsNodeModule.includes(/** @type {RuntimeFeatureByNodeModule} */ (feature))) {\n    return detectRuntimeFeatureByNodeModule(`node:${feature}`)\n  } else if (runtimeFeaturesByExportedProperty.includes(/** @type {RuntimeFeatureByExportedProperty} */ (feature))) {\n    const [moduleName, property] = exportedPropertyLookup[feature]\n    return detectRuntimeFeatureByExportedProperty(moduleName, property)\n  }\n  throw new TypeError(`unknown feature: ${feature}`)\n}\n\n/**\n * @class\n * @name RuntimeFeatures\n */\nclass RuntimeFeatures {\n  /** @type {Map<Feature, boolean>} */\n  #map = new Map()\n\n  /**\n   * Clears all cached feature detections.\n   */\n  clear () {\n    this.#map.clear()\n  }\n\n  /**\n   * @param {Feature} feature\n   * @returns {boolean}\n   */\n  has (feature) {\n    return (\n      this.#map.get(feature) ?? this.#detectRuntimeFeature(feature)\n    )\n  }\n\n  /**\n   * @param {Feature} feature\n   * @param {boolean} value\n   */\n  set (feature, value) {\n    if (features.includes(feature) === false) {\n      throw new TypeError(`unknown feature: ${feature}`)\n    }\n    this.#map.set(feature, value)\n  }\n\n  /**\n   * @param {Feature} feature\n   * @returns {boolean}\n   */\n  #detectRuntimeFeature (feature) {\n    const result = detectRuntimeFeature(feature)\n    this.#map.set(feature, result)\n    return result\n  }\n}\n\nconst instance = new RuntimeFeatures()\n\nmodule.exports.runtimeFeatures = instance\nmodule.exports.default = instance\n","'use strict'\n\nconst assert = require('node:assert')\nconst { types, inspect } = require('node:util')\nconst { runtimeFeatures } = require('../../util/runtime-features')\n\nconst UNDEFINED = 1\nconst BOOLEAN = 2\nconst STRING = 3\nconst SYMBOL = 4\nconst NUMBER = 5\nconst BIGINT = 6\nconst NULL = 7\nconst OBJECT = 8 // function and object\n\nconst FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance])\n\n/** @type {import('../../../types/webidl').Webidl} */\nconst webidl = {\n  converters: {},\n  util: {},\n  errors: {},\n  is: {}\n}\n\n/**\n * @description Instantiate an error.\n *\n * @param {Object} opts\n * @param {string} opts.header\n * @param {string} opts.message\n * @returns {TypeError}\n */\nwebidl.errors.exception = function (message) {\n  return new TypeError(`${message.header}: ${message.message}`)\n}\n\n/**\n * @description Instantiate an error when conversion from one type to another has failed.\n *\n * @param {Object} opts\n * @param {string} opts.prefix\n * @param {string} opts.argument\n * @param {string[]} opts.types\n * @returns {TypeError}\n */\nwebidl.errors.conversionFailed = function (opts) {\n  const plural = opts.types.length === 1 ? '' : ' one of'\n  const message =\n    `${opts.argument} could not be converted to` +\n    `${plural}: ${opts.types.join(', ')}.`\n\n  return webidl.errors.exception({\n    header: opts.prefix,\n    message\n  })\n}\n\n/**\n * @description Instantiate an error when an invalid argument is provided\n *\n * @param {Object} context\n * @param {string} context.prefix\n * @param {string} context.value\n * @param {string} context.type\n * @returns {TypeError}\n */\nwebidl.errors.invalidArgument = function (context) {\n  return webidl.errors.exception({\n    header: context.prefix,\n    message: `\"${context.value}\" is an invalid ${context.type}.`\n  })\n}\n\n// https://webidl.spec.whatwg.org/#implements\nwebidl.brandCheck = function (V, I) {\n  if (!FunctionPrototypeSymbolHasInstance(I, V)) {\n    const err = new TypeError('Illegal invocation')\n    err.code = 'ERR_INVALID_THIS' // node compat.\n    throw err\n  }\n}\n\nwebidl.brandCheckMultiple = function (List) {\n  const prototypes = List.map((c) => webidl.util.MakeTypeAssertion(c))\n\n  return (V) => {\n    if (prototypes.every(typeCheck => !typeCheck(V))) {\n      const err = new TypeError('Illegal invocation')\n      err.code = 'ERR_INVALID_THIS' // node compat.\n      throw err\n    }\n  }\n}\n\nwebidl.argumentLengthCheck = function ({ length }, min, ctx) {\n  if (length < min) {\n    throw webidl.errors.exception({\n      message: `${min} argument${min !== 1 ? 's' : ''} required, ` +\n               `but${length ? ' only' : ''} ${length} found.`,\n      header: ctx\n    })\n  }\n}\n\nwebidl.illegalConstructor = function () {\n  throw webidl.errors.exception({\n    header: 'TypeError',\n    message: 'Illegal constructor'\n  })\n}\n\nwebidl.util.MakeTypeAssertion = function (I) {\n  return (O) => FunctionPrototypeSymbolHasInstance(I, O)\n}\n\n// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values\nwebidl.util.Type = function (V) {\n  switch (typeof V) {\n    case 'undefined': return UNDEFINED\n    case 'boolean': return BOOLEAN\n    case 'string': return STRING\n    case 'symbol': return SYMBOL\n    case 'number': return NUMBER\n    case 'bigint': return BIGINT\n    case 'function':\n    case 'object': {\n      if (V === null) {\n        return NULL\n      }\n\n      return OBJECT\n    }\n  }\n}\n\nwebidl.util.Types = {\n  UNDEFINED,\n  BOOLEAN,\n  STRING,\n  SYMBOL,\n  NUMBER,\n  BIGINT,\n  NULL,\n  OBJECT\n}\n\nwebidl.util.TypeValueToString = function (o) {\n  switch (webidl.util.Type(o)) {\n    case UNDEFINED: return 'Undefined'\n    case BOOLEAN: return 'Boolean'\n    case STRING: return 'String'\n    case SYMBOL: return 'Symbol'\n    case NUMBER: return 'Number'\n    case BIGINT: return 'BigInt'\n    case NULL: return 'Null'\n    case OBJECT: return 'Object'\n  }\n}\n\nwebidl.util.markAsUncloneable = runtimeFeatures.has('markAsUncloneable')\n  ? require('node:worker_threads').markAsUncloneable\n  : () => {}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint\nwebidl.util.ConvertToInt = function (V, bitLength, signedness, flags) {\n  let upperBound\n  let lowerBound\n\n  // 1. If bitLength is 64, then:\n  if (bitLength === 64) {\n    // 1. Let upperBound be 2^53 − 1.\n    upperBound = Math.pow(2, 53) - 1\n\n    // 2. If signedness is \"unsigned\", then let lowerBound be 0.\n    if (signedness === 'unsigned') {\n      lowerBound = 0\n    } else {\n      // 3. Otherwise let lowerBound be −2^53 + 1.\n      lowerBound = Math.pow(-2, 53) + 1\n    }\n  } else if (signedness === 'unsigned') {\n    // 2. Otherwise, if signedness is \"unsigned\", then:\n\n    // 1. Let lowerBound be 0.\n    lowerBound = 0\n\n    // 2. Let upperBound be 2^bitLength − 1.\n    upperBound = Math.pow(2, bitLength) - 1\n  } else {\n    // 3. Otherwise:\n\n    // 1. Let lowerBound be -2^bitLength − 1.\n    lowerBound = Math.pow(-2, bitLength) - 1\n\n    // 2. Let upperBound be 2^bitLength − 1 − 1.\n    upperBound = Math.pow(2, bitLength - 1) - 1\n  }\n\n  // 4. Let x be ? ToNumber(V).\n  let x = Number(V)\n\n  // 5. If x is −0, then set x to +0.\n  if (x === 0) {\n    x = 0\n  }\n\n  // 6. If the conversion is to an IDL type associated\n  //    with the [EnforceRange] extended attribute, then:\n  if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) {\n    // 1. If x is NaN, +∞, or −∞, then throw a TypeError.\n    if (\n      Number.isNaN(x) ||\n      x === Number.POSITIVE_INFINITY ||\n      x === Number.NEGATIVE_INFINITY\n    ) {\n      throw webidl.errors.exception({\n        header: 'Integer conversion',\n        message: `Could not convert ${webidl.util.Stringify(V)} to an integer.`\n      })\n    }\n\n    // 2. Set x to IntegerPart(x).\n    x = webidl.util.IntegerPart(x)\n\n    // 3. If x < lowerBound or x > upperBound, then\n    //    throw a TypeError.\n    if (x < lowerBound || x > upperBound) {\n      throw webidl.errors.exception({\n        header: 'Integer conversion',\n        message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`\n      })\n    }\n\n    // 4. Return x.\n    return x\n  }\n\n  // 7. If x is not NaN and the conversion is to an IDL\n  //    type associated with the [Clamp] extended\n  //    attribute, then:\n  if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) {\n    // 1. Set x to min(max(x, lowerBound), upperBound).\n    x = Math.min(Math.max(x, lowerBound), upperBound)\n\n    // 2. Round x to the nearest integer, choosing the\n    //    even integer if it lies halfway between two,\n    //    and choosing +0 rather than −0.\n    if (Math.floor(x) % 2 === 0) {\n      x = Math.floor(x)\n    } else {\n      x = Math.ceil(x)\n    }\n\n    // 3. Return x.\n    return x\n  }\n\n  // 8. If x is NaN, +0, +∞, or −∞, then return +0.\n  if (\n    Number.isNaN(x) ||\n    (x === 0 && Object.is(0, x)) ||\n    x === Number.POSITIVE_INFINITY ||\n    x === Number.NEGATIVE_INFINITY\n  ) {\n    return 0\n  }\n\n  // 9. Set x to IntegerPart(x).\n  x = webidl.util.IntegerPart(x)\n\n  // 10. Set x to x modulo 2^bitLength.\n  x = x % Math.pow(2, bitLength)\n\n  // 11. If signedness is \"signed\" and x ≥ 2^bitLength − 1,\n  //    then return x − 2^bitLength.\n  if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {\n    return x - Math.pow(2, bitLength)\n  }\n\n  // 12. Otherwise, return x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart\nwebidl.util.IntegerPart = function (n) {\n  // 1. Let r be floor(abs(n)).\n  const r = Math.floor(Math.abs(n))\n\n  // 2. If n < 0, then return -1 × r.\n  if (n < 0) {\n    return -1 * r\n  }\n\n  // 3. Otherwise, return r.\n  return r\n}\n\nwebidl.util.Stringify = function (V) {\n  const type = webidl.util.Type(V)\n\n  switch (type) {\n    case SYMBOL:\n      return `Symbol(${V.description})`\n    case OBJECT:\n      return inspect(V)\n    case STRING:\n      return `\"${V}\"`\n    case BIGINT:\n      return `${V}n`\n    default:\n      return `${V}`\n  }\n}\n\nwebidl.util.IsResizableArrayBuffer = function (V) {\n  if (types.isArrayBuffer(V)) {\n    return V.resizable\n  }\n\n  if (types.isSharedArrayBuffer(V)) {\n    return V.growable\n  }\n\n  throw webidl.errors.exception({\n    header: 'IsResizableArrayBuffer',\n    message: `\"${webidl.util.Stringify(V)}\" is not an array buffer.`\n  })\n}\n\nwebidl.util.HasFlag = function (flags, attributes) {\n  return typeof flags === 'number' && (flags & attributes) === attributes\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nwebidl.sequenceConverter = function (converter) {\n  return (V, prefix, argument, Iterable) => {\n    // 1. If Type(V) is not Object, throw a TypeError.\n    if (webidl.util.Type(V) !== OBJECT) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.`\n      })\n    }\n\n    // 2. Let method be ? GetMethod(V, @@iterator).\n    /** @type {Generator} */\n    const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.()\n    const seq = []\n    let index = 0\n\n    // 3. If method is undefined, throw a TypeError.\n    if (\n      method === undefined ||\n      typeof method.next !== 'function'\n    ) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: `${argument} is not iterable.`\n      })\n    }\n\n    // https://webidl.spec.whatwg.org/#create-sequence-from-iterable\n    while (true) {\n      const { done, value } = method.next()\n\n      if (done) {\n        break\n      }\n\n      seq.push(converter(value, prefix, `${argument}[${index++}]`))\n    }\n\n    return seq\n  }\n}\n\n// https://webidl.spec.whatwg.org/#es-to-record\nwebidl.recordConverter = function (keyConverter, valueConverter) {\n  return (O, prefix, argument) => {\n    // 1. If Type(O) is not Object, throw a TypeError.\n    if (webidl.util.Type(O) !== OBJECT) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: `${argument} (\"${webidl.util.TypeValueToString(O)}\") is not an Object.`\n      })\n    }\n\n    // 2. Let result be a new empty instance of record<K, V>.\n    const result = {}\n\n    if (!types.isProxy(O)) {\n      // 1. Let desc be ? O.[[GetOwnProperty]](key).\n      const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]\n\n      for (const key of keys) {\n        const keyName = webidl.util.Stringify(key)\n\n        // 1. Let typedKey be key converted to an IDL value of type K.\n        const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`)\n\n        // 2. Let value be ? Get(O, key).\n        // 3. Let typedValue be value converted to an IDL value of type V.\n        const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`)\n\n        // 4. Set result[typedKey] to typedValue.\n        result[typedKey] = typedValue\n      }\n\n      // 5. Return result.\n      return result\n    }\n\n    // 3. Let keys be ? O.[[OwnPropertyKeys]]().\n    const keys = Reflect.ownKeys(O)\n\n    // 4. For each key of keys.\n    for (const key of keys) {\n      // 1. Let desc be ? O.[[GetOwnProperty]](key).\n      const desc = Reflect.getOwnPropertyDescriptor(O, key)\n\n      // 2. If desc is not undefined and desc.[[Enumerable]] is true:\n      if (desc?.enumerable) {\n        // 1. Let typedKey be key converted to an IDL value of type K.\n        const typedKey = keyConverter(key, prefix, argument)\n\n        // 2. Let value be ? Get(O, key).\n        // 3. Let typedValue be value converted to an IDL value of type V.\n        const typedValue = valueConverter(O[key], prefix, argument)\n\n        // 4. Set result[typedKey] to typedValue.\n        result[typedKey] = typedValue\n      }\n    }\n\n    // 5. Return result.\n    return result\n  }\n}\n\nwebidl.interfaceConverter = function (TypeCheck, name) {\n  return (V, prefix, argument) => {\n    if (!TypeCheck(V)) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: `Expected ${argument} (\"${webidl.util.Stringify(V)}\") to be an instance of ${name}.`\n      })\n    }\n\n    return V\n  }\n}\n\nwebidl.dictionaryConverter = function (converters) {\n  // \"For each dictionary member member declared on dictionary, in lexicographical order:\"\n  converters.sort((a, b) => (a.key > b.key) - (a.key < b.key))\n\n  return (dictionary, prefix, argument) => {\n    const dict = {}\n\n    if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`\n      })\n    }\n\n    for (const options of converters) {\n      const { key, defaultValue, required, converter } = options\n\n      if (required === true) {\n        if (dictionary == null || !Object.hasOwn(dictionary, key)) {\n          throw webidl.errors.exception({\n            header: prefix,\n            message: `Missing required key \"${key}\".`\n          })\n        }\n      }\n\n      let value = dictionary?.[key]\n      const hasDefault = defaultValue !== undefined\n\n      // Only use defaultValue if value is undefined and\n      // a defaultValue options was provided.\n      if (hasDefault && value === undefined) {\n        value = defaultValue()\n      }\n\n      // A key can be optional and have no default value.\n      // When this happens, do not perform a conversion,\n      // and do not assign the key a value.\n      if (required || hasDefault || value !== undefined) {\n        value = converter(value, prefix, `${argument}.${key}`)\n\n        if (\n          options.allowedValues &&\n          !options.allowedValues.includes(value)\n        ) {\n          throw webidl.errors.exception({\n            header: prefix,\n            message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`\n          })\n        }\n\n        dict[key] = value\n      }\n    }\n\n    return dict\n  }\n}\n\nwebidl.nullableConverter = function (converter) {\n  return (V, prefix, argument) => {\n    if (V === null) {\n      return V\n    }\n\n    return converter(V, prefix, argument)\n  }\n}\n\n/**\n * @param {*} value\n * @returns {boolean}\n */\nwebidl.is.USVString = function (value) {\n  return (\n    typeof value === 'string' &&\n    value.isWellFormed()\n  )\n}\n\nwebidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream)\nwebidl.is.Blob = webidl.util.MakeTypeAssertion(Blob)\nwebidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams)\nwebidl.is.File = webidl.util.MakeTypeAssertion(File)\nwebidl.is.URL = webidl.util.MakeTypeAssertion(URL)\nwebidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)\nwebidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)\n\nwebidl.is.BufferSource = function (V) {\n  return types.isArrayBuffer(V) || (\n    ArrayBuffer.isView(V) &&\n    types.isArrayBuffer(V.buffer)\n  )\n}\n\n// https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy\nwebidl.util.getCopyOfBytesHeldByBufferSource = function (bufferSource) {\n  // 1. Let jsBufferSource be the result of converting bufferSource to a JavaScript value.\n  const jsBufferSource = bufferSource\n\n  // 2. Let jsArrayBuffer be jsBufferSource.\n  let jsArrayBuffer = jsBufferSource\n\n  // 3. Let offset be 0.\n  let offset = 0\n\n  // 4. Let length be 0.\n  let length = 0\n\n  // 5. If jsBufferSource has a [[ViewedArrayBuffer]] internal slot, then:\n  if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) {\n    // 5.1. Set jsArrayBuffer to jsBufferSource.[[ViewedArrayBuffer]].\n    jsArrayBuffer = jsBufferSource.buffer\n\n    // 5.2. Set offset to jsBufferSource.[[ByteOffset]].\n    offset = jsBufferSource.byteOffset\n\n    // 5.3. Set length to jsBufferSource.[[ByteLength]].\n    length = jsBufferSource.byteLength\n  } else {\n    // 6. Otherwise:\n\n    // 6.1. Assert: jsBufferSource is an ArrayBuffer or SharedArrayBuffer object.\n    assert(types.isAnyArrayBuffer(jsBufferSource))\n\n    // 6.2. Set length to jsBufferSource.[[ArrayBufferByteLength]].\n    length = jsBufferSource.byteLength\n  }\n\n  // 7. If IsDetachedBuffer(jsArrayBuffer) is true, then return the empty byte sequence.\n  if (jsArrayBuffer.detached) {\n    return new Uint8Array(0)\n  }\n\n  // 8. Let bytes be a new byte sequence of length equal to length.\n  const bytes = new Uint8Array(length)\n\n  // 9. For i in the range offset to offset + length − 1, inclusive,\n  //    set bytes[i − offset] to GetValueFromBuffer(jsArrayBuffer, i, Uint8, true, Unordered).\n  const view = new Uint8Array(jsArrayBuffer, offset, length)\n  bytes.set(view)\n\n  // 10. Return bytes.\n  return bytes\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nwebidl.converters.DOMString = function (V, prefix, argument, flags) {\n  // 1. If V is null and the conversion is to an IDL type\n  //    associated with the [LegacyNullToEmptyString]\n  //    extended attribute, then return the DOMString value\n  //    that represents the empty string.\n  if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {\n    return ''\n  }\n\n  // 2. Let x be ? ToString(V).\n  if (typeof V === 'symbol') {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} is a symbol, which cannot be converted to a DOMString.`\n    })\n  }\n\n  // 3. Return the IDL DOMString value that represents the\n  //    same sequence of code units as the one the\n  //    ECMAScript String value x represents.\n  return String(V)\n}\n\n// https://webidl.spec.whatwg.org/#es-ByteString\nwebidl.converters.ByteString = function (V, prefix, argument) {\n  // 1. Let x be ? ToString(V).\n  if (typeof V === 'symbol') {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} is a symbol, which cannot be converted to a ByteString.`\n    })\n  }\n\n  const x = String(V)\n\n  // 2. If the value of any element of x is greater than\n  //    255, then throw a TypeError.\n  for (let index = 0; index < x.length; index++) {\n    if (x.charCodeAt(index) > 255) {\n      throw new TypeError(\n        'Cannot convert argument to a ByteString because the character at ' +\n        `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`\n      )\n    }\n  }\n\n  // 3. Return an IDL ByteString value whose length is the\n  //    length of x, and where the value of each element is\n  //    the value of the corresponding element of x.\n  return x\n}\n\n/**\n * @param {unknown} value\n * @returns {string}\n * @see https://webidl.spec.whatwg.org/#es-USVString\n */\nwebidl.converters.USVString = function (value) {\n  // TODO: rewrite this so we can control the errors thrown\n  if (typeof value === 'string') {\n    return value.toWellFormed()\n  }\n  return `${value}`.toWellFormed()\n}\n\n// https://webidl.spec.whatwg.org/#es-boolean\nwebidl.converters.boolean = function (V) {\n  // 1. Let x be the result of computing ToBoolean(V).\n  // https://262.ecma-international.org/10.0/index.html#table-10\n  const x = Boolean(V)\n\n  // 2. Return the IDL boolean value that is the one that represents\n  //    the same truth value as the ECMAScript Boolean value x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#es-any\nwebidl.converters.any = function (V) {\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#es-long-long\nwebidl.converters['long long'] = function (V, prefix, argument) {\n  // 1. Let x be ? ConvertToInt(V, 64, \"signed\").\n  const x = webidl.util.ConvertToInt(V, 64, 'signed', 0, prefix, argument)\n\n  // 2. Return the IDL long long value that represents\n  //    the same numeric value as x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long-long\nwebidl.converters['unsigned long long'] = function (V, prefix, argument) {\n  // 1. Let x be ? ConvertToInt(V, 64, \"unsigned\").\n  const x = webidl.util.ConvertToInt(V, 64, 'unsigned', 0, prefix, argument)\n\n  // 2. Return the IDL unsigned long long value that\n  //    represents the same numeric value as x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long\nwebidl.converters['unsigned long'] = function (V, prefix, argument) {\n  // 1. Let x be ? ConvertToInt(V, 32, \"unsigned\").\n  const x = webidl.util.ConvertToInt(V, 32, 'unsigned', 0, prefix, argument)\n\n  // 2. Return the IDL unsigned long value that\n  //    represents the same numeric value as x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-short\nwebidl.converters['unsigned short'] = function (V, prefix, argument, flags) {\n  // 1. Let x be ? ConvertToInt(V, 16, \"unsigned\").\n  const x = webidl.util.ConvertToInt(V, 16, 'unsigned', flags, prefix, argument)\n\n  // 2. Return the IDL unsigned short value that represents\n  //    the same numeric value as x.\n  return x\n}\n\n// https://webidl.spec.whatwg.org/#idl-ArrayBuffer\nwebidl.converters.ArrayBuffer = function (V, prefix, argument, flags) {\n  // 1. If V is not an Object, or V does not have an\n  //    [[ArrayBufferData]] internal slot, then throw a\n  //    TypeError.\n  // 2. If IsSharedArrayBuffer(V) is true, then throw a\n  //    TypeError.\n  // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances\n  if (\n    webidl.util.Type(V) !== OBJECT ||\n    !types.isArrayBuffer(V)\n  ) {\n    throw webidl.errors.conversionFailed({\n      prefix,\n      argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n      types: ['ArrayBuffer']\n    })\n  }\n\n  // 3. If the conversion is not to an IDL type associated\n  //    with the [AllowResizable] extended attribute, and\n  //    IsResizableArrayBuffer(V) is true, then throw a\n  //    TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a resizable ArrayBuffer.`\n    })\n  }\n\n  // 4. Return the IDL ArrayBuffer value that is a\n  //    reference to the same object as V.\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-SharedArrayBuffer\nwebidl.converters.SharedArrayBuffer = function (V, prefix, argument, flags) {\n  // 1. If V is not an Object, or V does not have an\n  //    [[ArrayBufferData]] internal slot, then throw a\n  //    TypeError.\n  // 2. If IsSharedArrayBuffer(V) is false, then throw a\n  //    TypeError.\n  // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances\n  if (\n    webidl.util.Type(V) !== OBJECT ||\n    !types.isSharedArrayBuffer(V)\n  ) {\n    throw webidl.errors.conversionFailed({\n      prefix,\n      argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n      types: ['SharedArrayBuffer']\n    })\n  }\n\n  // 3. If the conversion is not to an IDL type associated\n  //    with the [AllowResizable] extended attribute, and\n  //    IsResizableArrayBuffer(V) is true, then throw a\n  //    TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a resizable SharedArrayBuffer.`\n    })\n  }\n\n  // 4. Return the IDL SharedArrayBuffer value that is a\n  //    reference to the same object as V.\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#dfn-typed-array-type\nwebidl.converters.TypedArray = function (V, T, prefix, argument, flags) {\n  // 1. Let T be the IDL type V is being converted to.\n\n  // 2. If Type(V) is not Object, or V does not have a\n  //    [[TypedArrayName]] internal slot with a value\n  //    equal to T’s name, then throw a TypeError.\n  if (\n    webidl.util.Type(V) !== OBJECT ||\n    !types.isTypedArray(V) ||\n    V.constructor.name !== T.name\n  ) {\n    throw webidl.errors.conversionFailed({\n      prefix,\n      argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n      types: [T.name]\n    })\n  }\n\n  // 3. If the conversion is not to an IDL type associated\n  //    with the [AllowShared] extended attribute, and\n  //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is\n  //    true, then throw a TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a shared array buffer.`\n    })\n  }\n\n  // 4. If the conversion is not to an IDL type associated\n  //    with the [AllowResizable] extended attribute, and\n  //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n  //    true, then throw a TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a resizable array buffer.`\n    })\n  }\n\n  // 5. Return the IDL value of type T that is a reference\n  //    to the same object as V.\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-DataView\nwebidl.converters.DataView = function (V, prefix, argument, flags) {\n  // 1. If Type(V) is not Object, or V does not have a\n  //    [[DataView]] internal slot, then throw a TypeError.\n  if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) {\n    throw webidl.errors.conversionFailed({\n      prefix,\n      argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n      types: ['DataView']\n    })\n  }\n\n  // 2. If the conversion is not to an IDL type associated\n  //    with the [AllowShared] extended attribute, and\n  //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,\n  //    then throw a TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a shared array buffer.`\n    })\n  }\n\n  // 3. If the conversion is not to an IDL type associated\n  //    with the [AllowResizable] extended attribute, and\n  //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n  //    true, then throw a TypeError.\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a resizable array buffer.`\n    })\n  }\n\n  // 4. Return the IDL DataView value that is a reference\n  //    to the same object as V.\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#ArrayBufferView\nwebidl.converters.ArrayBufferView = function (V, prefix, argument, flags) {\n  if (\n    webidl.util.Type(V) !== OBJECT ||\n    !types.isArrayBufferView(V)\n  ) {\n    throw webidl.errors.conversionFailed({\n      prefix,\n      argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n      types: ['ArrayBufferView']\n    })\n  }\n\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a shared array buffer.`\n    })\n  }\n\n  if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a view on a resizable array buffer.`\n    })\n  }\n\n  return V\n}\n\n// https://webidl.spec.whatwg.org/#BufferSource\nwebidl.converters.BufferSource = function (V, prefix, argument, flags) {\n  if (types.isArrayBuffer(V)) {\n    return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n  }\n\n  if (types.isArrayBufferView(V)) {\n    flags &= ~webidl.attributes.AllowShared\n\n    return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n  }\n\n  // Make this explicit for easier debugging\n  if (types.isSharedArrayBuffer(V)) {\n    throw webidl.errors.exception({\n      header: prefix,\n      message: `${argument} cannot be a SharedArrayBuffer.`\n    })\n  }\n\n  throw webidl.errors.conversionFailed({\n    prefix,\n    argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n    types: ['ArrayBuffer', 'ArrayBufferView']\n  })\n}\n\n// https://webidl.spec.whatwg.org/#AllowSharedBufferSource\nwebidl.converters.AllowSharedBufferSource = function (V, prefix, argument, flags) {\n  if (types.isArrayBuffer(V)) {\n    return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n  }\n\n  if (types.isSharedArrayBuffer(V)) {\n    return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags)\n  }\n\n  if (types.isArrayBufferView(V)) {\n    flags |= webidl.attributes.AllowShared\n    return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n  }\n\n  throw webidl.errors.conversionFailed({\n    prefix,\n    argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n    types: ['ArrayBuffer', 'SharedArrayBuffer', 'ArrayBufferView']\n  })\n}\n\nwebidl.converters['sequence<ByteString>'] = webidl.sequenceConverter(\n  webidl.converters.ByteString\n)\n\nwebidl.converters['sequence<sequence<ByteString>>'] = webidl.sequenceConverter(\n  webidl.converters['sequence<ByteString>']\n)\n\nwebidl.converters['record<ByteString, ByteString>'] = webidl.recordConverter(\n  webidl.converters.ByteString,\n  webidl.converters.ByteString\n)\n\nwebidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, 'Blob')\n\nwebidl.converters.AbortSignal = webidl.interfaceConverter(\n  webidl.is.AbortSignal,\n  'AbortSignal'\n)\n\n/**\n * [LegacyTreatNonObjectAsNull]\n * callback EventHandlerNonNull = any (Event event);\n * typedef EventHandlerNonNull? EventHandler;\n * @param {*} V\n */\nwebidl.converters.EventHandlerNonNull = function (V) {\n  if (webidl.util.Type(V) !== OBJECT) {\n    return null\n  }\n\n  // [I]f the value is not an object, it will be converted to null, and if the value is not callable,\n  // it will be converted to a callback function value that does nothing when called.\n  if (typeof V === 'function') {\n    return V\n  }\n\n  return () => {}\n}\n\nwebidl.attributes = {\n  Clamp: 1 << 0,\n  EnforceRange: 1 << 1,\n  AllowShared: 1 << 2,\n  AllowResizable: 1 << 3,\n  LegacyNullToEmptyString: 1 << 4\n}\n\nmodule.exports = {\n  webidl\n}\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst zlib = require('node:zlib')\nconst { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require('./constants')\nconst { getGlobalOrigin } = require('./global')\nconst { collectAnHTTPQuotedString, parseMIMEType } = require('./data-url')\nconst { performance } = require('node:perf_hooks')\nconst { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util')\nconst assert = require('node:assert')\nconst { isUint8Array } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { isomorphicEncode, collectASequenceOfCodePoints, removeChars } = require('../infra')\n\nfunction responseURL (response) {\n  // https://fetch.spec.whatwg.org/#responses\n  // A response has an associated URL. It is a pointer to the last URL\n  // in response’s URL list and null if response’s URL list is empty.\n  const urlList = response.urlList\n  const length = urlList.length\n  return length === 0 ? null : urlList[length - 1].toString()\n}\n\n// https://fetch.spec.whatwg.org/#concept-response-location-url\nfunction responseLocationURL (response, requestFragment) {\n  // 1. If response’s status is not a redirect status, then return null.\n  if (!redirectStatusSet.has(response.status)) {\n    return null\n  }\n\n  // 2. Let location be the result of extracting header list values given\n  // `Location` and response’s header list.\n  let location = response.headersList.get('location', true)\n\n  // 3. If location is a header value, then set location to the result of\n  //    parsing location with response’s URL.\n  if (location !== null && isValidHeaderValue(location)) {\n    if (!isValidEncodedURL(location)) {\n      // Some websites respond location header in UTF-8 form without encoding them as ASCII\n      // and major browsers redirect them to correctly UTF-8 encoded addresses.\n      // Here, we handle that behavior in the same way.\n      location = normalizeBinaryStringToUtf8(location)\n    }\n    location = new URL(location, responseURL(response))\n  }\n\n  // 4. If location is a URL whose fragment is null, then set location’s\n  // fragment to requestFragment.\n  if (location && !location.hash) {\n    location.hash = requestFragment\n  }\n\n  // 5. Return location.\n  return location\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2\n * @param {string} url\n * @returns {boolean}\n */\nfunction isValidEncodedURL (url) {\n  for (let i = 0; i < url.length; ++i) {\n    const code = url.charCodeAt(i)\n\n    if (\n      code > 0x7E || // Non-US-ASCII + DEL\n      code < 0x20 // Control characters NUL - US\n    ) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it.\n * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well.\n * @param {string} value\n * @returns {string}\n */\nfunction normalizeBinaryStringToUtf8 (value) {\n  return Buffer.from(value, 'binary').toString('utf8')\n}\n\n/** @returns {URL} */\nfunction requestCurrentURL (request) {\n  return request.urlList[request.urlList.length - 1]\n}\n\nfunction requestBadPort (request) {\n  // 1. Let url be request’s current URL.\n  const url = requestCurrentURL(request)\n\n  // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,\n  // then return blocked.\n  if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {\n    return 'blocked'\n  }\n\n  // 3. Return allowed.\n  return 'allowed'\n}\n\nfunction isErrorLike (object) {\n  return object instanceof Error || (\n    object?.constructor?.name === 'Error' ||\n    object?.constructor?.name === 'DOMException'\n  )\n}\n\n// Check whether |statusText| is a ByteString and\n// matches the Reason-Phrase token production.\n// RFC 2616: https://tools.ietf.org/html/rfc2616\n// RFC 7230: https://tools.ietf.org/html/rfc7230\n// \"reason-phrase = *( HTAB / SP / VCHAR / obs-text )\"\n// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116\nfunction isValidReasonPhrase (statusText) {\n  for (let i = 0; i < statusText.length; ++i) {\n    const c = statusText.charCodeAt(i)\n    if (\n      !(\n        (\n          c === 0x09 || // HTAB\n          (c >= 0x20 && c <= 0x7e) || // SP / VCHAR\n          (c >= 0x80 && c <= 0xff)\n        ) // obs-text\n      )\n    ) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-name\n * @param {string} potentialValue\n */\nconst isValidHeaderName = isValidHTTPToken\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value\n * @param {string} potentialValue\n */\nfunction isValidHeaderValue (potentialValue) {\n  // - Has no leading or trailing HTTP tab or space bytes.\n  // - Contains no 0x00 (NUL) or HTTP newline bytes.\n  return (\n    potentialValue[0] === '\\t' ||\n    potentialValue[0] === ' ' ||\n    potentialValue[potentialValue.length - 1] === '\\t' ||\n    potentialValue[potentialValue.length - 1] === ' ' ||\n    potentialValue.includes('\\n') ||\n    potentialValue.includes('\\r') ||\n    potentialValue.includes('\\0')\n  ) === false\n}\n\n/**\n * Parse a referrer policy from a Referrer-Policy header\n * @see https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header\n */\nfunction parseReferrerPolicy (actualResponse) {\n  // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.\n  const policyHeader = (actualResponse.headersList.get('referrer-policy', true) ?? '').split(',')\n\n  // 2. Let policy be the empty string.\n  let policy = ''\n\n  // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.\n\n  // Note: As the referrer-policy can contain multiple policies\n  // separated by comma, we need to loop through all of them\n  // and pick the first valid one.\n  // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy\n  if (policyHeader.length) {\n    // The right-most policy takes precedence.\n    // The left-most policy is the fallback.\n    for (let i = policyHeader.length; i !== 0; i--) {\n      const token = policyHeader[i - 1].trim()\n      if (referrerPolicyTokens.has(token)) {\n        policy = token\n        break\n      }\n    }\n  }\n\n  // 4. Return policy.\n  return policy\n}\n\n/**\n * Given a request request and a response actualResponse, this algorithm\n * updates request’s referrer policy according to the Referrer-Policy\n * header (if any) in actualResponse.\n * @see https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect\n * @param {import('./request').Request} request\n * @param {import('./response').Response} actualResponse\n */\nfunction setRequestReferrerPolicyOnRedirect (request, actualResponse) {\n  // 1. Let policy be the result of executing § 8.1 Parse a referrer policy\n  // from a Referrer-Policy header on actualResponse.\n  const policy = parseReferrerPolicy(actualResponse)\n\n  // 2. If policy is not the empty string, then set request’s referrer policy to policy.\n  if (policy !== '') {\n    request.referrerPolicy = policy\n  }\n}\n\n// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check\nfunction crossOriginResourcePolicyCheck () {\n  // TODO\n  return 'allowed'\n}\n\n// https://fetch.spec.whatwg.org/#concept-cors-check\nfunction corsCheck () {\n  // TODO\n  return 'success'\n}\n\n// https://fetch.spec.whatwg.org/#concept-tao-check\nfunction TAOCheck () {\n  // TODO\n  return 'success'\n}\n\nfunction appendFetchMetadata (httpRequest) {\n  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header\n  //  TODO\n\n  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header\n\n  //  1. Assert: r’s url is a potentially trustworthy URL.\n  //  TODO\n\n  //  2. Let header be a Structured Header whose value is a token.\n  let header = null\n\n  //  3. Set header’s value to r’s mode.\n  header = httpRequest.mode\n\n  //  4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.\n  httpRequest.headersList.set('sec-fetch-mode', header, true)\n\n  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header\n  //  TODO\n\n  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header\n  //  TODO\n}\n\n// https://fetch.spec.whatwg.org/#append-a-request-origin-header\nfunction appendRequestOriginHeader (request) {\n  // 1. Let serializedOrigin be the result of byte-serializing a request origin\n  //    with request.\n  // TODO: implement \"byte-serializing a request origin\"\n  let serializedOrigin = request.origin\n\n  // - \"'client' is changed to an origin during fetching.\"\n  //   This doesn't happen in undici (in most cases) because undici, by default,\n  //   has no concept of origin.\n  // - request.origin can also be set to request.client.origin (client being\n  //   an environment settings object), which is undefined without using\n  //   setGlobalOrigin.\n  if (serializedOrigin === 'client' || serializedOrigin === undefined) {\n    return\n  }\n\n  // 2. If request’s response tainting is \"cors\" or request’s mode is \"websocket\",\n  //    then append (`Origin`, serializedOrigin) to request’s header list.\n  // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:\n  if (request.responseTainting === 'cors' || request.mode === 'websocket') {\n    request.headersList.append('origin', serializedOrigin, true)\n  } else if (request.method !== 'GET' && request.method !== 'HEAD') {\n    // 1. Switch on request’s referrer policy:\n    switch (request.referrerPolicy) {\n      case 'no-referrer':\n        // Set serializedOrigin to `null`.\n        serializedOrigin = null\n        break\n      case 'no-referrer-when-downgrade':\n      case 'strict-origin':\n      case 'strict-origin-when-cross-origin':\n        // If request’s origin is a tuple origin, its scheme is \"https\", and\n        // request’s current URL’s scheme is not \"https\", then set\n        // serializedOrigin to `null`.\n        if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {\n          serializedOrigin = null\n        }\n        break\n      case 'same-origin':\n        // If request’s origin is not same origin with request’s current URL’s\n        // origin, then set serializedOrigin to `null`.\n        if (!sameOrigin(request, requestCurrentURL(request))) {\n          serializedOrigin = null\n        }\n        break\n      default:\n        // Do nothing.\n    }\n\n    // 2. Append (`Origin`, serializedOrigin) to request’s header list.\n    request.headersList.append('origin', serializedOrigin, true)\n  }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsen-time\nfunction coarsenTime (timestamp, crossOriginIsolatedCapability) {\n  // TODO\n  return timestamp\n}\n\n// https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info\nfunction clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {\n  if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {\n    return {\n      domainLookupStartTime: defaultStartTime,\n      domainLookupEndTime: defaultStartTime,\n      connectionStartTime: defaultStartTime,\n      connectionEndTime: defaultStartTime,\n      secureConnectionStartTime: defaultStartTime,\n      ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol\n    }\n  }\n\n  return {\n    domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),\n    domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),\n    connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),\n    connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),\n    secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),\n    ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol\n  }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time\nfunction coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {\n  return coarsenTime(performance.now(), crossOriginIsolatedCapability)\n}\n\n// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info\nfunction createOpaqueTimingInfo (timingInfo) {\n  return {\n    startTime: timingInfo.startTime ?? 0,\n    redirectStartTime: 0,\n    redirectEndTime: 0,\n    postRedirectStartTime: timingInfo.startTime ?? 0,\n    finalServiceWorkerStartTime: 0,\n    finalNetworkResponseStartTime: 0,\n    finalNetworkRequestStartTime: 0,\n    endTime: 0,\n    encodedBodySize: 0,\n    decodedBodySize: 0,\n    finalConnectionTimingInfo: null\n  }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#policy-container\nfunction makePolicyContainer () {\n  // Note: the fetch spec doesn't make use of embedder policy or CSP list\n  return {\n    referrerPolicy: 'strict-origin-when-cross-origin'\n  }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container\nfunction clonePolicyContainer (policyContainer) {\n  return {\n    referrerPolicy: policyContainer.referrerPolicy\n  }\n}\n\n/**\n * Determine request’s Referrer\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer\n */\nfunction determineRequestsReferrer (request) {\n  // Given a request request, we can determine the correct referrer information\n  // to send by examining its referrer policy as detailed in the following\n  // steps, which return either no referrer or a URL:\n\n  // 1. Let policy be request's referrer policy.\n  const policy = request.referrerPolicy\n\n  // Note: policy cannot (shouldn't) be null or an empty string.\n  assert(policy)\n\n  // 2. Let environment be request’s client.\n\n  let referrerSource = null\n\n  // 3. Switch on request’s referrer:\n\n  // \"client\"\n  if (request.referrer === 'client') {\n    // Note: node isn't a browser and doesn't implement document/iframes,\n    // so we bypass this step and replace it with our own.\n\n    const globalOrigin = getGlobalOrigin()\n\n    if (!globalOrigin || globalOrigin.origin === 'null') {\n      return 'no-referrer'\n    }\n\n    // Note: we need to clone it as it's mutated\n    referrerSource = new URL(globalOrigin)\n  // a URL\n  } else if (webidl.is.URL(request.referrer)) {\n    // Let referrerSource be request’s referrer.\n    referrerSource = request.referrer\n  }\n\n  // 4. Let request’s referrerURL be the result of stripping referrerSource for\n  //    use as a referrer.\n  let referrerURL = stripURLForReferrer(referrerSource)\n\n  // 5. Let referrerOrigin be the result of stripping referrerSource for use as\n  //    a referrer, with the origin-only flag set to true.\n  const referrerOrigin = stripURLForReferrer(referrerSource, true)\n\n  // 6. If the result of serializing referrerURL is a string whose length is\n  //    greater than 4096, set referrerURL to referrerOrigin.\n  if (referrerURL.toString().length > 4096) {\n    referrerURL = referrerOrigin\n  }\n\n  // 7. The user agent MAY alter referrerURL or referrerOrigin at this point\n  // to enforce arbitrary policy considerations in the interests of minimizing\n  // data leakage. For example, the user agent could strip the URL down to an\n  // origin, modify its host, replace it with an empty string, etc.\n\n  // 8. Execute the switch statements corresponding to the value of policy:\n  switch (policy) {\n    case 'no-referrer':\n      // Return no referrer\n      return 'no-referrer'\n    case 'origin':\n      // Return referrerOrigin\n      if (referrerOrigin != null) {\n        return referrerOrigin\n      }\n      return stripURLForReferrer(referrerSource, true)\n    case 'unsafe-url':\n      // Return referrerURL.\n      return referrerURL\n    case 'strict-origin': {\n      const currentURL = requestCurrentURL(request)\n\n      // 1. If referrerURL is a potentially trustworthy URL and request’s\n      //    current URL is not a potentially trustworthy URL, then return no\n      //    referrer.\n      if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n        return 'no-referrer'\n      }\n      // 2. Return referrerOrigin\n      return referrerOrigin\n    }\n    case 'strict-origin-when-cross-origin': {\n      const currentURL = requestCurrentURL(request)\n\n      // 1. If the origin of referrerURL and the origin of request’s current\n      //    URL are the same, then return referrerURL.\n      if (sameOrigin(referrerURL, currentURL)) {\n        return referrerURL\n      }\n\n      // 2. If referrerURL is a potentially trustworthy URL and request’s\n      //    current URL is not a potentially trustworthy URL, then return no\n      //    referrer.\n      if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n        return 'no-referrer'\n      }\n\n      // 3. Return referrerOrigin.\n      return referrerOrigin\n    }\n    case 'same-origin':\n      // 1. If the origin of referrerURL and the origin of request’s current\n      // URL are the same, then return referrerURL.\n      if (sameOrigin(request, referrerURL)) {\n        return referrerURL\n      }\n      // 2. Return no referrer.\n      return 'no-referrer'\n    case 'origin-when-cross-origin':\n      // 1. If the origin of referrerURL and the origin of request’s current\n      // URL are the same, then return referrerURL.\n      if (sameOrigin(request, referrerURL)) {\n        return referrerURL\n      }\n      // 2. Return referrerOrigin.\n      return referrerOrigin\n    case 'no-referrer-when-downgrade': {\n      const currentURL = requestCurrentURL(request)\n\n      // 1. If referrerURL is a potentially trustworthy URL and request’s\n      //    current URL is not a potentially trustworthy URL, then return no\n      //    referrer.\n      if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n        return 'no-referrer'\n      }\n      // 2. Return referrerURL.\n      return referrerURL\n    }\n  }\n}\n\n/**\n * Certain portions of URLs must not be included when sending a URL as the\n * value of a `Referer` header: a URLs fragment, username, and password\n * components must be stripped from the URL before it’s sent out. This\n * algorithm accepts a origin-only flag, which defaults to false. If set to\n * true, the algorithm will additionally remove the URL’s path and query\n * components, leaving only the scheme, host, and port.\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url\n * @param {URL} url\n * @param {boolean} [originOnly=false]\n */\nfunction stripURLForReferrer (url, originOnly = false) {\n  // 1. Assert: url is a URL.\n  assert(webidl.is.URL(url))\n\n  // Note: Create a new URL instance to avoid mutating the original URL.\n  url = new URL(url)\n\n  // 2. If url’s scheme is a local scheme, then return no referrer.\n  if (urlIsLocal(url)) {\n    return 'no-referrer'\n  }\n\n  // 3. Set url’s username to the empty string.\n  url.username = ''\n\n  // 4. Set url’s password to the empty string.\n  url.password = ''\n\n  // 5. Set url’s fragment to null.\n  url.hash = ''\n\n  // 6. If the origin-only flag is true, then:\n  if (originOnly === true) {\n    // 1. Set url’s path to « the empty string ».\n    url.pathname = ''\n\n    // 2. Set url’s query to null.\n    url.search = ''\n  }\n\n  // 7. Return url.\n  return url\n}\n\nconst isPotentialleTrustworthyIPv4 = RegExp.prototype.test\n  .bind(/^127\\.(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){2}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)$/)\n\nconst isPotentiallyTrustworthyIPv6 = RegExp.prototype.test\n  .bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/)\n\n/**\n * Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128.\n *\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginIPPotentiallyTrustworthy (origin) {\n  // IPv6\n  if (origin.includes(':')) {\n    // Remove brackets from IPv6 addresses\n    if (origin[0] === '[' && origin[origin.length - 1] === ']') {\n      origin = origin.slice(1, -1)\n    }\n    return isPotentiallyTrustworthyIPv6(origin)\n  }\n\n  // IPv4\n  return isPotentialleTrustworthyIPv4(origin)\n}\n\n/**\n * A potentially trustworthy origin is one which a user agent can generally\n * trust as delivering data securely.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginPotentiallyTrustworthy (origin) {\n  // 1. If origin is an opaque origin, return \"Not Trustworthy\".\n  if (origin == null || origin === 'null') {\n    return false\n  }\n\n  // 2. Assert: origin is a tuple origin.\n  origin = new URL(origin)\n\n  // 3. If origin’s scheme is either \"https\" or \"wss\",\n  //    return \"Potentially Trustworthy\".\n  if (origin.protocol === 'https:' || origin.protocol === 'wss:') {\n    return true\n  }\n\n  // 4. If origin’s host matches one of the CIDR notations 127.0.0.0/8 or\n  // ::1/128 [RFC4632], return \"Potentially Trustworthy\".\n  if (isOriginIPPotentiallyTrustworthy(origin.hostname)) {\n    return true\n  }\n\n  // 5. If the user agent conforms to the name resolution rules in\n  //    [let-localhost-be-localhost] and one of the following is true:\n\n  //    origin’s host is \"localhost\" or \"localhost.\"\n  if (origin.hostname === 'localhost' || origin.hostname === 'localhost.') {\n    return true\n  }\n\n  //    origin’s host ends with \".localhost\" or \".localhost.\"\n  if (origin.hostname.endsWith('.localhost') || origin.hostname.endsWith('.localhost.')) {\n    return true\n  }\n\n  // 6. If origin’s scheme is \"file\", return \"Potentially Trustworthy\".\n  if (origin.protocol === 'file:') {\n    return true\n  }\n\n  // 7. If origin’s scheme component is one which the user agent considers to\n  // be authenticated, return \"Potentially Trustworthy\".\n\n  // 8. If origin has been configured as a trustworthy origin, return\n  //    \"Potentially Trustworthy\".\n\n  // 9. Return \"Not Trustworthy\".\n  return false\n}\n\n/**\n * A potentially trustworthy URL is one which either inherits context from its\n * creator (about:blank, about:srcdoc, data) or one whose origin is a\n * potentially trustworthy origin.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://www.w3.org/TR/secure-contexts/#is-url-trustworthy\n * @param {URL} url\n * @returns {boolean}\n */\nfunction isURLPotentiallyTrustworthy (url) {\n  // Given a URL record (url), the following algorithm returns \"Potentially\n  // Trustworthy\" or \"Not Trustworthy\" as appropriate:\n  if (!webidl.is.URL(url)) {\n    return false\n  }\n\n  // 1. If url is \"about:blank\" or \"about:srcdoc\",\n  //    return \"Potentially Trustworthy\".\n  if (url.href === 'about:blank' || url.href === 'about:srcdoc') {\n    return true\n  }\n\n  // 2. If url’s scheme is \"data\", return \"Potentially Trustworthy\".\n  if (url.protocol === 'data:') return true\n\n  // Note: The origin of blob: URLs is the origin of the context in which they\n  // were created. Therefore, blobs created in a trustworthy origin will\n  // themselves be potentially trustworthy.\n  if (url.protocol === 'blob:') return true\n\n  // 3. Return the result of executing § 3.1 Is origin potentially trustworthy?\n  // on url’s origin.\n  return isOriginPotentiallyTrustworthy(url.origin)\n}\n\n// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request\nfunction tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {\n  // TODO\n}\n\n/**\n * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}\n * @param {URL} A\n * @param {URL} B\n */\nfunction sameOrigin (A, B) {\n  // 1. If A and B are the same opaque origin, then return true.\n  if (A.origin === B.origin && A.origin === 'null') {\n    return true\n  }\n\n  // 2. If A and B are both tuple origins and their schemes,\n  //    hosts, and port are identical, then return true.\n  if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {\n    return true\n  }\n\n  // 3. Return false.\n  return false\n}\n\nfunction isAborted (fetchParams) {\n  return fetchParams.controller.state === 'aborted'\n}\n\nfunction isCancelled (fetchParams) {\n  return fetchParams.controller.state === 'aborted' ||\n    fetchParams.controller.state === 'terminated'\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-method-normalize\n * @param {string} method\n */\nfunction normalizeMethod (method) {\n  return normalizedMethodRecordsBase[method.toLowerCase()] ?? method\n}\n\n// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object\nconst esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {((target: any) => any)} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n  class FastIterableIterator {\n    /** @type {any} */\n    #target\n    /** @type {'key' | 'value' | 'key+value'} */\n    #kind\n    /** @type {number} */\n    #index\n\n    /**\n     * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object\n     * @param {unknown} target\n     * @param {'key' | 'value' | 'key+value'} kind\n     */\n    constructor (target, kind) {\n      this.#target = target\n      this.#kind = kind\n      this.#index = 0\n    }\n\n    next () {\n      // 1. Let interface be the interface for which the iterator prototype object exists.\n      // 2. Let thisValue be the this value.\n      // 3. Let object be ? ToObject(thisValue).\n      // 4. If object is a platform object, then perform a security\n      //    check, passing:\n      // 5. If object is not a default iterator object for interface,\n      //    then throw a TypeError.\n      if (typeof this !== 'object' || this === null || !(#target in this)) {\n        throw new TypeError(\n          `'next' called on an object that does not implement interface ${name} Iterator.`\n        )\n      }\n\n      // 6. Let index be object’s index.\n      // 7. Let kind be object’s kind.\n      // 8. Let values be object’s target's value pairs to iterate over.\n      const index = this.#index\n      const values = kInternalIterator(this.#target)\n\n      // 9. Let len be the length of values.\n      const len = values.length\n\n      // 10. If index is greater than or equal to len, then return\n      //     CreateIterResultObject(undefined, true).\n      if (index >= len) {\n        return {\n          value: undefined,\n          done: true\n        }\n      }\n\n      // 11. Let pair be the entry in values at index index.\n      const { [keyIndex]: key, [valueIndex]: value } = values[index]\n\n      // 12. Set object’s index to index + 1.\n      this.#index = index + 1\n\n      // 13. Return the iterator result for pair and kind.\n\n      // https://webidl.spec.whatwg.org/#iterator-result\n\n      // 1. Let result be a value determined by the value of kind:\n      let result\n      switch (this.#kind) {\n        case 'key':\n          // 1. Let idlKey be pair’s key.\n          // 2. Let key be the result of converting idlKey to an\n          //    ECMAScript value.\n          // 3. result is key.\n          result = key\n          break\n        case 'value':\n          // 1. Let idlValue be pair’s value.\n          // 2. Let value be the result of converting idlValue to\n          //    an ECMAScript value.\n          // 3. result is value.\n          result = value\n          break\n        case 'key+value':\n          // 1. Let idlKey be pair’s key.\n          // 2. Let idlValue be pair’s value.\n          // 3. Let key be the result of converting idlKey to an\n          //    ECMAScript value.\n          // 4. Let value be the result of converting idlValue to\n          //    an ECMAScript value.\n          // 5. Let array be ! ArrayCreate(2).\n          // 6. Call ! CreateDataProperty(array, \"0\", key).\n          // 7. Call ! CreateDataProperty(array, \"1\", value).\n          // 8. result is array.\n          result = [key, value]\n          break\n      }\n\n      // 2. Return CreateIterResultObject(result, false).\n      return {\n        value: result,\n        done: false\n      }\n    }\n  }\n\n  // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n  // @ts-ignore\n  delete FastIterableIterator.prototype.constructor\n\n  Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype)\n\n  Object.defineProperties(FastIterableIterator.prototype, {\n    [Symbol.toStringTag]: {\n      writable: false,\n      enumerable: false,\n      configurable: true,\n      value: `${name} Iterator`\n    },\n    next: { writable: true, enumerable: true, configurable: true }\n  })\n\n  /**\n   * @param {unknown} target\n   * @param {'key' | 'value' | 'key+value'} kind\n   * @returns {IterableIterator<any>}\n   */\n  return function (target, kind) {\n    return new FastIterableIterator(target, kind)\n  }\n}\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {any} object class\n * @param {(target: any) => any} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n  const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex)\n\n  const properties = {\n    keys: {\n      writable: true,\n      enumerable: true,\n      configurable: true,\n      value: function keys () {\n        webidl.brandCheck(this, object)\n        return makeIterator(this, 'key')\n      }\n    },\n    values: {\n      writable: true,\n      enumerable: true,\n      configurable: true,\n      value: function values () {\n        webidl.brandCheck(this, object)\n        return makeIterator(this, 'value')\n      }\n    },\n    entries: {\n      writable: true,\n      enumerable: true,\n      configurable: true,\n      value: function entries () {\n        webidl.brandCheck(this, object)\n        return makeIterator(this, 'key+value')\n      }\n    },\n    forEach: {\n      writable: true,\n      enumerable: true,\n      configurable: true,\n      value: function forEach (callbackfn, thisArg = globalThis) {\n        webidl.brandCheck(this, object)\n        webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`)\n        if (typeof callbackfn !== 'function') {\n          throw new TypeError(\n            `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`\n          )\n        }\n        for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) {\n          callbackfn.call(thisArg, value, key, this)\n        }\n      }\n    }\n  }\n\n  return Object.defineProperties(object.prototype, {\n    ...properties,\n    [Symbol.iterator]: {\n      writable: true,\n      enumerable: false,\n      configurable: true,\n      value: properties.entries.value\n    }\n  })\n}\n\n/**\n * @param {import('./body').ExtractBodyResult} body\n * @param {(bytes: Uint8Array) => void} processBody\n * @param {(error: Error) => void} processBodyError\n * @returns {void}\n *\n * @see https://fetch.spec.whatwg.org/#body-fully-read\n */\nfunction fullyReadBody (body, processBody, processBodyError) {\n  // 1. If taskDestination is null, then set taskDestination to\n  //    the result of starting a new parallel queue.\n\n  // 2. Let successSteps given a byte sequence bytes be to queue a\n  //    fetch task to run processBody given bytes, with taskDestination.\n  const successSteps = processBody\n\n  // 3. Let errorSteps be to queue a fetch task to run processBodyError,\n  //    with taskDestination.\n  const errorSteps = processBodyError\n\n  try {\n  // 4. Let reader be the result of getting a reader for body’s stream.\n  //    If that threw an exception, then run errorSteps with that\n  //    exception and return.\n    const reader = body.stream.getReader()\n\n    // 5. Read all bytes from reader, given successSteps and errorSteps.\n    readAllBytes(reader, successSteps, errorSteps)\n  } catch (e) {\n    errorSteps(e)\n  }\n}\n\n/**\n * @param {ReadableStreamController<Uint8Array>} controller\n */\nfunction readableStreamClose (controller) {\n  try {\n    controller.close()\n    controller.byobRequest?.respond(0)\n  } catch (err) {\n    // TODO: add comment explaining why this error occurs.\n    if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) {\n      throw err\n    }\n  }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes\n * @see https://streams.spec.whatwg.org/#read-loop\n * @param {ReadableStream<Uint8Array<ArrayBuffer>>} reader\n * @param {(bytes: Uint8Array) => void} successSteps\n * @param {(error: Error) => void} failureSteps\n * @returns {Promise<void>}\n */\nasync function readAllBytes (reader, successSteps, failureSteps) {\n  try {\n    const bytes = []\n    let byteLength = 0\n\n    do {\n      const { done, value: chunk } = await reader.read()\n\n      if (done) {\n        // 1. Call successSteps with bytes.\n        successSteps(Buffer.concat(bytes, byteLength))\n        return\n      }\n\n      // 1. If chunk is not a Uint8Array object, call failureSteps\n      //    with a TypeError and abort these steps.\n      if (!isUint8Array(chunk)) {\n        failureSteps(new TypeError('Received non-Uint8Array chunk'))\n        return\n      }\n\n      // 2. Append the bytes represented by chunk to bytes.\n      bytes.push(chunk)\n      byteLength += chunk.length\n\n    // 3. Read-loop given reader, bytes, successSteps, and failureSteps.\n    } while (true)\n  } catch (e) {\n    // 1. Call failureSteps with e.\n    failureSteps(e)\n  }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#is-local\n * @param {URL} url\n * @returns {boolean}\n */\nfunction urlIsLocal (url) {\n  assert('protocol' in url) // ensure it's a url object\n\n  const protocol = url.protocol\n\n  // A URL is local if its scheme is a local scheme.\n  // A local scheme is \"about\", \"blob\", or \"data\".\n  return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'\n}\n\n/**\n * @param {string|URL} url\n * @returns {boolean}\n */\nfunction urlHasHttpsScheme (url) {\n  return (\n    (\n      typeof url === 'string' &&\n      url[5] === ':' &&\n      url[0] === 'h' &&\n      url[1] === 't' &&\n      url[2] === 't' &&\n      url[3] === 'p' &&\n      url[4] === 's'\n    ) ||\n    url.protocol === 'https:'\n  )\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-scheme\n * @param {URL} url\n */\nfunction urlIsHttpHttpsScheme (url) {\n  assert('protocol' in url) // ensure it's a url object\n\n  const protocol = url.protocol\n\n  return protocol === 'http:' || protocol === 'https:'\n}\n\n/**\n * @typedef {Object} RangeHeaderValue\n * @property {number|null} rangeStartValue\n * @property {number|null} rangeEndValue\n */\n\n/**\n * @see https://fetch.spec.whatwg.org/#simple-range-header-value\n * @param {string} value\n * @param {boolean} allowWhitespace\n * @return {RangeHeaderValue|'failure'}\n */\nfunction simpleRangeHeaderValue (value, allowWhitespace) {\n  // 1. Let data be the isomorphic decoding of value.\n  // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string,\n  // nothing more. We obviously don't need to do that if value is a string already.\n  const data = value\n\n  // 2. If data does not start with \"bytes\", then return failure.\n  if (!data.startsWith('bytes')) {\n    return 'failure'\n  }\n\n  // 3. Let position be a position variable for data, initially pointing at the 5th code point of data.\n  const position = { position: 5 }\n\n  // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n  //    from data given position.\n  if (allowWhitespace) {\n    collectASequenceOfCodePoints(\n      (char) => char === '\\t' || char === ' ',\n      data,\n      position\n    )\n  }\n\n  // 5. If the code point at position within data is not U+003D (=), then return failure.\n  if (data.charCodeAt(position.position) !== 0x3D) {\n    return 'failure'\n  }\n\n  // 6. Advance position by 1.\n  position.position++\n\n  // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from\n  //    data given position.\n  if (allowWhitespace) {\n    collectASequenceOfCodePoints(\n      (char) => char === '\\t' || char === ' ',\n      data,\n      position\n    )\n  }\n\n  // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits,\n  //    from data given position.\n  const rangeStart = collectASequenceOfCodePoints(\n    (char) => {\n      const code = char.charCodeAt(0)\n\n      return code >= 0x30 && code <= 0x39\n    },\n    data,\n    position\n  )\n\n  // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the\n  //    empty string; otherwise null.\n  const rangeStartValue = rangeStart.length ? Number(rangeStart) : null\n\n  // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n  //     from data given position.\n  if (allowWhitespace) {\n    collectASequenceOfCodePoints(\n      (char) => char === '\\t' || char === ' ',\n      data,\n      position\n    )\n  }\n\n  // 11. If the code point at position within data is not U+002D (-), then return failure.\n  if (data.charCodeAt(position.position) !== 0x2D) {\n    return 'failure'\n  }\n\n  // 12. Advance position by 1.\n  position.position++\n\n  // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab\n  //     or space, from data given position.\n  // Note from Khafra: its the same step as in #8 again lol\n  if (allowWhitespace) {\n    collectASequenceOfCodePoints(\n      (char) => char === '\\t' || char === ' ',\n      data,\n      position\n    )\n  }\n\n  // 14. Let rangeEnd be the result of collecting a sequence of code points that are\n  //     ASCII digits, from data given position.\n  // Note from Khafra: you wouldn't guess it, but this is also the same step as #8\n  const rangeEnd = collectASequenceOfCodePoints(\n    (char) => {\n      const code = char.charCodeAt(0)\n\n      return code >= 0x30 && code <= 0x39\n    },\n    data,\n    position\n  )\n\n  // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd\n  //     is not the empty string; otherwise null.\n  // Note from Khafra: THE SAME STEP, AGAIN!!!\n  // Note: why interpret as a decimal if we only collect ascii digits?\n  const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null\n\n  // 16. If position is not past the end of data, then return failure.\n  if (position.position < data.length) {\n    return 'failure'\n  }\n\n  // 17. If rangeEndValue and rangeStartValue are null, then return failure.\n  if (rangeEndValue === null && rangeStartValue === null) {\n    return 'failure'\n  }\n\n  // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is\n  //     greater than rangeEndValue, then return failure.\n  // Note: ... when can they not be numbers?\n  if (rangeStartValue > rangeEndValue) {\n    return 'failure'\n  }\n\n  // 19. Return (rangeStartValue, rangeEndValue).\n  return { rangeStartValue, rangeEndValue }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#build-a-content-range\n * @param {number} rangeStart\n * @param {number} rangeEnd\n * @param {number} fullLength\n */\nfunction buildContentRange (rangeStart, rangeEnd, fullLength) {\n  // 1. Let contentRange be `bytes `.\n  let contentRange = 'bytes '\n\n  // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange.\n  contentRange += isomorphicEncode(`${rangeStart}`)\n\n  // 3. Append 0x2D (-) to contentRange.\n  contentRange += '-'\n\n  // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange.\n  contentRange += isomorphicEncode(`${rangeEnd}`)\n\n  // 5. Append 0x2F (/) to contentRange.\n  contentRange += '/'\n\n  // 6. Append fullLength, serialized and isomorphic encoded to contentRange.\n  contentRange += isomorphicEncode(`${fullLength}`)\n\n  // 7. Return contentRange.\n  return contentRange\n}\n\n// A Stream, which pipes the response to zlib.createInflate() or\n// zlib.createInflateRaw() depending on the first byte of the Buffer.\n// If the lower byte of the first byte is 0x08, then the stream is\n// interpreted as a zlib stream, otherwise it's interpreted as a\n// raw deflate stream.\nclass InflateStream extends Transform {\n  #zlibOptions\n\n  /** @param {zlib.ZlibOptions} [zlibOptions] */\n  constructor (zlibOptions) {\n    super()\n    this.#zlibOptions = zlibOptions\n  }\n\n  _transform (chunk, encoding, callback) {\n    if (!this._inflateStream) {\n      if (chunk.length === 0) {\n        callback()\n        return\n      }\n      this._inflateStream = (chunk[0] & 0x0F) === 0x08\n        ? zlib.createInflate(this.#zlibOptions)\n        : zlib.createInflateRaw(this.#zlibOptions)\n\n      this._inflateStream.on('data', this.push.bind(this))\n      this._inflateStream.on('end', () => this.push(null))\n      this._inflateStream.on('error', (err) => this.destroy(err))\n    }\n\n    this._inflateStream.write(chunk, encoding, callback)\n  }\n\n  _final (callback) {\n    if (this._inflateStream) {\n      this._inflateStream.end()\n      this._inflateStream = null\n    }\n    callback()\n  }\n}\n\n/**\n * @param {zlib.ZlibOptions} [zlibOptions]\n * @returns {InflateStream}\n */\nfunction createInflate (zlibOptions) {\n  return new InflateStream(zlibOptions)\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type\n * @param {import('./headers').HeadersList} headers\n */\nfunction extractMimeType (headers) {\n  // 1. Let charset be null.\n  let charset = null\n\n  // 2. Let essence be null.\n  let essence = null\n\n  // 3. Let mimeType be null.\n  let mimeType = null\n\n  // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers.\n  const values = getDecodeSplit('content-type', headers)\n\n  // 5. If values is null, then return failure.\n  if (values === null) {\n    return 'failure'\n  }\n\n  // 6. For each value of values:\n  for (const value of values) {\n    // 6.1. Let temporaryMimeType be the result of parsing value.\n    const temporaryMimeType = parseMIMEType(value)\n\n    // 6.2. If temporaryMimeType is failure or its essence is \"*/*\", then continue.\n    if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') {\n      continue\n    }\n\n    // 6.3. Set mimeType to temporaryMimeType.\n    mimeType = temporaryMimeType\n\n    // 6.4. If mimeType’s essence is not essence, then:\n    if (mimeType.essence !== essence) {\n      // 6.4.1. Set charset to null.\n      charset = null\n\n      // 6.4.2. If mimeType’s parameters[\"charset\"] exists, then set charset to\n      //        mimeType’s parameters[\"charset\"].\n      if (mimeType.parameters.has('charset')) {\n        charset = mimeType.parameters.get('charset')\n      }\n\n      // 6.4.3. Set essence to mimeType’s essence.\n      essence = mimeType.essence\n    } else if (!mimeType.parameters.has('charset') && charset !== null) {\n      // 6.5. Otherwise, if mimeType’s parameters[\"charset\"] does not exist, and\n      //      charset is non-null, set mimeType’s parameters[\"charset\"] to charset.\n      mimeType.parameters.set('charset', charset)\n    }\n  }\n\n  // 7. If mimeType is null, then return failure.\n  if (mimeType == null) {\n    return 'failure'\n  }\n\n  // 8. Return mimeType.\n  return mimeType\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split\n * @param {string|null} value\n */\nfunction gettingDecodingSplitting (value) {\n  // 1. Let input be the result of isomorphic decoding value.\n  const input = value\n\n  // 2. Let position be a position variable for input, initially pointing at the start of input.\n  const position = { position: 0 }\n\n  // 3. Let values be a list of strings, initially empty.\n  const values = []\n\n  // 4. Let temporaryValue be the empty string.\n  let temporaryValue = ''\n\n  // 5. While position is not past the end of input:\n  while (position.position < input.length) {\n    // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (\")\n    //      or U+002C (,) from input, given position, to temporaryValue.\n    temporaryValue += collectASequenceOfCodePoints(\n      (char) => char !== '\"' && char !== ',',\n      input,\n      position\n    )\n\n    // 5.2. If position is not past the end of input, then:\n    if (position.position < input.length) {\n      // 5.2.1. If the code point at position within input is U+0022 (\"), then:\n      if (input.charCodeAt(position.position) === 0x22) {\n        // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue.\n        temporaryValue += collectAnHTTPQuotedString(\n          input,\n          position\n        )\n\n        // 5.2.1.2. If position is not past the end of input, then continue.\n        if (position.position < input.length) {\n          continue\n        }\n      } else {\n        // 5.2.2. Otherwise:\n\n        // 5.2.2.1. Assert: the code point at position within input is U+002C (,).\n        assert(input.charCodeAt(position.position) === 0x2C)\n\n        // 5.2.2.2. Advance position by 1.\n        position.position++\n      }\n    }\n\n    // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue.\n    temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20)\n\n    // 5.4. Append temporaryValue to values.\n    values.push(temporaryValue)\n\n    // 5.6. Set temporaryValue to the empty string.\n    temporaryValue = ''\n  }\n\n  // 6. Return values.\n  return values\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split\n * @param {string} name lowercase header name\n * @param {import('./headers').HeadersList} list\n */\nfunction getDecodeSplit (name, list) {\n  // 1. Let value be the result of getting name from list.\n  const value = list.get(name, true)\n\n  // 2. If value is null, then return null.\n  if (value === null) {\n    return null\n  }\n\n  // 3. Return the result of getting, decoding, and splitting value.\n  return gettingDecodingSplitting(value)\n}\n\nfunction hasAuthenticationEntry (request) {\n  return false\n}\n\n/**\n * @see https://url.spec.whatwg.org/#include-credentials\n * @param {URL} url\n */\nfunction includesCredentials (url) {\n  // A URL includes credentials if its username or password is not the empty string.\n  return !!(url.username || url.password)\n}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/document-sequences.html#traversable-navigable\n * @param {object|string} navigable\n */\nfunction isTraversableNavigable (navigable) {\n  // Returns true only if we have an actual traversable navigable object\n  // that can prompt the user for credentials. In Node.js, this will always\n  // be false since there's no Window object or navigable.\n  return navigable != null && navigable !== 'client' && navigable !== 'no-traversable'\n}\n\nclass EnvironmentSettingsObjectBase {\n  get baseUrl () {\n    return getGlobalOrigin()\n  }\n\n  get origin () {\n    return this.baseUrl?.origin\n  }\n\n  policyContainer = makePolicyContainer()\n}\n\nclass EnvironmentSettingsObject {\n  settingsObject = new EnvironmentSettingsObjectBase()\n}\n\nconst environmentSettingsObject = new EnvironmentSettingsObject()\n\nmodule.exports = {\n  isAborted,\n  isCancelled,\n  isValidEncodedURL,\n  ReadableStreamFrom,\n  tryUpgradeRequestToAPotentiallyTrustworthyURL,\n  clampAndCoarsenConnectionTimingInfo,\n  coarsenedSharedCurrentTime,\n  determineRequestsReferrer,\n  makePolicyContainer,\n  clonePolicyContainer,\n  appendFetchMetadata,\n  appendRequestOriginHeader,\n  TAOCheck,\n  corsCheck,\n  crossOriginResourcePolicyCheck,\n  createOpaqueTimingInfo,\n  setRequestReferrerPolicyOnRedirect,\n  isValidHTTPToken,\n  requestBadPort,\n  requestCurrentURL,\n  responseURL,\n  responseLocationURL,\n  isURLPotentiallyTrustworthy,\n  isValidReasonPhrase,\n  sameOrigin,\n  normalizeMethod,\n  iteratorMixin,\n  createIterator,\n  isValidHeaderName,\n  isValidHeaderValue,\n  isErrorLike,\n  fullyReadBody,\n  readableStreamClose,\n  urlIsLocal,\n  urlHasHttpsScheme,\n  urlIsHttpHttpsScheme,\n  readAllBytes,\n  simpleRangeHeaderValue,\n  buildContentRange,\n  createInflate,\n  extractMimeType,\n  getDecodeSplit,\n  environmentSettingsObject,\n  isOriginIPPotentiallyTrustworthy,\n  hasAuthenticationEntry,\n  includesCredentials,\n  isTraversableNavigable\n}\n","'use strict'\n\nconst { iteratorMixin } = require('./util')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst nodeUtil = require('node:util')\n\n// https://xhr.spec.whatwg.org/#formdata\nclass FormData {\n  #state = []\n\n  constructor (form = undefined) {\n    webidl.util.markAsUncloneable(this)\n\n    if (form !== undefined) {\n      throw webidl.errors.conversionFailed({\n        prefix: 'FormData constructor',\n        argument: 'Argument 1',\n        types: ['undefined']\n      })\n    }\n  }\n\n  append (name, value, filename = undefined) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.append'\n    webidl.argumentLengthCheck(arguments, 2, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    if (arguments.length === 3 || webidl.is.Blob(value)) {\n      value = webidl.converters.Blob(value, prefix, 'value')\n\n      if (filename !== undefined) {\n        filename = webidl.converters.USVString(filename)\n      }\n    } else {\n      value = webidl.converters.USVString(value)\n    }\n\n    // 1. Let value be value if given; otherwise blobValue.\n\n    // 2. Let entry be the result of creating an entry with\n    // name, value, and filename if given.\n    const entry = makeEntry(name, value, filename)\n\n    // 3. Append entry to this’s entry list.\n    this.#state.push(entry)\n  }\n\n  delete (name) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.delete'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    // The delete(name) method steps are to remove all entries whose name\n    // is name from this’s entry list.\n    this.#state = this.#state.filter(entry => entry.name !== name)\n  }\n\n  get (name) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.get'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    // 1. If there is no entry whose name is name in this’s entry list,\n    // then return null.\n    const idx = this.#state.findIndex((entry) => entry.name === name)\n    if (idx === -1) {\n      return null\n    }\n\n    // 2. Return the value of the first entry whose name is name from\n    // this’s entry list.\n    return this.#state[idx].value\n  }\n\n  getAll (name) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.getAll'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    // 1. If there is no entry whose name is name in this’s entry list,\n    // then return the empty list.\n    // 2. Return the values of all entries whose name is name, in order,\n    // from this’s entry list.\n    return this.#state\n      .filter((entry) => entry.name === name)\n      .map((entry) => entry.value)\n  }\n\n  has (name) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.has'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    // The has(name) method steps are to return true if there is an entry\n    // whose name is name in this’s entry list; otherwise false.\n    return this.#state.findIndex((entry) => entry.name === name) !== -1\n  }\n\n  set (name, value, filename = undefined) {\n    webidl.brandCheck(this, FormData)\n\n    const prefix = 'FormData.set'\n    webidl.argumentLengthCheck(arguments, 2, prefix)\n\n    name = webidl.converters.USVString(name)\n\n    if (arguments.length === 3 || webidl.is.Blob(value)) {\n      value = webidl.converters.Blob(value, prefix, 'value')\n\n      if (filename !== undefined) {\n        filename = webidl.converters.USVString(filename)\n      }\n    } else {\n      value = webidl.converters.USVString(value)\n    }\n\n    // The set(name, value) and set(name, blobValue, filename) method steps\n    // are:\n\n    // 1. Let value be value if given; otherwise blobValue.\n\n    // 2. Let entry be the result of creating an entry with name, value, and\n    // filename if given.\n    const entry = makeEntry(name, value, filename)\n\n    // 3. If there are entries in this’s entry list whose name is name, then\n    // replace the first such entry with entry and remove the others.\n    const idx = this.#state.findIndex((entry) => entry.name === name)\n    if (idx !== -1) {\n      this.#state = [\n        ...this.#state.slice(0, idx),\n        entry,\n        ...this.#state.slice(idx + 1).filter((entry) => entry.name !== name)\n      ]\n    } else {\n      // 4. Otherwise, append entry to this’s entry list.\n      this.#state.push(entry)\n    }\n  }\n\n  [nodeUtil.inspect.custom] (depth, options) {\n    const state = this.#state.reduce((a, b) => {\n      if (a[b.name]) {\n        if (Array.isArray(a[b.name])) {\n          a[b.name].push(b.value)\n        } else {\n          a[b.name] = [a[b.name], b.value]\n        }\n      } else {\n        a[b.name] = b.value\n      }\n\n      return a\n    }, { __proto__: null })\n\n    options.depth ??= depth\n    options.colors ??= true\n\n    const output = nodeUtil.formatWithOptions(options, state)\n\n    // remove [Object null prototype]\n    return `FormData ${output.slice(output.indexOf(']') + 2)}`\n  }\n\n  /**\n   * @param {FormData} formData\n   */\n  static getFormDataState (formData) {\n    return formData.#state\n  }\n\n  /**\n   * @param {FormData} formData\n   * @param {any[]} newState\n   */\n  static setFormDataState (formData, newState) {\n    formData.#state = newState\n  }\n}\n\nconst { getFormDataState, setFormDataState } = FormData\nReflect.deleteProperty(FormData, 'getFormDataState')\nReflect.deleteProperty(FormData, 'setFormDataState')\n\niteratorMixin('FormData', FormData, getFormDataState, 'name', 'value')\n\nObject.defineProperties(FormData.prototype, {\n  append: kEnumerableProperty,\n  delete: kEnumerableProperty,\n  get: kEnumerableProperty,\n  getAll: kEnumerableProperty,\n  has: kEnumerableProperty,\n  set: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'FormData',\n    configurable: true\n  }\n})\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry\n * @param {string} name\n * @param {string|Blob} value\n * @param {?string} filename\n * @returns\n */\nfunction makeEntry (name, value, filename) {\n  // 1. Set name to the result of converting name into a scalar value string.\n  // Note: This operation was done by the webidl converter USVString.\n\n  // 2. If value is a string, then set value to the result of converting\n  //    value into a scalar value string.\n  if (typeof value === 'string') {\n    // Note: This operation was done by the webidl converter USVString.\n  } else {\n    // 3. Otherwise:\n\n    // 1. If value is not a File object, then set value to a new File object,\n    //    representing the same bytes, whose name attribute value is \"blob\"\n    if (!webidl.is.File(value)) {\n      value = new File([value], 'blob', { type: value.type })\n    }\n\n    // 2. If filename is given, then set value to a new File object,\n    //    representing the same bytes, whose name attribute is filename.\n    if (filename !== undefined) {\n      /** @type {FilePropertyBag} */\n      const options = {\n        type: value.type,\n        lastModified: value.lastModified\n      }\n\n      value = new File([value], filename, options)\n    }\n  }\n\n  // 4. Return an entry whose name is name and whose value is value.\n  return { name, value }\n}\n\nwebidl.is.FormData = webidl.util.MakeTypeAssertion(FormData)\n\nmodule.exports = { FormData, makeEntry, setFormDataState }\n","'use strict'\n\nconst { bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { HTTP_TOKEN_CODEPOINTS } = require('./data-url')\nconst { makeEntry } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isomorphicDecode } = require('../infra')\n\nconst dd = Buffer.from('--')\nconst decoder = new TextDecoder()\nconst decoderIgnoreBOM = new TextDecoder('utf-8', { ignoreBOM: true })\n\n/**\n * @param {string} chars\n */\nfunction isAsciiString (chars) {\n  for (let i = 0; i < chars.length; ++i) {\n    if ((chars.charCodeAt(i) & ~0x7F) !== 0) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary\n * @param {string} boundary\n */\nfunction validateBoundary (boundary) {\n  const length = boundary.length\n\n  // - its length is greater or equal to 27 and lesser or equal to 70, and\n  if (length < 27 || length > 70) {\n    return false\n  }\n\n  // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or\n  //   0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('),\n  //   0x2D (-) or 0x5F (_).\n  for (let i = 0; i < length; ++i) {\n    const cp = boundary.charCodeAt(i)\n\n    if (!(\n      (cp >= 0x30 && cp <= 0x39) ||\n      (cp >= 0x41 && cp <= 0x5a) ||\n      (cp >= 0x61 && cp <= 0x7a) ||\n      cp === 0x27 ||\n      cp === 0x2d ||\n      cp === 0x5f\n    )) {\n      return false\n    }\n  }\n\n  return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser\n * @param {Buffer} input\n * @param {ReturnType<import('./data-url')['parseMIMEType']>} mimeType\n */\nfunction multipartFormDataParser (input, mimeType) {\n  // 1. Assert: mimeType’s essence is \"multipart/form-data\".\n  assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data')\n\n  const boundaryString = mimeType.parameters.get('boundary')\n\n  // 2. If mimeType’s parameters[\"boundary\"] does not exist, return failure.\n  //    Otherwise, let boundary be the result of UTF-8 decoding mimeType’s\n  //    parameters[\"boundary\"].\n  if (boundaryString === undefined) {\n    throw parsingError('missing boundary in content-type header')\n  }\n\n  const boundary = Buffer.from(`--${boundaryString}`, 'utf8')\n\n  // 3. Let entry list be an empty entry list.\n  const entryList = []\n\n  // 4. Let position be a pointer to a byte in input, initially pointing at\n  //    the first byte.\n  const position = { position: 0 }\n\n  // Note: Per RFC 2046 Section 5.1.1, we must ignore anything before the\n  // first boundary delimiter line (preamble). Search for the first boundary.\n  const firstBoundaryIndex = input.indexOf(boundary)\n\n  if (firstBoundaryIndex === -1) {\n    throw parsingError('no boundary found in multipart body')\n  }\n\n  // Start parsing from the first boundary, ignoring any preamble\n  position.position = firstBoundaryIndex\n\n  // 5. While true:\n  while (true) {\n    // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D\n    //      (`--`) followed by boundary, advance position by 2 + the length of\n    //      boundary. Otherwise, return failure.\n    // Note: boundary is padded with 2 dashes already, no need to add 2.\n    if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) {\n      position.position += boundary.length\n    } else {\n      throw parsingError('expected a value starting with -- and the boundary')\n    }\n\n    // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A\n    //      (`--` followed by CR LF) followed by the end of input, return entry list.\n    // Note: Per RFC 2046 Section 5.1.1, we must ignore anything after the\n    // final boundary delimiter (epilogue). Check for -- or --CRLF and return\n    // regardless of what follows.\n    if (bufferStartsWith(input, dd, position)) {\n      // Found closing boundary delimiter (--), ignore any epilogue\n      return entryList\n    }\n\n    // 5.3. If position does not point to a sequence of bytes starting with 0x0D\n    //      0x0A (CR LF), return failure.\n    if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n      throw parsingError('expected CRLF')\n    }\n\n    // 5.4. Advance position by 2. (This skips past the newline.)\n    position.position += 2\n\n    // 5.5. Let name, filename and contentType be the result of parsing\n    //      multipart/form-data headers on input and position, if the result\n    //      is not failure. Otherwise, return failure.\n    const result = parseMultipartFormDataHeaders(input, position)\n\n    let { name, filename, contentType, encoding } = result\n\n    // 5.6. Advance position by 2. (This skips past the empty line that marks\n    //      the end of the headers.)\n    position.position += 2\n\n    // 5.7. Let body be the empty byte sequence.\n    let body\n\n    // 5.8. Body loop: While position is not past the end of input:\n    // TODO: the steps here are completely wrong\n    {\n      const boundaryIndex = input.indexOf(boundary.subarray(2), position.position)\n\n      if (boundaryIndex === -1) {\n        throw parsingError('expected boundary after body')\n      }\n\n      body = input.subarray(position.position, boundaryIndex - 4)\n\n      position.position += body.length\n\n      // Note: position must be advanced by the body's length before being\n      // decoded, otherwise the parsing will fail.\n      if (encoding === 'base64') {\n        body = Buffer.from(body.toString(), 'base64')\n      }\n    }\n\n    // 5.9. If position does not point to a sequence of bytes starting with\n    //      0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2.\n    if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n      throw parsingError('expected CRLF')\n    } else {\n      position.position += 2\n    }\n\n    // 5.10. If filename is not null:\n    let value\n\n    if (filename !== null) {\n      // 5.10.1. If contentType is null, set contentType to \"text/plain\".\n      contentType ??= 'text/plain'\n\n      // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string.\n\n      // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead.\n      // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`.\n      if (!isAsciiString(contentType)) {\n        contentType = ''\n      }\n\n      // 5.10.3. Let value be a new File object with name filename, type contentType, and body body.\n      value = new File([body], filename, { type: contentType })\n    } else {\n      // 5.11. Otherwise:\n\n      // 5.11.1. Let value be the UTF-8 decoding without BOM of body.\n      value = decoderIgnoreBOM.decode(Buffer.from(body))\n    }\n\n    // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.\n    assert(webidl.is.USVString(name))\n    assert((typeof value === 'string' && webidl.is.USVString(value)) || webidl.is.File(value))\n\n    // 5.13. Create an entry with name and value, and append it to entry list.\n    entryList.push(makeEntry(name, value, filename))\n  }\n}\n\n/**\n * Parses content-disposition attributes (e.g., name=\"value\" or filename*=utf-8''encoded)\n * @param {Buffer} input\n * @param {{ position: number }} position\n * @returns {{ name: string, value: string }}\n */\nfunction parseContentDispositionAttribute (input, position) {\n  // Skip leading semicolon and whitespace\n  if (input[position.position] === 0x3b /* ; */) {\n    position.position++\n  }\n\n  // Skip whitespace\n  collectASequenceOfBytes(\n    (char) => char === 0x20 || char === 0x09,\n    input,\n    position\n  )\n\n  // Collect attribute name (token characters)\n  const attributeName = collectASequenceOfBytes(\n    (char) => isToken(char) && char !== 0x3d && char !== 0x2a, // not = or *\n    input,\n    position\n  )\n\n  if (attributeName.length === 0) {\n    return null\n  }\n\n  const attrNameStr = attributeName.toString('ascii').toLowerCase()\n\n  // Check for extended notation (attribute*)\n  const isExtended = input[position.position] === 0x2a /* * */\n  if (isExtended) {\n    position.position++ // skip *\n  }\n\n  // Expect = sign\n  if (input[position.position] !== 0x3d /* = */) {\n    return null\n  }\n  position.position++ // skip =\n\n  // Skip whitespace\n  collectASequenceOfBytes(\n    (char) => char === 0x20 || char === 0x09,\n    input,\n    position\n  )\n\n  let value\n\n  if (isExtended) {\n    // Extended attribute format: charset'language'encoded-value\n    const headerValue = collectASequenceOfBytes(\n      (char) => char !== 0x20 && char !== 0x0d && char !== 0x0a && char !== 0x3b, // not space, CRLF, or ;\n      input,\n      position\n    )\n\n    // Check for utf-8'' prefix (case insensitive)\n    if (\n      (headerValue[0] !== 0x75 && headerValue[0] !== 0x55) || // u or U\n      (headerValue[1] !== 0x74 && headerValue[1] !== 0x54) || // t or T\n      (headerValue[2] !== 0x66 && headerValue[2] !== 0x46) || // f or F\n      headerValue[3] !== 0x2d || // -\n      headerValue[4] !== 0x38 // 8\n    ) {\n      throw parsingError('unknown encoding, expected utf-8\\'\\'')\n    }\n\n    // Skip utf-8'' and decode the rest\n    value = decodeURIComponent(decoder.decode(headerValue.subarray(7)))\n  } else if (input[position.position] === 0x22 /* \" */) {\n    // Quoted string\n    position.position++ // skip opening quote\n\n    const quotedValue = collectASequenceOfBytes(\n      (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, // not LF, CR, or \"\n      input,\n      position\n    )\n\n    if (input[position.position] !== 0x22) {\n      throw parsingError('Closing quote not found')\n    }\n    position.position++ // skip closing quote\n\n    value = decoder.decode(quotedValue)\n      .replace(/%0A/ig, '\\n')\n      .replace(/%0D/ig, '\\r')\n      .replace(/%22/g, '\"')\n  } else {\n    // Token value (no quotes)\n    const tokenValue = collectASequenceOfBytes(\n      (char) => isToken(char) && char !== 0x3b, // not ;\n      input,\n      position\n    )\n\n    value = decoder.decode(tokenValue)\n  }\n\n  return { name: attrNameStr, value }\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction parseMultipartFormDataHeaders (input, position) {\n  // 1. Let name, filename and contentType be null.\n  let name = null\n  let filename = null\n  let contentType = null\n  let encoding = null\n\n  // 2. While true:\n  while (true) {\n    // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF):\n    if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) {\n      // 2.1.1. If name is null, return failure.\n      if (name === null) {\n        throw parsingError('header name is null')\n      }\n\n      // 2.1.2. Return name, filename and contentType.\n      return { name, filename, contentType, encoding }\n    }\n\n    // 2.2. Let header name be the result of collecting a sequence of bytes that are\n    //      not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position.\n    let headerName = collectASequenceOfBytes(\n      (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a,\n      input,\n      position\n    )\n\n    // 2.3. Remove any HTTP tab or space bytes from the start or end of header name.\n    headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20)\n\n    // 2.4. If header name does not match the field-name token production, return failure.\n    if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) {\n      throw parsingError('header name does not match the field-name token production')\n    }\n\n    // 2.5. If the byte at position is not 0x3A (:), return failure.\n    if (input[position.position] !== 0x3a) {\n      throw parsingError('expected :')\n    }\n\n    // 2.6. Advance position by 1.\n    position.position++\n\n    // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position.\n    //      (Do nothing with those bytes.)\n    collectASequenceOfBytes(\n      (char) => char === 0x20 || char === 0x09,\n      input,\n      position\n    )\n\n    // 2.8. Byte-lowercase header name and switch on the result:\n    switch (bufferToLowerCasedHeaderName(headerName)) {\n      case 'content-disposition': {\n        name = filename = null\n\n        // Collect the disposition type (should be \"form-data\")\n        const dispositionType = collectASequenceOfBytes(\n          (char) => isToken(char),\n          input,\n          position\n        )\n\n        if (dispositionType.toString('ascii').toLowerCase() !== 'form-data') {\n          throw parsingError('expected form-data for content-disposition header')\n        }\n\n        // Parse attributes recursively until CRLF\n        while (\n          position.position < input.length &&\n          input[position.position] !== 0x0d &&\n          input[position.position + 1] !== 0x0a\n        ) {\n          const attribute = parseContentDispositionAttribute(input, position)\n\n          if (!attribute) {\n            break\n          }\n\n          if (attribute.name === 'name') {\n            name = attribute.value\n          } else if (attribute.name === 'filename') {\n            filename = attribute.value\n          }\n        }\n\n        if (name === null) {\n          throw parsingError('name attribute is required in content-disposition header')\n        }\n\n        break\n      }\n      case 'content-type': {\n        // 1. Let header value be the result of collecting a sequence of bytes that are\n        //    not 0x0A (LF) or 0x0D (CR), given position.\n        let headerValue = collectASequenceOfBytes(\n          (char) => char !== 0x0a && char !== 0x0d,\n          input,\n          position\n        )\n\n        // 2. Remove any HTTP tab or space bytes from the end of header value.\n        headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n        // 3. Set contentType to the isomorphic decoding of header value.\n        contentType = isomorphicDecode(headerValue)\n\n        break\n      }\n      case 'content-transfer-encoding': {\n        let headerValue = collectASequenceOfBytes(\n          (char) => char !== 0x0a && char !== 0x0d,\n          input,\n          position\n        )\n\n        headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n        encoding = isomorphicDecode(headerValue)\n\n        break\n      }\n      default: {\n        // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position.\n        // (Do nothing with those bytes.)\n        collectASequenceOfBytes(\n          (char) => char !== 0x0a && char !== 0x0d,\n          input,\n          position\n        )\n      }\n    }\n\n    // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A\n    //      (CR LF), return failure. Otherwise, advance position by 2 (past the newline).\n    if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) {\n      throw parsingError('expected CRLF')\n    } else {\n      position.position += 2\n    }\n  }\n}\n\n/**\n * @param {(char: number) => boolean} condition\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfBytes (condition, input, position) {\n  let start = position.position\n\n  while (start < input.length && condition(input[start])) {\n    ++start\n  }\n\n  return input.subarray(position.position, (position.position = start))\n}\n\n/**\n * @param {Buffer} buf\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {Buffer}\n */\nfunction removeChars (buf, leading, trailing, predicate) {\n  let lead = 0\n  let trail = buf.length - 1\n\n  if (leading) {\n    while (lead < buf.length && predicate(buf[lead])) lead++\n  }\n\n  if (trailing) {\n    while (trail > 0 && predicate(buf[trail])) trail--\n  }\n\n  return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1)\n}\n\n/**\n * Checks if {@param buffer} starts with {@param start}\n * @param {Buffer} buffer\n * @param {Buffer} start\n * @param {{ position: number }} position\n */\nfunction bufferStartsWith (buffer, start, position) {\n  if (buffer.length < start.length) {\n    return false\n  }\n\n  for (let i = 0; i < start.length; i++) {\n    if (start[i] !== buffer[position.position + i]) {\n      return false\n    }\n  }\n\n  return true\n}\n\nfunction parsingError (cause) {\n  return new TypeError('Failed to parse body as FormData.', { cause: new TypeError(cause) })\n}\n\n/**\n * CTL            = <any US-ASCII control character\n *                  (octets 0 - 31) and DEL (127)>\n * @param {number} char\n */\nfunction isCTL (char) {\n  return char <= 0x1f || char === 0x7f\n}\n\n/**\n * tspecials :=  \"(\" / \")\" / \"<\" / \">\" / \"@\" /\n *                \",\" / \";\" / \":\" / \"\\\" / <\">\n *                \"/\" / \"[\" / \"]\" / \"?\" / \"=\"\n *                ; Must be in quoted-string,\n *                ; to use within parameter values\n * @param {number} char\n */\nfunction isTSpecial (char) {\n  return (\n    char === 0x28 || // (\n    char === 0x29 || // )\n    char === 0x3c || // <\n    char === 0x3e || // >\n    char === 0x40 || // @\n    char === 0x2c || // ,\n    char === 0x3b || // ;\n    char === 0x3a || // :\n    char === 0x5c || // \\\n    char === 0x22 || // \"\n    char === 0x2f || // /\n    char === 0x5b || // [\n    char === 0x5d || // ]\n    char === 0x3f || // ?\n    char === 0x3d    // +\n  )\n}\n\n/**\n * token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,\n *          or tspecials>\n * @param {number} char\n */\nfunction isToken (char) {\n  return (\n    char <= 0x7f &&  // ascii\n    char !== 0x20 && // space\n    char !== 0x09 &&\n    !isCTL(char) &&\n    !isTSpecial(char)\n  )\n}\n\nmodule.exports = {\n  multipartFormDataParser,\n  validateBoundary\n}\n","'use strict'\n\n/**\n * @template {*} T\n * @typedef {Object} DeferredPromise\n * @property {Promise<T>} promise\n * @property {(value?: T) => void} resolve\n * @property {(reason?: any) => void} reject\n */\n\n/**\n * @template {*} T\n * @returns {DeferredPromise<T>} An object containing a promise and its resolve/reject methods.\n */\nfunction createDeferredPromise () {\n  let res\n  let rej\n  const promise = new Promise((resolve, reject) => {\n    res = resolve\n    rej = reject\n  })\n\n  return { promise, resolve: res, reject: rej }\n}\n\nmodule.exports = {\n  createDeferredPromise\n}\n","'use strict'\n\nconst util = require('../../core/util')\nconst {\n  ReadableStreamFrom,\n  readableStreamClose,\n  fullyReadBody,\n  extractMimeType\n} = require('./util')\nconst { FormData, setFormDataState } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isErrored, isDisturbed } = require('node:stream')\nconst { isUint8Array } = require('node:util/types')\nconst { serializeAMimeType } = require('./data-url')\nconst { multipartFormDataParser } = require('./formdata-parser')\nconst { createDeferredPromise } = require('../../util/promise')\nconst { parseJSONFromBytes } = require('../infra')\nconst { utf8DecodeBytes } = require('../../encoding')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\nconst random = runtimeFeatures.has('crypto')\n  ? require('node:crypto').randomInt\n  : (max) => Math.floor(Math.random() * max)\n\nconst textEncoder = new TextEncoder()\nfunction noop () {}\n\nconst streamRegistry = new FinalizationRegistry((weakRef) => {\n  const stream = weakRef.deref()\n  if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {\n    stream.cancel('Response object has been garbage collected').catch(noop)\n  }\n})\n\n/**\n * Extract a body with type from a byte sequence or BodyInit object\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[{stream: ReadableStream, source: any, length: number | null}, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n */\nfunction extractBody (object, keepalive = false) {\n  // 1. Let stream be null.\n  let stream = null\n  let controller = null\n\n  // 2. If object is a ReadableStream object, then set stream to object.\n  if (webidl.is.ReadableStream(object)) {\n    stream = object\n  } else if (webidl.is.Blob(object)) {\n    // 3. Otherwise, if object is a Blob object, set stream to the\n    //    result of running object’s get stream.\n    stream = object.stream()\n  } else {\n    // 4. Otherwise, set stream to a new ReadableStream object, and set\n    //    up stream with byte reading support.\n    stream = new ReadableStream({\n      pull () {},\n      start (c) {\n        controller = c\n      },\n      cancel () {},\n      type: 'bytes'\n    })\n  }\n\n  // 5. Assert: stream is a ReadableStream object.\n  assert(webidl.is.ReadableStream(stream))\n\n  // 6. Let action be null.\n  let action = null\n\n  // 7. Let source be null.\n  let source = null\n\n  // 8. Let length be null.\n  let length = null\n\n  // 9. Let type be null.\n  let type = null\n\n  // 10. Switch on object:\n  if (typeof object === 'string') {\n    // Set source to the UTF-8 encoding of object.\n    // Note: setting source to a Uint8Array here breaks some mocking assumptions.\n    source = object\n\n    // Set type to `text/plain;charset=UTF-8`.\n    type = 'text/plain;charset=UTF-8'\n  } else if (webidl.is.URLSearchParams(object)) {\n    // URLSearchParams\n\n    // spec says to run application/x-www-form-urlencoded on body.list\n    // this is implemented in Node.js as apart of an URLSearchParams instance toString method\n    // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490\n    // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100\n\n    // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.\n    source = object.toString()\n\n    // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.\n    type = 'application/x-www-form-urlencoded;charset=UTF-8'\n  } else if (webidl.is.BufferSource(object)) {\n    // Set source to a copy of the bytes held by object.\n    source = webidl.util.getCopyOfBytesHeldByBufferSource(object)\n  } else if (webidl.is.FormData(object)) {\n    const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`\n    const prefix = `--${boundary}\\r\\nContent-Disposition: form-data`\n\n    /*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */\n    const formdataEscape = (str) =>\n      str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22')\n    const normalizeLinefeeds = (value) => value.replace(/\\r?\\n|\\r/g, '\\r\\n')\n\n    // Set action to this step: run the multipart/form-data\n    // encoding algorithm, with object’s entry list and UTF-8.\n    // - This ensures that the body is immutable and can't be changed afterwords\n    // - That the content-length is calculated in advance.\n    // - And that all parts are pre-encoded and ready to be sent.\n\n    const blobParts = []\n    const rn = new Uint8Array([13, 10]) // '\\r\\n'\n    length = 0\n    let hasUnknownSizeValue = false\n\n    for (const [name, value] of object) {\n      if (typeof value === 'string') {\n        const chunk = textEncoder.encode(prefix +\n          `; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n          `\\r\\n\\r\\n${normalizeLinefeeds(value)}\\r\\n`)\n        blobParts.push(chunk)\n        length += chunk.byteLength\n      } else {\n        const chunk = textEncoder.encode(`${prefix}; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n          (value.name ? `; filename=\"${formdataEscape(value.name)}\"` : '') + '\\r\\n' +\n          `Content-Type: ${\n            value.type || 'application/octet-stream'\n          }\\r\\n\\r\\n`)\n        blobParts.push(chunk, value, rn)\n        if (typeof value.size === 'number') {\n          length += chunk.byteLength + value.size + rn.byteLength\n        } else {\n          hasUnknownSizeValue = true\n        }\n      }\n    }\n\n    // CRLF is appended to the body to function with legacy servers and match other implementations.\n    // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030\n    // https://github.com/form-data/form-data/issues/63\n    const chunk = textEncoder.encode(`--${boundary}--\\r\\n`)\n    blobParts.push(chunk)\n    length += chunk.byteLength\n    if (hasUnknownSizeValue) {\n      length = null\n    }\n\n    // Set source to object.\n    source = object\n\n    action = async function * () {\n      for (const part of blobParts) {\n        if (part.stream) {\n          yield * part.stream()\n        } else {\n          yield part\n        }\n      }\n    }\n\n    // Set type to `multipart/form-data; boundary=`,\n    // followed by the multipart/form-data boundary string generated\n    // by the multipart/form-data encoding algorithm.\n    type = `multipart/form-data; boundary=${boundary}`\n  } else if (webidl.is.Blob(object)) {\n    // Blob\n\n    // Set source to object.\n    source = object\n\n    // Set length to object’s size.\n    length = object.size\n\n    // If object’s type attribute is not the empty byte sequence, set\n    // type to its value.\n    if (object.type) {\n      type = object.type\n    }\n  } else if (typeof object[Symbol.asyncIterator] === 'function') {\n    // If keepalive is true, then throw a TypeError.\n    if (keepalive) {\n      throw new TypeError('keepalive')\n    }\n\n    // If object is disturbed or locked, then throw a TypeError.\n    if (util.isDisturbed(object) || object.locked) {\n      throw new TypeError(\n        'Response body object should not be disturbed or locked'\n      )\n    }\n\n    stream =\n      webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object)\n  }\n\n  // 11. If source is a byte sequence, then set action to a\n  // step that returns source and length to source’s length.\n  if (typeof source === 'string' || isUint8Array(source)) {\n    action = () => {\n      length = typeof source === 'string' ? Buffer.byteLength(source) : source.length\n      return source\n    }\n  }\n\n  // 12. If action is non-null, then run these steps in parallel:\n  if (action != null) {\n    ;(async () => {\n      // 1. Run action.\n      const result = action()\n\n      // 2. Whenever one or more bytes are available and stream is not errored,\n      //    enqueue the result of creating a Uint8Array from the available bytes into stream.\n      const iterator = result?.[Symbol.asyncIterator]?.()\n      if (iterator) {\n        for await (const bytes of iterator) {\n          if (isErrored(stream)) break\n          if (bytes.length) {\n            controller.enqueue(new Uint8Array(bytes))\n          }\n        }\n      } else if (result?.length && !isErrored(stream)) {\n        controller.enqueue(typeof result === 'string' ? textEncoder.encode(result) : new Uint8Array(result))\n      }\n\n      // 3. When running action is done, close stream.\n      queueMicrotask(() => readableStreamClose(controller))\n    })()\n  }\n\n  // 13. Let body be a body whose stream is stream, source is source,\n  // and length is length.\n  const body = { stream, source, length }\n\n  // 14. Return (body, type).\n  return [body, type]\n}\n\n/**\n * @typedef {object} ExtractBodyResult\n * @property {ReadableStream<Uint8Array<ArrayBuffer>>} stream - The ReadableStream containing the body data\n * @property {any} source - The original source of the body data\n * @property {number | null} length - The length of the body data, or null\n */\n\n/**\n * Safely extract a body with type from a byte sequence or BodyInit object.\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[ExtractBodyResult, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#bodyinit-safely-extract\n */\nfunction safelyExtractBody (object, keepalive = false) {\n  // To safely extract a body and a `Content-Type` value from\n  // a byte sequence or BodyInit object object, run these steps:\n\n  // 1. If object is a ReadableStream object, then:\n  if (webidl.is.ReadableStream(object)) {\n    // Assert: object is neither disturbed nor locked.\n    assert(!util.isDisturbed(object), 'The body has already been consumed.')\n    assert(!object.locked, 'The stream is locked.')\n  }\n\n  // 2. Return the results of extracting object.\n  return extractBody(object, keepalive)\n}\n\nfunction cloneBody (body) {\n  // To clone a body body, run these steps:\n\n  // https://fetch.spec.whatwg.org/#concept-body-clone\n\n  // 1. Let « out1, out2 » be the result of teeing body’s stream.\n  const { 0: out1, 1: out2 } = body.stream.tee()\n\n  // 2. Set body’s stream to out1.\n  body.stream = out1\n\n  // 3. Return a body whose stream is out2 and other members are copied from body.\n  return {\n    stream: out2,\n    length: body.length,\n    source: body.source\n  }\n}\n\nfunction bodyMixinMethods (instance, getInternalState) {\n  const methods = {\n    blob () {\n      // The blob() method steps are to return the result of\n      // running consume body with this and the following step\n      // given a byte sequence bytes: return a Blob whose\n      // contents are bytes and whose type attribute is this’s\n      // MIME type.\n      return consumeBody(this, (bytes) => {\n        let mimeType = bodyMimeType(getInternalState(this))\n\n        if (mimeType === null) {\n          mimeType = ''\n        } else if (mimeType) {\n          mimeType = serializeAMimeType(mimeType)\n        }\n\n        // Return a Blob whose contents are bytes and type attribute\n        // is mimeType.\n        return new Blob([bytes], { type: mimeType })\n      }, instance, getInternalState)\n    },\n\n    arrayBuffer () {\n      // The arrayBuffer() method steps are to return the result\n      // of running consume body with this and the following step\n      // given a byte sequence bytes: return a new ArrayBuffer\n      // whose contents are bytes.\n      return consumeBody(this, (bytes) => {\n        return new Uint8Array(bytes).buffer\n      }, instance, getInternalState)\n    },\n\n    text () {\n      // The text() method steps are to return the result of running\n      // consume body with this and UTF-8 decode.\n      return consumeBody(this, utf8DecodeBytes, instance, getInternalState)\n    },\n\n    json () {\n      // The json() method steps are to return the result of running\n      // consume body with this and parse JSON from bytes.\n      return consumeBody(this, parseJSONFromBytes, instance, getInternalState)\n    },\n\n    formData () {\n      // The formData() method steps are to return the result of running\n      // consume body with this and the following step given a byte sequence bytes:\n      return consumeBody(this, (value) => {\n        // 1. Let mimeType be the result of get the MIME type with this.\n        const mimeType = bodyMimeType(getInternalState(this))\n\n        // 2. If mimeType is non-null, then switch on mimeType’s essence and run\n        //    the corresponding steps:\n        if (mimeType !== null) {\n          switch (mimeType.essence) {\n            case 'multipart/form-data': {\n              // 1. ... [long step]\n              // 2. If that fails for some reason, then throw a TypeError.\n              const parsed = multipartFormDataParser(value, mimeType)\n\n              // 3. Return a new FormData object, appending each entry,\n              //    resulting from the parsing operation, to its entry list.\n              const fd = new FormData()\n              setFormDataState(fd, parsed)\n\n              return fd\n            }\n            case 'application/x-www-form-urlencoded': {\n              // 1. Let entries be the result of parsing bytes.\n              const entries = new URLSearchParams(value.toString())\n\n              // 2. If entries is failure, then throw a TypeError.\n\n              // 3. Return a new FormData object whose entry list is entries.\n              const fd = new FormData()\n\n              for (const [name, value] of entries) {\n                fd.append(name, value)\n              }\n\n              return fd\n            }\n          }\n        }\n\n        // 3. Throw a TypeError.\n        throw new TypeError(\n          'Content-Type was not one of \"multipart/form-data\" or \"application/x-www-form-urlencoded\".'\n        )\n      }, instance, getInternalState)\n    },\n\n    bytes () {\n      // The bytes() method steps are to return the result of running consume body\n      // with this and the following step given a byte sequence bytes: return the\n      // result of creating a Uint8Array from bytes in this’s relevant realm.\n      return consumeBody(this, (bytes) => {\n        return new Uint8Array(bytes)\n      }, instance, getInternalState)\n    }\n  }\n\n  return methods\n}\n\nfunction mixinBody (prototype, getInternalState) {\n  Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-consume-body\n * @param {any} object internal state\n * @param {(value: unknown) => unknown} convertBytesToJSValue\n * @param {any} instance\n * @param {(target: any) => any} getInternalState\n */\nfunction consumeBody (object, convertBytesToJSValue, instance, getInternalState) {\n  try {\n    webidl.brandCheck(object, instance)\n  } catch (e) {\n    return Promise.reject(e)\n  }\n\n  object = getInternalState(object)\n\n  // 1. If object is unusable, then return a promise rejected\n  //    with a TypeError.\n  if (bodyUnusable(object)) {\n    return Promise.reject(new TypeError('Body is unusable: Body has already been read'))\n  }\n\n  // 2. Let promise be a new promise.\n  const promise = createDeferredPromise()\n\n  // 3. Let errorSteps given error be to reject promise with error.\n  const errorSteps = promise.reject\n\n  // 4. Let successSteps given a byte sequence data be to resolve\n  //    promise with the result of running convertBytesToJSValue\n  //    with data. If that threw an exception, then run errorSteps\n  //    with that exception.\n  const successSteps = (data) => {\n    try {\n      promise.resolve(convertBytesToJSValue(data))\n    } catch (e) {\n      errorSteps(e)\n    }\n  }\n\n  // 5. If object’s body is null, then run successSteps with an\n  //    empty byte sequence.\n  if (object.body == null) {\n    successSteps(Buffer.allocUnsafe(0))\n    return promise.promise\n  }\n\n  // 6. Otherwise, fully read object’s body given successSteps,\n  //    errorSteps, and object’s relevant global object.\n  fullyReadBody(object.body, successSteps, errorSteps)\n\n  // 7. Return promise.\n  return promise.promise\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {any} object internal state\n */\nfunction bodyUnusable (object) {\n  const body = object.body\n\n  // An object including the Body interface mixin is\n  // said to be unusable if its body is non-null and\n  // its body’s stream is disturbed or locked.\n  return body != null && (body.stream.locked || util.isDisturbed(body.stream))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-mime-type\n * @param {any} requestOrResponse internal state\n */\nfunction bodyMimeType (requestOrResponse) {\n  // 1. Let headers be null.\n  // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list.\n  // 3. Otherwise, set headers to requestOrResponse’s response’s header list.\n  /** @type {import('./headers').HeadersList} */\n  const headers = requestOrResponse.headersList\n\n  // 4. Let mimeType be the result of extracting a MIME type from headers.\n  const mimeType = extractMimeType(headers)\n\n  // 5. If mimeType is failure, then return null.\n  if (mimeType === 'failure') {\n    return null\n  }\n\n  // 6. Return mimeType.\n  return mimeType\n}\n\nmodule.exports = {\n  extractBody,\n  safelyExtractBody,\n  cloneBody,\n  mixinBody,\n  streamRegistry,\n  bodyUnusable\n}\n","'use strict'\n\n/* global WebAssembly */\n\nconst assert = require('node:assert')\nconst util = require('../core/util.js')\nconst { channels } = require('../core/diagnostics.js')\nconst timers = require('../util/timers.js')\nconst {\n  RequestContentLengthMismatchError,\n  ResponseContentLengthMismatchError,\n  RequestAbortedError,\n  HeadersTimeoutError,\n  HeadersOverflowError,\n  SocketError,\n  InformationalError,\n  BodyTimeoutError,\n  HTTPParserError,\n  ResponseExceededMaxSizeError\n} = require('../core/errors.js')\nconst {\n  kUrl,\n  kReset,\n  kClient,\n  kParser,\n  kBlocking,\n  kRunning,\n  kPending,\n  kSize,\n  kWriting,\n  kQueue,\n  kNoRef,\n  kKeepAliveDefaultTimeout,\n  kHostHeader,\n  kPendingIdx,\n  kRunningIdx,\n  kError,\n  kPipelining,\n  kSocket,\n  kKeepAliveTimeoutValue,\n  kMaxHeadersSize,\n  kKeepAliveMaxTimeout,\n  kKeepAliveTimeoutThreshold,\n  kHeadersTimeout,\n  kBodyTimeout,\n  kStrictContentLength,\n  kMaxRequests,\n  kCounter,\n  kMaxResponseSize,\n  kOnError,\n  kResume,\n  kHTTPContext,\n  kClosed\n} = require('../core/symbols.js')\n\nconst constants = require('../llhttp/constants.js')\nconst EMPTY_BUF = Buffer.alloc(0)\nconst FastBuffer = Buffer[Symbol.species]\nconst removeAllListeners = util.removeAllListeners\n\nlet extractBody\n\nfunction lazyllhttp () {\n  const llhttpWasmData = process.env.JEST_WORKER_ID ? require('../llhttp/llhttp-wasm.js') : undefined\n\n  let mod\n\n  // We disable wasm SIMD on ppc64 as it seems to be broken on Power 9 architectures.\n  let useWasmSIMD = process.arch !== 'ppc64'\n  // The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior\n  if (process.env.UNDICI_NO_WASM_SIMD === '1') {\n    useWasmSIMD = true\n  } else if (process.env.UNDICI_NO_WASM_SIMD === '0') {\n    useWasmSIMD = false\n  }\n\n  if (useWasmSIMD) {\n    try {\n      mod = new WebAssembly.Module(require('../llhttp/llhttp_simd-wasm.js'))\n    } catch {\n    }\n  }\n\n  if (!mod) {\n    // We could check if the error was caused by the simd option not\n    // being enabled, but the occurring of this other error\n    // * https://github.com/emscripten-core/emscripten/issues/11495\n    // got me to remove that check to avoid breaking Node 12.\n    mod = new WebAssembly.Module(llhttpWasmData || require('../llhttp/llhttp-wasm.js'))\n  }\n\n  return new WebAssembly.Instance(mod, {\n    env: {\n      /**\n       * @param {number} p\n       * @param {number} at\n       * @param {number} len\n       * @returns {number}\n       */\n      wasm_on_url: (p, at, len) => {\n        return 0\n      },\n      /**\n       * @param {number} p\n       * @param {number} at\n       * @param {number} len\n       * @returns {number}\n       */\n      wasm_on_status: (p, at, len) => {\n        assert(currentParser.ptr === p)\n        const start = at - currentBufferPtr + currentBufferRef.byteOffset\n        return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len))\n      },\n      /**\n       * @param {number} p\n       * @returns {number}\n       */\n      wasm_on_message_begin: (p) => {\n        assert(currentParser.ptr === p)\n        return currentParser.onMessageBegin()\n      },\n      /**\n       * @param {number} p\n       * @param {number} at\n       * @param {number} len\n       * @returns {number}\n       */\n      wasm_on_header_field: (p, at, len) => {\n        assert(currentParser.ptr === p)\n        const start = at - currentBufferPtr + currentBufferRef.byteOffset\n        return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len))\n      },\n      /**\n       * @param {number} p\n       * @param {number} at\n       * @param {number} len\n       * @returns {number}\n       */\n      wasm_on_header_value: (p, at, len) => {\n        assert(currentParser.ptr === p)\n        const start = at - currentBufferPtr + currentBufferRef.byteOffset\n        return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len))\n      },\n      /**\n       * @param {number} p\n       * @param {number} statusCode\n       * @param {0|1} upgrade\n       * @param {0|1} shouldKeepAlive\n       * @returns {number}\n       */\n      wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {\n        assert(currentParser.ptr === p)\n        return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1)\n      },\n      /**\n       * @param {number} p\n       * @param {number} at\n       * @param {number} len\n       * @returns {number}\n       */\n      wasm_on_body: (p, at, len) => {\n        assert(currentParser.ptr === p)\n        const start = at - currentBufferPtr + currentBufferRef.byteOffset\n        return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len))\n      },\n      /**\n       * @param {number} p\n       * @returns {number}\n       */\n      wasm_on_message_complete: (p) => {\n        assert(currentParser.ptr === p)\n        return currentParser.onMessageComplete()\n      }\n\n    }\n  })\n}\n\nlet llhttpInstance = null\n\n/**\n * @type {Parser|null}\n */\nlet currentParser = null\nlet currentBufferRef = null\n/**\n * @type {number}\n */\nlet currentBufferSize = 0\nlet currentBufferPtr = null\n\nconst USE_NATIVE_TIMER = 0\nconst USE_FAST_TIMER = 1\n\n// Use fast timers for headers and body to take eventual event loop\n// latency into account.\nconst TIMEOUT_HEADERS = 2 | USE_FAST_TIMER\nconst TIMEOUT_BODY = 4 | USE_FAST_TIMER\n\n// Use native timers to ignore event loop latency for keep-alive\n// handling.\nconst TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER\n\nclass Parser {\n  /**\n     * @param {import('./client.js')} client\n     * @param {import('net').Socket} socket\n     * @param {*} llhttp\n     */\n  constructor (client, socket, { exports }) {\n    this.llhttp = exports\n    this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)\n    this.client = client\n    /**\n     * @type {import('net').Socket}\n     */\n    this.socket = socket\n    this.timeout = null\n    this.timeoutValue = null\n    this.timeoutType = null\n    this.statusCode = 0\n    this.statusText = ''\n    this.upgrade = false\n    this.headers = []\n    this.headersSize = 0\n    this.headersMaxSize = client[kMaxHeadersSize]\n    this.shouldKeepAlive = false\n    this.paused = false\n    this.resume = this.resume.bind(this)\n\n    this.bytesRead = 0\n\n    this.keepAlive = ''\n    this.contentLength = ''\n    this.connection = ''\n    this.maxResponseSize = client[kMaxResponseSize]\n  }\n\n  setTimeout (delay, type) {\n    // If the existing timer and the new timer are of different timer type\n    // (fast or native) or have different delay, we need to clear the existing\n    // timer and set a new one.\n    if (\n      delay !== this.timeoutValue ||\n      (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER)\n    ) {\n      // If a timeout is already set, clear it with clearTimeout of the fast\n      // timer implementation, as it can clear fast and native timers.\n      if (this.timeout) {\n        timers.clearTimeout(this.timeout)\n        this.timeout = null\n      }\n\n      if (delay) {\n        if (type & USE_FAST_TIMER) {\n          this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this))\n        } else {\n          this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this))\n          this.timeout?.unref()\n        }\n      }\n\n      this.timeoutValue = delay\n    } else if (this.timeout) {\n      if (this.timeout.refresh) {\n        this.timeout.refresh()\n      }\n    }\n\n    this.timeoutType = type\n  }\n\n  resume () {\n    if (this.socket.destroyed || !this.paused) {\n      return\n    }\n\n    assert(this.ptr != null)\n    assert(currentParser === null)\n\n    this.llhttp.llhttp_resume(this.ptr)\n\n    assert(this.timeoutType === TIMEOUT_BODY)\n    if (this.timeout) {\n      if (this.timeout.refresh) {\n        this.timeout.refresh()\n      }\n    }\n\n    this.paused = false\n    this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.\n    this.readMore()\n  }\n\n  readMore () {\n    while (!this.paused && this.ptr) {\n      const chunk = this.socket.read()\n      if (chunk === null) {\n        break\n      }\n      this.execute(chunk)\n    }\n  }\n\n  /**\n   * @param {Buffer} chunk\n   */\n  execute (chunk) {\n    assert(currentParser === null)\n    assert(this.ptr != null)\n    assert(!this.paused)\n\n    const { socket, llhttp } = this\n\n    // Allocate a new buffer if the current buffer is too small.\n    if (chunk.length > currentBufferSize) {\n      if (currentBufferPtr) {\n        llhttp.free(currentBufferPtr)\n      }\n      // Allocate a buffer that is a multiple of 4096 bytes.\n      currentBufferSize = Math.ceil(chunk.length / 4096) * 4096\n      currentBufferPtr = llhttp.malloc(currentBufferSize)\n    }\n\n    new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk)\n\n    // Call `execute` on the wasm parser.\n    // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,\n    // and finally the length of bytes to parse.\n    // The return value is an error code or `constants.ERROR.OK`.\n    try {\n      let ret\n\n      try {\n        currentBufferRef = chunk\n        currentParser = this\n        ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length)\n      } finally {\n        currentParser = null\n        currentBufferRef = null\n      }\n\n      if (ret !== constants.ERROR.OK) {\n        const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr)\n\n        if (ret === constants.ERROR.PAUSED_UPGRADE) {\n          this.onUpgrade(data)\n        } else if (ret === constants.ERROR.PAUSED) {\n          this.paused = true\n          socket.unshift(data)\n        } else {\n          const ptr = llhttp.llhttp_get_error_reason(this.ptr)\n          let message = ''\n          if (ptr) {\n            const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)\n            message =\n              'Response does not match the HTTP/1.1 protocol (' +\n              Buffer.from(llhttp.memory.buffer, ptr, len).toString() +\n              ')'\n          }\n          throw new HTTPParserError(message, constants.ERROR[ret], data)\n        }\n      }\n    } catch (err) {\n      util.destroy(socket, err)\n    }\n  }\n\n  destroy () {\n    assert(currentParser === null)\n    assert(this.ptr != null)\n\n    this.llhttp.llhttp_free(this.ptr)\n    this.ptr = null\n\n    this.timeout && timers.clearTimeout(this.timeout)\n    this.timeout = null\n    this.timeoutValue = null\n    this.timeoutType = null\n\n    this.paused = false\n  }\n\n  /**\n   * @param {Buffer} buf\n   * @returns {0}\n   */\n  onStatus (buf) {\n    this.statusText = buf.toString()\n    return 0\n  }\n\n  /**\n   * @returns {0|-1}\n   */\n  onMessageBegin () {\n    const { socket, client } = this\n\n    if (socket.destroyed) {\n      return -1\n    }\n\n    const request = client[kQueue][client[kRunningIdx]]\n    if (!request) {\n      return -1\n    }\n    request.onResponseStarted()\n\n    return 0\n  }\n\n  /**\n   * @param {Buffer} buf\n   * @returns {number}\n   */\n  onHeaderField (buf) {\n    const len = this.headers.length\n\n    if ((len & 1) === 0) {\n      this.headers.push(buf)\n    } else {\n      this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n    }\n\n    this.trackHeader(buf.length)\n\n    return 0\n  }\n\n  /**\n   * @param {Buffer} buf\n   * @returns {number}\n   */\n  onHeaderValue (buf) {\n    let len = this.headers.length\n\n    if ((len & 1) === 1) {\n      this.headers.push(buf)\n      len += 1\n    } else {\n      this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n    }\n\n    const key = this.headers[len - 2]\n    if (key.length === 10) {\n      const headerName = util.bufferToLowerCasedHeaderName(key)\n      if (headerName === 'keep-alive') {\n        this.keepAlive += buf.toString()\n      } else if (headerName === 'connection') {\n        this.connection += buf.toString()\n      }\n    } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') {\n      this.contentLength += buf.toString()\n    }\n\n    this.trackHeader(buf.length)\n\n    return 0\n  }\n\n  /**\n   * @param {number} len\n   */\n  trackHeader (len) {\n    this.headersSize += len\n    if (this.headersSize >= this.headersMaxSize) {\n      util.destroy(this.socket, new HeadersOverflowError())\n    }\n  }\n\n  /**\n   * @param {Buffer} head\n   */\n  onUpgrade (head) {\n    const { upgrade, client, socket, headers, statusCode } = this\n\n    assert(upgrade)\n    assert(client[kSocket] === socket)\n    assert(!socket.destroyed)\n    assert(!this.paused)\n    assert((headers.length & 1) === 0)\n\n    const request = client[kQueue][client[kRunningIdx]]\n    assert(request)\n    assert(request.upgrade || request.method === 'CONNECT')\n\n    this.statusCode = 0\n    this.statusText = ''\n    this.shouldKeepAlive = false\n\n    this.headers = []\n    this.headersSize = 0\n\n    socket.unshift(head)\n\n    socket[kParser].destroy()\n    socket[kParser] = null\n\n    socket[kClient] = null\n    socket[kError] = null\n\n    removeAllListeners(socket)\n\n    client[kSocket] = null\n    client[kHTTPContext] = null // TODO (fix): This is hacky...\n    client[kQueue][client[kRunningIdx]++] = null\n    client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))\n\n    try {\n      request.onUpgrade(statusCode, headers, socket)\n    } catch (err) {\n      util.destroy(socket, err)\n    }\n\n    client[kResume]()\n  }\n\n  /**\n   * @param {number} statusCode\n   * @param {boolean} upgrade\n   * @param {boolean} shouldKeepAlive\n   * @returns {number}\n   */\n  onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {\n    const { client, socket, headers, statusText } = this\n\n    if (socket.destroyed) {\n      return -1\n    }\n\n    const request = client[kQueue][client[kRunningIdx]]\n\n    if (!request) {\n      return -1\n    }\n\n    assert(!this.upgrade)\n    assert(this.statusCode < 200)\n\n    if (statusCode === 100) {\n      util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))\n      return -1\n    }\n\n    /* this can only happen if server is misbehaving */\n    if (upgrade && !request.upgrade) {\n      util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))\n      return -1\n    }\n\n    assert(this.timeoutType === TIMEOUT_HEADERS)\n\n    this.statusCode = statusCode\n    this.shouldKeepAlive = (\n      shouldKeepAlive ||\n      // Override llhttp value which does not allow keepAlive for HEAD.\n      (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')\n    )\n\n    if (this.statusCode >= 200) {\n      const bodyTimeout = request.bodyTimeout != null\n        ? request.bodyTimeout\n        : client[kBodyTimeout]\n      this.setTimeout(bodyTimeout, TIMEOUT_BODY)\n    } else if (this.timeout) {\n      if (this.timeout.refresh) {\n        this.timeout.refresh()\n      }\n    }\n\n    if (request.method === 'CONNECT') {\n      assert(client[kRunning] === 1)\n      this.upgrade = true\n      return 2\n    }\n\n    if (upgrade) {\n      assert(client[kRunning] === 1)\n      this.upgrade = true\n      return 2\n    }\n\n    assert((this.headers.length & 1) === 0)\n    this.headers = []\n    this.headersSize = 0\n\n    if (this.shouldKeepAlive && client[kPipelining]) {\n      const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null\n\n      if (keepAliveTimeout != null) {\n        const timeout = Math.min(\n          keepAliveTimeout - client[kKeepAliveTimeoutThreshold],\n          client[kKeepAliveMaxTimeout]\n        )\n        if (timeout <= 0) {\n          socket[kReset] = true\n        } else {\n          client[kKeepAliveTimeoutValue] = timeout\n        }\n      } else {\n        client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]\n      }\n    } else {\n      // Stop more requests from being dispatched.\n      socket[kReset] = true\n    }\n\n    const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false\n\n    if (request.aborted) {\n      return -1\n    }\n\n    if (request.method === 'HEAD') {\n      return 1\n    }\n\n    if (statusCode < 200) {\n      return 1\n    }\n\n    if (socket[kBlocking]) {\n      socket[kBlocking] = false\n      client[kResume]()\n    }\n\n    return pause ? constants.ERROR.PAUSED : 0\n  }\n\n  /**\n   * @param {Buffer} buf\n   * @returns {number}\n   */\n  onBody (buf) {\n    const { client, socket, statusCode, maxResponseSize } = this\n\n    if (socket.destroyed) {\n      return -1\n    }\n\n    const request = client[kQueue][client[kRunningIdx]]\n    assert(request)\n\n    assert(this.timeoutType === TIMEOUT_BODY)\n    if (this.timeout) {\n      if (this.timeout.refresh) {\n        this.timeout.refresh()\n      }\n    }\n\n    assert(statusCode >= 200)\n\n    if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {\n      util.destroy(socket, new ResponseExceededMaxSizeError())\n      return -1\n    }\n\n    this.bytesRead += buf.length\n\n    if (request.onData(buf) === false) {\n      return constants.ERROR.PAUSED\n    }\n\n    return 0\n  }\n\n  /**\n   * @returns {number}\n   */\n  onMessageComplete () {\n    const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this\n\n    if (socket.destroyed && (!statusCode || shouldKeepAlive)) {\n      return -1\n    }\n\n    if (upgrade) {\n      return 0\n    }\n\n    assert(statusCode >= 100)\n    assert((this.headers.length & 1) === 0)\n\n    const request = client[kQueue][client[kRunningIdx]]\n    assert(request)\n\n    this.statusCode = 0\n    this.statusText = ''\n    this.bytesRead = 0\n    this.contentLength = ''\n    this.keepAlive = ''\n    this.connection = ''\n\n    this.headers = []\n    this.headersSize = 0\n\n    if (statusCode < 200) {\n      return 0\n    }\n\n    if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {\n      util.destroy(socket, new ResponseContentLengthMismatchError())\n      return -1\n    }\n\n    request.onComplete(headers)\n\n    client[kQueue][client[kRunningIdx]++] = null\n\n    if (socket[kWriting]) {\n      assert(client[kRunning] === 0)\n      // Response completed before request.\n      util.destroy(socket, new InformationalError('reset'))\n      return constants.ERROR.PAUSED\n    } else if (!shouldKeepAlive) {\n      util.destroy(socket, new InformationalError('reset'))\n      return constants.ERROR.PAUSED\n    } else if (socket[kReset] && client[kRunning] === 0) {\n      // Destroy socket once all requests have completed.\n      // The request at the tail of the pipeline is the one\n      // that requested reset and no further requests should\n      // have been queued since then.\n      util.destroy(socket, new InformationalError('reset'))\n      return constants.ERROR.PAUSED\n    } else if (client[kPipelining] == null || client[kPipelining] === 1) {\n      // We must wait a full event loop cycle to reuse this socket to make sure\n      // that non-spec compliant servers are not closing the connection even if they\n      // said they won't.\n      setImmediate(client[kResume])\n    } else {\n      client[kResume]()\n    }\n\n    return 0\n  }\n}\n\nfunction onParserTimeout (parserWeakRef) {\n  const parser = parserWeakRef.deref()\n  if (!parser) {\n    return\n  }\n\n  const { socket, timeoutType, client, paused } = parser\n\n  if (timeoutType === TIMEOUT_HEADERS) {\n    if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {\n      assert(!paused, 'cannot be paused while waiting for headers')\n      util.destroy(socket, new HeadersTimeoutError())\n    }\n  } else if (timeoutType === TIMEOUT_BODY) {\n    if (!paused) {\n      util.destroy(socket, new BodyTimeoutError())\n    }\n  } else if (timeoutType === TIMEOUT_KEEP_ALIVE) {\n    assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])\n    util.destroy(socket, new InformationalError('socket idle timeout'))\n  }\n}\n\n/**\n * @param {import ('./client.js')} client\n * @param {import('net').Socket} socket\n * @returns\n */\nfunction connectH1 (client, socket) {\n  client[kSocket] = socket\n\n  if (!llhttpInstance) {\n    llhttpInstance = lazyllhttp()\n  }\n\n  if (socket.errored) {\n    throw socket.errored\n  }\n\n  if (socket.destroyed) {\n    throw new SocketError('destroyed')\n  }\n\n  socket[kNoRef] = false\n  socket[kWriting] = false\n  socket[kReset] = false\n  socket[kBlocking] = false\n  socket[kParser] = new Parser(client, socket, llhttpInstance)\n\n  util.addListener(socket, 'error', onHttpSocketError)\n  util.addListener(socket, 'readable', onHttpSocketReadable)\n  util.addListener(socket, 'end', onHttpSocketEnd)\n  util.addListener(socket, 'close', onHttpSocketClose)\n\n  socket[kClosed] = false\n  socket.on('close', onSocketClose)\n\n  return {\n    version: 'h1',\n    defaultPipelining: 1,\n    write (request) {\n      return writeH1(client, request)\n    },\n    resume () {\n      resumeH1(client)\n    },\n    /**\n     * @param {Error|undefined} err\n     * @param {() => void} callback\n     */\n    destroy (err, callback) {\n      if (socket[kClosed]) {\n        queueMicrotask(callback)\n      } else {\n        socket.on('close', callback)\n        socket.destroy(err)\n      }\n    },\n    /**\n     * @returns {boolean}\n     */\n    get destroyed () {\n      return socket.destroyed\n    },\n    /**\n     * @param {import('../core/request.js')} request\n     * @returns {boolean}\n     */\n    busy (request) {\n      if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {\n        return true\n      }\n\n      if (request) {\n        if (client[kRunning] > 0 && !request.idempotent) {\n          // Non-idempotent request cannot be retried.\n          // Ensure that no other requests are inflight and\n          // could cause failure.\n          return true\n        }\n\n        if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {\n          // Don't dispatch an upgrade until all preceding requests have completed.\n          // A misbehaving server might upgrade the connection before all pipelined\n          // request has completed.\n          return true\n        }\n\n        if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&\n          (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {\n          // Request with stream or iterator body can error while other requests\n          // are inflight and indirectly error those as well.\n          // Ensure this doesn't happen by waiting for inflight\n          // to complete before dispatching.\n\n          // Request with stream or iterator body cannot be retried.\n          // Ensure that no other requests are inflight and\n          // could cause failure.\n          return true\n        }\n      }\n\n      return false\n    }\n  }\n}\n\nfunction onHttpSocketError (err) {\n  assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n  const parser = this[kParser]\n\n  // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded\n  // to the user.\n  if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {\n    // We treat all incoming data so for as a valid response.\n    parser.onMessageComplete()\n    return\n  }\n\n  this[kError] = err\n\n  this[kClient][kOnError](err)\n}\n\nfunction onHttpSocketReadable () {\n  this[kParser]?.readMore()\n}\n\nfunction onHttpSocketEnd () {\n  const parser = this[kParser]\n\n  if (parser.statusCode && !parser.shouldKeepAlive) {\n    // We treat all incoming data so far as a valid response.\n    parser.onMessageComplete()\n    return\n  }\n\n  util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onHttpSocketClose () {\n  const parser = this[kParser]\n\n  if (parser) {\n    if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {\n      // We treat all incoming data so far as a valid response.\n      parser.onMessageComplete()\n    }\n\n    this[kParser].destroy()\n    this[kParser] = null\n  }\n\n  const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n  const client = this[kClient]\n\n  client[kSocket] = null\n  client[kHTTPContext] = null // TODO (fix): This is hacky...\n\n  if (client.destroyed) {\n    assert(client[kPending] === 0)\n\n    // Fail entire queue.\n    const requests = client[kQueue].splice(client[kRunningIdx])\n    for (let i = 0; i < requests.length; i++) {\n      const request = requests[i]\n      util.errorRequest(client, request, err)\n    }\n  } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {\n    // Fail head of pipeline.\n    const request = client[kQueue][client[kRunningIdx]]\n    client[kQueue][client[kRunningIdx]++] = null\n\n    util.errorRequest(client, request, err)\n  }\n\n  client[kPendingIdx] = client[kRunningIdx]\n\n  assert(client[kRunning] === 0)\n\n  client.emit('disconnect', client[kUrl], [client], err)\n\n  client[kResume]()\n}\n\nfunction onSocketClose () {\n  this[kClosed] = true\n}\n\n/**\n * @param {import('./client.js')} client\n */\nfunction resumeH1 (client) {\n  const socket = client[kSocket]\n\n  if (socket && !socket.destroyed) {\n    if (client[kSize] === 0) {\n      if (!socket[kNoRef] && socket.unref) {\n        socket.unref()\n        socket[kNoRef] = true\n      }\n    } else if (socket[kNoRef] && socket.ref) {\n      socket.ref()\n      socket[kNoRef] = false\n    }\n\n    if (client[kSize] === 0) {\n      if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {\n        socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE)\n      }\n    } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {\n      if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {\n        const request = client[kQueue][client[kRunningIdx]]\n        const headersTimeout = request.headersTimeout != null\n          ? request.headersTimeout\n          : client[kHeadersTimeout]\n        socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)\n      }\n    }\n  }\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n  return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\n/**\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @returns\n */\nfunction writeH1 (client, request) {\n  const { method, path, host, upgrade, blocking, reset } = request\n\n  let { body, headers, contentLength } = request\n\n  // https://tools.ietf.org/html/rfc7231#section-4.3.1\n  // https://tools.ietf.org/html/rfc7231#section-4.3.2\n  // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n  // Sending a payload body on a request that does not\n  // expect it can cause undefined behavior on some\n  // servers and corrupt connection state. Do not\n  // re-use the connection for further requests.\n\n  const expectsPayload = (\n    method === 'PUT' ||\n    method === 'POST' ||\n    method === 'PATCH' ||\n    method === 'QUERY' ||\n    method === 'PROPFIND' ||\n    method === 'PROPPATCH'\n  )\n\n  if (util.isFormDataLike(body)) {\n    if (!extractBody) {\n      extractBody = require('../web/fetch/body.js').extractBody\n    }\n\n    const [bodyStream, contentType] = extractBody(body)\n    if (request.contentType == null) {\n      headers.push('content-type', contentType)\n    }\n    body = bodyStream.stream\n    contentLength = bodyStream.length\n  } else if (util.isBlobLike(body) && request.contentType == null && body.type) {\n    headers.push('content-type', body.type)\n  }\n\n  if (body && typeof body.read === 'function') {\n    // Try to read EOF in order to get length.\n    body.read(0)\n  }\n\n  const bodyLength = util.bodyLength(body)\n\n  contentLength = bodyLength ?? contentLength\n\n  if (contentLength === null) {\n    contentLength = request.contentLength\n  }\n\n  if (contentLength === 0 && !expectsPayload) {\n    // https://tools.ietf.org/html/rfc7230#section-3.3.2\n    // A user agent SHOULD NOT send a Content-Length header field when\n    // the request message does not contain a payload body and the method\n    // semantics do not anticipate such a body.\n\n    contentLength = null\n  }\n\n  // https://github.com/nodejs/undici/issues/2046\n  // A user agent may send a Content-Length header with 0 value, this should be allowed.\n  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {\n    if (client[kStrictContentLength]) {\n      util.errorRequest(client, request, new RequestContentLengthMismatchError())\n      return false\n    }\n\n    process.emitWarning(new RequestContentLengthMismatchError())\n  }\n\n  const socket = client[kSocket]\n\n  /**\n   * @param {Error} [err]\n   * @returns {void}\n   */\n  const abort = (err) => {\n    if (request.aborted || request.completed) {\n      return\n    }\n\n    util.errorRequest(client, request, err || new RequestAbortedError())\n\n    util.destroy(body)\n    util.destroy(socket, new InformationalError('aborted'))\n  }\n\n  try {\n    request.onConnect(abort)\n  } catch (err) {\n    util.errorRequest(client, request, err)\n  }\n\n  if (request.aborted) {\n    return false\n  }\n\n  if (method === 'HEAD') {\n    // https://github.com/mcollina/undici/issues/258\n    // Close after a HEAD request to interop with misbehaving servers\n    // that may send a body in the response.\n\n    socket[kReset] = true\n  }\n\n  if (upgrade || method === 'CONNECT') {\n    // On CONNECT or upgrade, block pipeline from dispatching further\n    // requests on this connection.\n\n    socket[kReset] = true\n  }\n\n  if (reset != null) {\n    socket[kReset] = reset\n  }\n\n  if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {\n    socket[kReset] = true\n  }\n\n  if (blocking) {\n    socket[kBlocking] = true\n  }\n\n  if (socket.setTypeOfService) {\n    socket.setTypeOfService(request.typeOfService)\n  }\n\n  let header = `${method} ${path} HTTP/1.1\\r\\n`\n\n  if (typeof host === 'string') {\n    header += `host: ${host}\\r\\n`\n  } else {\n    header += client[kHostHeader]\n  }\n\n  if (upgrade) {\n    header += `connection: upgrade\\r\\nupgrade: ${upgrade}\\r\\n`\n  } else if (client[kPipelining] && !socket[kReset]) {\n    header += 'connection: keep-alive\\r\\n'\n  } else {\n    header += 'connection: close\\r\\n'\n  }\n\n  if (Array.isArray(headers)) {\n    for (let n = 0; n < headers.length; n += 2) {\n      const key = headers[n + 0]\n      const val = headers[n + 1]\n\n      if (Array.isArray(val)) {\n        for (let i = 0; i < val.length; i++) {\n          header += `${key}: ${val[i]}\\r\\n`\n        }\n      } else {\n        header += `${key}: ${val}\\r\\n`\n      }\n    }\n  }\n\n  if (channels.sendHeaders.hasSubscribers) {\n    channels.sendHeaders.publish({ request, headers: header, socket })\n  }\n\n  if (!body || bodyLength === 0) {\n    writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload)\n  } else if (util.isBuffer(body)) {\n    writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload)\n  } else if (util.isBlobLike(body)) {\n    if (typeof body.stream === 'function') {\n      writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload)\n    } else {\n      writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload)\n    }\n  } else if (util.isStream(body)) {\n    writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload)\n  } else if (util.isIterable(body)) {\n    writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload)\n  } else {\n    assert(false)\n  }\n\n  return true\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {import('stream').Stream} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n */\nfunction writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n  assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n  let finished = false\n\n  const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n\n  /**\n   * @param {Buffer} chunk\n   * @returns {void}\n   */\n  const onData = function (chunk) {\n    if (finished) {\n      return\n    }\n\n    try {\n      if (!writer.write(chunk) && this.pause) {\n        this.pause()\n      }\n    } catch (err) {\n      util.destroy(this, err)\n    }\n  }\n\n  /**\n   * @returns {void}\n   */\n  const onDrain = function () {\n    if (finished) {\n      return\n    }\n\n    if (body.resume) {\n      body.resume()\n    }\n  }\n\n  /**\n   * @returns {void}\n   */\n  const onClose = function () {\n    // 'close' might be emitted *before* 'error' for\n    // broken streams. Wait a tick to avoid this case.\n    queueMicrotask(() => {\n      // It's only safe to remove 'error' listener after\n      // 'close'.\n      body.removeListener('error', onFinished)\n    })\n\n    if (!finished) {\n      const err = new RequestAbortedError()\n      queueMicrotask(() => onFinished(err))\n    }\n  }\n\n  /**\n   * @param {Error} [err]\n   * @returns\n   */\n  const onFinished = function (err) {\n    if (finished) {\n      return\n    }\n\n    finished = true\n\n    assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))\n\n    socket\n      .off('drain', onDrain)\n      .off('error', onFinished)\n\n    body\n      .removeListener('data', onData)\n      .removeListener('end', onFinished)\n      .removeListener('close', onClose)\n\n    if (!err) {\n      try {\n        writer.end()\n      } catch (er) {\n        err = er\n      }\n    }\n\n    writer.destroy(err)\n\n    if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {\n      util.destroy(body, err)\n    } else {\n      util.destroy(body)\n    }\n  }\n\n  body\n    .on('data', onData)\n    .on('end', onFinished)\n    .on('error', onFinished)\n    .on('close', onClose)\n\n  if (body.resume) {\n    body.resume()\n  }\n\n  socket\n    .on('drain', onDrain)\n    .on('error', onFinished)\n\n  if (body.errorEmitted ?? body.errored) {\n    setImmediate(onFinished, body.errored)\n  } else if (body.endEmitted ?? body.readableEnded) {\n    setImmediate(onFinished, null)\n  }\n\n  if (body.closeEmitted ?? body.closed) {\n    setImmediate(onClose)\n  }\n}\n\n/**\n * @typedef AbortCallback\n * @type {Function}\n * @param {Error} [err]\n * @returns {void}\n */\n\n/**\n * @param {AbortCallback} abort\n * @param {Uint8Array|null} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {void}\n */\nfunction writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n  try {\n    if (!body) {\n      if (contentLength === 0) {\n        socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n      } else {\n        assert(contentLength === null, 'no body must not have content length')\n        socket.write(`${header}\\r\\n`, 'latin1')\n      }\n    } else if (util.isBuffer(body)) {\n      assert(contentLength === body.byteLength, 'buffer body must have content length')\n\n      socket.cork()\n      socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n      socket.write(body)\n      socket.uncork()\n      request.onBodySent(body)\n\n      if (!expectsPayload && request.reset !== false) {\n        socket[kReset] = true\n      }\n    }\n    request.onRequestSent()\n\n    client[kResume]()\n  } catch (err) {\n    abort(err)\n  }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Blob} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise<void>}\n */\nasync function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n  assert(contentLength === body.size, 'blob body must have content length')\n\n  try {\n    if (contentLength != null && contentLength !== body.size) {\n      throw new RequestContentLengthMismatchError()\n    }\n\n    const buffer = Buffer.from(await body.arrayBuffer())\n\n    socket.cork()\n    socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n    socket.write(buffer)\n    socket.uncork()\n\n    request.onBodySent(buffer)\n    request.onRequestSent()\n\n    if (!expectsPayload && request.reset !== false) {\n      socket[kReset] = true\n    }\n\n    client[kResume]()\n  } catch (err) {\n    abort(err)\n  }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Iterable} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise<void>}\n */\nasync function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n  assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n  let callback = null\n  function onDrain () {\n    if (callback) {\n      const cb = callback\n      callback = null\n      cb()\n    }\n  }\n\n  const waitForDrain = () => new Promise((resolve, reject) => {\n    assert(callback === null)\n\n    if (socket[kError]) {\n      reject(socket[kError])\n    } else {\n      callback = resolve\n    }\n  })\n\n  socket\n    .on('close', onDrain)\n    .on('drain', onDrain)\n\n  const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n  try {\n    // It's up to the user to somehow abort the async iterable.\n    for await (const chunk of body) {\n      if (socket[kError]) {\n        throw socket[kError]\n      }\n\n      if (!writer.write(chunk)) {\n        await waitForDrain()\n      }\n    }\n\n    writer.end()\n  } catch (err) {\n    writer.destroy(err)\n  } finally {\n    socket\n      .off('close', onDrain)\n      .off('drain', onDrain)\n  }\n}\n\nclass AsyncWriter {\n  /**\n   *\n   * @param {object} arg\n   * @param {AbortCallback} arg.abort\n   * @param {import('net').Socket} arg.socket\n   * @param {import('../core/request.js')} arg.request\n   * @param {number} arg.contentLength\n   * @param {import('./client.js')} arg.client\n   * @param {boolean} arg.expectsPayload\n   * @param {string} arg.header\n   */\n  constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) {\n    this.socket = socket\n    this.request = request\n    this.contentLength = contentLength\n    this.client = client\n    this.bytesWritten = 0\n    this.expectsPayload = expectsPayload\n    this.header = header\n    this.abort = abort\n\n    socket[kWriting] = true\n  }\n\n  /**\n   * @param {Buffer} chunk\n   * @returns\n   */\n  write (chunk) {\n    const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this\n\n    if (socket[kError]) {\n      throw socket[kError]\n    }\n\n    if (socket.destroyed) {\n      return false\n    }\n\n    const len = Buffer.byteLength(chunk)\n    if (!len) {\n      return true\n    }\n\n    // We should defer writing chunks.\n    if (contentLength !== null && bytesWritten + len > contentLength) {\n      if (client[kStrictContentLength]) {\n        throw new RequestContentLengthMismatchError()\n      }\n\n      process.emitWarning(new RequestContentLengthMismatchError())\n    }\n\n    socket.cork()\n\n    if (bytesWritten === 0) {\n      if (!expectsPayload && request.reset !== false) {\n        socket[kReset] = true\n      }\n\n      if (contentLength === null) {\n        socket.write(`${header}transfer-encoding: chunked\\r\\n`, 'latin1')\n      } else {\n        socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n      }\n    }\n\n    if (contentLength === null) {\n      socket.write(`\\r\\n${len.toString(16)}\\r\\n`, 'latin1')\n    }\n\n    this.bytesWritten += len\n\n    const ret = socket.write(chunk)\n\n    socket.uncork()\n\n    request.onBodySent(chunk)\n\n    if (!ret) {\n      if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n        if (socket[kParser].timeout.refresh) {\n          socket[kParser].timeout.refresh()\n        }\n      }\n    }\n\n    return ret\n  }\n\n  /**\n   * @returns {void}\n   */\n  end () {\n    const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this\n    request.onRequestSent()\n\n    socket[kWriting] = false\n\n    if (socket[kError]) {\n      throw socket[kError]\n    }\n\n    if (socket.destroyed) {\n      return\n    }\n\n    if (bytesWritten === 0) {\n      if (expectsPayload) {\n        // https://tools.ietf.org/html/rfc7230#section-3.3.2\n        // A user agent SHOULD send a Content-Length in a request message when\n        // no Transfer-Encoding is sent and the request method defines a meaning\n        // for an enclosed payload body.\n\n        socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n      } else {\n        socket.write(`${header}\\r\\n`, 'latin1')\n      }\n    } else if (contentLength === null) {\n      socket.write('\\r\\n0\\r\\n\\r\\n', 'latin1')\n    }\n\n    if (contentLength !== null && bytesWritten !== contentLength) {\n      if (client[kStrictContentLength]) {\n        throw new RequestContentLengthMismatchError()\n      } else {\n        process.emitWarning(new RequestContentLengthMismatchError())\n      }\n    }\n\n    if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n      if (socket[kParser].timeout.refresh) {\n        socket[kParser].timeout.refresh()\n      }\n    }\n\n    client[kResume]()\n  }\n\n  /**\n   * @param {Error} [err]\n   * @returns {void}\n   */\n  destroy (err) {\n    const { socket, client, abort } = this\n\n    socket[kWriting] = false\n\n    if (err) {\n      assert(client[kRunning] <= 1, 'pipeline should only contain this request')\n      abort(err)\n    }\n  }\n}\n\nmodule.exports = connectH1\n","'use strict'\n\nconst assert = require('node:assert')\nconst { pipeline } = require('node:stream')\nconst util = require('../core/util.js')\nconst {\n  RequestContentLengthMismatchError,\n  RequestAbortedError,\n  SocketError,\n  InformationalError,\n  InvalidArgumentError\n} = require('../core/errors.js')\nconst {\n  kUrl,\n  kReset,\n  kClient,\n  kRunning,\n  kPending,\n  kQueue,\n  kPendingIdx,\n  kRunningIdx,\n  kError,\n  kSocket,\n  kStrictContentLength,\n  kOnError,\n  kMaxConcurrentStreams,\n  kPingInterval,\n  kHTTP2Session,\n  kHTTP2InitialWindowSize,\n  kHTTP2ConnectionWindowSize,\n  kResume,\n  kSize,\n  kHTTPContext,\n  kClosed,\n  kBodyTimeout,\n  kEnableConnectProtocol,\n  kRemoteSettings,\n  kHTTP2Stream,\n  kHTTP2SessionState\n} = require('../core/symbols.js')\nconst { channels } = require('../core/diagnostics.js')\n\nconst kOpenStreams = Symbol('open streams')\n\nlet extractBody\n\n/** @type {import('http2')} */\nlet http2\ntry {\n  http2 = require('node:http2')\n} catch {\n  // @ts-ignore\n  http2 = { constants: {} }\n}\n\nconst {\n  constants: {\n    HTTP2_HEADER_AUTHORITY,\n    HTTP2_HEADER_METHOD,\n    HTTP2_HEADER_PATH,\n    HTTP2_HEADER_SCHEME,\n    HTTP2_HEADER_CONTENT_LENGTH,\n    HTTP2_HEADER_EXPECT,\n    HTTP2_HEADER_STATUS,\n    HTTP2_HEADER_PROTOCOL,\n    NGHTTP2_REFUSED_STREAM,\n    NGHTTP2_CANCEL\n  }\n} = http2\n\nfunction parseH2Headers (headers) {\n  const result = []\n\n  for (const [name, value] of Object.entries(headers)) {\n    // h2 may concat the header value by array\n    // e.g. Set-Cookie\n    if (Array.isArray(value)) {\n      for (const subvalue of value) {\n        // we need to provide each header value of header name\n        // because the headers handler expect name-value pair\n        result.push(Buffer.from(name), Buffer.from(subvalue))\n      }\n    } else {\n      result.push(Buffer.from(name), Buffer.from(value))\n    }\n  }\n\n  return result\n}\n\nfunction connectH2 (client, socket) {\n  client[kSocket] = socket\n\n  const http2InitialWindowSize = client[kHTTP2InitialWindowSize]\n  const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]\n\n  const session = http2.connect(client[kUrl], {\n    createConnection: () => socket,\n    peerMaxConcurrentStreams: client[kMaxConcurrentStreams],\n    settings: {\n      // TODO(metcoder95): add support for PUSH\n      enablePush: false,\n      ...(http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null)\n    }\n  })\n\n  client[kSocket] = socket\n  session[kOpenStreams] = 0\n  session[kClient] = client\n  session[kSocket] = socket\n  session[kHTTP2SessionState] = {\n    ping: {\n      interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref()\n    }\n  }\n  // We set it to true by default in a best-effort; however once connected to an H2 server\n  // we will check if extended CONNECT protocol is supported or not\n  // and set this value accordingly.\n  session[kEnableConnectProtocol] = false\n  // States whether or not we have received the remote settings from the server\n  session[kRemoteSettings] = false\n\n  // Apply connection-level flow control once connected (if supported).\n  if (http2ConnectionWindowSize) {\n    util.addListener(session, 'connect', applyConnectionWindowSize.bind(session, http2ConnectionWindowSize))\n  }\n\n  util.addListener(session, 'error', onHttp2SessionError)\n  util.addListener(session, 'frameError', onHttp2FrameError)\n  util.addListener(session, 'end', onHttp2SessionEnd)\n  util.addListener(session, 'goaway', onHttp2SessionGoAway)\n  util.addListener(session, 'close', onHttp2SessionClose)\n  util.addListener(session, 'remoteSettings', onHttp2RemoteSettings)\n  // TODO (@metcoder95): implement SETTINGS support\n  // util.addListener(session, 'localSettings', onHttp2RemoteSettings)\n\n  session.unref()\n\n  client[kHTTP2Session] = session\n  socket[kHTTP2Session] = session\n\n  util.addListener(socket, 'error', onHttp2SocketError)\n  util.addListener(socket, 'end', onHttp2SocketEnd)\n  util.addListener(socket, 'close', onHttp2SocketClose)\n\n  socket[kClosed] = false\n  socket.on('close', onSocketClose)\n\n  return {\n    version: 'h2',\n    defaultPipelining: Infinity,\n    /**\n     * @param {import('../core/request.js')} request\n     * @returns {boolean}\n    */\n    write (request) {\n      return writeH2(client, request)\n    },\n    /**\n     * @returns {void}\n     */\n    resume () {\n      resumeH2(client)\n    },\n    /**\n     * @param {Error | null} err\n     * @param {() => void} callback\n     */\n    destroy (err, callback) {\n      if (socket[kClosed]) {\n        queueMicrotask(callback)\n      } else {\n        socket.destroy(err).on('close', callback)\n      }\n    },\n    /**\n     * @type {boolean}\n     */\n    get destroyed () {\n      return socket.destroyed\n    },\n    /**\n     * @param {import('../core/request.js')} request\n     * @returns {boolean}\n    */\n    busy (request) {\n      if (request != null) {\n        if (client[kRunning] > 0) {\n          // We are already processing requests\n\n          // Non-idempotent request cannot be retried.\n          // Ensure that no other requests are inflight and\n          // could cause failure.\n          if (request.idempotent === false) return true\n          // Don't dispatch an upgrade until all preceding requests have completed.\n          // Possibly, we do not have remote settings confirmed yet.\n          if ((request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false) return true\n          // Request with stream or iterator body can error while other requests\n          // are inflight and indirectly error those as well.\n          // Ensure this doesn't happen by waiting for inflight\n          // to complete before dispatching.\n\n          // Request with stream or iterator body cannot be retried.\n          // Ensure that no other requests are inflight and\n          // could cause failure.\n          if (util.bodyLength(request.body) !== 0 &&\n            (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) return true\n        } else {\n          return (request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false\n        }\n      }\n\n      return false\n    }\n  }\n}\n\nfunction resumeH2 (client) {\n  const socket = client[kSocket]\n\n  if (socket?.destroyed === false) {\n    if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) {\n      socket.unref()\n      client[kHTTP2Session].unref()\n    } else {\n      socket.ref()\n      client[kHTTP2Session].ref()\n    }\n  }\n}\n\nfunction applyConnectionWindowSize (connectionWindowSize) {\n  try {\n    if (typeof this.setLocalWindowSize === 'function') {\n      this.setLocalWindowSize(connectionWindowSize)\n    }\n  } catch {\n    // Best-effort only.\n  }\n}\n\nfunction onHttp2RemoteSettings (settings) {\n  // Fallbacks are a safe bet, remote setting will always override\n  this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams]\n  /**\n   * From RFC-8441\n   * A sender MUST NOT send a SETTINGS_ENABLE_CONNECT_PROTOCOL parameter\n   * with the value of 0 after previously sending a value of 1.\n   */\n  // Note: Cannot be tested in Node, it does not supports disabling the extended CONNECT protocol once enabled\n  if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) {\n    const err = new InformationalError('HTTP/2: Server disabled extended CONNECT protocol against RFC-8441')\n    this[kSocket][kError] = err\n    this[kClient][kOnError](err)\n    return\n  }\n\n  this[kEnableConnectProtocol] = settings.enableConnectProtocol ?? this[kEnableConnectProtocol]\n  this[kRemoteSettings] = true\n  this[kClient][kResume]()\n}\n\nfunction onHttp2SendPing (session) {\n  const state = session[kHTTP2SessionState]\n  if ((session.closed || session.destroyed) && state.ping.interval != null) {\n    clearInterval(state.ping.interval)\n    state.ping.interval = null\n    return\n  }\n\n  // If no ping sent, do nothing\n  session.ping(onPing.bind(session))\n\n  function onPing (err, duration) {\n    const client = this[kClient]\n    const socket = this[kClient]\n\n    if (err != null) {\n      const error = new InformationalError(`HTTP/2: \"PING\" errored - type ${err.message}`)\n      socket[kError] = error\n      client[kOnError](error)\n    } else {\n      client.emit('ping', duration)\n    }\n  }\n}\n\nfunction onHttp2SessionError (err) {\n  assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n  this[kSocket][kError] = err\n  this[kClient][kOnError](err)\n}\n\nfunction onHttp2FrameError (type, code, id) {\n  if (id === 0) {\n    const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n    this[kSocket][kError] = err\n    this[kClient][kOnError](err)\n  }\n}\n\nfunction onHttp2SessionEnd () {\n  const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket]))\n  this.destroy(err)\n  util.destroy(this[kSocket], err)\n}\n\n/**\n * This is the root cause of #3011\n * We need to handle GOAWAY frames properly, and trigger the session close\n * along with the socket right away\n *\n * @this {import('http2').ClientHttp2Session}\n * @param {number} errorCode\n */\nfunction onHttp2SessionGoAway (errorCode) {\n  // TODO(mcollina): Verify if GOAWAY implements the spec correctly:\n  // https://datatracker.ietf.org/doc/html/rfc7540#section-6.8\n  // Specifically, we do not verify the \"valid\" stream id.\n\n  const err = this[kError] || new SocketError(`HTTP/2: \"GOAWAY\" frame received with code ${errorCode}`, util.getSocketInfo(this[kSocket]))\n  const client = this[kClient]\n\n  client[kSocket] = null\n  client[kHTTPContext] = null\n\n  // this is an HTTP2 session\n  this.close()\n  this[kHTTP2Session] = null\n\n  util.destroy(this[kSocket], err)\n\n  // Fail head of pipeline.\n  if (client[kRunningIdx] < client[kQueue].length) {\n    const request = client[kQueue][client[kRunningIdx]]\n    client[kQueue][client[kRunningIdx]++] = null\n    util.errorRequest(client, request, err)\n    client[kPendingIdx] = client[kRunningIdx]\n  }\n\n  assert(client[kRunning] === 0)\n\n  client.emit('disconnect', client[kUrl], [client], err)\n  client.emit('connectionError', client[kUrl], [client], err)\n\n  client[kResume]()\n}\n\nfunction onHttp2SessionClose () {\n  const { [kClient]: client, [kHTTP2SessionState]: state } = this\n  const { [kSocket]: socket } = client\n\n  const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket))\n\n  client[kSocket] = null\n  client[kHTTPContext] = null\n\n  if (state.ping.interval != null) {\n    clearInterval(state.ping.interval)\n    state.ping.interval = null\n  }\n\n  if (client.destroyed) {\n    assert(client[kPending] === 0)\n\n    // Fail entire queue.\n    const requests = client[kQueue].splice(client[kRunningIdx])\n    for (let i = 0; i < requests.length; i++) {\n      const request = requests[i]\n      util.errorRequest(client, request, err)\n    }\n  }\n}\n\nfunction onHttp2SocketClose () {\n  const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n  const client = this[kHTTP2Session][kClient]\n\n  client[kSocket] = null\n  client[kHTTPContext] = null\n\n  if (this[kHTTP2Session] !== null) {\n    this[kHTTP2Session].destroy(err)\n  }\n\n  client[kPendingIdx] = client[kRunningIdx]\n\n  assert(client[kRunning] === 0)\n\n  client.emit('disconnect', client[kUrl], [client], err)\n\n  client[kResume]()\n}\n\nfunction onHttp2SocketError (err) {\n  assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n  this[kError] = err\n\n  this[kClient][kOnError](err)\n}\n\nfunction onHttp2SocketEnd () {\n  util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onSocketClose () {\n  this[kClosed] = true\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n  return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\nfunction writeH2 (client, request) {\n  const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]\n  const session = client[kHTTP2Session]\n  const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request\n  let { body } = request\n\n  if (upgrade != null && upgrade !== 'websocket') {\n    util.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade \"${upgrade}\" not supported over HTTP/2`))\n    return false\n  }\n\n  const headers = {}\n  for (let n = 0; n < reqHeaders.length; n += 2) {\n    const key = reqHeaders[n + 0]\n    const val = reqHeaders[n + 1]\n\n    if (key === 'cookie') {\n      if (headers[key] != null) {\n        headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]\n      } else {\n        headers[key] = val\n      }\n\n      continue\n    }\n\n    if (Array.isArray(val)) {\n      for (let i = 0; i < val.length; i++) {\n        if (headers[key]) {\n          headers[key] += `, ${val[i]}`\n        } else {\n          headers[key] = val[i]\n        }\n      }\n    } else if (headers[key]) {\n      headers[key] += `, ${val}`\n    } else {\n      headers[key] = val\n    }\n  }\n\n  /** @type {import('node:http2').ClientHttp2Stream} */\n  let stream = null\n\n  const { hostname, port } = client[kUrl]\n\n  headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`\n  headers[HTTP2_HEADER_METHOD] = method\n\n  const abort = (err) => {\n    if (request.aborted || request.completed) {\n      return\n    }\n\n    err = err || new RequestAbortedError()\n\n    util.errorRequest(client, request, err)\n\n    if (stream != null) {\n      // Some chunks might still come after abort,\n      // let's ignore them\n      stream.removeAllListeners('data')\n\n      // On Abort, we close the stream to send RST_STREAM frame\n      stream.close()\n\n      // We move the running index to the next request\n      client[kOnError](err)\n      client[kResume]()\n    }\n\n    // We do not destroy the socket as we can continue using the session\n    // the stream gets destroyed and the session remains to create new streams\n    util.destroy(body, err)\n  }\n\n  try {\n    // We are already connected, streams are pending.\n    // We can call on connect, and wait for abort\n    request.onConnect(abort)\n  } catch (err) {\n    util.errorRequest(client, request, err)\n  }\n\n  if (request.aborted) {\n    return false\n  }\n\n  if (upgrade || method === 'CONNECT') {\n    session.ref()\n\n    if (upgrade === 'websocket') {\n      // We cannot upgrade to websocket if extended CONNECT protocol is not supported\n      if (session[kEnableConnectProtocol] === false) {\n        util.errorRequest(client, request, new InformationalError('HTTP/2: Extended CONNECT protocol not supported by server'))\n        session.unref()\n        return false\n      }\n\n      // We force the method to CONNECT\n      // as per RFC-8441\n      // https://datatracker.ietf.org/doc/html/rfc8441#section-4\n      headers[HTTP2_HEADER_METHOD] = 'CONNECT'\n      headers[HTTP2_HEADER_PROTOCOL] = 'websocket'\n      // :path and :scheme headers must be omitted when sending CONNECT but set if extended-CONNECT\n      headers[HTTP2_HEADER_PATH] = path\n\n      if (protocol === 'ws:' || protocol === 'wss:') {\n        headers[HTTP2_HEADER_SCHEME] = protocol === 'ws:' ? 'http' : 'https'\n      } else {\n        headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n      }\n\n      stream = session.request(headers, { endStream: false, signal })\n      stream[kHTTP2Stream] = true\n\n      stream.once('response', (headers, _flags) => {\n        const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n        request.onUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n\n        ++session[kOpenStreams]\n        client[kQueue][client[kRunningIdx]++] = null\n      })\n\n      stream.on('error', () => {\n        if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) {\n          // NGHTTP2_REFUSED_STREAM (7) or NGHTTP2_CANCEL (8)\n          // We do not treat those as errors as the server might\n          // not support websockets and refuse the stream\n          abort(new InformationalError(`HTTP/2: \"stream error\" received - code ${stream.rstCode}`))\n        }\n      })\n\n      stream.once('close', () => {\n        session[kOpenStreams] -= 1\n        if (session[kOpenStreams] === 0) session.unref()\n      })\n\n      stream.setTimeout(requestTimeout)\n      return true\n    }\n\n    // TODO: consolidate once we support CONNECT properly\n    // NOTE: We are already connected, streams are pending, first request\n    // will create a new stream. We trigger a request to create the stream and wait until\n    // `ready` event is triggered\n    // We disabled endStream to allow the user to write to the stream\n    stream = session.request(headers, { endStream: false, signal })\n    stream[kHTTP2Stream] = true\n    stream.on('response', headers => {\n      const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n      request.onUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n      ++session[kOpenStreams]\n      client[kQueue][client[kRunningIdx]++] = null\n    })\n    stream.once('close', () => {\n      session[kOpenStreams] -= 1\n      if (session[kOpenStreams] === 0) session.unref()\n    })\n    stream.setTimeout(requestTimeout)\n\n    return true\n  }\n\n  // https://tools.ietf.org/html/rfc7540#section-8.3\n  // :path and :scheme headers must be omitted when sending CONNECT\n  headers[HTTP2_HEADER_PATH] = path\n  headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n\n  // https://tools.ietf.org/html/rfc7231#section-4.3.1\n  // https://tools.ietf.org/html/rfc7231#section-4.3.2\n  // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n  // Sending a payload body on a request that does not\n  // expect it can cause undefined behavior on some\n  // servers and corrupt connection state. Do not\n  // re-use the connection for further requests.\n\n  const expectsPayload = (\n    method === 'PUT' ||\n    method === 'POST' ||\n    method === 'PATCH'\n  )\n\n  if (body && typeof body.read === 'function') {\n    // Try to read EOF in order to get length.\n    body.read(0)\n  }\n\n  let contentLength = util.bodyLength(body)\n\n  if (util.isFormDataLike(body)) {\n    extractBody ??= require('../web/fetch/body.js').extractBody\n\n    const [bodyStream, contentType] = extractBody(body)\n    headers['content-type'] = contentType\n\n    body = bodyStream.stream\n    contentLength = bodyStream.length\n  }\n\n  if (contentLength == null) {\n    contentLength = request.contentLength\n  }\n\n  if (!expectsPayload) {\n    // https://tools.ietf.org/html/rfc7230#section-3.3.2\n    // A user agent SHOULD NOT send a Content-Length header field when\n    // the request message does not contain a payload body and the method\n    // semantics do not anticipate such a body.\n    // And for methods that don't expect a payload, omit Content-Length.\n    contentLength = null\n  }\n\n  // https://github.com/nodejs/undici/issues/2046\n  // A user agent may send a Content-Length header with 0 value, this should be allowed.\n  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {\n    if (client[kStrictContentLength]) {\n      util.errorRequest(client, request, new RequestContentLengthMismatchError())\n      return false\n    }\n\n    process.emitWarning(new RequestContentLengthMismatchError())\n  }\n\n  if (contentLength != null) {\n    assert(body || contentLength === 0, 'no body must not have content length')\n    headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`\n  }\n\n  session.ref()\n\n  if (channels.sendHeaders.hasSubscribers) {\n    let header = ''\n    for (const key in headers) {\n      header += `${key}: ${headers[key]}\\r\\n`\n    }\n    channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] })\n  }\n\n  // TODO(metcoder95): add support for sending trailers\n  const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null\n  if (expectContinue) {\n    headers[HTTP2_HEADER_EXPECT] = '100-continue'\n    stream = session.request(headers, { endStream: shouldEndStream, signal })\n    stream[kHTTP2Stream] = true\n\n    stream.once('continue', writeBodyH2)\n  } else {\n    stream = session.request(headers, {\n      endStream: shouldEndStream,\n      signal\n    })\n    stream[kHTTP2Stream] = true\n\n    writeBodyH2()\n  }\n\n  // Increment counter as we have new streams open\n  ++session[kOpenStreams]\n  stream.setTimeout(requestTimeout)\n\n  // Track whether we received a response (headers)\n  let responseReceived = false\n\n  stream.once('response', headers => {\n    const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n    request.onResponseStarted()\n    responseReceived = true\n\n    // Due to the stream nature, it is possible we face a race condition\n    // where the stream has been assigned, but the request has been aborted\n    // the request remains in-flight and headers hasn't been received yet\n    // for those scenarios, best effort is to destroy the stream immediately\n    // as there's no value to keep it open.\n    if (request.aborted) {\n      stream.removeAllListeners('data')\n      return\n    }\n\n    if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {\n      stream.pause()\n    }\n\n    stream.on('data', (chunk) => {\n      if (request.aborted || request.completed) {\n        return\n      }\n\n      if (request.onData(chunk) === false) {\n        stream.pause()\n      }\n    })\n  })\n\n  stream.once('end', () => {\n    stream.removeAllListeners('data')\n    // If we received a response, this is a normal completion\n    if (responseReceived) {\n      if (!request.aborted && !request.completed) {\n        request.onComplete({})\n      }\n\n      client[kQueue][client[kRunningIdx]++] = null\n      client[kResume]()\n    } else {\n      // Stream ended without receiving a response - this is an error\n      // (e.g., server destroyed the stream before sending headers)\n      abort(new InformationalError('HTTP/2: stream half-closed (remote)'))\n      client[kQueue][client[kRunningIdx]++] = null\n      client[kPendingIdx] = client[kRunningIdx]\n      client[kResume]()\n    }\n  })\n\n  stream.once('close', () => {\n    stream.removeAllListeners('data')\n    session[kOpenStreams] -= 1\n    if (session[kOpenStreams] === 0) {\n      session.unref()\n    }\n  })\n\n  stream.once('error', function (err) {\n    stream.removeAllListeners('data')\n    abort(err)\n  })\n\n  stream.once('frameError', (type, code) => {\n    stream.removeAllListeners('data')\n    abort(new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`))\n  })\n\n  stream.on('aborted', () => {\n    stream.removeAllListeners('data')\n  })\n\n  stream.on('timeout', () => {\n    const err = new InformationalError(`HTTP/2: \"stream timeout after ${requestTimeout}\"`)\n    stream.removeAllListeners('data')\n    session[kOpenStreams] -= 1\n\n    if (session[kOpenStreams] === 0) {\n      session.unref()\n    }\n\n    abort(err)\n  })\n\n  stream.once('trailers', trailers => {\n    if (request.aborted || request.completed) {\n      return\n    }\n\n    stream.removeAllListeners('data')\n    request.onComplete(trailers)\n  })\n\n  return true\n\n  function writeBodyH2 () {\n    if (!body || contentLength === 0) {\n      writeBuffer(\n        abort,\n        stream,\n        null,\n        client,\n        request,\n        client[kSocket],\n        contentLength,\n        expectsPayload\n      )\n    } else if (util.isBuffer(body)) {\n      writeBuffer(\n        abort,\n        stream,\n        body,\n        client,\n        request,\n        client[kSocket],\n        contentLength,\n        expectsPayload\n      )\n    } else if (util.isBlobLike(body)) {\n      if (typeof body.stream === 'function') {\n        writeIterable(\n          abort,\n          stream,\n          body.stream(),\n          client,\n          request,\n          client[kSocket],\n          contentLength,\n          expectsPayload\n        )\n      } else {\n        writeBlob(\n          abort,\n          stream,\n          body,\n          client,\n          request,\n          client[kSocket],\n          contentLength,\n          expectsPayload\n        )\n      }\n    } else if (util.isStream(body)) {\n      writeStream(\n        abort,\n        client[kSocket],\n        expectsPayload,\n        stream,\n        body,\n        client,\n        request,\n        contentLength\n      )\n    } else if (util.isIterable(body)) {\n      writeIterable(\n        abort,\n        stream,\n        body,\n        client,\n        request,\n        client[kSocket],\n        contentLength,\n        expectsPayload\n      )\n    } else {\n      assert(false)\n    }\n  }\n}\n\nfunction writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n  try {\n    if (body != null && util.isBuffer(body)) {\n      assert(contentLength === body.byteLength, 'buffer body must have content length')\n      h2stream.cork()\n      h2stream.write(body)\n      h2stream.uncork()\n      h2stream.end()\n\n      request.onBodySent(body)\n    }\n\n    if (!expectsPayload) {\n      socket[kReset] = true\n    }\n\n    request.onRequestSent()\n    client[kResume]()\n  } catch (error) {\n    abort(error)\n  }\n}\n\nfunction writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) {\n  assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n  // For HTTP/2, is enough to pipe the stream\n  const pipe = pipeline(\n    body,\n    h2stream,\n    (err) => {\n      if (err) {\n        util.destroy(pipe, err)\n        abort(err)\n      } else {\n        util.removeAllListeners(pipe)\n        request.onRequestSent()\n\n        if (!expectsPayload) {\n          socket[kReset] = true\n        }\n\n        client[kResume]()\n      }\n    }\n  )\n\n  util.addListener(pipe, 'data', onPipeData)\n\n  function onPipeData (chunk) {\n    request.onBodySent(chunk)\n  }\n}\n\nasync function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n  assert(contentLength === body.size, 'blob body must have content length')\n\n  try {\n    if (contentLength != null && contentLength !== body.size) {\n      throw new RequestContentLengthMismatchError()\n    }\n\n    const buffer = Buffer.from(await body.arrayBuffer())\n\n    h2stream.cork()\n    h2stream.write(buffer)\n    h2stream.uncork()\n    h2stream.end()\n\n    request.onBodySent(buffer)\n    request.onRequestSent()\n\n    if (!expectsPayload) {\n      socket[kReset] = true\n    }\n\n    client[kResume]()\n  } catch (err) {\n    abort(err)\n  }\n}\n\nasync function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n  assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n  let callback = null\n  function onDrain () {\n    if (callback) {\n      const cb = callback\n      callback = null\n      cb()\n    }\n  }\n\n  const waitForDrain = () => new Promise((resolve, reject) => {\n    assert(callback === null)\n\n    if (socket[kError]) {\n      reject(socket[kError])\n    } else {\n      callback = resolve\n    }\n  })\n\n  h2stream\n    .on('close', onDrain)\n    .on('drain', onDrain)\n\n  try {\n    // It's up to the user to somehow abort the async iterable.\n    for await (const chunk of body) {\n      if (socket[kError]) {\n        throw socket[kError]\n      }\n\n      const res = h2stream.write(chunk)\n      request.onBodySent(chunk)\n      if (!res) {\n        await waitForDrain()\n      }\n    }\n\n    h2stream.end()\n\n    request.onRequestSent()\n\n    if (!expectsPayload) {\n      socket[kReset] = true\n    }\n\n    client[kResume]()\n  } catch (err) {\n    abort(err)\n  } finally {\n    h2stream\n      .off('close', onDrain)\n      .off('drain', onDrain)\n  }\n}\n\nmodule.exports = connectH2\n","'use strict'\n\nconst assert = require('node:assert')\nconst net = require('node:net')\nconst http = require('node:http')\nconst util = require('../core/util.js')\nconst { ClientStats } = require('../util/stats.js')\nconst { channels } = require('../core/diagnostics.js')\nconst Request = require('../core/request.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst {\n  InvalidArgumentError,\n  InformationalError,\n  ClientDestroyedError\n} = require('../core/errors.js')\nconst buildConnector = require('../core/connect.js')\nconst {\n  kUrl,\n  kServerName,\n  kClient,\n  kBusy,\n  kConnect,\n  kResuming,\n  kRunning,\n  kPending,\n  kSize,\n  kQueue,\n  kConnected,\n  kConnecting,\n  kNeedDrain,\n  kKeepAliveDefaultTimeout,\n  kHostHeader,\n  kPendingIdx,\n  kRunningIdx,\n  kError,\n  kPipelining,\n  kKeepAliveTimeoutValue,\n  kMaxHeadersSize,\n  kKeepAliveMaxTimeout,\n  kKeepAliveTimeoutThreshold,\n  kHeadersTimeout,\n  kBodyTimeout,\n  kStrictContentLength,\n  kConnector,\n  kMaxRequests,\n  kCounter,\n  kClose,\n  kDestroy,\n  kDispatch,\n  kLocalAddress,\n  kMaxResponseSize,\n  kOnError,\n  kHTTPContext,\n  kMaxConcurrentStreams,\n  kHTTP2InitialWindowSize,\n  kHTTP2ConnectionWindowSize,\n  kResume,\n  kPingInterval\n} = require('../core/symbols.js')\nconst connectH1 = require('./client-h1.js')\nconst connectH2 = require('./client-h2.js')\n\nconst kClosedResolve = Symbol('kClosedResolve')\n\nconst getDefaultNodeMaxHeaderSize = http &&\n  http.maxHeaderSize &&\n  Number.isInteger(http.maxHeaderSize) &&\n  http.maxHeaderSize > 0\n  ? () => http.maxHeaderSize\n  : () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') }\n\nconst noop = () => { }\n\nfunction getPipelining (client) {\n  return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1\n}\n\n/**\n * @type {import('../../types/client.js').default}\n */\nclass Client extends DispatcherBase {\n  /**\n   *\n   * @param {string|URL} url\n   * @param {import('../../types/client.js').Client.Options} options\n   */\n  constructor (url, {\n    maxHeaderSize,\n    headersTimeout,\n    socketTimeout,\n    requestTimeout,\n    connectTimeout,\n    bodyTimeout,\n    idleTimeout,\n    keepAlive,\n    keepAliveTimeout,\n    maxKeepAliveTimeout,\n    keepAliveMaxTimeout,\n    keepAliveTimeoutThreshold,\n    socketPath,\n    pipelining,\n    tls,\n    strictContentLength,\n    maxCachedSessions,\n    connect,\n    maxRequestsPerClient,\n    localAddress,\n    maxResponseSize,\n    autoSelectFamily,\n    autoSelectFamilyAttemptTimeout,\n    // h2\n    maxConcurrentStreams,\n    allowH2,\n    useH2c,\n    initialWindowSize,\n    connectionWindowSize,\n    pingInterval\n  } = {}) {\n    if (keepAlive !== undefined) {\n      throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')\n    }\n\n    if (socketTimeout !== undefined) {\n      throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')\n    }\n\n    if (requestTimeout !== undefined) {\n      throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')\n    }\n\n    if (idleTimeout !== undefined) {\n      throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')\n    }\n\n    if (maxKeepAliveTimeout !== undefined) {\n      throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')\n    }\n\n    if (maxHeaderSize != null) {\n      if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) {\n        throw new InvalidArgumentError('invalid maxHeaderSize')\n      }\n    } else {\n      // If maxHeaderSize is not provided, use the default value from the http module\n      // or if that is not available, throw an error.\n      maxHeaderSize = getDefaultNodeMaxHeaderSize()\n    }\n\n    if (socketPath != null && typeof socketPath !== 'string') {\n      throw new InvalidArgumentError('invalid socketPath')\n    }\n\n    if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {\n      throw new InvalidArgumentError('invalid connectTimeout')\n    }\n\n    if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {\n      throw new InvalidArgumentError('invalid keepAliveTimeout')\n    }\n\n    if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {\n      throw new InvalidArgumentError('invalid keepAliveMaxTimeout')\n    }\n\n    if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {\n      throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')\n    }\n\n    if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {\n      throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')\n    }\n\n    if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {\n      throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')\n    }\n\n    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n      throw new InvalidArgumentError('connect must be a function or an object')\n    }\n\n    if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {\n      throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')\n    }\n\n    if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {\n      throw new InvalidArgumentError('localAddress must be valid string IP address')\n    }\n\n    if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {\n      throw new InvalidArgumentError('maxResponseSize must be a positive number')\n    }\n\n    if (\n      autoSelectFamilyAttemptTimeout != null &&\n      (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)\n    ) {\n      throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')\n    }\n\n    // h2\n    if (allowH2 != null && typeof allowH2 !== 'boolean') {\n      throw new InvalidArgumentError('allowH2 must be a valid boolean value')\n    }\n\n    if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {\n      throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')\n    }\n\n    if (useH2c != null && typeof useH2c !== 'boolean') {\n      throw new InvalidArgumentError('useH2c must be a valid boolean value')\n    }\n\n    if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {\n      throw new InvalidArgumentError('initialWindowSize must be a positive integer, greater than 0')\n    }\n\n    if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {\n      throw new InvalidArgumentError('connectionWindowSize must be a positive integer, greater than 0')\n    }\n\n    if (pingInterval != null && (typeof pingInterval !== 'number' || !Number.isInteger(pingInterval) || pingInterval < 0)) {\n      throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')\n    }\n\n    super()\n\n    if (typeof connect !== 'function') {\n      connect = buildConnector({\n        ...tls,\n        maxCachedSessions,\n        allowH2,\n        useH2c,\n        socketPath,\n        timeout: connectTimeout,\n        ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n        ...connect\n      })\n    } else if (socketPath != null) {\n      const customConnect = connect\n      connect = (opts, callback) => customConnect({ ...opts, socketPath }, callback)\n    }\n\n    this[kUrl] = util.parseOrigin(url)\n    this[kConnector] = connect\n    this[kPipelining] = pipelining != null ? pipelining : 1\n    this[kMaxHeadersSize] = maxHeaderSize\n    this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout\n    this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout\n    this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold\n    this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]\n    this[kServerName] = null\n    this[kLocalAddress] = localAddress != null ? localAddress : null\n    this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming\n    this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming\n    this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\\r\\n`\n    this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3\n    this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3\n    this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength\n    this[kMaxRequests] = maxRequestsPerClient\n    this[kClosedResolve] = null\n    this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1\n    this[kHTTPContext] = null\n    // h2\n    this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server\n    // HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:\n    // - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)\n    //   Allows more data to be sent before requiring acknowledgment, improving throughput\n    //   especially on high-latency networks. This matches common production HTTP/2 servers.\n    // - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)\n    //   Provides better flow control for the entire connection across multiple streams.\n    this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144\n    this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288\n    this[kPingInterval] = pingInterval != null ? pingInterval : 60e3 // Default ping interval for h2 - 1 minute\n\n    // kQueue is built up of 3 sections separated by\n    // the kRunningIdx and kPendingIdx indices.\n    // |   complete   |   running   |   pending   |\n    //                ^ kRunningIdx ^ kPendingIdx ^ kQueue.length\n    // kRunningIdx points to the first running element.\n    // kPendingIdx points to the first pending element.\n    // This implements a fast queue with an amortized\n    // time of O(1).\n\n    this[kQueue] = []\n    this[kRunningIdx] = 0\n    this[kPendingIdx] = 0\n\n    this[kResume] = (sync) => resume(this, sync)\n    this[kOnError] = (err) => onError(this, err)\n  }\n\n  get pipelining () {\n    return this[kPipelining]\n  }\n\n  set pipelining (value) {\n    this[kPipelining] = value\n    this[kResume](true)\n  }\n\n  get stats () {\n    return new ClientStats(this)\n  }\n\n  get [kPending] () {\n    return this[kQueue].length - this[kPendingIdx]\n  }\n\n  get [kRunning] () {\n    return this[kPendingIdx] - this[kRunningIdx]\n  }\n\n  get [kSize] () {\n    return this[kQueue].length - this[kRunningIdx]\n  }\n\n  get [kConnected] () {\n    return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed\n  }\n\n  get [kBusy] () {\n    return Boolean(\n      this[kHTTPContext]?.busy(null) ||\n      (this[kSize] >= (getPipelining(this) || 1)) ||\n      this[kPending] > 0\n    )\n  }\n\n  [kConnect] (cb) {\n    connect(this)\n    this.once('connect', cb)\n  }\n\n  [kDispatch] (opts, handler) {\n    const request = new Request(this[kUrl].origin, opts, handler)\n\n    this[kQueue].push(request)\n    if (this[kResuming]) {\n      // Do nothing.\n    } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {\n      // Wait a tick in case stream/iterator is ended in the same tick.\n      this[kResuming] = 1\n      queueMicrotask(() => resume(this))\n    } else {\n      this[kResume](true)\n    }\n\n    if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {\n      this[kNeedDrain] = 2\n    }\n\n    return this[kNeedDrain] < 2\n  }\n\n  [kClose] () {\n    // TODO: for H2 we need to gracefully flush the remaining enqueued\n    // request and close each stream.\n    return new Promise((resolve) => {\n      if (this[kSize]) {\n        this[kClosedResolve] = resolve\n      } else {\n        resolve(null)\n      }\n    })\n  }\n\n  [kDestroy] (err) {\n    return new Promise((resolve) => {\n      const requests = this[kQueue].splice(this[kPendingIdx])\n      for (let i = 0; i < requests.length; i++) {\n        const request = requests[i]\n        util.errorRequest(this, request, err)\n      }\n\n      const callback = () => {\n        if (this[kClosedResolve]) {\n          // TODO (fix): Should we error here with ClientDestroyedError?\n          this[kClosedResolve]()\n          this[kClosedResolve] = null\n        }\n        resolve(null)\n      }\n\n      if (this[kHTTPContext]) {\n        this[kHTTPContext].destroy(err, callback)\n        this[kHTTPContext] = null\n      } else {\n        queueMicrotask(callback)\n      }\n\n      this[kResume]()\n    })\n  }\n}\n\nfunction onError (client, err) {\n  if (\n    client[kRunning] === 0 &&\n    err.code !== 'UND_ERR_INFO' &&\n    err.code !== 'UND_ERR_SOCKET'\n  ) {\n    // Error is not caused by running request and not a recoverable\n    // socket error.\n\n    assert(client[kPendingIdx] === client[kRunningIdx])\n\n    const requests = client[kQueue].splice(client[kRunningIdx])\n\n    for (let i = 0; i < requests.length; i++) {\n      const request = requests[i]\n      util.errorRequest(client, request, err)\n    }\n    assert(client[kSize] === 0)\n  }\n}\n\n/**\n * @param {Client} client\n * @returns {void}\n */\nfunction connect (client) {\n  assert(!client[kConnecting])\n  assert(!client[kHTTPContext])\n\n  let { host, hostname, protocol, port } = client[kUrl]\n\n  // Resolve ipv6\n  if (hostname[0] === '[') {\n    const idx = hostname.indexOf(']')\n\n    assert(idx !== -1)\n    const ip = hostname.substring(1, idx)\n\n    assert(net.isIPv6(ip))\n    hostname = ip\n  }\n\n  client[kConnecting] = true\n\n  if (channels.beforeConnect.hasSubscribers) {\n    channels.beforeConnect.publish({\n      connectParams: {\n        host,\n        hostname,\n        protocol,\n        port,\n        version: client[kHTTPContext]?.version,\n        servername: client[kServerName],\n        localAddress: client[kLocalAddress]\n      },\n      connector: client[kConnector]\n    })\n  }\n\n  try {\n    client[kConnector]({\n      host,\n      hostname,\n      protocol,\n      port,\n      servername: client[kServerName],\n      localAddress: client[kLocalAddress]\n    }, (err, socket) => {\n      if (err) {\n        handleConnectError(client, err, { host, hostname, protocol, port })\n        client[kResume]()\n        return\n      }\n\n      if (client.destroyed) {\n        util.destroy(socket.on('error', noop), new ClientDestroyedError())\n        client[kResume]()\n        return\n      }\n\n      assert(socket)\n\n      try {\n        client[kHTTPContext] = socket.alpnProtocol === 'h2'\n          ? connectH2(client, socket)\n          : connectH1(client, socket)\n      } catch (err) {\n        socket.destroy().on('error', noop)\n        handleConnectError(client, err, { host, hostname, protocol, port })\n        client[kResume]()\n        return\n      }\n\n      client[kConnecting] = false\n\n      socket[kCounter] = 0\n      socket[kMaxRequests] = client[kMaxRequests]\n      socket[kClient] = client\n      socket[kError] = null\n\n      if (channels.connected.hasSubscribers) {\n        channels.connected.publish({\n          connectParams: {\n            host,\n            hostname,\n            protocol,\n            port,\n            version: client[kHTTPContext]?.version,\n            servername: client[kServerName],\n            localAddress: client[kLocalAddress]\n          },\n          connector: client[kConnector],\n          socket\n        })\n      }\n\n      client.emit('connect', client[kUrl], [client])\n      client[kResume]()\n    })\n  } catch (err) {\n    handleConnectError(client, err, { host, hostname, protocol, port })\n    client[kResume]()\n  }\n}\n\nfunction handleConnectError (client, err, { host, hostname, protocol, port }) {\n  if (client.destroyed) {\n    return\n  }\n\n  client[kConnecting] = false\n\n  if (channels.connectError.hasSubscribers) {\n    channels.connectError.publish({\n      connectParams: {\n        host,\n        hostname,\n        protocol,\n        port,\n        version: client[kHTTPContext]?.version,\n        servername: client[kServerName],\n        localAddress: client[kLocalAddress]\n      },\n      connector: client[kConnector],\n      error: err\n    })\n  }\n\n  if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n    assert(client[kRunning] === 0)\n    while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {\n      const request = client[kQueue][client[kPendingIdx]++]\n      util.errorRequest(client, request, err)\n    }\n  } else {\n    onError(client, err)\n  }\n\n  client.emit('connectionError', client[kUrl], [client], err)\n}\n\nfunction emitDrain (client) {\n  client[kNeedDrain] = 0\n  client.emit('drain', client[kUrl], [client])\n}\n\nfunction resume (client, sync) {\n  if (client[kResuming] === 2) {\n    return\n  }\n\n  client[kResuming] = 2\n\n  _resume(client, sync)\n  client[kResuming] = 0\n\n  if (client[kRunningIdx] > 256) {\n    client[kQueue].splice(0, client[kRunningIdx])\n    client[kPendingIdx] -= client[kRunningIdx]\n    client[kRunningIdx] = 0\n  }\n}\n\nfunction _resume (client, sync) {\n  while (true) {\n    if (client.destroyed) {\n      assert(client[kPending] === 0)\n      return\n    }\n\n    if (client[kClosedResolve] && !client[kSize]) {\n      client[kClosedResolve]()\n      client[kClosedResolve] = null\n      return\n    }\n\n    if (client[kHTTPContext]) {\n      client[kHTTPContext].resume()\n    }\n\n    if (client[kBusy]) {\n      client[kNeedDrain] = 2\n    } else if (client[kNeedDrain] === 2) {\n      if (sync) {\n        client[kNeedDrain] = 1\n        queueMicrotask(() => emitDrain(client))\n      } else {\n        emitDrain(client)\n      }\n      continue\n    }\n\n    if (client[kPending] === 0) {\n      return\n    }\n\n    if (client[kRunning] >= (getPipelining(client) || 1)) {\n      return\n    }\n\n    const request = client[kQueue][client[kPendingIdx]]\n\n    if (request === null) {\n      return\n    }\n\n    if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {\n      if (client[kRunning] > 0) {\n        return\n      }\n\n      client[kServerName] = request.servername\n      client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => {\n        client[kHTTPContext] = null\n        resume(client)\n      })\n    }\n\n    if (client[kConnecting]) {\n      return\n    }\n\n    if (!client[kHTTPContext]) {\n      connect(client)\n      return\n    }\n\n    if (client[kHTTPContext].destroyed) {\n      return\n    }\n\n    if (client[kHTTPContext].busy(request)) {\n      return\n    }\n\n    if (!request.aborted && client[kHTTPContext].write(request)) {\n      client[kPendingIdx]++\n    } else {\n      client[kQueue].splice(client[kPendingIdx], 1)\n    }\n  }\n}\n\nmodule.exports = Client\n","'use strict'\n\n// Extracted from node/lib/internal/fixed_queue.js\n\n// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.\nconst kSize = 2048\nconst kMask = kSize - 1\n\n// The FixedQueue is implemented as a singly-linked list of fixed-size\n// circular buffers. It looks something like this:\n//\n//  head                                                       tail\n//    |                                                          |\n//    v                                                          v\n// +-----------+ <-----\\       +-----------+ <------\\         +-----------+\n// |  [null]   |        \\----- |   next    |         \\------- |   next    |\n// +-----------+               +-----------+                  +-----------+\n// |   item    | <-- bottom    |   item    | <-- bottom       | undefined |\n// |   item    |               |   item    |                  | undefined |\n// |   item    |               |   item    |                  | undefined |\n// |   item    |               |   item    |                  | undefined |\n// |   item    |               |   item    |       bottom --> |   item    |\n// |   item    |               |   item    |                  |   item    |\n// |    ...    |               |    ...    |                  |    ...    |\n// |   item    |               |   item    |                  |   item    |\n// |   item    |               |   item    |                  |   item    |\n// | undefined | <-- top       |   item    |                  |   item    |\n// | undefined |               |   item    |                  |   item    |\n// | undefined |               | undefined | <-- top  top --> | undefined |\n// +-----------+               +-----------+                  +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n//  head   tail                                 head   tail\n//    |     |                                     |     |\n//    v     v                                     v     v\n// +-----------+                               +-----------+\n// |  [null]   |                               |  [null]   |\n// +-----------+                               +-----------+\n// | undefined |                               |   item    |\n// | undefined |                               |   item    |\n// |   item    | <-- bottom            top --> | undefined |\n// |   item    |                               | undefined |\n// | undefined | <-- top            bottom --> |   item    |\n// | undefined |                               |   item    |\n// +-----------+                               +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\n/**\n * @type {FixedCircularBuffer}\n * @template T\n */\nclass FixedCircularBuffer {\n  /** @type {number} */\n  bottom = 0\n  /** @type {number} */\n  top = 0\n  /** @type {Array<T|undefined>} */\n  list = new Array(kSize).fill(undefined)\n  /** @type {T|null} */\n  next = null\n\n  /** @returns {boolean} */\n  isEmpty () {\n    return this.top === this.bottom\n  }\n\n  /** @returns {boolean} */\n  isFull () {\n    return ((this.top + 1) & kMask) === this.bottom\n  }\n\n  /**\n   * @param {T} data\n   * @returns {void}\n   */\n  push (data) {\n    this.list[this.top] = data\n    this.top = (this.top + 1) & kMask\n  }\n\n  /** @returns {T|null} */\n  shift () {\n    const nextItem = this.list[this.bottom]\n    if (nextItem === undefined) { return null }\n    this.list[this.bottom] = undefined\n    this.bottom = (this.bottom + 1) & kMask\n    return nextItem\n  }\n}\n\n/**\n * @template T\n */\nmodule.exports = class FixedQueue {\n  constructor () {\n    /** @type {FixedCircularBuffer<T>} */\n    this.head = this.tail = new FixedCircularBuffer()\n  }\n\n  /** @returns {boolean} */\n  isEmpty () {\n    return this.head.isEmpty()\n  }\n\n  /** @param {T} data */\n  push (data) {\n    if (this.head.isFull()) {\n      // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n      // and sets it as the new main queue.\n      this.head = this.head.next = new FixedCircularBuffer()\n    }\n    this.head.push(data)\n  }\n\n  /** @returns {T|null} */\n  shift () {\n    const tail = this.tail\n    const next = tail.shift()\n    if (tail.isEmpty() && tail.next !== null) {\n      // If there is another queue, it forms the new tail.\n      this.tail = tail.next\n      tail.next = null\n    }\n    return next\n  }\n}\n","'use strict'\n\nconst { PoolStats } = require('../util/stats.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('../core/symbols')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\n\nclass PoolBase extends DispatcherBase {\n  [kQueue] = new FixedQueue();\n\n  [kQueued] = 0;\n\n  [kClients] = [];\n\n  [kNeedDrain] = false;\n\n  [kOnDrain] (client, origin, targets) {\n    const queue = this[kQueue]\n\n    let needDrain = false\n\n    while (!needDrain) {\n      const item = queue.shift()\n      if (!item) {\n        break\n      }\n      this[kQueued]--\n      needDrain = !client.dispatch(item.opts, item.handler)\n    }\n\n    client[kNeedDrain] = needDrain\n\n    if (!needDrain && this[kNeedDrain]) {\n      this[kNeedDrain] = false\n      this.emit('drain', origin, [this, ...targets])\n    }\n\n    if (this[kClosedResolve] && queue.isEmpty()) {\n      const closeAll = []\n      for (let i = 0; i < this[kClients].length; i++) {\n        const client = this[kClients][i]\n        if (!client.destroyed) {\n          closeAll.push(client.close())\n        }\n      }\n      return Promise.all(closeAll)\n        .then(this[kClosedResolve])\n    }\n  }\n\n  [kOnConnect] = (origin, targets) => {\n    this.emit('connect', origin, [this, ...targets])\n  };\n\n  [kOnDisconnect] = (origin, targets, err) => {\n    this.emit('disconnect', origin, [this, ...targets], err)\n  };\n\n  [kOnConnectionError] = (origin, targets, err) => {\n    this.emit('connectionError', origin, [this, ...targets], err)\n  }\n\n  get [kBusy] () {\n    return this[kNeedDrain]\n  }\n\n  get [kConnected] () {\n    let ret = 0\n    for (const { [kConnected]: connected } of this[kClients]) {\n      ret += connected\n    }\n    return ret\n  }\n\n  get [kFree] () {\n    let ret = 0\n    for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {\n      ret += connected && !needDrain\n    }\n    return ret\n  }\n\n  get [kPending] () {\n    let ret = this[kQueued]\n    for (const { [kPending]: pending } of this[kClients]) {\n      ret += pending\n    }\n    return ret\n  }\n\n  get [kRunning] () {\n    let ret = 0\n    for (const { [kRunning]: running } of this[kClients]) {\n      ret += running\n    }\n    return ret\n  }\n\n  get [kSize] () {\n    let ret = this[kQueued]\n    for (const { [kSize]: size } of this[kClients]) {\n      ret += size\n    }\n    return ret\n  }\n\n  get stats () {\n    return new PoolStats(this)\n  }\n\n  [kClose] () {\n    if (this[kQueue].isEmpty()) {\n      const closeAll = []\n      for (let i = 0; i < this[kClients].length; i++) {\n        const client = this[kClients][i]\n        if (!client.destroyed) {\n          closeAll.push(client.close())\n        }\n      }\n      return Promise.all(closeAll)\n    } else {\n      return new Promise((resolve) => {\n        this[kClosedResolve] = resolve\n      })\n    }\n  }\n\n  [kDestroy] (err) {\n    while (true) {\n      const item = this[kQueue].shift()\n      if (!item) {\n        break\n      }\n      item.handler.onError(err)\n    }\n\n    const destroyAll = new Array(this[kClients].length)\n    for (let i = 0; i < this[kClients].length; i++) {\n      destroyAll[i] = this[kClients][i].destroy(err)\n    }\n    return Promise.all(destroyAll)\n  }\n\n  [kDispatch] (opts, handler) {\n    const dispatcher = this[kGetDispatcher]()\n\n    if (!dispatcher) {\n      this[kNeedDrain] = true\n      this[kQueue].push({ opts, handler })\n      this[kQueued]++\n    } else if (!dispatcher.dispatch(opts, handler)) {\n      dispatcher[kNeedDrain] = true\n      this[kNeedDrain] = !this[kGetDispatcher]()\n    }\n\n    return !this[kNeedDrain]\n  }\n\n  [kAddClient] (client) {\n    client\n      .on('drain', this[kOnDrain].bind(this, client))\n      .on('connect', this[kOnConnect])\n      .on('disconnect', this[kOnDisconnect])\n      .on('connectionError', this[kOnConnectionError])\n\n    this[kClients].push(client)\n\n    if (this[kNeedDrain]) {\n      queueMicrotask(() => {\n        if (this[kNeedDrain]) {\n          this[kOnDrain](client, client[kUrl], [client, this])\n        }\n      })\n    }\n\n    return this\n  }\n\n  [kRemoveClient] (client) {\n    client.close(() => {\n      const idx = this[kClients].indexOf(client)\n      if (idx !== -1) {\n        this[kClients].splice(idx, 1)\n      }\n    })\n\n    this[kNeedDrain] = this[kClients].some(dispatcher => (\n      !dispatcher[kNeedDrain] &&\n      dispatcher.closed !== true &&\n      dispatcher.destroyed !== true\n    ))\n  }\n}\n\nmodule.exports = {\n  PoolBase,\n  kClients,\n  kNeedDrain,\n  kAddClient,\n  kRemoveClient,\n  kGetDispatcher\n}\n","'use strict'\n\nconst {\n  PoolBase,\n  kClients,\n  kNeedDrain,\n  kAddClient,\n  kGetDispatcher,\n  kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n  InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n  return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n  constructor (origin, {\n    connections,\n    factory = defaultFactory,\n    connect,\n    connectTimeout,\n    tls,\n    maxCachedSessions,\n    socketPath,\n    autoSelectFamily,\n    autoSelectFamilyAttemptTimeout,\n    allowH2,\n    clientTtl,\n    ...options\n  } = {}) {\n    if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n      throw new InvalidArgumentError('invalid connections')\n    }\n\n    if (typeof factory !== 'function') {\n      throw new InvalidArgumentError('factory must be a function.')\n    }\n\n    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n      throw new InvalidArgumentError('connect must be a function or an object')\n    }\n\n    if (typeof connect !== 'function') {\n      connect = buildConnector({\n        ...tls,\n        maxCachedSessions,\n        allowH2,\n        socketPath,\n        timeout: connectTimeout,\n        ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n        ...connect\n      })\n    }\n\n    super()\n\n    this[kConnections] = connections || null\n    this[kUrl] = util.parseOrigin(origin)\n    this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n    this[kOptions].interceptors = options.interceptors\n      ? { ...options.interceptors }\n      : undefined\n    this[kFactory] = factory\n\n    this.on('connect', (origin, targets) => {\n      if (clientTtl != null && clientTtl > 0) {\n        for (const target of targets) {\n          Object.assign(target, { ttl: Date.now() })\n        }\n      }\n    })\n\n    this.on('connectionError', (origin, targets, error) => {\n      // If a connection error occurs, we remove the client from the pool,\n      // and emit a connectionError event. They will not be re-used.\n      // Fixes https://github.com/nodejs/undici/issues/3895\n      for (const target of targets) {\n        // Do not use kRemoveClient here, as it will close the client,\n        // but the client cannot be closed in this state.\n        const idx = this[kClients].indexOf(target)\n        if (idx !== -1) {\n          this[kClients].splice(idx, 1)\n        }\n      }\n    })\n  }\n\n  [kGetDispatcher] () {\n    const clientTtlOption = this[kOptions].clientTtl\n    for (const client of this[kClients]) {\n      // check ttl of client and if it's stale, remove it from the pool\n      if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n        this[kRemoveClient](client)\n      } else if (!client[kNeedDrain]) {\n        return client\n      }\n    }\n\n    if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n      const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n      this[kAddClient](dispatcher)\n      return dispatcher\n    }\n  }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst {\n  BalancedPoolMissingUpstreamError,\n  InvalidArgumentError\n} = require('../core/errors')\nconst {\n  PoolBase,\n  kClients,\n  kNeedDrain,\n  kAddClient,\n  kRemoveClient,\n  kGetDispatcher\n} = require('./pool-base')\nconst Pool = require('./pool')\nconst { kUrl } = require('../core/symbols')\nconst util = require('../core/util')\nconst kFactory = Symbol('factory')\n\nconst kOptions = Symbol('options')\nconst kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor')\nconst kCurrentWeight = Symbol('kCurrentWeight')\nconst kIndex = Symbol('kIndex')\nconst kWeight = Symbol('kWeight')\nconst kMaxWeightPerServer = Symbol('kMaxWeightPerServer')\nconst kErrorPenalty = Symbol('kErrorPenalty')\n\n/**\n * Calculate the greatest common divisor of two numbers by\n * using the Euclidean algorithm.\n *\n * @param {number} a\n * @param {number} b\n * @returns {number}\n */\nfunction getGreatestCommonDivisor (a, b) {\n  if (a === 0) return b\n\n  while (b !== 0) {\n    const t = b\n    b = a % b\n    a = t\n  }\n  return a\n}\n\nfunction defaultFactory (origin, opts) {\n  return new Pool(origin, opts)\n}\n\nclass BalancedPool extends PoolBase {\n  constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {\n    if (typeof factory !== 'function') {\n      throw new InvalidArgumentError('factory must be a function.')\n    }\n\n    super()\n\n    this[kOptions] = { ...util.deepClone(opts) }\n    this[kOptions].interceptors = opts.interceptors\n      ? { ...opts.interceptors }\n      : undefined\n    this[kIndex] = -1\n    this[kCurrentWeight] = 0\n\n    this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100\n    this[kErrorPenalty] = this[kOptions].errorPenalty || 15\n\n    if (!Array.isArray(upstreams)) {\n      upstreams = [upstreams]\n    }\n\n    this[kFactory] = factory\n\n    for (const upstream of upstreams) {\n      this.addUpstream(upstream)\n    }\n    this._updateBalancedPoolStats()\n  }\n\n  addUpstream (upstream) {\n    const upstreamOrigin = util.parseOrigin(upstream).origin\n\n    if (this[kClients].find((pool) => (\n      pool[kUrl].origin === upstreamOrigin &&\n      pool.closed !== true &&\n      pool.destroyed !== true\n    ))) {\n      return this\n    }\n    const pool = this[kFactory](upstreamOrigin, this[kOptions])\n\n    this[kAddClient](pool)\n    pool.on('connect', () => {\n      pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty])\n    })\n\n    pool.on('connectionError', () => {\n      pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n      this._updateBalancedPoolStats()\n    })\n\n    pool.on('disconnect', (...args) => {\n      const err = args[2]\n      if (err && err.code === 'UND_ERR_SOCKET') {\n        // decrease the weight of the pool.\n        pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n        this._updateBalancedPoolStats()\n      }\n    })\n\n    for (const client of this[kClients]) {\n      client[kWeight] = this[kMaxWeightPerServer]\n    }\n\n    this._updateBalancedPoolStats()\n\n    return this\n  }\n\n  _updateBalancedPoolStats () {\n    let result = 0\n    for (let i = 0; i < this[kClients].length; i++) {\n      result = getGreatestCommonDivisor(this[kClients][i][kWeight], result)\n    }\n\n    this[kGreatestCommonDivisor] = result\n  }\n\n  removeUpstream (upstream) {\n    const upstreamOrigin = util.parseOrigin(upstream).origin\n\n    const pool = this[kClients].find((pool) => (\n      pool[kUrl].origin === upstreamOrigin &&\n      pool.closed !== true &&\n      pool.destroyed !== true\n    ))\n\n    if (pool) {\n      this[kRemoveClient](pool)\n    }\n\n    return this\n  }\n\n  getUpstream (upstream) {\n    const upstreamOrigin = util.parseOrigin(upstream).origin\n\n    return this[kClients].find((pool) => (\n      pool[kUrl].origin === upstreamOrigin &&\n      pool.closed !== true &&\n      pool.destroyed !== true\n    ))\n  }\n\n  get upstreams () {\n    return this[kClients]\n      .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)\n      .map((p) => p[kUrl].origin)\n  }\n\n  [kGetDispatcher] () {\n    // We validate that pools is greater than 0,\n    // otherwise we would have to wait until an upstream\n    // is added, which might never happen.\n    if (this[kClients].length === 0) {\n      throw new BalancedPoolMissingUpstreamError()\n    }\n\n    const dispatcher = this[kClients].find(dispatcher => (\n      !dispatcher[kNeedDrain] &&\n      dispatcher.closed !== true &&\n      dispatcher.destroyed !== true\n    ))\n\n    if (!dispatcher) {\n      return\n    }\n\n    const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true)\n\n    if (allClientsBusy) {\n      return\n    }\n\n    let counter = 0\n\n    let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain])\n\n    while (counter++ < this[kClients].length) {\n      this[kIndex] = (this[kIndex] + 1) % this[kClients].length\n      const pool = this[kClients][this[kIndex]]\n\n      // find pool index with the largest weight\n      if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {\n        maxWeightIndex = this[kIndex]\n      }\n\n      // decrease the current weight every `this[kClients].length`.\n      if (this[kIndex] === 0) {\n        // Set the current weight to the next lower weight.\n        this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]\n\n        if (this[kCurrentWeight] <= 0) {\n          this[kCurrentWeight] = this[kMaxWeightPerServer]\n        }\n      }\n      if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {\n        return pool\n      }\n    }\n\n    this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]\n    this[kIndex] = maxWeightIndex\n    return this[kClients][maxWeightIndex]\n  }\n}\n\nmodule.exports = BalancedPool\n","'use strict'\n\nconst {\n  PoolBase,\n  kClients,\n  kNeedDrain,\n  kAddClient,\n  kGetDispatcher,\n  kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n  InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\nconst kIndex = Symbol('index')\n\nfunction defaultFactory (origin, opts) {\n  return new Client(origin, opts)\n}\n\nclass RoundRobinPool extends PoolBase {\n  constructor (origin, {\n    connections,\n    factory = defaultFactory,\n    connect,\n    connectTimeout,\n    tls,\n    maxCachedSessions,\n    socketPath,\n    autoSelectFamily,\n    autoSelectFamilyAttemptTimeout,\n    allowH2,\n    clientTtl,\n    ...options\n  } = {}) {\n    if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n      throw new InvalidArgumentError('invalid connections')\n    }\n\n    if (typeof factory !== 'function') {\n      throw new InvalidArgumentError('factory must be a function.')\n    }\n\n    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n      throw new InvalidArgumentError('connect must be a function or an object')\n    }\n\n    if (typeof connect !== 'function') {\n      connect = buildConnector({\n        ...tls,\n        maxCachedSessions,\n        allowH2,\n        socketPath,\n        timeout: connectTimeout,\n        ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n        ...connect\n      })\n    }\n\n    super()\n\n    this[kConnections] = connections || null\n    this[kUrl] = util.parseOrigin(origin)\n    this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n    this[kOptions].interceptors = options.interceptors\n      ? { ...options.interceptors }\n      : undefined\n    this[kFactory] = factory\n    this[kIndex] = -1\n\n    this.on('connect', (origin, targets) => {\n      if (clientTtl != null && clientTtl > 0) {\n        for (const target of targets) {\n          Object.assign(target, { ttl: Date.now() })\n        }\n      }\n    })\n\n    this.on('connectionError', (origin, targets, error) => {\n      for (const target of targets) {\n        const idx = this[kClients].indexOf(target)\n        if (idx !== -1) {\n          this[kClients].splice(idx, 1)\n        }\n      }\n    })\n  }\n\n  [kGetDispatcher] () {\n    const clientTtlOption = this[kOptions].clientTtl\n    const clientsLength = this[kClients].length\n\n    // If we have no clients yet, create one\n    if (clientsLength === 0) {\n      const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n      this[kAddClient](dispatcher)\n      return dispatcher\n    }\n\n    // Round-robin through existing clients\n    let checked = 0\n    while (checked < clientsLength) {\n      this[kIndex] = (this[kIndex] + 1) % clientsLength\n      const client = this[kClients][this[kIndex]]\n\n      // Check if client is stale (TTL expired)\n      if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n        this[kRemoveClient](client)\n        checked++\n        continue\n      }\n\n      // Return client if it's not draining\n      if (!client[kNeedDrain]) {\n        return client\n      }\n\n      checked++\n    }\n\n    // All clients are busy, create a new one if we haven't reached the limit\n    if (!this[kConnections] || clientsLength < this[kConnections]) {\n      const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n      this[kAddClient](dispatcher)\n      return dispatcher\n    }\n  }\n}\n\nmodule.exports = RoundRobinPool\n","'use strict'\n\nconst { InvalidArgumentError, MaxOriginsReachedError } = require('../core/errors')\nconst { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = require('../core/symbols')\nconst DispatcherBase = require('./dispatcher-base')\nconst Pool = require('./pool')\nconst Client = require('./client')\nconst util = require('../core/util')\n\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kOnDrain = Symbol('onDrain')\nconst kFactory = Symbol('factory')\nconst kOptions = Symbol('options')\nconst kOrigins = Symbol('origins')\n\nfunction defaultFactory (origin, opts) {\n  return opts && opts.connections === 1\n    ? new Client(origin, opts)\n    : new Pool(origin, opts)\n}\n\nclass Agent extends DispatcherBase {\n  constructor ({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {\n    if (typeof factory !== 'function') {\n      throw new InvalidArgumentError('factory must be a function.')\n    }\n\n    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n      throw new InvalidArgumentError('connect must be a function or an object')\n    }\n\n    if (typeof maxOrigins !== 'number' || Number.isNaN(maxOrigins) || maxOrigins <= 0) {\n      throw new InvalidArgumentError('maxOrigins must be a number greater than 0')\n    }\n\n    super()\n\n    if (connect && typeof connect !== 'function') {\n      connect = { ...connect }\n    }\n\n    this[kOptions] = { ...util.deepClone(options), maxOrigins, connect }\n    this[kFactory] = factory\n    this[kClients] = new Map()\n    this[kOrigins] = new Set()\n\n    this[kOnDrain] = (origin, targets) => {\n      this.emit('drain', origin, [this, ...targets])\n    }\n\n    this[kOnConnect] = (origin, targets) => {\n      this.emit('connect', origin, [this, ...targets])\n    }\n\n    this[kOnDisconnect] = (origin, targets, err) => {\n      this.emit('disconnect', origin, [this, ...targets], err)\n    }\n\n    this[kOnConnectionError] = (origin, targets, err) => {\n      this.emit('connectionError', origin, [this, ...targets], err)\n    }\n  }\n\n  get [kRunning] () {\n    let ret = 0\n    for (const { dispatcher } of this[kClients].values()) {\n      ret += dispatcher[kRunning]\n    }\n    return ret\n  }\n\n  [kDispatch] (opts, handler) {\n    let key\n    if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {\n      key = String(opts.origin)\n    } else {\n      throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')\n    }\n\n    if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(key)) {\n      throw new MaxOriginsReachedError()\n    }\n\n    const result = this[kClients].get(key)\n    let dispatcher = result && result.dispatcher\n    if (!dispatcher) {\n      const closeClientIfUnused = (connected) => {\n        const result = this[kClients].get(key)\n        if (result) {\n          if (connected) result.count -= 1\n          if (result.count <= 0) {\n            this[kClients].delete(key)\n            if (!result.dispatcher.destroyed) {\n              result.dispatcher.close()\n            }\n          }\n          this[kOrigins].delete(key)\n        }\n      }\n      dispatcher = this[kFactory](opts.origin, this[kOptions])\n        .on('drain', this[kOnDrain])\n        .on('connect', (origin, targets) => {\n          const result = this[kClients].get(key)\n          if (result) {\n            result.count += 1\n          }\n          this[kOnConnect](origin, targets)\n        })\n        .on('disconnect', (origin, targets, err) => {\n          closeClientIfUnused(true)\n          this[kOnDisconnect](origin, targets, err)\n        })\n        .on('connectionError', (origin, targets, err) => {\n          closeClientIfUnused(false)\n          this[kOnConnectionError](origin, targets, err)\n        })\n\n      this[kClients].set(key, { count: 0, dispatcher })\n      this[kOrigins].add(key)\n    }\n\n    return dispatcher.dispatch(opts, handler)\n  }\n\n  [kClose] () {\n    const closePromises = []\n    for (const { dispatcher } of this[kClients].values()) {\n      closePromises.push(dispatcher.close())\n    }\n    this[kClients].clear()\n\n    return Promise.all(closePromises)\n  }\n\n  [kDestroy] (err) {\n    const destroyPromises = []\n    for (const { dispatcher } of this[kClients].values()) {\n      destroyPromises.push(dispatcher.destroy(err))\n    }\n    this[kClients].clear()\n\n    return Promise.all(destroyPromises)\n  }\n\n  get stats () {\n    const allClientStats = {}\n    for (const { dispatcher } of this[kClients].values()) {\n      if (dispatcher.stats) {\n        allClientStats[dispatcher[kUrl].origin] = dispatcher.stats\n      }\n    }\n    return allClientStats\n  }\n}\n\nmodule.exports = Agent\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\nconst net = require('node:net')\nconst { InvalidArgumentError } = require('./errors')\n\n/**\n * Parse an address and determine its type\n * @param {string} address - The address to parse\n * @returns {{type: number, buffer: Buffer}} Address type and buffer\n */\nfunction parseAddress (address) {\n  // Check if it's an IPv4 address\n  if (net.isIPv4(address)) {\n    const parts = address.split('.').map(Number)\n    return {\n      type: 0x01, // IPv4\n      buffer: Buffer.from(parts)\n    }\n  }\n\n  // Check if it's an IPv6 address\n  if (net.isIPv6(address)) {\n    return {\n      type: 0x04, // IPv6\n      buffer: parseIPv6(address)\n    }\n  }\n\n  // Otherwise, treat as domain name\n  const domainBuffer = Buffer.from(address, 'utf8')\n  if (domainBuffer.length > 255) {\n    throw new InvalidArgumentError('Domain name too long (max 255 bytes)')\n  }\n\n  return {\n    type: 0x03, // Domain\n    buffer: Buffer.concat([Buffer.from([domainBuffer.length]), domainBuffer])\n  }\n}\n\n/**\n * Parse IPv6 address to buffer\n * @param {string} address - IPv6 address string\n * @returns {Buffer} 16-byte buffer\n */\nfunction parseIPv6 (address) {\n  const buffer = Buffer.alloc(16)\n  const parts = address.split(':')\n  let partIndex = 0\n  let bufferIndex = 0\n\n  // Handle compressed notation (::)\n  const doubleColonIndex = address.indexOf('::')\n  if (doubleColonIndex !== -1) {\n    // Count non-empty parts\n    const nonEmptyParts = parts.filter(p => p.length > 0).length\n    const skipParts = 8 - nonEmptyParts\n\n    for (let i = 0; i < parts.length; i++) {\n      if (parts[i] === '' && i === doubleColonIndex / 3) {\n        // Skip empty parts for ::\n        bufferIndex += skipParts * 2\n      } else if (parts[i] !== '') {\n        const value = parseInt(parts[i], 16)\n        buffer.writeUInt16BE(value, bufferIndex)\n        bufferIndex += 2\n      }\n    }\n  } else {\n    // No compression, parse normally\n    for (const part of parts) {\n      if (part === '') continue\n      const value = parseInt(part, 16)\n      buffer.writeUInt16BE(value, partIndex * 2)\n      partIndex++\n    }\n  }\n\n  return buffer\n}\n\n/**\n * Build a SOCKS5 address buffer\n * @param {number} type - Address type (1=IPv4, 3=Domain, 4=IPv6)\n * @param {Buffer} addressBuffer - The address data\n * @param {number} port - Port number\n * @returns {Buffer} Complete address buffer including type, address, and port\n */\nfunction buildAddressBuffer (type, addressBuffer, port) {\n  const portBuffer = Buffer.allocUnsafe(2)\n  portBuffer.writeUInt16BE(port, 0)\n\n  return Buffer.concat([\n    Buffer.from([type]),\n    addressBuffer,\n    portBuffer\n  ])\n}\n\n/**\n * Parse address from SOCKS5 response\n * @param {Buffer} buffer - Buffer containing the address\n * @param {number} offset - Starting offset in buffer\n * @returns {{address: string, port: number, bytesRead: number}}\n */\nfunction parseResponseAddress (buffer, offset = 0) {\n  if (buffer.length < offset + 1) {\n    throw new InvalidArgumentError('Buffer too small to contain address type')\n  }\n\n  const addressType = buffer[offset]\n  let address\n  let currentOffset = offset + 1\n\n  switch (addressType) {\n    case 0x01: { // IPv4\n      if (buffer.length < currentOffset + 6) {\n        throw new InvalidArgumentError('Buffer too small for IPv4 address')\n      }\n      address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join('.')\n      currentOffset += 4\n      break\n    }\n\n    case 0x03: { // Domain\n      if (buffer.length < currentOffset + 1) {\n        throw new InvalidArgumentError('Buffer too small for domain length')\n      }\n      const domainLength = buffer[currentOffset]\n      currentOffset += 1\n\n      if (buffer.length < currentOffset + domainLength + 2) {\n        throw new InvalidArgumentError('Buffer too small for domain address')\n      }\n      address = buffer.subarray(currentOffset, currentOffset + domainLength).toString('utf8')\n      currentOffset += domainLength\n      break\n    }\n\n    case 0x04: { // IPv6\n      if (buffer.length < currentOffset + 18) {\n        throw new InvalidArgumentError('Buffer too small for IPv6 address')\n      }\n      // Convert buffer to IPv6 string\n      const parts = []\n      for (let i = 0; i < 8; i++) {\n        const value = buffer.readUInt16BE(currentOffset + i * 2)\n        parts.push(value.toString(16))\n      }\n      address = parts.join(':')\n      currentOffset += 16\n      break\n    }\n\n    default:\n      throw new InvalidArgumentError(`Invalid address type: ${addressType}`)\n  }\n\n  // Parse port\n  if (buffer.length < currentOffset + 2) {\n    throw new InvalidArgumentError('Buffer too small for port')\n  }\n  const port = buffer.readUInt16BE(currentOffset)\n  currentOffset += 2\n\n  return {\n    address,\n    port,\n    bytesRead: currentOffset - offset\n  }\n}\n\n/**\n * Create error for SOCKS5 reply code\n * @param {number} replyCode - SOCKS5 reply code\n * @returns {Error} Appropriate error object\n */\nfunction createReplyError (replyCode) {\n  const messages = {\n    0x01: 'General SOCKS server failure',\n    0x02: 'Connection not allowed by ruleset',\n    0x03: 'Network unreachable',\n    0x04: 'Host unreachable',\n    0x05: 'Connection refused',\n    0x06: 'TTL expired',\n    0x07: 'Command not supported',\n    0x08: 'Address type not supported'\n  }\n\n  const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`\n  const error = new Error(message)\n  error.code = `SOCKS5_${replyCode}`\n  return error\n}\n\nmodule.exports = {\n  parseAddress,\n  parseIPv6,\n  buildAddressBuffer,\n  parseResponseAddress,\n  createReplyError\n}\n","'use strict'\n\nconst { EventEmitter } = require('node:events')\nconst { Buffer } = require('node:buffer')\nconst { InvalidArgumentError, Socks5ProxyError } = require('./errors')\nconst { debuglog } = require('node:util')\nconst { parseAddress } = require('./socks5-utils')\n\nconst debug = debuglog('undici:socks5')\n\n// SOCKS5 constants\nconst SOCKS_VERSION = 0x05\n\n// Authentication methods\nconst AUTH_METHODS = {\n  NO_AUTH: 0x00,\n  GSSAPI: 0x01,\n  USERNAME_PASSWORD: 0x02,\n  NO_ACCEPTABLE: 0xFF\n}\n\n// SOCKS5 commands\nconst COMMANDS = {\n  CONNECT: 0x01,\n  BIND: 0x02,\n  UDP_ASSOCIATE: 0x03\n}\n\n// Address types\nconst ADDRESS_TYPES = {\n  IPV4: 0x01,\n  DOMAIN: 0x03,\n  IPV6: 0x04\n}\n\n// Reply codes\nconst REPLY_CODES = {\n  SUCCEEDED: 0x00,\n  GENERAL_FAILURE: 0x01,\n  CONNECTION_NOT_ALLOWED: 0x02,\n  NETWORK_UNREACHABLE: 0x03,\n  HOST_UNREACHABLE: 0x04,\n  CONNECTION_REFUSED: 0x05,\n  TTL_EXPIRED: 0x06,\n  COMMAND_NOT_SUPPORTED: 0x07,\n  ADDRESS_TYPE_NOT_SUPPORTED: 0x08\n}\n\n// State machine states\nconst STATES = {\n  INITIAL: 'initial',\n  HANDSHAKING: 'handshaking',\n  AUTHENTICATING: 'authenticating',\n  CONNECTING: 'connecting',\n  CONNECTED: 'connected',\n  ERROR: 'error',\n  CLOSED: 'closed'\n}\n\n/**\n * SOCKS5 client implementation\n * Handles SOCKS5 protocol negotiation and connection establishment\n */\nclass Socks5Client extends EventEmitter {\n  constructor (socket, options = {}) {\n    super()\n\n    if (!socket) {\n      throw new InvalidArgumentError('socket is required')\n    }\n\n    this.socket = socket\n    this.options = options\n    this.state = STATES.INITIAL\n    this.buffer = Buffer.alloc(0)\n\n    // Authentication settings\n    this.authMethods = []\n    if (options.username && options.password) {\n      this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD)\n    }\n    this.authMethods.push(AUTH_METHODS.NO_AUTH)\n\n    // Socket event handlers\n    this.socket.on('data', this.onData.bind(this))\n    this.socket.on('error', this.onError.bind(this))\n    this.socket.on('close', this.onClose.bind(this))\n  }\n\n  /**\n   * Handle incoming data from the socket\n   */\n  onData (data) {\n    debug('received data', data.length, 'bytes in state', this.state)\n    this.buffer = Buffer.concat([this.buffer, data])\n\n    try {\n      switch (this.state) {\n        case STATES.HANDSHAKING:\n          this.handleHandshakeResponse()\n          break\n        case STATES.AUTHENTICATING:\n          this.handleAuthResponse()\n          break\n        case STATES.CONNECTING:\n          this.handleConnectResponse()\n          break\n      }\n    } catch (err) {\n      this.onError(err)\n    }\n  }\n\n  /**\n   * Handle socket errors\n   */\n  onError (err) {\n    debug('socket error', err)\n    this.state = STATES.ERROR\n    this.emit('error', err)\n    this.destroy()\n  }\n\n  /**\n   * Handle socket close\n   */\n  onClose () {\n    debug('socket closed')\n    this.state = STATES.CLOSED\n    this.emit('close')\n  }\n\n  /**\n   * Destroy the client and underlying socket\n   */\n  destroy () {\n    if (this.socket && !this.socket.destroyed) {\n      this.socket.destroy()\n    }\n  }\n\n  /**\n   * Start the SOCKS5 handshake\n   */\n  handshake () {\n    if (this.state !== STATES.INITIAL) {\n      throw new InvalidArgumentError('Handshake already started')\n    }\n\n    debug('starting handshake with', this.authMethods.length, 'auth methods')\n    this.state = STATES.HANDSHAKING\n\n    // Build handshake request\n    // +----+----------+----------+\n    // |VER | NMETHODS | METHODS  |\n    // +----+----------+----------+\n    // | 1  |    1     | 1 to 255 |\n    // +----+----------+----------+\n    const request = Buffer.alloc(2 + this.authMethods.length)\n    request[0] = SOCKS_VERSION\n    request[1] = this.authMethods.length\n    this.authMethods.forEach((method, i) => {\n      request[2 + i] = method\n    })\n\n    this.socket.write(request)\n  }\n\n  /**\n   * Handle handshake response from server\n   */\n  handleHandshakeResponse () {\n    if (this.buffer.length < 2) {\n      return // Not enough data yet\n    }\n\n    const version = this.buffer[0]\n    const method = this.buffer[1]\n\n    if (version !== SOCKS_VERSION) {\n      throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, 'UND_ERR_SOCKS5_VERSION')\n    }\n\n    if (method === AUTH_METHODS.NO_ACCEPTABLE) {\n      throw new Socks5ProxyError('No acceptable authentication method', 'UND_ERR_SOCKS5_AUTH_REJECTED')\n    }\n\n    this.buffer = this.buffer.subarray(2)\n    debug('server selected auth method', method)\n\n    if (method === AUTH_METHODS.NO_AUTH) {\n      this.emit('authenticated')\n    } else if (method === AUTH_METHODS.USERNAME_PASSWORD) {\n      this.state = STATES.AUTHENTICATING\n      this.sendAuthRequest()\n    } else {\n      throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, 'UND_ERR_SOCKS5_AUTH_METHOD')\n    }\n  }\n\n  /**\n   * Send username/password authentication request\n   */\n  sendAuthRequest () {\n    const { username, password } = this.options\n\n    if (!username || !password) {\n      throw new InvalidArgumentError('Username and password required for authentication')\n    }\n\n    debug('sending username/password auth')\n\n    // Username/Password authentication request (RFC 1929)\n    // +----+------+----------+------+----------+\n    // |VER | ULEN |  UNAME   | PLEN |  PASSWD  |\n    // +----+------+----------+------+----------+\n    // | 1  |  1   | 1 to 255 |  1   | 1 to 255 |\n    // +----+------+----------+------+----------+\n    const usernameBuffer = Buffer.from(username)\n    const passwordBuffer = Buffer.from(password)\n\n    if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {\n      throw new InvalidArgumentError('Username or password too long')\n    }\n\n    const request = Buffer.alloc(3 + usernameBuffer.length + passwordBuffer.length)\n    request[0] = 0x01 // Sub-negotiation version\n    request[1] = usernameBuffer.length\n    usernameBuffer.copy(request, 2)\n    request[2 + usernameBuffer.length] = passwordBuffer.length\n    passwordBuffer.copy(request, 3 + usernameBuffer.length)\n\n    this.socket.write(request)\n  }\n\n  /**\n   * Handle authentication response\n   */\n  handleAuthResponse () {\n    if (this.buffer.length < 2) {\n      return // Not enough data yet\n    }\n\n    const version = this.buffer[0]\n    const status = this.buffer[1]\n\n    if (version !== 0x01) {\n      throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, 'UND_ERR_SOCKS5_AUTH_VERSION')\n    }\n\n    if (status !== 0x00) {\n      throw new Socks5ProxyError('Authentication failed', 'UND_ERR_SOCKS5_AUTH_FAILED')\n    }\n\n    this.buffer = this.buffer.subarray(2)\n    debug('authentication successful')\n    this.emit('authenticated')\n  }\n\n  /**\n   * Send CONNECT command\n   * @param {string} address - Target address (IP or domain)\n   * @param {number} port - Target port\n   */\n  connect (address, port) {\n    if (this.state === STATES.CONNECTED) {\n      throw new InvalidArgumentError('Already connected')\n    }\n\n    debug('connecting to', address, port)\n    this.state = STATES.CONNECTING\n\n    const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port)\n    this.socket.write(request)\n  }\n\n  /**\n   * Build a SOCKS5 request\n   */\n  buildConnectRequest (command, address, port) {\n    // Parse address to determine type and buffer\n    const { type: addressType, buffer: addressBuffer } = parseAddress(address)\n\n    // Build request\n    // +----+-----+-------+------+----------+----------+\n    // |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |\n    // +----+-----+-------+------+----------+----------+\n    // | 1  |  1  | X'00' |  1   | Variable |    2     |\n    // +----+-----+-------+------+----------+----------+\n    const request = Buffer.alloc(4 + addressBuffer.length + 2)\n    request[0] = SOCKS_VERSION\n    request[1] = command\n    request[2] = 0x00 // Reserved\n    request[3] = addressType\n    addressBuffer.copy(request, 4)\n    request.writeUInt16BE(port, 4 + addressBuffer.length)\n\n    return request\n  }\n\n  /**\n   * Handle CONNECT response\n   */\n  handleConnectResponse () {\n    if (this.buffer.length < 4) {\n      return // Not enough data for header\n    }\n\n    const version = this.buffer[0]\n    const reply = this.buffer[1]\n    const addressType = this.buffer[3]\n\n    if (version !== SOCKS_VERSION) {\n      throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, 'UND_ERR_SOCKS5_REPLY_VERSION')\n    }\n\n    // Calculate the expected response length\n    let responseLength = 4 // VER + REP + RSV + ATYP\n    if (addressType === ADDRESS_TYPES.IPV4) {\n      responseLength += 4 + 2 // IPv4 + port\n    } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n      if (this.buffer.length < 5) {\n        return // Need domain length byte\n      }\n      responseLength += 1 + this.buffer[4] + 2 // length byte + domain + port\n    } else if (addressType === ADDRESS_TYPES.IPV6) {\n      responseLength += 16 + 2 // IPv6 + port\n    } else {\n      throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, 'UND_ERR_SOCKS5_ADDR_TYPE')\n    }\n\n    if (this.buffer.length < responseLength) {\n      return // Not enough data for full response\n    }\n\n    if (reply !== REPLY_CODES.SUCCEEDED) {\n      const errorMessage = this.getReplyErrorMessage(reply)\n      throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`)\n    }\n\n    // Parse bound address and port\n    let boundAddress\n    let offset = 4\n\n    if (addressType === ADDRESS_TYPES.IPV4) {\n      boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join('.')\n      offset += 4\n    } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n      const domainLength = this.buffer[offset]\n      offset += 1\n      boundAddress = this.buffer.subarray(offset, offset + domainLength).toString()\n      offset += domainLength\n    } else if (addressType === ADDRESS_TYPES.IPV6) {\n      // Parse IPv6 address from 16-byte buffer\n      const parts = []\n      for (let i = 0; i < 8; i++) {\n        const value = this.buffer.readUInt16BE(offset + i * 2)\n        parts.push(value.toString(16))\n      }\n      boundAddress = parts.join(':')\n      offset += 16\n    }\n\n    const boundPort = this.buffer.readUInt16BE(offset)\n\n    this.buffer = this.buffer.subarray(responseLength)\n    this.state = STATES.CONNECTED\n\n    debug('connected, bound address:', boundAddress, 'port:', boundPort)\n    this.emit('connected', { address: boundAddress, port: boundPort })\n  }\n\n  /**\n   * Get human-readable error message for reply code\n   */\n  getReplyErrorMessage (reply) {\n    switch (reply) {\n      case REPLY_CODES.GENERAL_FAILURE:\n        return 'General SOCKS server failure'\n      case REPLY_CODES.CONNECTION_NOT_ALLOWED:\n        return 'Connection not allowed by ruleset'\n      case REPLY_CODES.NETWORK_UNREACHABLE:\n        return 'Network unreachable'\n      case REPLY_CODES.HOST_UNREACHABLE:\n        return 'Host unreachable'\n      case REPLY_CODES.CONNECTION_REFUSED:\n        return 'Connection refused'\n      case REPLY_CODES.TTL_EXPIRED:\n        return 'TTL expired'\n      case REPLY_CODES.COMMAND_NOT_SUPPORTED:\n        return 'Command not supported'\n      case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:\n        return 'Address type not supported'\n      default:\n        return `Unknown error code: ${reply}`\n    }\n  }\n}\n\nmodule.exports = {\n  Socks5Client,\n  AUTH_METHODS,\n  COMMANDS,\n  ADDRESS_TYPES,\n  REPLY_CODES,\n  STATES\n}\n","'use strict'\n\nconst net = require('node:net')\nconst { URL } = require('node:url')\n\nlet tls // include tls conditionally since it is not always available\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { Socks5Client } = require('../core/socks5-client')\nconst { kDispatch, kClose, kDestroy } = require('../core/symbols')\nconst Pool = require('./pool')\nconst buildConnector = require('../core/connect')\nconst { debuglog } = require('node:util')\n\nconst debug = debuglog('undici:socks5-proxy')\n\nconst kProxyUrl = Symbol('proxy url')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kProxyAuth = Symbol('proxy auth')\nconst kPool = Symbol('pool')\nconst kConnector = Symbol('connector')\n\n// Static flag to ensure warning is only emitted once per process\nlet experimentalWarningEmitted = false\n\n/**\n * SOCKS5 proxy agent for dispatching requests through a SOCKS5 proxy\n */\nclass Socks5ProxyAgent extends DispatcherBase {\n  constructor (proxyUrl, options = {}) {\n    super()\n\n    // Emit experimental warning only once\n    if (!experimentalWarningEmitted) {\n      process.emitWarning(\n        'SOCKS5 proxy support is experimental and subject to change',\n        'ExperimentalWarning'\n      )\n      experimentalWarningEmitted = true\n    }\n\n    if (!proxyUrl) {\n      throw new InvalidArgumentError('Proxy URL is mandatory')\n    }\n\n    // Parse proxy URL\n    const url = typeof proxyUrl === 'string' ? new URL(proxyUrl) : proxyUrl\n\n    if (url.protocol !== 'socks5:' && url.protocol !== 'socks:') {\n      throw new InvalidArgumentError('Proxy URL must use socks5:// or socks:// protocol')\n    }\n\n    this[kProxyUrl] = url\n    this[kProxyHeaders] = options.headers || {}\n\n    // Extract auth from URL or options\n    this[kProxyAuth] = {\n      username: options.username || (url.username ? decodeURIComponent(url.username) : null),\n      password: options.password || (url.password ? decodeURIComponent(url.password) : null)\n    }\n\n    // Create connector for proxy connection\n    this[kConnector] = options.connect || buildConnector({\n      ...options.proxyTls,\n      servername: options.proxyTls?.servername || url.hostname\n    })\n\n    // Pool for the actual HTTP connections (with SOCKS5 tunnel connect function)\n    this[kPool] = null\n  }\n\n  /**\n   * Create a SOCKS5 connection to the proxy\n   */\n  async createSocks5Connection (targetHost, targetPort) {\n    const proxyHost = this[kProxyUrl].hostname\n    const proxyPort = parseInt(this[kProxyUrl].port) || 1080\n\n    debug('creating SOCKS5 connection to', proxyHost, proxyPort)\n\n    // Connect to the SOCKS5 proxy\n    const socket = await new Promise((resolve, reject) => {\n      const onConnect = () => {\n        socket.removeListener('error', onError)\n        resolve(socket)\n      }\n\n      const onError = (err) => {\n        socket.removeListener('connect', onConnect)\n        reject(err)\n      }\n\n      const socket = net.connect({\n        host: proxyHost,\n        port: proxyPort\n      })\n\n      socket.once('connect', onConnect)\n      socket.once('error', onError)\n    })\n\n    // Create SOCKS5 client\n    const socks5Client = new Socks5Client(socket, this[kProxyAuth])\n\n    // Handle SOCKS5 errors\n    socks5Client.on('error', (err) => {\n      debug('SOCKS5 error:', err)\n      socket.destroy()\n    })\n\n    // Perform SOCKS5 handshake\n    await socks5Client.handshake()\n\n    // Wait for authentication (if required)\n    await new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        reject(new Error('SOCKS5 authentication timeout'))\n      }, 5000)\n\n      const onAuthenticated = () => {\n        clearTimeout(timeout)\n        socks5Client.removeListener('error', onError)\n        resolve()\n      }\n\n      const onError = (err) => {\n        clearTimeout(timeout)\n        socks5Client.removeListener('authenticated', onAuthenticated)\n        reject(err)\n      }\n\n      // Check if already authenticated (for NO_AUTH method)\n      if (socks5Client.state === 'authenticated') {\n        clearTimeout(timeout)\n        resolve()\n      } else {\n        socks5Client.once('authenticated', onAuthenticated)\n        socks5Client.once('error', onError)\n      }\n    })\n\n    // Send CONNECT command\n    await socks5Client.connect(targetHost, targetPort)\n\n    // Wait for connection\n    await new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        reject(new Error('SOCKS5 connection timeout'))\n      }, 5000)\n\n      const onConnected = (info) => {\n        debug('SOCKS5 tunnel established to', targetHost, targetPort, 'via', info)\n        clearTimeout(timeout)\n        socks5Client.removeListener('error', onError)\n        resolve()\n      }\n\n      const onError = (err) => {\n        clearTimeout(timeout)\n        socks5Client.removeListener('connected', onConnected)\n        reject(err)\n      }\n\n      socks5Client.once('connected', onConnected)\n      socks5Client.once('error', onError)\n    })\n\n    return socket\n  }\n\n  /**\n   * Dispatch a request through the SOCKS5 proxy\n   */\n  async [kDispatch] (opts, handler) {\n    const { origin } = opts\n\n    debug('dispatching request to', origin, 'via SOCKS5')\n\n    try {\n      // Create Pool with custom connect function if we don't have one yet\n      if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) {\n        this[kPool] = new Pool(origin, {\n          pipelining: opts.pipelining,\n          connections: opts.connections,\n          connect: async (connectOpts, callback) => {\n            try {\n              const url = new URL(origin)\n              const targetHost = url.hostname\n              const targetPort = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80)\n\n              debug('establishing SOCKS5 connection to', targetHost, targetPort)\n\n              // Create SOCKS5 tunnel\n              const socket = await this.createSocks5Connection(targetHost, targetPort)\n\n              // Handle TLS if needed\n              let finalSocket = socket\n              if (url.protocol === 'https:') {\n                if (!tls) {\n                  tls = require('node:tls')\n                }\n                debug('upgrading to TLS')\n                finalSocket = tls.connect({\n                  socket,\n                  servername: targetHost,\n                  ...connectOpts.tls || {}\n                })\n\n                await new Promise((resolve, reject) => {\n                  finalSocket.once('secureConnect', resolve)\n                  finalSocket.once('error', reject)\n                })\n              }\n\n              callback(null, finalSocket)\n            } catch (err) {\n              debug('SOCKS5 connection error:', err)\n              callback(err)\n            }\n          }\n        })\n      }\n\n      // Dispatch the request through the pool\n      return this[kPool][kDispatch](opts, handler)\n    } catch (err) {\n      debug('dispatch error:', err)\n      if (typeof handler.onError === 'function') {\n        handler.onError(err)\n      } else {\n        throw err\n      }\n    }\n  }\n\n  async [kClose] () {\n    if (this[kPool]) {\n      await this[kPool].close()\n    }\n  }\n\n  async [kDestroy] (err) {\n    if (this[kPool]) {\n      await this[kPool].destroy(err)\n    }\n  }\n}\n\nmodule.exports = Socks5ProxyAgent\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kDispatch } = require('../core/symbols')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require('../core/errors')\nconst buildConnector = require('../core/connect')\nconst Client = require('./client')\nconst { channels } = require('../core/diagnostics')\nconst Socks5ProxyAgent = require('./socks5-proxy-agent')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\nconst kTunnelProxy = Symbol('tunnel proxy')\n\nfunction defaultProtocolPort (protocol) {\n  return protocol === 'https:' ? 443 : 80\n}\n\nfunction defaultFactory (origin, opts) {\n  return new Pool(origin, opts)\n}\n\nconst noop = () => {}\n\nfunction defaultAgentFactory (origin, opts) {\n  if (opts.connections === 1) {\n    return new Client(origin, opts)\n  }\n  return new Pool(origin, opts)\n}\n\nclass Http1ProxyWrapper extends DispatcherBase {\n  #client\n\n  constructor (proxyUrl, { headers = {}, connect, factory }) {\n    if (!proxyUrl) {\n      throw new InvalidArgumentError('Proxy URL is mandatory')\n    }\n\n    super()\n\n    this[kProxyHeaders] = headers\n    if (factory) {\n      this.#client = factory(proxyUrl, { connect })\n    } else {\n      this.#client = new Client(proxyUrl, { connect })\n    }\n  }\n\n  [kDispatch] (opts, handler) {\n    const onHeaders = handler.onHeaders\n    handler.onHeaders = function (statusCode, data, resume) {\n      if (statusCode === 407) {\n        if (typeof handler.onError === 'function') {\n          handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)'))\n        }\n        return\n      }\n      if (onHeaders) onHeaders.call(this, statusCode, data, resume)\n    }\n\n    // Rewrite request as an HTTP1 Proxy request, without tunneling.\n    const {\n      origin,\n      path = '/',\n      headers = {}\n    } = opts\n\n    opts.path = origin + path\n\n    if (!('host' in headers) && !('Host' in headers)) {\n      const { host } = new URL(origin)\n      headers.host = host\n    }\n    opts.headers = { ...this[kProxyHeaders], ...headers }\n\n    return this.#client[kDispatch](opts, handler)\n  }\n\n  [kClose] () {\n    return this.#client.close()\n  }\n\n  [kDestroy] (err) {\n    return this.#client.destroy(err)\n  }\n}\n\nclass ProxyAgent extends DispatcherBase {\n  constructor (opts) {\n    if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {\n      throw new InvalidArgumentError('Proxy uri is mandatory')\n    }\n\n    const { clientFactory = defaultFactory } = opts\n    if (typeof clientFactory !== 'function') {\n      throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n    }\n\n    const { proxyTunnel = true } = opts\n\n    super()\n\n    const url = this.#getUrl(opts)\n    const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url\n\n    this[kProxy] = { uri: href, protocol }\n    this[kRequestTls] = opts.requestTls\n    this[kProxyTls] = opts.proxyTls\n    this[kProxyHeaders] = opts.headers || {}\n    this[kTunnelProxy] = proxyTunnel\n\n    if (opts.auth && opts.token) {\n      throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n    } else if (opts.auth) {\n      /* @deprecated in favour of opts.token */\n      this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n    } else if (opts.token) {\n      this[kProxyHeaders]['proxy-authorization'] = opts.token\n    } else if (username && password) {\n      this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`\n    }\n\n    const connect = buildConnector({ ...opts.proxyTls })\n    this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })\n\n    const agentFactory = opts.factory || defaultAgentFactory\n    const factory = (origin, options) => {\n      const { protocol } = new URL(origin)\n\n      // Handle SOCKS5 proxy\n      if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {\n        return new Socks5ProxyAgent(this[kProxy].uri, {\n          headers: this[kProxyHeaders],\n          connect,\n          factory: agentFactory,\n          username: opts.username || username,\n          password: opts.password || password,\n          proxyTls: opts.proxyTls\n        })\n      }\n\n      if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {\n        return new Http1ProxyWrapper(this[kProxy].uri, {\n          headers: this[kProxyHeaders],\n          connect,\n          factory: agentFactory\n        })\n      }\n      return agentFactory(origin, options)\n    }\n\n    // For SOCKS5 proxies, we don't need a client to the proxy itself\n    // The SOCKS5 connection is handled within Socks5ProxyAgent\n    if (protocol === 'socks5:' || protocol === 'socks:') {\n      this[kClient] = null\n    } else {\n      this[kClient] = clientFactory(url, { connect })\n    }\n\n    this[kAgent] = new Agent({\n      ...opts,\n      factory,\n      connect: async (opts, callback) => {\n        // SOCKS5 proxies handle their own connections via Socks5ProxyAgent,\n        // so this connect function should never be called for them.\n        if (!this[kClient]) {\n          callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'))\n          return\n        }\n\n        let requestedPath = opts.host\n        if (!opts.port) {\n          requestedPath += `:${defaultProtocolPort(opts.protocol)}`\n        }\n        try {\n          const connectParams = {\n            origin,\n            port,\n            path: requestedPath,\n            signal: opts.signal,\n            headers: {\n              ...this[kProxyHeaders],\n              host: opts.host,\n              ...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})\n            },\n            servername: this[kProxyTls]?.servername || proxyHostname\n          }\n          const { socket, statusCode } = await this[kClient].connect(connectParams)\n          if (statusCode !== 200) {\n            socket.on('error', noop).destroy()\n            callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))\n            return\n          }\n\n          if (channels.proxyConnected.hasSubscribers) {\n            channels.proxyConnected.publish({\n              socket,\n              connectParams\n            })\n          }\n\n          if (opts.protocol !== 'https:') {\n            callback(null, socket)\n            return\n          }\n          let servername\n          if (this[kRequestTls]) {\n            servername = this[kRequestTls].servername\n          } else {\n            servername = opts.servername\n          }\n          this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)\n        } catch (err) {\n          if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n            // Throw a custom error to avoid loop in client.js#connect\n            callback(new SecureProxyConnectionError(err))\n          } else {\n            callback(err)\n          }\n        }\n      }\n    })\n  }\n\n  dispatch (opts, handler) {\n    const headers = buildHeaders(opts.headers)\n    throwIfProxyAuthIsSent(headers)\n\n    if (headers && !('host' in headers) && !('Host' in headers)) {\n      const { host } = new URL(opts.origin)\n      headers.host = host\n    }\n\n    return this[kAgent].dispatch(\n      {\n        ...opts,\n        headers\n      },\n      handler\n    )\n  }\n\n  /**\n   * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts\n   * @returns {URL}\n   */\n  #getUrl (opts) {\n    if (typeof opts === 'string') {\n      return new URL(opts)\n    } else if (opts instanceof URL) {\n      return opts\n    } else {\n      return new URL(opts.uri)\n    }\n  }\n\n  [kClose] () {\n    const promises = [this[kAgent].close()]\n    if (this[kClient]) {\n      promises.push(this[kClient].close())\n    }\n    return Promise.all(promises)\n  }\n\n  [kDestroy] () {\n    const promises = [this[kAgent].destroy()]\n    if (this[kClient]) {\n      promises.push(this[kClient].destroy())\n    }\n    return Promise.all(promises)\n  }\n}\n\n/**\n * @param {string[] | Record<string, string>} headers\n * @returns {Record<string, string>}\n */\nfunction buildHeaders (headers) {\n  // When using undici.fetch, the headers list is stored\n  // as an array.\n  if (Array.isArray(headers)) {\n    /** @type {Record<string, string>} */\n    const headersPair = {}\n\n    for (let i = 0; i < headers.length; i += 2) {\n      headersPair[headers[i]] = headers[i + 1]\n    }\n\n    return headersPair\n  }\n\n  return headers\n}\n\n/**\n * @param {Record<string, string>} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n  const existProxyAuth = headers && Object.keys(headers)\n    .find((key) => key.toLowerCase() === 'proxy-authorization')\n  if (existProxyAuth) {\n    throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n  }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require('../core/symbols')\nconst ProxyAgent = require('./proxy-agent')\nconst Agent = require('./agent')\n\nconst DEFAULT_PORTS = {\n  'http:': 80,\n  'https:': 443\n}\n\nclass EnvHttpProxyAgent extends DispatcherBase {\n  #noProxyValue = null\n  #noProxyEntries = null\n  #opts = null\n\n  constructor (opts = {}) {\n    super()\n    this.#opts = opts\n\n    const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts\n\n    this[kNoProxyAgent] = new Agent(agentOpts)\n\n    const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY\n    if (HTTP_PROXY) {\n      this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY })\n    } else {\n      this[kHttpProxyAgent] = this[kNoProxyAgent]\n    }\n\n    const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY\n    if (HTTPS_PROXY) {\n      this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY })\n    } else {\n      this[kHttpsProxyAgent] = this[kHttpProxyAgent]\n    }\n\n    this.#parseNoProxy()\n  }\n\n  [kDispatch] (opts, handler) {\n    const url = new URL(opts.origin)\n    const agent = this.#getProxyAgentForUrl(url)\n    return agent.dispatch(opts, handler)\n  }\n\n  [kClose] () {\n    return Promise.all([\n      this[kNoProxyAgent].close(),\n      !this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(),\n      !this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close()\n    ])\n  }\n\n  [kDestroy] (err) {\n    return Promise.all([\n      this[kNoProxyAgent].destroy(err),\n      !this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err),\n      !this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err)\n    ])\n  }\n\n  #getProxyAgentForUrl (url) {\n    let { protocol, host: hostname, port } = url\n\n    // Stripping ports in this way instead of using parsedUrl.hostname to make\n    // sure that the brackets around IPv6 addresses are kept.\n    hostname = hostname.replace(/:\\d*$/, '').toLowerCase()\n    port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0\n    if (!this.#shouldProxy(hostname, port)) {\n      return this[kNoProxyAgent]\n    }\n    if (protocol === 'https:') {\n      return this[kHttpsProxyAgent]\n    }\n    return this[kHttpProxyAgent]\n  }\n\n  #shouldProxy (hostname, port) {\n    if (this.#noProxyChanged) {\n      this.#parseNoProxy()\n    }\n\n    if (this.#noProxyEntries.length === 0) {\n      return true // Always proxy if NO_PROXY is not set or empty.\n    }\n    if (this.#noProxyValue === '*') {\n      return false // Never proxy if wildcard is set.\n    }\n\n    for (let i = 0; i < this.#noProxyEntries.length; i++) {\n      const entry = this.#noProxyEntries[i]\n      if (entry.port && entry.port !== port) {\n        continue // Skip if ports don't match.\n      }\n      // Don't proxy if the hostname is equal with the no_proxy host.\n      if (hostname === entry.hostname) {\n        return false\n      }\n      // Don't proxy if the hostname is the subdomain of the no_proxy host.\n      // Reference - https://github.com/denoland/deno/blob/6fbce91e40cc07fc6da74068e5cc56fdd40f7b4c/ext/fetch/proxy.rs#L485\n      if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  #parseNoProxy () {\n    const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv\n    const noProxySplit = noProxyValue.split(/[,\\s]/)\n    const noProxyEntries = []\n\n    for (let i = 0; i < noProxySplit.length; i++) {\n      const entry = noProxySplit[i]\n      if (!entry) {\n        continue\n      }\n      const parsed = entry.match(/^(.+):(\\d+)$/)\n      noProxyEntries.push({\n        // strip leading dot or asterisk with dot\n        hostname: (parsed ? parsed[1] : entry).replace(/^\\*?\\./, '').toLowerCase(),\n        port: parsed ? Number.parseInt(parsed[2], 10) : 0\n      })\n    }\n\n    this.#noProxyValue = noProxyValue\n    this.#noProxyEntries = noProxyEntries\n  }\n\n  get #noProxyChanged () {\n    if (this.#opts.noProxy !== undefined) {\n      return false\n    }\n    return this.#noProxyValue !== this.#noProxyEnv\n  }\n\n  get #noProxyEnv () {\n    return process.env.no_proxy ?? process.env.NO_PROXY ?? ''\n  }\n}\n\nmodule.exports = EnvHttpProxyAgent\n","'use strict'\nconst assert = require('node:assert')\n\nconst { kRetryHandlerDefaultRetry } = require('../core/symbols')\nconst { RequestRetryError } = require('../core/errors')\nconst WrapHandler = require('./wrap-handler')\nconst {\n  isDisturbed,\n  parseRangeHeader,\n  wrapRequestBody\n} = require('../core/util')\n\nfunction calculateRetryAfterHeader (retryAfter) {\n  const retryTime = new Date(retryAfter).getTime()\n  return isNaN(retryTime) ? 0 : retryTime - Date.now()\n}\n\nclass RetryHandler {\n  constructor (opts, { dispatch, handler }) {\n    const { retryOptions, ...dispatchOpts } = opts\n    const {\n      // Retry scoped\n      retry: retryFn,\n      maxRetries,\n      maxTimeout,\n      minTimeout,\n      timeoutFactor,\n      // Response scoped\n      methods,\n      errorCodes,\n      retryAfter,\n      statusCodes,\n      throwOnError\n    } = retryOptions ?? {}\n\n    this.error = null\n    this.dispatch = dispatch\n    this.handler = WrapHandler.wrap(handler)\n    this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }\n    this.retryOpts = {\n      throwOnError: throwOnError ?? true,\n      retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],\n      retryAfter: retryAfter ?? true,\n      maxTimeout: maxTimeout ?? 30 * 1000, // 30s,\n      minTimeout: minTimeout ?? 500, // .5s\n      timeoutFactor: timeoutFactor ?? 2,\n      maxRetries: maxRetries ?? 5,\n      // What errors we should retry\n      methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],\n      // Indicates which errors to retry\n      statusCodes: statusCodes ?? [500, 502, 503, 504, 429],\n      // List of errors to retry\n      errorCodes: errorCodes ?? [\n        'ECONNRESET',\n        'ECONNREFUSED',\n        'ENOTFOUND',\n        'ENETDOWN',\n        'ENETUNREACH',\n        'EHOSTDOWN',\n        'EHOSTUNREACH',\n        'EPIPE',\n        'UND_ERR_SOCKET'\n      ]\n    }\n\n    this.retryCount = 0\n    this.retryCountCheckpoint = 0\n    this.headersSent = false\n    this.start = 0\n    this.end = null\n    this.etag = null\n  }\n\n  onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {\n    if (this.retryOpts.throwOnError) {\n      // Preserve old behavior for status codes that are not eligible for retry\n      if (this.retryOpts.statusCodes.includes(statusCode) === false) {\n        this.headersSent = true\n        this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n      } else {\n        this.error = err\n      }\n\n      return\n    }\n\n    if (isDisturbed(this.opts.body)) {\n      this.headersSent = true\n      this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n      return\n    }\n\n    function shouldRetry (passedErr) {\n      if (passedErr) {\n        this.headersSent = true\n        this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n        controller.resume()\n        return\n      }\n\n      this.error = err\n      controller.resume()\n    }\n\n    controller.pause()\n    this.retryOpts.retry(\n      err,\n      {\n        state: { counter: this.retryCount },\n        opts: { retryOptions: this.retryOpts, ...this.opts }\n      },\n      shouldRetry.bind(this)\n    )\n  }\n\n  onRequestStart (controller, context) {\n    if (!this.headersSent) {\n      this.handler.onRequestStart?.(controller, context)\n    }\n  }\n\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n  }\n\n  static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {\n    const { statusCode, code, headers } = err\n    const { method, retryOptions } = opts\n    const {\n      maxRetries,\n      minTimeout,\n      maxTimeout,\n      timeoutFactor,\n      statusCodes,\n      errorCodes,\n      methods\n    } = retryOptions\n    const { counter } = state\n\n    // Any code that is not a Undici's originated and allowed to retry\n    if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) {\n      cb(err)\n      return\n    }\n\n    // If a set of method are provided and the current method is not in the list\n    if (Array.isArray(methods) && !methods.includes(method)) {\n      cb(err)\n      return\n    }\n\n    // If a set of status code are provided and the current status code is not in the list\n    if (\n      statusCode != null &&\n      Array.isArray(statusCodes) &&\n      !statusCodes.includes(statusCode)\n    ) {\n      cb(err)\n      return\n    }\n\n    // If we reached the max number of retries\n    if (counter > maxRetries) {\n      cb(err)\n      return\n    }\n\n    let retryAfterHeader = headers?.['retry-after']\n    if (retryAfterHeader) {\n      retryAfterHeader = Number(retryAfterHeader)\n      retryAfterHeader = Number.isNaN(retryAfterHeader)\n        ? calculateRetryAfterHeader(headers['retry-after'])\n        : retryAfterHeader * 1e3 // Retry-After is in seconds\n    }\n\n    const retryTimeout =\n      retryAfterHeader > 0\n        ? Math.min(retryAfterHeader, maxTimeout)\n        : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)\n\n    setTimeout(() => cb(null), retryTimeout)\n  }\n\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    this.error = null\n    this.retryCount += 1\n\n    if (statusCode >= 300) {\n      const err = new RequestRetryError('Request failed', statusCode, {\n        headers,\n        data: {\n          count: this.retryCount\n        }\n      })\n\n      this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)\n      return\n    }\n\n    // Checkpoint for resume from where we left it\n    if (this.headersSent) {\n      // Only Partial Content 206 supposed to provide Content-Range,\n      // any other status code that partially consumed the payload\n      // should not be retried because it would result in downstream\n      // wrongly concatenate multiple responses.\n      if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) {\n        throw new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, {\n          headers,\n          data: { count: this.retryCount }\n        })\n      }\n\n      const contentRange = parseRangeHeader(headers['content-range'])\n      // If no content range\n      if (!contentRange) {\n        // We always throw here as we want to indicate that we entred unexpected path\n        throw new RequestRetryError('Content-Range mismatch', statusCode, {\n          headers,\n          data: { count: this.retryCount }\n        })\n      }\n\n      // Let's start with a weak etag check\n      if (this.etag != null && this.etag !== headers.etag) {\n        // We always throw here as we want to indicate that we entred unexpected path\n        throw new RequestRetryError('ETag mismatch', statusCode, {\n          headers,\n          data: { count: this.retryCount }\n        })\n      }\n\n      const { start, size, end = size ? size - 1 : null } = contentRange\n\n      assert(this.start === start, 'content-range mismatch')\n      assert(this.end == null || this.end === end, 'content-range mismatch')\n\n      return\n    }\n\n    if (this.end == null) {\n      if (statusCode === 206) {\n        // First time we receive 206\n        const range = parseRangeHeader(headers['content-range'])\n\n        if (range == null) {\n          this.headersSent = true\n          this.handler.onResponseStart?.(\n            controller,\n            statusCode,\n            headers,\n            statusMessage\n          )\n          return\n        }\n\n        const { start, size, end = size ? size - 1 : null } = range\n        assert(\n          start != null && Number.isFinite(start),\n          'content-range mismatch'\n        )\n        assert(end != null && Number.isFinite(end), 'invalid content-length')\n\n        this.start = start\n        this.end = end\n      }\n\n      // We make our best to checkpoint the body for further range headers\n      if (this.end == null) {\n        const contentLength = headers['content-length']\n        this.end = contentLength != null ? Number(contentLength) - 1 : null\n      }\n\n      assert(Number.isFinite(this.start))\n      assert(\n        this.end == null || Number.isFinite(this.end),\n        'invalid content-length'\n      )\n\n      this.resume = true\n      this.etag = headers.etag != null ? headers.etag : null\n\n      // Weak etags are not useful for comparison nor cache\n      // for instance not safe to assume if the response is byte-per-byte\n      // equal\n      if (\n        this.etag != null &&\n        this.etag[0] === 'W' &&\n        this.etag[1] === '/'\n      ) {\n        this.etag = null\n      }\n\n      this.headersSent = true\n      this.handler.onResponseStart?.(\n        controller,\n        statusCode,\n        headers,\n        statusMessage\n      )\n    } else {\n      throw new RequestRetryError('Request failed', statusCode, {\n        headers,\n        data: { count: this.retryCount }\n      })\n    }\n  }\n\n  onResponseData (controller, chunk) {\n    if (this.error) {\n      return\n    }\n\n    this.start += chunk.length\n\n    this.handler.onResponseData?.(controller, chunk)\n  }\n\n  onResponseEnd (controller, trailers) {\n    if (this.error && this.retryOpts.throwOnError) {\n      throw this.error\n    }\n\n    if (!this.error) {\n      this.retryCount = 0\n      return this.handler.onResponseEnd?.(controller, trailers)\n    }\n\n    this.retry(controller)\n  }\n\n  retry (controller) {\n    if (this.start !== 0) {\n      const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }\n\n      // Weak etag check - weak etags will make comparison algorithms never match\n      if (this.etag != null) {\n        headers['if-match'] = this.etag\n      }\n\n      this.opts = {\n        ...this.opts,\n        headers: {\n          ...this.opts.headers,\n          ...headers\n        }\n      }\n    }\n\n    try {\n      this.retryCountCheckpoint = this.retryCount\n      this.dispatch(this.opts, this)\n    } catch (err) {\n      this.handler.onResponseError?.(controller, err)\n    }\n  }\n\n  onResponseError (controller, err) {\n    if (controller?.aborted || isDisturbed(this.opts.body)) {\n      this.handler.onResponseError?.(controller, err)\n      return\n    }\n\n    function shouldRetry (returnedErr) {\n      if (!returnedErr) {\n        this.retry(controller)\n        return\n      }\n\n      this.handler?.onResponseError?.(controller, returnedErr)\n    }\n\n    // We reconcile in case of a mix between network errors\n    // and server error response\n    if (this.retryCount - this.retryCountCheckpoint > 0) {\n      // We count the difference between the last checkpoint and the current retry count\n      this.retryCount =\n        this.retryCountCheckpoint +\n        (this.retryCount - this.retryCountCheckpoint)\n    } else {\n      this.retryCount += 1\n    }\n\n    this.retryOpts.retry(\n      err,\n      {\n        state: { counter: this.retryCount },\n        opts: { retryOptions: this.retryOpts, ...this.opts }\n      },\n      shouldRetry.bind(this)\n    )\n  }\n}\n\nmodule.exports = RetryHandler\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst RetryHandler = require('../handler/retry-handler')\n\nclass RetryAgent extends Dispatcher {\n  #agent = null\n  #options = null\n  constructor (agent, options = {}) {\n    super(options)\n    this.#agent = agent\n    this.#options = options\n  }\n\n  dispatch (opts, handler) {\n    const retry = new RetryHandler({\n      ...opts,\n      retryOptions: this.#options\n    }, {\n      dispatch: this.#agent.dispatch.bind(this.#agent),\n      handler\n    })\n    return this.#agent.dispatch(opts, retry)\n  }\n\n  close () {\n    return this.#agent.close()\n  }\n\n  destroy () {\n    return this.#agent.destroy()\n  }\n}\n\nmodule.exports = RetryAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst Client = require('./client')\n\nclass H2CClient extends Client {\n  constructor (origin, clientOpts) {\n    if (typeof origin === 'string') {\n      origin = new URL(origin)\n    }\n\n    if (origin.protocol !== 'http:') {\n      throw new InvalidArgumentError(\n        'h2c-client: Only h2c protocol is supported'\n      )\n    }\n\n    const { connect, maxConcurrentStreams, pipelining, ...opts } =\n            clientOpts ?? {}\n    let defaultMaxConcurrentStreams = 100\n    let defaultPipelining = 100\n\n    if (\n      maxConcurrentStreams != null &&\n            Number.isInteger(maxConcurrentStreams) &&\n            maxConcurrentStreams > 0\n    ) {\n      defaultMaxConcurrentStreams = maxConcurrentStreams\n    }\n\n    if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {\n      defaultPipelining = pipelining\n    }\n\n    if (defaultPipelining > defaultMaxConcurrentStreams) {\n      throw new InvalidArgumentError(\n        'h2c-client: pipelining cannot be greater than maxConcurrentStreams'\n      )\n    }\n\n    super(origin, {\n      ...opts,\n      maxConcurrentStreams: defaultMaxConcurrentStreams,\n      pipelining: defaultPipelining,\n      allowH2: true,\n      useH2c: true\n    })\n  }\n}\n\nmodule.exports = H2CClient\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors')\nconst util = require('../core/util')\nconst { ReadableStreamFrom } = require('../core/util')\n\nconst kConsume = Symbol('kConsume')\nconst kReading = Symbol('kReading')\nconst kBody = Symbol('kBody')\nconst kAbort = Symbol('kAbort')\nconst kContentType = Symbol('kContentType')\nconst kContentLength = Symbol('kContentLength')\nconst kUsed = Symbol('kUsed')\nconst kBytesRead = Symbol('kBytesRead')\n\nconst noop = () => {}\n\n/**\n * @class\n * @extends {Readable}\n * @see https://fetch.spec.whatwg.org/#body\n */\nclass BodyReadable extends Readable {\n  /**\n   * @param {object} opts\n   * @param {(this: Readable, size: number) => void} opts.resume\n   * @param {() => (void | null)} opts.abort\n   * @param {string} [opts.contentType = '']\n   * @param {number} [opts.contentLength]\n   * @param {number} [opts.highWaterMark = 64 * 1024]\n   */\n  constructor ({\n    resume,\n    abort,\n    contentType = '',\n    contentLength,\n    highWaterMark = 64 * 1024 // Same as nodejs fs streams.\n  }) {\n    super({\n      autoDestroy: true,\n      read: resume,\n      highWaterMark\n    })\n\n    this._readableState.dataEmitted = false\n\n    this[kAbort] = abort\n\n    /** @type {Consume | null} */\n    this[kConsume] = null\n\n    /** @type {number} */\n    this[kBytesRead] = 0\n\n    /** @type {ReadableStream|null} */\n    this[kBody] = null\n\n    /** @type {boolean} */\n    this[kUsed] = false\n\n    /** @type {string} */\n    this[kContentType] = contentType\n\n    /** @type {number|null} */\n    this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null\n\n    /**\n     * Is stream being consumed through Readable API?\n     * This is an optimization so that we avoid checking\n     * for 'data' and 'readable' listeners in the hot path\n     * inside push().\n     *\n     * @type {boolean}\n     */\n    this[kReading] = false\n  }\n\n  /**\n   * @param {Error|null} err\n   * @param {(error:(Error|null)) => void} callback\n   * @returns {void}\n   */\n  _destroy (err, callback) {\n    if (!err && !this._readableState.endEmitted) {\n      err = new RequestAbortedError()\n    }\n\n    if (err) {\n      this[kAbort]()\n    }\n\n    // Workaround for Node \"bug\". If the stream is destroyed in same\n    // tick as it is created, then a user who is waiting for a\n    // promise (i.e micro tick) for installing an 'error' listener will\n    // never get a chance and will always encounter an unhandled exception.\n    if (!this[kUsed]) {\n      setImmediate(callback, err)\n    } else {\n      callback(err)\n    }\n  }\n\n  /**\n   * @param {string|symbol} event\n   * @param {(...args: any[]) => void} listener\n   * @returns {this}\n   */\n  on (event, listener) {\n    if (event === 'data' || event === 'readable') {\n      this[kReading] = true\n      this[kUsed] = true\n    }\n    return super.on(event, listener)\n  }\n\n  /**\n   * @param {string|symbol} event\n   * @param {(...args: any[]) => void} listener\n   * @returns {this}\n   */\n  addListener (event, listener) {\n    return this.on(event, listener)\n  }\n\n  /**\n   * @param {string|symbol} event\n   * @param {(...args: any[]) => void} listener\n   * @returns {this}\n   */\n  off (event, listener) {\n    const ret = super.off(event, listener)\n    if (event === 'data' || event === 'readable') {\n      this[kReading] = (\n        this.listenerCount('data') > 0 ||\n        this.listenerCount('readable') > 0\n      )\n    }\n    return ret\n  }\n\n  /**\n   * @param {string|symbol} event\n   * @param {(...args: any[]) => void} listener\n   * @returns {this}\n   */\n  removeListener (event, listener) {\n    return this.off(event, listener)\n  }\n\n  /**\n   * @param {Buffer|null} chunk\n   * @returns {boolean}\n   */\n  push (chunk) {\n    if (chunk) {\n      this[kBytesRead] += chunk.length\n      if (this[kConsume]) {\n        consumePush(this[kConsume], chunk)\n        return this[kReading] ? super.push(chunk) : true\n      }\n    }\n\n    return super.push(chunk)\n  }\n\n  /**\n   * Consumes and returns the body as a string.\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-text\n   * @returns {Promise<string>}\n   */\n  text () {\n    return consume(this, 'text')\n  }\n\n  /**\n   * Consumes and returns the body as a JavaScript Object.\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-json\n   * @returns {Promise<unknown>}\n   */\n  json () {\n    return consume(this, 'json')\n  }\n\n  /**\n   * Consumes and returns the body as a Blob\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-blob\n   * @returns {Promise<Blob>}\n   */\n  blob () {\n    return consume(this, 'blob')\n  }\n\n  /**\n   * Consumes and returns the body as an Uint8Array.\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-bytes\n   * @returns {Promise<Uint8Array>}\n   */\n  bytes () {\n    return consume(this, 'bytes')\n  }\n\n  /**\n   * Consumes and returns the body as an ArrayBuffer.\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer\n   * @returns {Promise<ArrayBuffer>}\n   */\n  arrayBuffer () {\n    return consume(this, 'arrayBuffer')\n  }\n\n  /**\n   * Not implemented\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-formdata\n   * @throws {NotSupportedError}\n   */\n  async formData () {\n    // TODO: Implement.\n    throw new NotSupportedError()\n  }\n\n  /**\n   * Returns true if the body is not null and the body has been consumed.\n   * Otherwise, returns false.\n   *\n   * @see https://fetch.spec.whatwg.org/#dom-body-bodyused\n   * @readonly\n   * @returns {boolean}\n   */\n  get bodyUsed () {\n    return util.isDisturbed(this)\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#dom-body-body\n   * @readonly\n   * @returns {ReadableStream}\n   */\n  get body () {\n    if (!this[kBody]) {\n      this[kBody] = ReadableStreamFrom(this)\n      if (this[kConsume]) {\n        // TODO: Is this the best way to force a lock?\n        this[kBody].getReader() // Ensure stream is locked.\n        assert(this[kBody].locked)\n      }\n    }\n    return this[kBody]\n  }\n\n  /**\n   * Dumps the response body by reading `limit` number of bytes.\n   * @param {object} opts\n   * @param {number} [opts.limit = 131072] Number of bytes to read.\n   * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump.\n   * @returns {Promise<null>}\n   */\n  dump (opts) {\n    const signal = opts?.signal\n\n    if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {\n      return Promise.reject(new InvalidArgumentError('signal must be an AbortSignal'))\n    }\n\n    const limit = opts?.limit && Number.isFinite(opts.limit)\n      ? opts.limit\n      : 128 * 1024\n\n    if (signal?.aborted) {\n      return Promise.reject(signal.reason ?? new AbortError())\n    }\n\n    if (this._readableState.closeEmitted) {\n      return Promise.resolve(null)\n    }\n\n    return new Promise((resolve, reject) => {\n      if (\n        (this[kContentLength] && (this[kContentLength] > limit)) ||\n        this[kBytesRead] > limit\n      ) {\n        this.destroy(new AbortError())\n      }\n\n      if (signal) {\n        const onAbort = () => {\n          this.destroy(signal.reason ?? new AbortError())\n        }\n        signal.addEventListener('abort', onAbort)\n        this\n          .on('close', function () {\n            signal.removeEventListener('abort', onAbort)\n            if (signal.aborted) {\n              reject(signal.reason ?? new AbortError())\n            } else {\n              resolve(null)\n            }\n          })\n      } else {\n        this.on('close', resolve)\n      }\n\n      this\n        .on('error', noop)\n        .on('data', () => {\n          if (this[kBytesRead] > limit) {\n            this.destroy()\n          }\n        })\n        .resume()\n    })\n  }\n\n  /**\n   * @param {BufferEncoding} encoding\n   * @returns {this}\n   */\n  setEncoding (encoding) {\n    if (Buffer.isEncoding(encoding)) {\n      this._readableState.encoding = encoding\n    }\n    return this\n  }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestream-locked\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isLocked (bodyReadable) {\n  // Consume is an implicit lock.\n  return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isUnusable (bodyReadable) {\n  return util.isDisturbed(bodyReadable) || isLocked(bodyReadable)\n}\n\n/**\n * @typedef {'text' | 'json' | 'blob' | 'bytes' | 'arrayBuffer'} ConsumeType\n */\n\n/**\n * @template {ConsumeType} T\n * @typedef {T extends 'text' ? string :\n *           T extends 'json' ? unknown :\n *           T extends 'blob' ? Blob :\n *           T extends 'arrayBuffer' ? ArrayBuffer :\n *           T extends 'bytes' ? Uint8Array :\n *           never\n * } ConsumeReturnType\n */\n/**\n * @typedef {object} Consume\n * @property {ConsumeType} type\n * @property {BodyReadable} stream\n * @property {((value?: any) => void)} resolve\n * @property {((err: Error) => void)} reject\n * @property {number} length\n * @property {Buffer[]} body\n */\n\n/**\n * @template {ConsumeType} T\n * @param {BodyReadable} stream\n * @param {T} type\n * @returns {Promise<ConsumeReturnType<T>>}\n */\nfunction consume (stream, type) {\n  assert(!stream[kConsume])\n\n  return new Promise((resolve, reject) => {\n    if (isUnusable(stream)) {\n      const rState = stream._readableState\n      if (rState.destroyed && rState.closeEmitted === false) {\n        stream\n          .on('error', reject)\n          .on('close', () => {\n            reject(new TypeError('unusable'))\n          })\n      } else {\n        reject(rState.errored ?? new TypeError('unusable'))\n      }\n    } else {\n      queueMicrotask(() => {\n        stream[kConsume] = {\n          type,\n          stream,\n          resolve,\n          reject,\n          length: 0,\n          body: []\n        }\n\n        stream\n          .on('error', function (err) {\n            consumeFinish(this[kConsume], err)\n          })\n          .on('close', function () {\n            if (this[kConsume].body !== null) {\n              consumeFinish(this[kConsume], new RequestAbortedError())\n            }\n          })\n\n        consumeStart(stream[kConsume])\n      })\n    }\n  })\n}\n\n/**\n * @param {Consume} consume\n * @returns {void}\n */\nfunction consumeStart (consume) {\n  if (consume.body === null) {\n    return\n  }\n\n  const { _readableState: state } = consume.stream\n\n  if (state.bufferIndex) {\n    const start = state.bufferIndex\n    const end = state.buffer.length\n    for (let n = start; n < end; n++) {\n      consumePush(consume, state.buffer[n])\n    }\n  } else {\n    for (const chunk of state.buffer) {\n      consumePush(consume, chunk)\n    }\n  }\n\n  if (state.endEmitted) {\n    consumeEnd(this[kConsume], this._readableState.encoding)\n  } else {\n    consume.stream.on('end', function () {\n      consumeEnd(this[kConsume], this._readableState.encoding)\n    })\n  }\n\n  consume.stream.resume()\n\n  while (consume.stream.read() != null) {\n    // Loop\n  }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @param {BufferEncoding} [encoding='utf8']\n * @returns {string}\n */\nfunction chunksDecode (chunks, length, encoding) {\n  if (chunks.length === 0 || length === 0) {\n    return ''\n  }\n  const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length)\n  const bufferLength = buffer.length\n\n  // Skip BOM.\n  const start =\n    bufferLength > 2 &&\n    buffer[0] === 0xef &&\n    buffer[1] === 0xbb &&\n    buffer[2] === 0xbf\n      ? 3\n      : 0\n  if (!encoding || encoding === 'utf8' || encoding === 'utf-8') {\n    return buffer.utf8Slice(start, bufferLength)\n  } else {\n    return buffer.subarray(start, bufferLength).toString(encoding)\n  }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @returns {Uint8Array}\n */\nfunction chunksConcat (chunks, length) {\n  if (chunks.length === 0 || length === 0) {\n    return new Uint8Array(0)\n  }\n  if (chunks.length === 1) {\n    // fast-path\n    return new Uint8Array(chunks[0])\n  }\n  const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer)\n\n  let offset = 0\n  for (let i = 0; i < chunks.length; ++i) {\n    const chunk = chunks[i]\n    buffer.set(chunk, offset)\n    offset += chunk.length\n  }\n\n  return buffer\n}\n\n/**\n * @param {Consume} consume\n * @param {BufferEncoding} encoding\n * @returns {void}\n */\nfunction consumeEnd (consume, encoding) {\n  const { type, body, resolve, stream, length } = consume\n\n  try {\n    if (type === 'text') {\n      resolve(chunksDecode(body, length, encoding))\n    } else if (type === 'json') {\n      resolve(JSON.parse(chunksDecode(body, length, encoding)))\n    } else if (type === 'arrayBuffer') {\n      resolve(chunksConcat(body, length).buffer)\n    } else if (type === 'blob') {\n      resolve(new Blob(body, { type: stream[kContentType] }))\n    } else if (type === 'bytes') {\n      resolve(chunksConcat(body, length))\n    }\n\n    consumeFinish(consume)\n  } catch (err) {\n    stream.destroy(err)\n  }\n}\n\n/**\n * @param {Consume} consume\n * @param {Buffer} chunk\n * @returns {void}\n */\nfunction consumePush (consume, chunk) {\n  consume.length += chunk.length\n  consume.body.push(chunk)\n}\n\n/**\n * @param {Consume} consume\n * @param {Error} [err]\n * @returns {void}\n */\nfunction consumeFinish (consume, err) {\n  if (consume.body === null) {\n    return\n  }\n\n  if (err) {\n    consume.reject(err)\n  } else {\n    consume.resolve()\n  }\n\n  // Reset the consume object to allow for garbage collection.\n  consume.type = null\n  consume.stream = null\n  consume.resolve = null\n  consume.reject = null\n  consume.length = 0\n  consume.body = null\n}\n\nmodule.exports = {\n  Readable: BodyReadable,\n  chunksDecode\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { Readable } = require('./readable')\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst util = require('../core/util')\n\nfunction noop () {}\n\nclass RequestHandler extends AsyncResource {\n  constructor (opts, callback) {\n    if (!opts || typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts\n\n    try {\n      if (typeof callback !== 'function') {\n        throw new InvalidArgumentError('invalid callback')\n      }\n\n      if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {\n        throw new InvalidArgumentError('invalid highWaterMark')\n      }\n\n      if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n        throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n      }\n\n      if (method === 'CONNECT') {\n        throw new InvalidArgumentError('invalid method')\n      }\n\n      if (onInfo && typeof onInfo !== 'function') {\n        throw new InvalidArgumentError('invalid onInfo callback')\n      }\n\n      super('UNDICI_REQUEST')\n    } catch (err) {\n      if (util.isStream(body)) {\n        util.destroy(body.on('error', noop), err)\n      }\n      throw err\n    }\n\n    this.method = method\n    this.responseHeaders = responseHeaders || null\n    this.opaque = opaque || null\n    this.callback = callback\n    this.res = null\n    this.abort = null\n    this.body = body\n    this.trailers = {}\n    this.context = null\n    this.onInfo = onInfo || null\n    this.highWaterMark = highWaterMark\n    this.reason = null\n    this.removeAbortListener = null\n\n    if (signal?.aborted) {\n      this.reason = signal.reason ?? new RequestAbortedError()\n    } else if (signal) {\n      this.removeAbortListener = util.addAbortListener(signal, () => {\n        this.reason = signal.reason ?? new RequestAbortedError()\n        if (this.res) {\n          util.destroy(this.res.on('error', noop), this.reason)\n        } else if (this.abort) {\n          this.abort(this.reason)\n        }\n      })\n    }\n  }\n\n  onConnect (abort, context) {\n    if (this.reason) {\n      abort(this.reason)\n      return\n    }\n\n    assert(this.callback)\n\n    this.abort = abort\n    this.context = context\n  }\n\n  onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n    const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this\n\n    const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n    if (statusCode < 200) {\n      if (this.onInfo) {\n        this.onInfo({ statusCode, headers })\n      }\n      return\n    }\n\n    const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers\n    const contentType = parsedHeaders['content-type']\n    const contentLength = parsedHeaders['content-length']\n    const res = new Readable({\n      resume,\n      abort,\n      contentType,\n      contentLength: this.method !== 'HEAD' && contentLength\n        ? Number(contentLength)\n        : null,\n      highWaterMark\n    })\n\n    if (this.removeAbortListener) {\n      res.on('close', this.removeAbortListener)\n      this.removeAbortListener = null\n    }\n\n    this.callback = null\n    this.res = res\n    if (callback !== null) {\n      try {\n        this.runInAsyncScope(callback, null, null, {\n          statusCode,\n          statusText: statusMessage,\n          headers,\n          trailers: this.trailers,\n          opaque,\n          body: res,\n          context\n        })\n      } catch (err) {\n        // If the callback throws synchronously, we need to handle it\n        // Remove reference to res to allow res being garbage collected\n        this.res = null\n\n        // Destroy the response stream\n        util.destroy(res.on('error', noop), err)\n\n        // Use queueMicrotask to re-throw the error so it reaches uncaughtException\n        queueMicrotask(() => {\n          throw err\n        })\n      }\n    }\n  }\n\n  onData (chunk) {\n    return this.res.push(chunk)\n  }\n\n  onComplete (trailers) {\n    util.parseHeaders(trailers, this.trailers)\n    this.res.push(null)\n  }\n\n  onError (err) {\n    const { res, callback, body, opaque } = this\n\n    if (callback) {\n      // TODO: Does this need queueMicrotask?\n      this.callback = null\n      queueMicrotask(() => {\n        this.runInAsyncScope(callback, null, err, { opaque })\n      })\n    }\n\n    if (res) {\n      this.res = null\n      // Ensure all queued handlers are invoked before destroying res.\n      queueMicrotask(() => {\n        util.destroy(res.on('error', noop), err)\n      })\n    }\n\n    if (body) {\n      this.body = null\n\n      if (util.isStream(body)) {\n        body.on('error', noop)\n        util.destroy(body, err)\n      }\n    }\n\n    if (this.removeAbortListener) {\n      this.removeAbortListener()\n      this.removeAbortListener = null\n    }\n  }\n}\n\nfunction request (opts, callback) {\n  if (callback === undefined) {\n    return new Promise((resolve, reject) => {\n      request.call(this, opts, (err, data) => {\n        return err ? reject(err) : resolve(data)\n      })\n    })\n  }\n\n  try {\n    const handler = new RequestHandler(opts, callback)\n\n    this.dispatch(opts, handler)\n  } catch (err) {\n    if (typeof callback !== 'function') {\n      throw err\n    }\n    const opaque = opts?.opaque\n    queueMicrotask(() => callback(err, { opaque }))\n  }\n}\n\nmodule.exports = request\nmodule.exports.RequestHandler = RequestHandler\n","'use strict'\n\nconst { addAbortListener } = require('../core/util')\nconst { RequestAbortedError } = require('../core/errors')\n\nconst kListener = Symbol('kListener')\nconst kSignal = Symbol('kSignal')\n\nfunction abort (self) {\n  if (self.abort) {\n    self.abort(self[kSignal]?.reason)\n  } else {\n    self.reason = self[kSignal]?.reason ?? new RequestAbortedError()\n  }\n  removeSignal(self)\n}\n\nfunction addSignal (self, signal) {\n  self.reason = null\n\n  self[kSignal] = null\n  self[kListener] = null\n\n  if (!signal) {\n    return\n  }\n\n  if (signal.aborted) {\n    abort(self)\n    return\n  }\n\n  self[kSignal] = signal\n  self[kListener] = () => {\n    abort(self)\n  }\n\n  addAbortListener(self[kSignal], self[kListener])\n}\n\nfunction removeSignal (self) {\n  if (!self[kSignal]) {\n    return\n  }\n\n  if ('removeEventListener' in self[kSignal]) {\n    self[kSignal].removeEventListener('abort', self[kListener])\n  } else {\n    self[kSignal].removeListener('abort', self[kListener])\n  }\n\n  self[kSignal] = null\n  self[kListener] = null\n}\n\nmodule.exports = {\n  addSignal,\n  removeSignal\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { finished } = require('node:stream')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, InvalidReturnValueError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nclass StreamHandler extends AsyncResource {\n  constructor (opts, factory, callback) {\n    if (!opts || typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    const { signal, method, opaque, body, onInfo, responseHeaders } = opts\n\n    try {\n      if (typeof callback !== 'function') {\n        throw new InvalidArgumentError('invalid callback')\n      }\n\n      if (typeof factory !== 'function') {\n        throw new InvalidArgumentError('invalid factory')\n      }\n\n      if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n        throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n      }\n\n      if (method === 'CONNECT') {\n        throw new InvalidArgumentError('invalid method')\n      }\n\n      if (onInfo && typeof onInfo !== 'function') {\n        throw new InvalidArgumentError('invalid onInfo callback')\n      }\n\n      super('UNDICI_STREAM')\n    } catch (err) {\n      if (util.isStream(body)) {\n        util.destroy(body.on('error', noop), err)\n      }\n      throw err\n    }\n\n    this.responseHeaders = responseHeaders || null\n    this.opaque = opaque || null\n    this.factory = factory\n    this.callback = callback\n    this.res = null\n    this.abort = null\n    this.context = null\n    this.trailers = null\n    this.body = body\n    this.onInfo = onInfo || null\n\n    if (util.isStream(body)) {\n      body.on('error', (err) => {\n        this.onError(err)\n      })\n    }\n\n    addSignal(this, signal)\n  }\n\n  onConnect (abort, context) {\n    if (this.reason) {\n      abort(this.reason)\n      return\n    }\n\n    assert(this.callback)\n\n    this.abort = abort\n    this.context = context\n  }\n\n  onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n    const { factory, opaque, context, responseHeaders } = this\n\n    const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n    if (statusCode < 200) {\n      if (this.onInfo) {\n        this.onInfo({ statusCode, headers })\n      }\n      return\n    }\n\n    this.factory = null\n\n    if (factory === null) {\n      return\n    }\n\n    const res = this.runInAsyncScope(factory, null, {\n      statusCode,\n      headers,\n      opaque,\n      context\n    })\n\n    if (\n      !res ||\n      typeof res.write !== 'function' ||\n      typeof res.end !== 'function' ||\n      typeof res.on !== 'function'\n    ) {\n      throw new InvalidReturnValueError('expected Writable')\n    }\n\n    // TODO: Avoid finished. It registers an unnecessary amount of listeners.\n    finished(res, { readable: false }, (err) => {\n      const { callback, res, opaque, trailers, abort } = this\n\n      this.res = null\n      if (err || !res?.readable) {\n        util.destroy(res, err)\n      }\n\n      this.callback = null\n      this.runInAsyncScope(callback, null, err || null, { opaque, trailers })\n\n      if (err) {\n        abort()\n      }\n    })\n\n    res.on('drain', resume)\n\n    this.res = res\n\n    const needDrain = res.writableNeedDrain !== undefined\n      ? res.writableNeedDrain\n      : res._writableState?.needDrain\n\n    return needDrain !== true\n  }\n\n  onData (chunk) {\n    const { res } = this\n\n    return res ? res.write(chunk) : true\n  }\n\n  onComplete (trailers) {\n    const { res } = this\n\n    removeSignal(this)\n\n    if (!res) {\n      return\n    }\n\n    this.trailers = util.parseHeaders(trailers)\n\n    res.end()\n  }\n\n  onError (err) {\n    const { res, callback, opaque, body } = this\n\n    removeSignal(this)\n\n    this.factory = null\n\n    if (res) {\n      this.res = null\n      util.destroy(res, err)\n    } else if (callback) {\n      this.callback = null\n      queueMicrotask(() => {\n        this.runInAsyncScope(callback, null, err, { opaque })\n      })\n    }\n\n    if (body) {\n      this.body = null\n      util.destroy(body, err)\n    }\n  }\n}\n\nfunction stream (opts, factory, callback) {\n  if (callback === undefined) {\n    return new Promise((resolve, reject) => {\n      stream.call(this, opts, factory, (err, data) => {\n        return err ? reject(err) : resolve(data)\n      })\n    })\n  }\n\n  try {\n    const handler = new StreamHandler(opts, factory, callback)\n\n    this.dispatch(opts, handler)\n  } catch (err) {\n    if (typeof callback !== 'function') {\n      throw err\n    }\n    const opaque = opts?.opaque\n    queueMicrotask(() => callback(err, { opaque }))\n  }\n}\n\nmodule.exports = stream\n","'use strict'\n\nconst {\n  Readable,\n  Duplex,\n  PassThrough\n} = require('node:stream')\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst {\n  InvalidArgumentError,\n  InvalidReturnValueError,\n  RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nconst kResume = Symbol('resume')\n\nclass PipelineRequest extends Readable {\n  constructor () {\n    super({ autoDestroy: true })\n\n    this[kResume] = null\n  }\n\n  _read () {\n    const { [kResume]: resume } = this\n\n    if (resume) {\n      this[kResume] = null\n      resume()\n    }\n  }\n\n  _destroy (err, callback) {\n    this._read()\n\n    callback(err)\n  }\n}\n\nclass PipelineResponse extends Readable {\n  constructor (resume) {\n    super({ autoDestroy: true })\n    this[kResume] = resume\n  }\n\n  _read () {\n    this[kResume]()\n  }\n\n  _destroy (err, callback) {\n    if (!err && !this._readableState.endEmitted) {\n      err = new RequestAbortedError()\n    }\n\n    callback(err)\n  }\n}\n\nclass PipelineHandler extends AsyncResource {\n  constructor (opts, handler) {\n    if (!opts || typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    if (typeof handler !== 'function') {\n      throw new InvalidArgumentError('invalid handler')\n    }\n\n    const { signal, method, opaque, onInfo, responseHeaders } = opts\n\n    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n    }\n\n    if (method === 'CONNECT') {\n      throw new InvalidArgumentError('invalid method')\n    }\n\n    if (onInfo && typeof onInfo !== 'function') {\n      throw new InvalidArgumentError('invalid onInfo callback')\n    }\n\n    super('UNDICI_PIPELINE')\n\n    this.opaque = opaque || null\n    this.responseHeaders = responseHeaders || null\n    this.handler = handler\n    this.abort = null\n    this.context = null\n    this.onInfo = onInfo || null\n\n    this.req = new PipelineRequest().on('error', noop)\n\n    this.ret = new Duplex({\n      readableObjectMode: opts.objectMode,\n      autoDestroy: true,\n      read: () => {\n        const { body } = this\n\n        if (body?.resume) {\n          body.resume()\n        }\n      },\n      write: (chunk, encoding, callback) => {\n        const { req } = this\n\n        if (req.push(chunk, encoding) || req._readableState.destroyed) {\n          callback()\n        } else {\n          req[kResume] = callback\n        }\n      },\n      destroy: (err, callback) => {\n        const { body, req, res, ret, abort } = this\n\n        if (!err && !ret._readableState.endEmitted) {\n          err = new RequestAbortedError()\n        }\n\n        if (abort && err) {\n          abort()\n        }\n\n        util.destroy(body, err)\n        util.destroy(req, err)\n        util.destroy(res, err)\n\n        removeSignal(this)\n\n        callback(err)\n      }\n    }).on('prefinish', () => {\n      const { req } = this\n\n      // Node < 15 does not call _final in same tick.\n      req.push(null)\n    })\n\n    this.res = null\n\n    addSignal(this, signal)\n  }\n\n  onConnect (abort, context) {\n    const { res } = this\n\n    if (this.reason) {\n      abort(this.reason)\n      return\n    }\n\n    assert(!res, 'pipeline cannot be retried')\n\n    this.abort = abort\n    this.context = context\n  }\n\n  onHeaders (statusCode, rawHeaders, resume) {\n    const { opaque, handler, context } = this\n\n    if (statusCode < 200) {\n      if (this.onInfo) {\n        const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n        this.onInfo({ statusCode, headers })\n      }\n      return\n    }\n\n    this.res = new PipelineResponse(resume)\n\n    let body\n    try {\n      this.handler = null\n      const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n      body = this.runInAsyncScope(handler, null, {\n        statusCode,\n        headers,\n        opaque,\n        body: this.res,\n        context\n      })\n    } catch (err) {\n      this.res.on('error', noop)\n      throw err\n    }\n\n    if (!body || typeof body.on !== 'function') {\n      throw new InvalidReturnValueError('expected Readable')\n    }\n\n    body\n      .on('data', (chunk) => {\n        const { ret, body } = this\n\n        if (!ret.push(chunk) && body.pause) {\n          body.pause()\n        }\n      })\n      .on('error', (err) => {\n        const { ret } = this\n\n        util.destroy(ret, err)\n      })\n      .on('end', () => {\n        const { ret } = this\n\n        ret.push(null)\n      })\n      .on('close', () => {\n        const { ret } = this\n\n        if (!ret._readableState.ended) {\n          util.destroy(ret, new RequestAbortedError())\n        }\n      })\n\n    this.body = body\n  }\n\n  onData (chunk) {\n    const { res } = this\n    return res.push(chunk)\n  }\n\n  onComplete (trailers) {\n    const { res } = this\n    res.push(null)\n  }\n\n  onError (err) {\n    const { ret } = this\n    this.handler = null\n    util.destroy(ret, err)\n  }\n}\n\nfunction pipeline (opts, handler) {\n  try {\n    const pipelineHandler = new PipelineHandler(opts, handler)\n    this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler)\n    return pipelineHandler.ret\n  } catch (err) {\n    return new PassThrough().destroy(err)\n  }\n}\n\nmodule.exports = pipeline\n","'use strict'\n\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst { AsyncResource } = require('node:async_hooks')\nconst assert = require('node:assert')\nconst util = require('../core/util')\nconst { kHTTP2Stream } = require('../core/symbols')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass UpgradeHandler extends AsyncResource {\n  constructor (opts, callback) {\n    if (!opts || typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    if (typeof callback !== 'function') {\n      throw new InvalidArgumentError('invalid callback')\n    }\n\n    const { signal, opaque, responseHeaders } = opts\n\n    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n    }\n\n    super('UNDICI_UPGRADE')\n\n    this.responseHeaders = responseHeaders || null\n    this.opaque = opaque || null\n    this.callback = callback\n    this.abort = null\n    this.context = null\n\n    addSignal(this, signal)\n  }\n\n  onConnect (abort, context) {\n    if (this.reason) {\n      abort(this.reason)\n      return\n    }\n\n    assert(this.callback)\n\n    this.abort = abort\n    this.context = null\n  }\n\n  onHeaders () {\n    throw new SocketError('bad upgrade', null)\n  }\n\n  onUpgrade (statusCode, rawHeaders, socket) {\n    assert(socket[kHTTP2Stream] === true ? statusCode === 200 : statusCode === 101)\n\n    const { callback, opaque, context } = this\n\n    removeSignal(this)\n\n    this.callback = null\n    const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n    this.runInAsyncScope(callback, null, null, {\n      headers,\n      socket,\n      opaque,\n      context\n    })\n  }\n\n  onError (err) {\n    const { callback, opaque } = this\n\n    removeSignal(this)\n\n    if (callback) {\n      this.callback = null\n      queueMicrotask(() => {\n        this.runInAsyncScope(callback, null, err, { opaque })\n      })\n    }\n  }\n}\n\nfunction upgrade (opts, callback) {\n  if (callback === undefined) {\n    return new Promise((resolve, reject) => {\n      upgrade.call(this, opts, (err, data) => {\n        return err ? reject(err) : resolve(data)\n      })\n    })\n  }\n\n  try {\n    const upgradeHandler = new UpgradeHandler(opts, callback)\n    const upgradeOpts = {\n      ...opts,\n      method: opts.method || 'GET',\n      upgrade: opts.protocol || 'Websocket'\n    }\n\n    this.dispatch(upgradeOpts, upgradeHandler)\n  } catch (err) {\n    if (typeof callback !== 'function') {\n      throw err\n    }\n    const opaque = opts?.opaque\n    queueMicrotask(() => callback(err, { opaque }))\n  }\n}\n\nmodule.exports = upgrade\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass ConnectHandler extends AsyncResource {\n  constructor (opts, callback) {\n    if (!opts || typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    if (typeof callback !== 'function') {\n      throw new InvalidArgumentError('invalid callback')\n    }\n\n    const { signal, opaque, responseHeaders } = opts\n\n    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n    }\n\n    super('UNDICI_CONNECT')\n\n    this.opaque = opaque || null\n    this.responseHeaders = responseHeaders || null\n    this.callback = callback\n    this.abort = null\n\n    addSignal(this, signal)\n  }\n\n  onConnect (abort, context) {\n    if (this.reason) {\n      abort(this.reason)\n      return\n    }\n\n    assert(this.callback)\n\n    this.abort = abort\n    this.context = context\n  }\n\n  onHeaders () {\n    throw new SocketError('bad connect', null)\n  }\n\n  onUpgrade (statusCode, rawHeaders, socket) {\n    const { callback, opaque, context } = this\n\n    removeSignal(this)\n\n    this.callback = null\n\n    let headers = rawHeaders\n    // Indicates is an HTTP2Session\n    if (headers != null) {\n      headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n    }\n\n    this.runInAsyncScope(callback, null, null, {\n      statusCode,\n      headers,\n      socket,\n      opaque,\n      context\n    })\n  }\n\n  onError (err) {\n    const { callback, opaque } = this\n\n    removeSignal(this)\n\n    if (callback) {\n      this.callback = null\n      queueMicrotask(() => {\n        this.runInAsyncScope(callback, null, err, { opaque })\n      })\n    }\n  }\n}\n\nfunction connect (opts, callback) {\n  if (callback === undefined) {\n    return new Promise((resolve, reject) => {\n      connect.call(this, opts, (err, data) => {\n        return err ? reject(err) : resolve(data)\n      })\n    })\n  }\n\n  try {\n    const connectHandler = new ConnectHandler(opts, callback)\n    const connectOptions = { ...opts, method: 'CONNECT' }\n\n    this.dispatch(connectOptions, connectHandler)\n  } catch (err) {\n    if (typeof callback !== 'function') {\n      throw err\n    }\n    const opaque = opts?.opaque\n    queueMicrotask(() => callback(err, { opaque }))\n  }\n}\n\nmodule.exports = connect\n","'use strict'\n\nmodule.exports.request = require('./api-request')\nmodule.exports.stream = require('./api-stream')\nmodule.exports.pipeline = require('./api-pipeline')\nmodule.exports.upgrade = require('./api-upgrade')\nmodule.exports.connect = require('./api-connect')\n","'use strict'\n\nconst { UndiciError } = require('../core/errors')\n\nconst kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED')\n\n/**\n * The request does not match any registered mock dispatches.\n */\nclass MockNotMatchedError extends UndiciError {\n  constructor (message) {\n    super(message)\n    this.name = 'MockNotMatchedError'\n    this.message = message || 'The request does not match any registered mock dispatches'\n    this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'\n  }\n\n  static [Symbol.hasInstance] (instance) {\n    return instance && instance[kMockNotMatchedError] === true\n  }\n\n  get [kMockNotMatchedError] () {\n    return true\n  }\n}\n\nmodule.exports = {\n  MockNotMatchedError\n}\n","'use strict'\n\nmodule.exports = {\n  kAgent: Symbol('agent'),\n  kOptions: Symbol('options'),\n  kFactory: Symbol('factory'),\n  kDispatches: Symbol('dispatches'),\n  kDispatchKey: Symbol('dispatch key'),\n  kDefaultHeaders: Symbol('default headers'),\n  kDefaultTrailers: Symbol('default trailers'),\n  kContentLength: Symbol('content length'),\n  kMockAgent: Symbol('mock agent'),\n  kMockAgentSet: Symbol('mock agent set'),\n  kMockAgentGet: Symbol('mock agent get'),\n  kMockDispatch: Symbol('mock dispatch'),\n  kClose: Symbol('close'),\n  kOriginalClose: Symbol('original agent close'),\n  kOriginalDispatch: Symbol('original dispatch'),\n  kOrigin: Symbol('origin'),\n  kIsMockActive: Symbol('is mock active'),\n  kNetConnect: Symbol('net connect'),\n  kGetNetConnect: Symbol('get net connect'),\n  kConnected: Symbol('connected'),\n  kIgnoreTrailingSlash: Symbol('ignore trailing slash'),\n  kMockAgentMockCallHistoryInstance: Symbol('mock agent mock call history name'),\n  kMockAgentRegisterCallHistory: Symbol('mock agent register mock call history'),\n  kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),\n  kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),\n  kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),\n  kMockCallHistoryAddLog: Symbol('mock call history add log'),\n  kTotalDispatchCount: Symbol('total dispatch count')\n}\n","'use strict'\n\nconst { MockNotMatchedError } = require('./mock-errors')\nconst {\n  kDispatches,\n  kMockAgent,\n  kOriginalDispatch,\n  kOrigin,\n  kGetNetConnect,\n  kTotalDispatchCount\n} = require('./mock-symbols')\nconst { serializePathWithQuery } = require('../core/util')\nconst { STATUS_CODES } = require('node:http')\nconst {\n  types: {\n    isPromise\n  }\n} = require('node:util')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction matchValue (match, value) {\n  if (typeof match === 'string') {\n    return match === value\n  }\n  if (match instanceof RegExp) {\n    return match.test(value)\n  }\n  if (typeof match === 'function') {\n    return match(value) === true\n  }\n  return false\n}\n\nfunction lowerCaseEntries (headers) {\n  return Object.fromEntries(\n    Object.entries(headers).map(([headerName, headerValue]) => {\n      return [headerName.toLocaleLowerCase(), headerValue]\n    })\n  )\n}\n\n/**\n * @param {import('../../index').Headers|string[]|Record<string, string>} headers\n * @param {string} key\n */\nfunction getHeaderByName (headers, key) {\n  if (Array.isArray(headers)) {\n    for (let i = 0; i < headers.length; i += 2) {\n      if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {\n        return headers[i + 1]\n      }\n    }\n\n    return undefined\n  } else if (typeof headers.get === 'function') {\n    return headers.get(key)\n  } else {\n    return lowerCaseEntries(headers)[key.toLocaleLowerCase()]\n  }\n}\n\n/** @param {string[]} headers */\nfunction buildHeadersFromArray (headers) { // fetch HeadersList\n  const clone = headers.slice()\n  const entries = []\n  for (let index = 0; index < clone.length; index += 2) {\n    entries.push([clone[index], clone[index + 1]])\n  }\n  return Object.fromEntries(entries)\n}\n\nfunction matchHeaders (mockDispatch, headers) {\n  if (typeof mockDispatch.headers === 'function') {\n    if (Array.isArray(headers)) { // fetch HeadersList\n      headers = buildHeadersFromArray(headers)\n    }\n    return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})\n  }\n  if (typeof mockDispatch.headers === 'undefined') {\n    return true\n  }\n  if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {\n    return false\n  }\n\n  for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {\n    const headerValue = getHeaderByName(headers, matchHeaderName)\n\n    if (!matchValue(matchHeaderValue, headerValue)) {\n      return false\n    }\n  }\n  return true\n}\n\nfunction normalizeSearchParams (query) {\n  if (typeof query !== 'string') {\n    return query\n  }\n\n  const originalQp = new URLSearchParams(query)\n  const normalizedQp = new URLSearchParams()\n\n  for (let [key, value] of originalQp.entries()) {\n    key = key.replace('[]', '')\n\n    const valueRepresentsString = /^(['\"]).*\\1$/.test(value)\n    if (valueRepresentsString) {\n      normalizedQp.append(key, value)\n      continue\n    }\n\n    if (value.includes(',')) {\n      const values = value.split(',')\n      for (const v of values) {\n        normalizedQp.append(key, v)\n      }\n      continue\n    }\n\n    normalizedQp.append(key, value)\n  }\n\n  return normalizedQp\n}\n\nfunction safeUrl (path) {\n  if (typeof path !== 'string') {\n    return path\n  }\n  const pathSegments = path.split('?', 3)\n  if (pathSegments.length !== 2) {\n    return path\n  }\n\n  const qp = new URLSearchParams(pathSegments.pop())\n  qp.sort()\n  return [...pathSegments, qp.toString()].join('?')\n}\n\nfunction matchKey (mockDispatch, { path, method, body, headers }) {\n  const pathMatch = matchValue(mockDispatch.path, path)\n  const methodMatch = matchValue(mockDispatch.method, method)\n  const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true\n  const headersMatch = matchHeaders(mockDispatch, headers)\n  return pathMatch && methodMatch && bodyMatch && headersMatch\n}\n\nfunction getResponseData (data) {\n  if (Buffer.isBuffer(data)) {\n    return data\n  } else if (data instanceof Uint8Array) {\n    return data\n  } else if (data instanceof ArrayBuffer) {\n    return data\n  } else if (typeof data === 'object') {\n    return JSON.stringify(data)\n  } else if (data) {\n    return data.toString()\n  } else {\n    return ''\n  }\n}\n\nfunction getMockDispatch (mockDispatches, key) {\n  const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path\n  const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath\n\n  const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath)\n\n  // Match path\n  let matchedMockDispatches = mockDispatches\n    .filter(({ consumed }) => !consumed)\n    .filter(({ path, ignoreTrailingSlash }) => {\n      return ignoreTrailingSlash\n        ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash)\n        : matchValue(safeUrl(path), resolvedPath)\n    })\n  if (matchedMockDispatches.length === 0) {\n    throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)\n  }\n\n  // Match method\n  matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))\n  if (matchedMockDispatches.length === 0) {\n    throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`)\n  }\n\n  // Match body\n  matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)\n  if (matchedMockDispatches.length === 0) {\n    throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`)\n  }\n\n  // Match headers\n  matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))\n  if (matchedMockDispatches.length === 0) {\n    const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers\n    throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`)\n  }\n\n  return matchedMockDispatches[0]\n}\n\nfunction addMockDispatch (mockDispatches, key, data, opts) {\n  const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }\n  const replyData = typeof data === 'function' ? { callback: data } : { ...data }\n  const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }\n  mockDispatches.push(newMockDispatch)\n  // Track total number of intercepts ever registered for better error messages\n  mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1\n  return newMockDispatch\n}\n\nfunction deleteMockDispatch (mockDispatches, key) {\n  const index = mockDispatches.findIndex(dispatch => {\n    if (!dispatch.consumed) {\n      return false\n    }\n    return matchKey(dispatch, key)\n  })\n  if (index !== -1) {\n    mockDispatches.splice(index, 1)\n  }\n}\n\n/**\n * @param {string} path Path to remove trailing slash from\n */\nfunction removeTrailingSlash (path) {\n  while (path.endsWith('/')) {\n    path = path.slice(0, -1)\n  }\n\n  if (path.length === 0) {\n    path = '/'\n  }\n\n  return path\n}\n\nfunction buildKey (opts) {\n  const { path, method, body, headers, query } = opts\n\n  return {\n    path,\n    method,\n    body,\n    headers,\n    query\n  }\n}\n\nfunction generateKeyValues (data) {\n  const keys = Object.keys(data)\n  const result = []\n  for (let i = 0; i < keys.length; ++i) {\n    const key = keys[i]\n    const value = data[key]\n    const name = Buffer.from(`${key}`)\n    if (Array.isArray(value)) {\n      for (let j = 0; j < value.length; ++j) {\n        result.push(name, Buffer.from(`${value[j]}`))\n      }\n    } else {\n      result.push(name, Buffer.from(`${value}`))\n    }\n  }\n  return result\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n * @param {number} statusCode\n */\nfunction getStatusText (statusCode) {\n  return STATUS_CODES[statusCode] || 'unknown'\n}\n\nasync function getResponse (body) {\n  const buffers = []\n  for await (const data of body) {\n    buffers.push(data)\n  }\n  return Buffer.concat(buffers).toString('utf8')\n}\n\n/**\n * Mock dispatch function used to simulate undici dispatches\n */\nfunction mockDispatch (opts, handler) {\n  // Get mock dispatch from built key\n  const key = buildKey(opts)\n  const mockDispatch = getMockDispatch(this[kDispatches], key)\n\n  mockDispatch.timesInvoked++\n\n  // Here's where we resolve a callback if a callback is present for the dispatch data.\n  if (mockDispatch.data.callback) {\n    mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }\n  }\n\n  // Parse mockDispatch data\n  const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch\n  const { timesInvoked, times } = mockDispatch\n\n  // If it's used up and not persistent, mark as consumed\n  mockDispatch.consumed = !persist && timesInvoked >= times\n  mockDispatch.pending = timesInvoked < times\n\n  // If specified, trigger dispatch error\n  if (error !== null) {\n    deleteMockDispatch(this[kDispatches], key)\n    handler.onError(error)\n    return true\n  }\n\n  // Track whether the request has been aborted\n  let aborted = false\n  let timer = null\n\n  function abort (err) {\n    if (aborted) {\n      return\n    }\n    aborted = true\n\n    // Clear the pending delayed response if any\n    if (timer !== null) {\n      clearTimeout(timer)\n      timer = null\n    }\n\n    // Notify the handler of the abort\n    handler.onError(err)\n  }\n\n  // Call onConnect to allow the handler to register the abort callback\n  handler.onConnect?.(abort, null)\n\n  // Handle the request with a delay if necessary\n  if (typeof delay === 'number' && delay > 0) {\n    timer = setTimeout(() => {\n      timer = null\n      handleReply(this[kDispatches])\n    }, delay)\n  } else {\n    handleReply(this[kDispatches])\n  }\n\n  function handleReply (mockDispatches, _data = data) {\n    // Don't send response if the request was aborted\n    if (aborted) {\n      return\n    }\n\n    // fetch's HeadersList is a 1D string array\n    const optsHeaders = Array.isArray(opts.headers)\n      ? buildHeadersFromArray(opts.headers)\n      : opts.headers\n    const body = typeof _data === 'function'\n      ? _data({ ...opts, headers: optsHeaders })\n      : _data\n\n    // util.types.isPromise is likely needed for jest.\n    if (isPromise(body)) {\n      // If handleReply is asynchronous, throwing an error\n      // in the callback will reject the promise, rather than\n      // synchronously throw the error, which breaks some tests.\n      // Rather, we wait for the callback to resolve if it is a\n      // promise, and then re-run handleReply with the new body.\n      return body.then((newData) => handleReply(mockDispatches, newData))\n    }\n\n    // Check again if aborted after async body resolution\n    if (aborted) {\n      return\n    }\n\n    const responseData = getResponseData(body)\n    const responseHeaders = generateKeyValues(headers)\n    const responseTrailers = generateKeyValues(trailers)\n\n    handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode))\n    handler.onData?.(Buffer.from(responseData))\n    handler.onComplete?.(responseTrailers)\n    deleteMockDispatch(mockDispatches, key)\n  }\n\n  function resume () {}\n\n  return true\n}\n\nfunction buildMockDispatch () {\n  const agent = this[kMockAgent]\n  const origin = this[kOrigin]\n  const originalDispatch = this[kOriginalDispatch]\n\n  return function dispatch (opts, handler) {\n    if (agent.isMockActive) {\n      try {\n        mockDispatch.call(this, opts, handler)\n      } catch (error) {\n        if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {\n          const netConnect = agent[kGetNetConnect]()\n          const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length\n          const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length\n          const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`\n          if (netConnect === false) {\n            throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`)\n          }\n          if (checkNetConnect(netConnect, origin)) {\n            originalDispatch.call(this, opts, handler)\n          } else {\n            throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`)\n          }\n        } else {\n          throw error\n        }\n      }\n    } else {\n      originalDispatch.call(this, opts, handler)\n    }\n  }\n}\n\nfunction checkNetConnect (netConnect, origin) {\n  const url = new URL(origin)\n  if (netConnect === true) {\n    return true\n  } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {\n    return true\n  }\n  return false\n}\n\nfunction normalizeOrigin (origin) {\n  if (typeof origin !== 'string' && !(origin instanceof URL)) {\n    return origin\n  }\n\n  if (origin instanceof URL) {\n    return origin.origin\n  }\n\n  return origin.toLowerCase()\n}\n\nfunction buildAndValidateMockOptions (opts) {\n  const { agent, ...mockOptions } = opts\n\n  if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== 'boolean') {\n    throw new InvalidArgumentError('options.enableCallHistory must to be a boolean')\n  }\n\n  if ('acceptNonStandardSearchParameters' in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== 'boolean') {\n    throw new InvalidArgumentError('options.acceptNonStandardSearchParameters must to be a boolean')\n  }\n\n  if ('ignoreTrailingSlash' in mockOptions && typeof mockOptions.ignoreTrailingSlash !== 'boolean') {\n    throw new InvalidArgumentError('options.ignoreTrailingSlash must to be a boolean')\n  }\n\n  return mockOptions\n}\n\nmodule.exports = {\n  getResponseData,\n  getMockDispatch,\n  addMockDispatch,\n  deleteMockDispatch,\n  buildKey,\n  generateKeyValues,\n  matchValue,\n  getResponse,\n  getStatusText,\n  mockDispatch,\n  buildMockDispatch,\n  checkNetConnect,\n  buildAndValidateMockOptions,\n  getHeaderByName,\n  buildHeadersFromArray,\n  normalizeSearchParams,\n  normalizeOrigin\n}\n","'use strict'\n\nconst { getResponseData, buildKey, addMockDispatch } = require('./mock-utils')\nconst {\n  kDispatches,\n  kDispatchKey,\n  kDefaultHeaders,\n  kDefaultTrailers,\n  kContentLength,\n  kMockDispatch,\n  kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * Defines the scope API for an interceptor reply\n */\nclass MockScope {\n  constructor (mockDispatch) {\n    this[kMockDispatch] = mockDispatch\n  }\n\n  /**\n   * Delay a reply by a set amount in ms.\n   */\n  delay (waitInMs) {\n    if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {\n      throw new InvalidArgumentError('waitInMs must be a valid integer > 0')\n    }\n\n    this[kMockDispatch].delay = waitInMs\n    return this\n  }\n\n  /**\n   * For a defined reply, never mark as consumed.\n   */\n  persist () {\n    this[kMockDispatch].persist = true\n    return this\n  }\n\n  /**\n   * Allow one to define a reply for a set amount of matching requests.\n   */\n  times (repeatTimes) {\n    if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {\n      throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')\n    }\n\n    this[kMockDispatch].times = repeatTimes\n    return this\n  }\n}\n\n/**\n * Defines an interceptor for a Mock\n */\nclass MockInterceptor {\n  constructor (opts, mockDispatches) {\n    if (typeof opts !== 'object') {\n      throw new InvalidArgumentError('opts must be an object')\n    }\n    if (typeof opts.path === 'undefined') {\n      throw new InvalidArgumentError('opts.path must be defined')\n    }\n    if (typeof opts.method === 'undefined') {\n      opts.method = 'GET'\n    }\n    // See https://github.com/nodejs/undici/issues/1245\n    // As per RFC 3986, clients are not supposed to send URI\n    // fragments to servers when they retrieve a document,\n    if (typeof opts.path === 'string') {\n      if (opts.query) {\n        opts.path = serializePathWithQuery(opts.path, opts.query)\n      } else {\n        // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811\n        const parsedURL = new URL(opts.path, 'data://')\n        opts.path = parsedURL.pathname + parsedURL.search\n      }\n    }\n    if (typeof opts.method === 'string') {\n      opts.method = opts.method.toUpperCase()\n    }\n\n    this[kDispatchKey] = buildKey(opts)\n    this[kDispatches] = mockDispatches\n    this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n    this[kDefaultHeaders] = {}\n    this[kDefaultTrailers] = {}\n    this[kContentLength] = false\n  }\n\n  createMockScopeDispatchData ({ statusCode, data, responseOptions }) {\n    const responseData = getResponseData(data)\n    const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}\n    const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }\n    const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }\n\n    return { statusCode, data, headers, trailers }\n  }\n\n  validateReplyParameters (replyParameters) {\n    if (typeof replyParameters.statusCode === 'undefined') {\n      throw new InvalidArgumentError('statusCode must be defined')\n    }\n    if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) {\n      throw new InvalidArgumentError('responseOptions must be an object')\n    }\n  }\n\n  /**\n   * Mock an undici request with a defined reply.\n   */\n  reply (replyOptionsCallbackOrStatusCode) {\n    // Values of reply aren't available right now as they\n    // can only be available when the reply callback is invoked.\n    if (typeof replyOptionsCallbackOrStatusCode === 'function') {\n      // We'll first wrap the provided callback in another function,\n      // this function will properly resolve the data from the callback\n      // when invoked.\n      const wrappedDefaultsCallback = (opts) => {\n        // Our reply options callback contains the parameter for statusCode, data and options.\n        const resolvedData = replyOptionsCallbackOrStatusCode(opts)\n\n        // Check if it is in the right format\n        if (typeof resolvedData !== 'object' || resolvedData === null) {\n          throw new InvalidArgumentError('reply options callback must return an object')\n        }\n\n        const replyParameters = { data: '', responseOptions: {}, ...resolvedData }\n        this.validateReplyParameters(replyParameters)\n        // Since the values can be obtained immediately we return them\n        // from this higher order function that will be resolved later.\n        return {\n          ...this.createMockScopeDispatchData(replyParameters)\n        }\n      }\n\n      // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.\n      const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n      return new MockScope(newMockDispatch)\n    }\n\n    // We can have either one or three parameters, if we get here,\n    // we should have 1-3 parameters. So we spread the arguments of\n    // this function to obtain the parameters, since replyData will always\n    // just be the statusCode.\n    const replyParameters = {\n      statusCode: replyOptionsCallbackOrStatusCode,\n      data: arguments[1] === undefined ? '' : arguments[1],\n      responseOptions: arguments[2] === undefined ? {} : arguments[2]\n    }\n    this.validateReplyParameters(replyParameters)\n\n    // Send in-already provided data like usual\n    const dispatchData = this.createMockScopeDispatchData(replyParameters)\n    const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n    return new MockScope(newMockDispatch)\n  }\n\n  /**\n   * Mock an undici request with a defined error.\n   */\n  replyWithError (error) {\n    if (typeof error === 'undefined') {\n      throw new InvalidArgumentError('error must be defined')\n    }\n\n    const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n    return new MockScope(newMockDispatch)\n  }\n\n  /**\n   * Set default reply headers on the interceptor for subsequent replies\n   */\n  defaultReplyHeaders (headers) {\n    if (typeof headers === 'undefined') {\n      throw new InvalidArgumentError('headers must be defined')\n    }\n\n    this[kDefaultHeaders] = headers\n    return this\n  }\n\n  /**\n   * Set default reply trailers on the interceptor for subsequent replies\n   */\n  defaultReplyTrailers (trailers) {\n    if (typeof trailers === 'undefined') {\n      throw new InvalidArgumentError('trailers must be defined')\n    }\n\n    this[kDefaultTrailers] = trailers\n    return this\n  }\n\n  /**\n   * Set reply content length header for replies on the interceptor\n   */\n  replyContentLength () {\n    this[kContentLength] = true\n    return this\n  }\n}\n\nmodule.exports.MockInterceptor = MockInterceptor\nmodule.exports.MockScope = MockScope\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Client = require('../dispatcher/client')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n  kDispatches,\n  kMockAgent,\n  kClose,\n  kOriginalClose,\n  kOrigin,\n  kOriginalDispatch,\n  kConnected,\n  kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockClient provides an API that extends the Client to influence the mockDispatches.\n */\nclass MockClient extends Client {\n  constructor (origin, opts) {\n    if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n      throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n    }\n\n    super(origin, opts)\n\n    this[kMockAgent] = opts.agent\n    this[kOrigin] = origin\n    this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n    this[kDispatches] = []\n    this[kConnected] = 1\n    this[kOriginalDispatch] = this.dispatch\n    this[kOriginalClose] = this.close.bind(this)\n\n    this.dispatch = buildMockDispatch.call(this)\n    this.close = this[kClose]\n  }\n\n  get [Symbols.kConnected] () {\n    return this[kConnected]\n  }\n\n  /**\n   * Sets up the base interceptor for mocking replies from undici.\n   */\n  intercept (opts) {\n    return new MockInterceptor(\n      opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n      this[kDispatches]\n    )\n  }\n\n  cleanMocks () {\n    this[kDispatches] = []\n  }\n\n  async [kClose] () {\n    await promisify(this[kOriginalClose])()\n    this[kConnected] = 0\n    this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n  }\n}\n\nmodule.exports = MockClient\n","'use strict'\n\nconst { kMockCallHistoryAddLog } = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction handleFilterCallsWithOptions (criteria, options, handler, store) {\n  switch (options.operator) {\n    case 'OR':\n      store.push(...handler(criteria))\n\n      return store\n    case 'AND':\n      return handler.call({ logs: store }, criteria)\n    default:\n      // guard -- should never happens because buildAndValidateFilterCallsOptions is called before\n      throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n  }\n}\n\nfunction buildAndValidateFilterCallsOptions (options = {}) {\n  const finalOptions = {}\n\n  if ('operator' in options) {\n    if (typeof options.operator !== 'string' || (options.operator.toUpperCase() !== 'OR' && options.operator.toUpperCase() !== 'AND')) {\n      throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n    }\n\n    return {\n      ...finalOptions,\n      operator: options.operator.toUpperCase()\n    }\n  }\n\n  return finalOptions\n}\n\nfunction makeFilterCalls (parameterName) {\n  return (parameterValue) => {\n    if (typeof parameterValue === 'string' || parameterValue == null) {\n      return this.logs.filter((log) => {\n        return log[parameterName] === parameterValue\n      })\n    }\n    if (parameterValue instanceof RegExp) {\n      return this.logs.filter((log) => {\n        return parameterValue.test(log[parameterName])\n      })\n    }\n\n    throw new InvalidArgumentError(`${parameterName} parameter should be one of string, regexp, undefined or null`)\n  }\n}\nfunction computeUrlWithMaybeSearchParameters (requestInit) {\n  // path can contains query url parameters\n  // or query can contains query url parameters\n  try {\n    const url = new URL(requestInit.path, requestInit.origin)\n\n    // requestInit.path contains query url parameters\n    // requestInit.query is then undefined\n    if (url.search.length !== 0) {\n      return url\n    }\n\n    // requestInit.query can be populated here\n    url.search = new URLSearchParams(requestInit.query).toString()\n\n    return url\n  } catch (error) {\n    throw new InvalidArgumentError('An error occurred when computing MockCallHistoryLog.url', { cause: error })\n  }\n}\n\nclass MockCallHistoryLog {\n  constructor (requestInit = {}) {\n    this.body = requestInit.body\n    this.headers = requestInit.headers\n    this.method = requestInit.method\n\n    const url = computeUrlWithMaybeSearchParameters(requestInit)\n\n    this.fullUrl = url.toString()\n    this.origin = url.origin\n    this.path = url.pathname\n    this.searchParams = Object.fromEntries(url.searchParams)\n    this.protocol = url.protocol\n    this.host = url.host\n    this.port = url.port\n    this.hash = url.hash\n  }\n\n  toMap () {\n    return new Map([\n      ['protocol', this.protocol],\n      ['host', this.host],\n      ['port', this.port],\n      ['origin', this.origin],\n      ['path', this.path],\n      ['hash', this.hash],\n      ['searchParams', this.searchParams],\n      ['fullUrl', this.fullUrl],\n      ['method', this.method],\n      ['body', this.body],\n      ['headers', this.headers]]\n    )\n  }\n\n  toString () {\n    const options = { betweenKeyValueSeparator: '->', betweenPairSeparator: '|' }\n    let result = ''\n\n    this.toMap().forEach((value, key) => {\n      if (typeof value === 'string' || value === undefined || value === null) {\n        result = `${result}${key}${options.betweenKeyValueSeparator}${value}${options.betweenPairSeparator}`\n      }\n      if ((typeof value === 'object' && value !== null) || Array.isArray(value)) {\n        result = `${result}${key}${options.betweenKeyValueSeparator}${JSON.stringify(value)}${options.betweenPairSeparator}`\n      }\n      // maybe miss something for non Record / Array headers and searchParams here\n    })\n\n    // delete last betweenPairSeparator\n    return result.slice(0, -1)\n  }\n}\n\nclass MockCallHistory {\n  logs = []\n\n  calls () {\n    return this.logs\n  }\n\n  firstCall () {\n    return this.logs.at(0)\n  }\n\n  lastCall () {\n    return this.logs.at(-1)\n  }\n\n  nthCall (number) {\n    if (typeof number !== 'number') {\n      throw new InvalidArgumentError('nthCall must be called with a number')\n    }\n    if (!Number.isInteger(number)) {\n      throw new InvalidArgumentError('nthCall must be called with an integer')\n    }\n    if (Math.sign(number) !== 1) {\n      throw new InvalidArgumentError('nthCall must be called with a positive value. use firstCall or lastCall instead')\n    }\n\n    // non zero based index. this is more human readable\n    return this.logs.at(number - 1)\n  }\n\n  filterCalls (criteria, options) {\n    // perf\n    if (this.logs.length === 0) {\n      return this.logs\n    }\n    if (typeof criteria === 'function') {\n      return this.logs.filter(criteria)\n    }\n    if (criteria instanceof RegExp) {\n      return this.logs.filter((log) => {\n        return criteria.test(log.toString())\n      })\n    }\n    if (typeof criteria === 'object' && criteria !== null) {\n      // no criteria - returning all logs\n      if (Object.keys(criteria).length === 0) {\n        return this.logs\n      }\n\n      const finalOptions = { operator: 'OR', ...buildAndValidateFilterCallsOptions(options) }\n\n      let maybeDuplicatedLogsFiltered = []\n      if ('protocol' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered)\n      }\n      if ('host' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered)\n      }\n      if ('port' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered)\n      }\n      if ('origin' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered)\n      }\n      if ('path' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered)\n      }\n      if ('hash' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered)\n      }\n      if ('fullUrl' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered)\n      }\n      if ('method' in criteria) {\n        maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered)\n      }\n\n      const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)]\n\n      return uniqLogsFiltered\n    }\n\n    throw new InvalidArgumentError('criteria parameter should be one of function, regexp, or object')\n  }\n\n  filterCallsByProtocol = makeFilterCalls.call(this, 'protocol')\n\n  filterCallsByHost = makeFilterCalls.call(this, 'host')\n\n  filterCallsByPort = makeFilterCalls.call(this, 'port')\n\n  filterCallsByOrigin = makeFilterCalls.call(this, 'origin')\n\n  filterCallsByPath = makeFilterCalls.call(this, 'path')\n\n  filterCallsByHash = makeFilterCalls.call(this, 'hash')\n\n  filterCallsByFullUrl = makeFilterCalls.call(this, 'fullUrl')\n\n  filterCallsByMethod = makeFilterCalls.call(this, 'method')\n\n  clear () {\n    this.logs = []\n  }\n\n  [kMockCallHistoryAddLog] (requestInit) {\n    const log = new MockCallHistoryLog(requestInit)\n\n    this.logs.push(log)\n\n    return log\n  }\n\n  * [Symbol.iterator] () {\n    for (const log of this.calls()) {\n      yield log\n    }\n  }\n}\n\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Pool = require('../dispatcher/pool')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n  kDispatches,\n  kMockAgent,\n  kClose,\n  kOriginalClose,\n  kOrigin,\n  kOriginalDispatch,\n  kConnected,\n  kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockPool provides an API that extends the Pool to influence the mockDispatches.\n */\nclass MockPool extends Pool {\n  constructor (origin, opts) {\n    if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n      throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n    }\n\n    super(origin, opts)\n\n    this[kMockAgent] = opts.agent\n    this[kOrigin] = origin\n    this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n    this[kDispatches] = []\n    this[kConnected] = 1\n    this[kOriginalDispatch] = this.dispatch\n    this[kOriginalClose] = this.close.bind(this)\n\n    this.dispatch = buildMockDispatch.call(this)\n    this.close = this[kClose]\n  }\n\n  get [Symbols.kConnected] () {\n    return this[kConnected]\n  }\n\n  /**\n   * Sets up the base interceptor for mocking replies from undici.\n   */\n  intercept (opts) {\n    return new MockInterceptor(\n      opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n      this[kDispatches]\n    )\n  }\n\n  cleanMocks () {\n    this[kDispatches] = []\n  }\n\n  async [kClose] () {\n    await promisify(this[kOriginalClose])()\n    this[kConnected] = 0\n    this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n  }\n}\n\nmodule.exports = MockPool\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst { Console } = require('node:console')\n\nconst PERSISTENT = process.versions.icu ? '✅' : 'Y '\nconst NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '\n\n/**\n * Gets the output of `console.table(…)` as a string.\n */\nmodule.exports = class PendingInterceptorsFormatter {\n  constructor ({ disableColors } = {}) {\n    this.transform = new Transform({\n      transform (chunk, _enc, cb) {\n        cb(null, chunk)\n      }\n    })\n\n    this.logger = new Console({\n      stdout: this.transform,\n      inspectOptions: {\n        colors: !disableColors && !process.env.CI\n      }\n    })\n  }\n\n  format (pendingInterceptors) {\n    const withPrettyHeaders = pendingInterceptors.map(\n      ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({\n        Method: method,\n        Origin: origin,\n        Path: path,\n        'Status code': statusCode,\n        Persistent: persist ? PERSISTENT : NOT_PERSISTENT,\n        Invocations: timesInvoked,\n        Remaining: persist ? Infinity : times - timesInvoked\n      }))\n\n    this.logger.table(withPrettyHeaders)\n    return this.transform.read().toString()\n  }\n}\n","'use strict'\n\nconst { kClients } = require('../core/symbols')\nconst Agent = require('../dispatcher/agent')\nconst {\n  kAgent,\n  kMockAgentSet,\n  kMockAgentGet,\n  kDispatches,\n  kIsMockActive,\n  kNetConnect,\n  kGetNetConnect,\n  kOptions,\n  kFactory,\n  kMockAgentRegisterCallHistory,\n  kMockAgentIsCallHistoryEnabled,\n  kMockAgentAddCallHistoryLog,\n  kMockAgentMockCallHistoryInstance,\n  kMockAgentAcceptsNonStandardSearchParameters,\n  kMockCallHistoryAddLog,\n  kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst MockClient = require('./mock-client')\nconst MockPool = require('./mock-pool')\nconst { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require('./mock-utils')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst Dispatcher = require('../dispatcher/dispatcher')\nconst PendingInterceptorsFormatter = require('./pending-interceptors-formatter')\nconst { MockCallHistory } = require('./mock-call-history')\n\nclass MockAgent extends Dispatcher {\n  constructor (opts = {}) {\n    super(opts)\n\n    const mockOptions = buildAndValidateMockOptions(opts)\n\n    this[kNetConnect] = true\n    this[kIsMockActive] = true\n    this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false\n    this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false\n    this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false\n\n    // Instantiate Agent and encapsulate\n    if (opts?.agent && typeof opts.agent.dispatch !== 'function') {\n      throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n    }\n    const agent = opts?.agent ? opts.agent : new Agent(opts)\n    this[kAgent] = agent\n\n    this[kClients] = agent[kClients]\n    this[kOptions] = mockOptions\n\n    if (this[kMockAgentIsCallHistoryEnabled]) {\n      this[kMockAgentRegisterCallHistory]()\n    }\n  }\n\n  get (origin) {\n    // Normalize origin to handle URL objects and case-insensitive hostnames\n    const normalizedOrigin = normalizeOrigin(origin)\n    const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\\/$/, '') : normalizedOrigin\n\n    let dispatcher = this[kMockAgentGet](originKey)\n\n    if (!dispatcher) {\n      dispatcher = this[kFactory](originKey)\n      this[kMockAgentSet](originKey, dispatcher)\n    }\n    return dispatcher\n  }\n\n  dispatch (opts, handler) {\n    opts.origin = normalizeOrigin(opts.origin)\n\n    // Call MockAgent.get to perform additional setup before dispatching as normal\n    this.get(opts.origin)\n\n    this[kMockAgentAddCallHistoryLog](opts)\n\n    const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters]\n\n    const dispatchOpts = { ...opts }\n\n    if (acceptNonStandardSearchParameters && dispatchOpts.path) {\n      const [path, searchParams] = dispatchOpts.path.split('?')\n      const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters)\n      dispatchOpts.path = `${path}?${normalizedSearchParams}`\n    }\n\n    return this[kAgent].dispatch(dispatchOpts, handler)\n  }\n\n  async close () {\n    this.clearCallHistory()\n    await this[kAgent].close()\n    this[kClients].clear()\n  }\n\n  deactivate () {\n    this[kIsMockActive] = false\n  }\n\n  activate () {\n    this[kIsMockActive] = true\n  }\n\n  enableNetConnect (matcher) {\n    if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {\n      if (Array.isArray(this[kNetConnect])) {\n        this[kNetConnect].push(matcher)\n      } else {\n        this[kNetConnect] = [matcher]\n      }\n    } else if (typeof matcher === 'undefined') {\n      this[kNetConnect] = true\n    } else {\n      throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')\n    }\n  }\n\n  disableNetConnect () {\n    this[kNetConnect] = false\n  }\n\n  enableCallHistory () {\n    this[kMockAgentIsCallHistoryEnabled] = true\n\n    return this\n  }\n\n  disableCallHistory () {\n    this[kMockAgentIsCallHistoryEnabled] = false\n\n    return this\n  }\n\n  getCallHistory () {\n    return this[kMockAgentMockCallHistoryInstance]\n  }\n\n  clearCallHistory () {\n    if (this[kMockAgentMockCallHistoryInstance] !== undefined) {\n      this[kMockAgentMockCallHistoryInstance].clear()\n    }\n  }\n\n  // This is required to bypass issues caused by using global symbols - see:\n  // https://github.com/nodejs/undici/issues/1447\n  get isMockActive () {\n    return this[kIsMockActive]\n  }\n\n  [kMockAgentRegisterCallHistory] () {\n    if (this[kMockAgentMockCallHistoryInstance] === undefined) {\n      this[kMockAgentMockCallHistoryInstance] = new MockCallHistory()\n    }\n  }\n\n  [kMockAgentAddCallHistoryLog] (opts) {\n    if (this[kMockAgentIsCallHistoryEnabled]) {\n      // additional setup when enableCallHistory class method is used after mockAgent instantiation\n      this[kMockAgentRegisterCallHistory]()\n\n      // add call history log on every call (intercepted or not)\n      this[kMockAgentMockCallHistoryInstance][kMockCallHistoryAddLog](opts)\n    }\n  }\n\n  [kMockAgentSet] (origin, dispatcher) {\n    this[kClients].set(origin, { count: 0, dispatcher })\n  }\n\n  [kFactory] (origin) {\n    const mockOptions = Object.assign({ agent: this }, this[kOptions])\n    return this[kOptions] && this[kOptions].connections === 1\n      ? new MockClient(origin, mockOptions)\n      : new MockPool(origin, mockOptions)\n  }\n\n  [kMockAgentGet] (origin) {\n    // First check if we can immediately find it\n    const result = this[kClients].get(origin)\n    if (result?.dispatcher) {\n      return result.dispatcher\n    }\n\n    // If the origin is not a string create a dummy parent pool and return to user\n    if (typeof origin !== 'string') {\n      const dispatcher = this[kFactory]('http://localhost:9999')\n      this[kMockAgentSet](origin, dispatcher)\n      return dispatcher\n    }\n\n    // If we match, create a pool and assign the same dispatches\n    for (const [keyMatcher, result] of Array.from(this[kClients])) {\n      if (result && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {\n        const dispatcher = this[kFactory](origin)\n        this[kMockAgentSet](origin, dispatcher)\n        dispatcher[kDispatches] = result.dispatcher[kDispatches]\n        return dispatcher\n      }\n    }\n  }\n\n  [kGetNetConnect] () {\n    return this[kNetConnect]\n  }\n\n  pendingInterceptors () {\n    const mockAgentClients = this[kClients]\n\n    return Array.from(mockAgentClients.entries())\n      .flatMap(([origin, result]) => result.dispatcher[kDispatches].map(dispatch => ({ ...dispatch, origin })))\n      .filter(({ pending }) => pending)\n  }\n\n  assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {\n    const pending = this.pendingInterceptors()\n\n    if (pending.length === 0) {\n      return\n    }\n\n    throw new UndiciError(\n      pending.length === 1\n        ? `1 interceptor is pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n        : `${pending.length} interceptors are pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n    )\n  }\n}\n\nmodule.exports = MockAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst { runtimeFeatures } = require('../util/runtime-features.js')\n\n/**\n * @typedef {Object} HeaderFilters\n * @property {Set<string>} ignore - Set of headers to ignore for matching\n * @property {Set<string>} exclude - Set of headers to exclude from matching\n * @property {Set<string>} match - Set of headers to match (empty means match\n */\n\n/**\n * Creates cached header sets for performance\n *\n * @param {import('./snapshot-recorder').SnapshotRecorderMatchOptions} matchOptions - Matching options for headers\n * @returns {HeaderFilters} - Cached sets for ignore, exclude, and match headers\n */\nfunction createHeaderFilters (matchOptions = {}) {\n  const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions\n\n  return {\n    ignore: new Set(ignoreHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n    exclude: new Set(excludeHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n    match: new Set(matchHeaders.map(header => caseSensitive ? header : header.toLowerCase()))\n  }\n}\n\nconst crypto = runtimeFeatures.has('crypto')\n  ? require('node:crypto')\n  : null\n\n/**\n * @callback HashIdFunction\n * @param {string} value - The value to hash\n * @returns {string} - The base64url encoded hash of the value\n */\n\n/**\n * Generates a hash for a given value\n * @type {HashIdFunction}\n */\nconst hashId = crypto?.hash\n  ? (value) => crypto.hash('sha256', value, 'base64url')\n  : (value) => Buffer.from(value).toString('base64url')\n\n/**\n * @typedef {(url: string) => boolean} IsUrlExcluded Checks if a URL matches any of the exclude patterns\n */\n\n/** @typedef {{[key: Lowercase<string>]: string}} NormalizedHeaders */\n/** @typedef {Array<string>} UndiciHeaders */\n/** @typedef {Record<string, string|string[]>} Headers */\n\n/**\n * @param {*} headers\n * @returns {headers is UndiciHeaders}\n */\nfunction isUndiciHeaders (headers) {\n  return Array.isArray(headers) && (headers.length & 1) === 0\n}\n\n/**\n * Factory function to create a URL exclusion checker\n * @param {Array<string| RegExp>} [excludePatterns=[]] - Array of patterns to exclude\n * @returns {IsUrlExcluded} - A function that checks if a URL matches any of the exclude patterns\n */\nfunction isUrlExcludedFactory (excludePatterns = []) {\n  if (excludePatterns.length === 0) {\n    return () => false\n  }\n\n  return function isUrlExcluded (url) {\n    let urlLowerCased\n\n    for (const pattern of excludePatterns) {\n      if (typeof pattern === 'string') {\n        if (!urlLowerCased) {\n          // Convert URL to lowercase only once\n          urlLowerCased = url.toLowerCase()\n        }\n        // Simple string match (case-insensitive)\n        if (urlLowerCased.includes(pattern.toLowerCase())) {\n          return true\n        }\n      } else if (pattern instanceof RegExp) {\n        // Regex pattern match\n        if (pattern.test(url)) {\n          return true\n        }\n      }\n    }\n\n    return false\n  }\n}\n\n/**\n * Normalizes headers for consistent comparison\n *\n * @param {Object|UndiciHeaders} headers - Headers to normalize\n * @returns {NormalizedHeaders} - Normalized headers as a lowercase object\n */\nfunction normalizeHeaders (headers) {\n  /** @type {NormalizedHeaders} */\n  const normalizedHeaders = {}\n\n  if (!headers) return normalizedHeaders\n\n  // Handle array format (undici internal format: [name, value, name, value, ...])\n  if (isUndiciHeaders(headers)) {\n    for (let i = 0; i < headers.length; i += 2) {\n      const key = headers[i]\n      const value = headers[i + 1]\n      if (key && value !== undefined) {\n        // Convert Buffers to strings if needed\n        const keyStr = Buffer.isBuffer(key) ? key.toString() : key\n        const valueStr = Buffer.isBuffer(value) ? value.toString() : value\n        normalizedHeaders[keyStr.toLowerCase()] = valueStr\n      }\n    }\n    return normalizedHeaders\n  }\n\n  // Handle object format\n  if (headers && typeof headers === 'object') {\n    for (const [key, value] of Object.entries(headers)) {\n      if (key && typeof key === 'string') {\n        normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(', ') : String(value)\n      }\n    }\n  }\n\n  return normalizedHeaders\n}\n\nconst validSnapshotModes = /** @type {const} */ (['record', 'playback', 'update'])\n\n/** @typedef {typeof validSnapshotModes[number]} SnapshotMode */\n\n/**\n * @param {*} mode - The snapshot mode to validate\n * @returns {asserts mode is SnapshotMode}\n */\nfunction validateSnapshotMode (mode) {\n  if (!validSnapshotModes.includes(mode)) {\n    throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(', ')}`)\n  }\n}\n\nmodule.exports = {\n  createHeaderFilters,\n  hashId,\n  isUndiciHeaders,\n  normalizeHeaders,\n  isUrlExcludedFactory,\n  validateSnapshotMode\n}\n","'use strict'\n\nconst { writeFile, readFile, mkdir } = require('node:fs/promises')\nconst { dirname, resolve } = require('node:path')\nconst { setTimeout, clearTimeout } = require('node:timers')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require('./snapshot-utils')\n\n/**\n * @typedef {Object} SnapshotRequestOptions\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} path - Request path\n * @property {string} origin - Request origin (base URL)\n * @property {import('./snapshot-utils').Headers|import('./snapshot-utils').UndiciHeaders} headers - Request headers\n * @property {import('./snapshot-utils').NormalizedHeaders} _normalizedHeaders - Request headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryResponse\n * @property {number} statusCode - HTTP status code of the response\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized response headers as a lowercase object\n * @property {string} body - Response body as a base64url encoded string\n * @property {Object} [trailers] - Optional response trailers\n */\n\n/**\n * @typedef {Object} SnapshotEntry\n * @property {SnapshotEntryRequest} request - The request object\n * @property {Array<SnapshotEntryResponse>} responses - Array of response objects\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * @typedef {Object} SnapshotRecorderMatchOptions\n * @property {Array<string>} [matchHeaders=[]] - Headers to match (empty array means match all headers)\n * @property {Array<string>} [ignoreHeaders=[]] - Headers to ignore for matching\n * @property {Array<string>} [excludeHeaders=[]] - Headers to exclude from matching\n * @property {boolean} [matchBody=true] - Whether to match request body\n * @property {boolean} [matchQuery=true] - Whether to match query properties\n * @property {boolean} [caseSensitive=false] - Whether header matching is case-sensitive\n */\n\n/**\n * @typedef {Object} SnapshotRecorderOptions\n * @property {string} [snapshotPath] - Path to save/load snapshots\n * @property {import('./snapshot-utils').SnapshotMode} [mode='record'] - Mode: 'record' or 'playback'\n * @property {number} [maxSnapshots=Infinity] - Maximum number of snapshots to keep\n * @property {boolean} [autoFlush=false] - Whether to automatically flush snapshots to disk\n * @property {number} [flushInterval=30000] - Auto-flush interval in milliseconds (default: 30 seconds)\n * @property {Array<string|RegExp>} [excludeUrls=[]] - URLs to exclude from recording\n * @property {function} [shouldRecord=null] - Function to filter requests for recording\n * @property {function} [shouldPlayback=null] - Function to filter requests\n */\n\n/**\n * @typedef {Object} SnapshotFormattedRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request (with query parameters if matchQuery is true)\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string} body - Request body (optional, only if matchBody is true)\n */\n\n/**\n * @typedef {Object} SnapshotInfo\n * @property {string} hash - Hash key for the snapshot\n * @property {SnapshotEntryRequest} request - The request object\n * @property {number} responseCount - Number of responses recorded for this request\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * Formats a request for consistent snapshot storage\n * Caches normalized headers to avoid repeated processing\n *\n * @param {SnapshotRequestOptions} opts - Request options\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached header sets for performance\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers and body\n * @returns {SnapshotFormattedRequest} - Formatted request object\n */\nfunction formatRequestKey (opts, headerFilters, matchOptions = {}) {\n  const url = new URL(opts.path, opts.origin)\n\n  // Cache normalized headers if not already done\n  const normalized = opts._normalizedHeaders || normalizeHeaders(opts.headers)\n  if (!opts._normalizedHeaders) {\n    opts._normalizedHeaders = normalized\n  }\n\n  return {\n    method: opts.method || 'GET',\n    url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`,\n    headers: filterHeadersForMatching(normalized, headerFilters, matchOptions),\n    body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : ''\n  }\n}\n\n/**\n * Filters headers based on matching configuration\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForMatching (headers, headerFilters, matchOptions = {}) {\n  if (!headers || typeof headers !== 'object') return {}\n\n  const {\n    caseSensitive = false\n  } = matchOptions\n\n  const filtered = {}\n  const { ignore, exclude, match } = headerFilters\n\n  for (const [key, value] of Object.entries(headers)) {\n    const headerKey = caseSensitive ? key : key.toLowerCase()\n\n    // Skip if in exclude list (for security)\n    if (exclude.has(headerKey)) continue\n\n    // Skip if in ignore list (for matching)\n    if (ignore.has(headerKey)) continue\n\n    // If matchHeaders is specified, only include those headers\n    if (match.size !== 0) {\n      if (!match.has(headerKey)) continue\n    }\n\n    filtered[headerKey] = value\n  }\n\n  return filtered\n}\n\n/**\n * Filters headers for storage (only excludes sensitive headers)\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForStorage (headers, headerFilters, matchOptions = {}) {\n  if (!headers || typeof headers !== 'object') return {}\n\n  const {\n    caseSensitive = false\n  } = matchOptions\n\n  const filtered = {}\n  const { exclude: excludeSet } = headerFilters\n\n  for (const [key, value] of Object.entries(headers)) {\n    const headerKey = caseSensitive ? key : key.toLowerCase()\n\n    // Skip if in exclude list (for security)\n    if (excludeSet.has(headerKey)) continue\n\n    filtered[headerKey] = value\n  }\n\n  return filtered\n}\n\n/**\n * Creates a hash key for request matching\n * Properly orders headers to avoid conflicts and uses crypto hashing when available\n *\n * @param {SnapshotFormattedRequest} formattedRequest - Request object\n * @returns {string} - Base64url encoded hash of the request\n */\nfunction createRequestHash (formattedRequest) {\n  const parts = [\n    formattedRequest.method,\n    formattedRequest.url\n  ]\n\n  // Process headers in a deterministic way to avoid conflicts\n  if (formattedRequest.headers && typeof formattedRequest.headers === 'object') {\n    const headerKeys = Object.keys(formattedRequest.headers).sort()\n    for (const key of headerKeys) {\n      const values = Array.isArray(formattedRequest.headers[key])\n        ? formattedRequest.headers[key]\n        : [formattedRequest.headers[key]]\n\n      // Add header name\n      parts.push(key)\n\n      // Add all values for this header, sorted for consistency\n      for (const value of values.sort()) {\n        parts.push(String(value))\n      }\n    }\n  }\n\n  // Add body\n  parts.push(formattedRequest.body)\n\n  const content = parts.join('|')\n\n  return hashId(content)\n}\n\nclass SnapshotRecorder {\n  /** @type {NodeJS.Timeout | null} */\n  #flushTimeout\n\n  /** @type {import('./snapshot-utils').IsUrlExcluded} */\n  #isUrlExcluded\n\n  /** @type {Map<string, SnapshotEntry>} */\n  #snapshots = new Map()\n\n  /** @type {string|undefined} */\n  #snapshotPath\n\n  /** @type {number} */\n  #maxSnapshots = Infinity\n\n  /** @type {boolean} */\n  #autoFlush = false\n\n  /** @type {import('./snapshot-utils').HeaderFilters} */\n  #headerFilters\n\n  /**\n   * Creates a new SnapshotRecorder instance\n   * @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder\n   */\n  constructor (options = {}) {\n    this.#snapshotPath = options.snapshotPath\n    this.#maxSnapshots = options.maxSnapshots || Infinity\n    this.#autoFlush = options.autoFlush || false\n    this.flushInterval = options.flushInterval || 30000 // 30 seconds default\n    this._flushTimer = null\n\n    // Matching configuration\n    /** @type {Required<SnapshotRecorderMatchOptions>} */\n    this.matchOptions = {\n      matchHeaders: options.matchHeaders || [], // empty means match all headers\n      ignoreHeaders: options.ignoreHeaders || [],\n      excludeHeaders: options.excludeHeaders || [],\n      matchBody: options.matchBody !== false, // default: true\n      matchQuery: options.matchQuery !== false, // default: true\n      caseSensitive: options.caseSensitive || false\n    }\n\n    // Cache processed header sets to avoid recreating them on every request\n    this.#headerFilters = createHeaderFilters(this.matchOptions)\n\n    // Request filtering callbacks\n    this.shouldRecord = options.shouldRecord || (() => true) // function(requestOpts) -> boolean\n    this.shouldPlayback = options.shouldPlayback || (() => true) // function(requestOpts) -> boolean\n\n    // URL pattern filtering\n    this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls) // Array of regex patterns or strings\n\n    // Start auto-flush timer if enabled\n    if (this.#autoFlush && this.#snapshotPath) {\n      this.#startAutoFlush()\n    }\n  }\n\n  /**\n   * Records a request-response interaction\n   * @param {SnapshotRequestOptions} requestOpts - Request options\n   * @param {SnapshotEntryResponse} response - Response data to record\n   * @return {Promise<void>} - Resolves when the recording is complete\n   */\n  async record (requestOpts, response) {\n    // Check if recording should be filtered out\n    if (!this.shouldRecord(requestOpts)) {\n      return // Skip recording\n    }\n\n    // Check URL exclusion patterns\n    if (this.isUrlExcluded(requestOpts)) {\n      return // Skip recording\n    }\n\n    const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n    const hash = createRequestHash(request)\n\n    // Extract response data - always store body as base64\n    const normalizedHeaders = normalizeHeaders(response.headers)\n\n    /** @type {SnapshotEntryResponse} */\n    const responseData = {\n      statusCode: response.statusCode,\n      headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions),\n      body: Buffer.isBuffer(response.body)\n        ? response.body.toString('base64')\n        : Buffer.from(String(response.body || '')).toString('base64'),\n      trailers: response.trailers\n    }\n\n    // Remove oldest snapshot if we exceed maxSnapshots limit\n    if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash)) {\n      const oldestKey = this.#snapshots.keys().next().value\n      this.#snapshots.delete(oldestKey)\n    }\n\n    // Support sequential responses - if snapshot exists, add to responses array\n    const existingSnapshot = this.#snapshots.get(hash)\n    if (existingSnapshot && existingSnapshot.responses) {\n      existingSnapshot.responses.push(responseData)\n      existingSnapshot.timestamp = new Date().toISOString()\n    } else {\n      this.#snapshots.set(hash, {\n        request,\n        responses: [responseData], // Always store as array for consistency\n        callCount: 0,\n        timestamp: new Date().toISOString()\n      })\n    }\n\n    // Auto-flush if enabled\n    if (this.#autoFlush && this.#snapshotPath) {\n      this.#scheduleFlush()\n    }\n  }\n\n  /**\n   * Checks if a URL should be excluded from recording/playback\n   * @param {SnapshotRequestOptions} requestOpts - Request options to check\n   * @returns {boolean} - True if URL is excluded\n   */\n  isUrlExcluded (requestOpts) {\n    const url = new URL(requestOpts.path, requestOpts.origin).toString()\n    return this.#isUrlExcluded(url)\n  }\n\n  /**\n   * Finds a matching snapshot for the given request\n   * Returns the appropriate response based on call count for sequential responses\n   *\n   * @param {SnapshotRequestOptions} requestOpts - Request options to match\n   * @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found\n   */\n  findSnapshot (requestOpts) {\n    // Check if playback should be filtered out\n    if (!this.shouldPlayback(requestOpts)) {\n      return undefined // Skip playback\n    }\n\n    // Check URL exclusion patterns\n    if (this.isUrlExcluded(requestOpts)) {\n      return undefined // Skip playback\n    }\n\n    const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n    const hash = createRequestHash(request)\n    const snapshot = this.#snapshots.get(hash)\n\n    if (!snapshot) return undefined\n\n    // Handle sequential responses\n    const currentCallCount = snapshot.callCount || 0\n    const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1)\n    snapshot.callCount = currentCallCount + 1\n\n    return {\n      ...snapshot,\n      response: snapshot.responses[responseIndex]\n    }\n  }\n\n  /**\n   * Loads snapshots from file\n   * @param {string} [filePath] - Optional file path to load snapshots from\n   * @return {Promise<void>} - Resolves when snapshots are loaded\n   */\n  async loadSnapshots (filePath) {\n    const path = filePath || this.#snapshotPath\n    if (!path) {\n      throw new InvalidArgumentError('Snapshot path is required')\n    }\n\n    try {\n      const data = await readFile(resolve(path), 'utf8')\n      const parsed = JSON.parse(data)\n\n      // Convert array format back to Map\n      if (Array.isArray(parsed)) {\n        this.#snapshots.clear()\n        for (const { hash, snapshot } of parsed) {\n          this.#snapshots.set(hash, snapshot)\n        }\n      } else {\n        // Legacy object format\n        this.#snapshots = new Map(Object.entries(parsed))\n      }\n    } catch (error) {\n      if (error.code === 'ENOENT') {\n        // File doesn't exist yet - that's ok for recording mode\n        this.#snapshots.clear()\n      } else {\n        throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error })\n      }\n    }\n  }\n\n  /**\n   * Saves snapshots to file\n   *\n   * @param {string} [filePath] - Optional file path to save snapshots\n   * @returns {Promise<void>} - Resolves when snapshots are saved\n   */\n  async saveSnapshots (filePath) {\n    const path = filePath || this.#snapshotPath\n    if (!path) {\n      throw new InvalidArgumentError('Snapshot path is required')\n    }\n\n    const resolvedPath = resolve(path)\n\n    // Ensure directory exists\n    await mkdir(dirname(resolvedPath), { recursive: true })\n\n    // Convert Map to serializable format\n    const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({\n      hash,\n      snapshot\n    }))\n\n    await writeFile(resolvedPath, JSON.stringify(data, null, 2), { flush: true })\n  }\n\n  /**\n   * Clears all recorded snapshots\n   * @returns {void}\n   */\n  clear () {\n    this.#snapshots.clear()\n  }\n\n  /**\n   * Gets all recorded snapshots\n   * @return {Array<SnapshotEntry>} - Array of all recorded snapshots\n   */\n  getSnapshots () {\n    return Array.from(this.#snapshots.values())\n  }\n\n  /**\n   * Gets snapshot count\n   * @return {number} - Number of recorded snapshots\n   */\n  size () {\n    return this.#snapshots.size\n  }\n\n  /**\n   * Resets call counts for all snapshots (useful for test cleanup)\n   * @returns {void}\n   */\n  resetCallCounts () {\n    for (const snapshot of this.#snapshots.values()) {\n      snapshot.callCount = 0\n    }\n  }\n\n  /**\n   * Deletes a specific snapshot by request options\n   * @param {SnapshotRequestOptions} requestOpts - Request options to match\n   * @returns {boolean} - True if snapshot was deleted, false if not found\n   */\n  deleteSnapshot (requestOpts) {\n    const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n    const hash = createRequestHash(request)\n    return this.#snapshots.delete(hash)\n  }\n\n  /**\n   * Gets information about a specific snapshot\n   * @param {SnapshotRequestOptions} requestOpts - Request options to match\n   * @returns {SnapshotInfo|null} - Snapshot information or null if not found\n   */\n  getSnapshotInfo (requestOpts) {\n    const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n    const hash = createRequestHash(request)\n    const snapshot = this.#snapshots.get(hash)\n\n    if (!snapshot) return null\n\n    return {\n      hash,\n      request: snapshot.request,\n      responseCount: snapshot.responses ? snapshot.responses.length : (snapshot.response ? 1 : 0), // .response for legacy snapshots\n      callCount: snapshot.callCount || 0,\n      timestamp: snapshot.timestamp\n    }\n  }\n\n  /**\n   * Replaces all snapshots with new data (full replacement)\n   * @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record<string, SnapshotEntry>} snapshotData - New snapshot data to replace existing ones\n   * @returns {void}\n   */\n  replaceSnapshots (snapshotData) {\n    this.#snapshots.clear()\n\n    if (Array.isArray(snapshotData)) {\n      for (const { hash, snapshot } of snapshotData) {\n        this.#snapshots.set(hash, snapshot)\n      }\n    } else if (snapshotData && typeof snapshotData === 'object') {\n      // Legacy object format\n      this.#snapshots = new Map(Object.entries(snapshotData))\n    }\n  }\n\n  /**\n   * Starts the auto-flush timer\n   * @returns {void}\n   */\n  #startAutoFlush () {\n    return this.#scheduleFlush()\n  }\n\n  /**\n   * Stops the auto-flush timer\n   * @returns {void}\n   */\n  #stopAutoFlush () {\n    if (this.#flushTimeout) {\n      clearTimeout(this.#flushTimeout)\n      // Ensure any pending flush is completed\n      this.saveSnapshots().catch(() => {\n      // Ignore flush errors\n      })\n      this.#flushTimeout = null\n    }\n  }\n\n  /**\n   * Schedules a flush (debounced to avoid excessive writes)\n   */\n  #scheduleFlush () {\n    this.#flushTimeout = setTimeout(() => {\n      this.saveSnapshots().catch(() => {\n        // Ignore flush errors\n      })\n      if (this.#autoFlush) {\n        this.#flushTimeout?.refresh()\n      } else {\n        this.#flushTimeout = null\n      }\n    }, 1000) // 1 second debounce\n  }\n\n  /**\n   * Cleanup method to stop timers\n   * @returns {void}\n   */\n  destroy () {\n    this.#stopAutoFlush()\n    if (this.#flushTimeout) {\n      clearTimeout(this.#flushTimeout)\n      this.#flushTimeout = null\n    }\n  }\n\n  /**\n   * Async close method that saves all recordings and performs cleanup\n   * @returns {Promise<void>}\n   */\n  async close () {\n    // Save any pending recordings if we have a snapshot path\n    if (this.#snapshotPath && this.#snapshots.size !== 0) {\n      await this.saveSnapshots()\n    }\n\n    // Perform cleanup\n    this.destroy()\n  }\n}\n\nmodule.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }\n","'use strict'\n\nconst Agent = require('../dispatcher/agent')\nconst MockAgent = require('./mock-agent')\nconst { SnapshotRecorder } = require('./snapshot-recorder')\nconst WrapHandler = require('../handler/wrap-handler')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst { validateSnapshotMode } = require('./snapshot-utils')\n\nconst kSnapshotRecorder = Symbol('kSnapshotRecorder')\nconst kSnapshotMode = Symbol('kSnapshotMode')\nconst kSnapshotPath = Symbol('kSnapshotPath')\nconst kSnapshotLoaded = Symbol('kSnapshotLoaded')\nconst kRealAgent = Symbol('kRealAgent')\n\n// Static flag to ensure warning is only emitted once per process\nlet warningEmitted = false\n\nclass SnapshotAgent extends MockAgent {\n  constructor (opts = {}) {\n    // Emit experimental warning only once\n    if (!warningEmitted) {\n      process.emitWarning(\n        'SnapshotAgent is experimental and subject to change',\n        'ExperimentalWarning'\n      )\n      warningEmitted = true\n    }\n\n    const {\n      mode = 'record',\n      snapshotPath = null,\n      ...mockAgentOpts\n    } = opts\n\n    super(mockAgentOpts)\n\n    validateSnapshotMode(mode)\n\n    // Validate snapshotPath is provided when required\n    if ((mode === 'playback' || mode === 'update') && !snapshotPath) {\n      throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`)\n    }\n\n    this[kSnapshotMode] = mode\n    this[kSnapshotPath] = snapshotPath\n\n    this[kSnapshotRecorder] = new SnapshotRecorder({\n      snapshotPath: this[kSnapshotPath],\n      mode: this[kSnapshotMode],\n      maxSnapshots: opts.maxSnapshots,\n      autoFlush: opts.autoFlush,\n      flushInterval: opts.flushInterval,\n      matchHeaders: opts.matchHeaders,\n      ignoreHeaders: opts.ignoreHeaders,\n      excludeHeaders: opts.excludeHeaders,\n      matchBody: opts.matchBody,\n      matchQuery: opts.matchQuery,\n      caseSensitive: opts.caseSensitive,\n      shouldRecord: opts.shouldRecord,\n      shouldPlayback: opts.shouldPlayback,\n      excludeUrls: opts.excludeUrls\n    })\n    this[kSnapshotLoaded] = false\n\n    // For recording/update mode, we need a real agent to make actual requests\n    // For playback mode, we need a real agent if there are excluded URLs\n    if (this[kSnapshotMode] === 'record' || this[kSnapshotMode] === 'update' ||\n        (this[kSnapshotMode] === 'playback' && opts.excludeUrls && opts.excludeUrls.length > 0)) {\n      this[kRealAgent] = new Agent(opts)\n    }\n\n    // Auto-load snapshots in playback/update mode\n    if ((this[kSnapshotMode] === 'playback' || this[kSnapshotMode] === 'update') && this[kSnapshotPath]) {\n      this.loadSnapshots().catch(() => {\n        // Ignore load errors - file might not exist yet\n      })\n    }\n  }\n\n  dispatch (opts, handler) {\n    handler = WrapHandler.wrap(handler)\n    const mode = this[kSnapshotMode]\n\n    // Check if URL should be excluded (pass through without mocking/recording)\n    if (this[kSnapshotRecorder].isUrlExcluded(opts)) {\n      // Real agent is guaranteed by constructor when excludeUrls is configured\n      return this[kRealAgent].dispatch(opts, handler)\n    }\n\n    if (mode === 'playback' || mode === 'update') {\n      // Ensure snapshots are loaded\n      if (!this[kSnapshotLoaded]) {\n        // Need to load asynchronously, delegate to async version\n        return this.#asyncDispatch(opts, handler)\n      }\n\n      // Try to find existing snapshot (synchronous)\n      const snapshot = this[kSnapshotRecorder].findSnapshot(opts)\n\n      if (snapshot) {\n        // Use recorded response (synchronous)\n        return this.#replaySnapshot(snapshot, handler)\n      } else if (mode === 'update') {\n        // Make real request and record it (async required)\n        return this.#recordAndReplay(opts, handler)\n      } else {\n        // Playback mode but no snapshot found\n        const error = new UndiciError(`No snapshot found for ${opts.method || 'GET'} ${opts.path}`)\n        if (handler.onError) {\n          handler.onError(error)\n          return\n        }\n        throw error\n      }\n    } else if (mode === 'record') {\n      // Record mode - make real request and save response (async required)\n      return this.#recordAndReplay(opts, handler)\n    }\n  }\n\n  /**\n   * Async version of dispatch for when we need to load snapshots first\n   */\n  async #asyncDispatch (opts, handler) {\n    await this.loadSnapshots()\n    return this.dispatch(opts, handler)\n  }\n\n  /**\n   * Records a real request and replays the response\n   */\n  #recordAndReplay (opts, handler) {\n    const responseData = {\n      statusCode: null,\n      headers: {},\n      trailers: {},\n      body: []\n    }\n\n    const self = this // Capture 'this' context for use within nested handler callbacks\n\n    const recordingHandler = {\n      onRequestStart (controller, context) {\n        return handler.onRequestStart(controller, { ...context, history: this.history })\n      },\n\n      onRequestUpgrade (controller, statusCode, headers, socket) {\n        return handler.onRequestUpgrade(controller, statusCode, headers, socket)\n      },\n\n      onResponseStart (controller, statusCode, headers, statusMessage) {\n        responseData.statusCode = statusCode\n        responseData.headers = headers\n        return handler.onResponseStart(controller, statusCode, headers, statusMessage)\n      },\n\n      onResponseData (controller, chunk) {\n        responseData.body.push(chunk)\n        return handler.onResponseData(controller, chunk)\n      },\n\n      onResponseEnd (controller, trailers) {\n        responseData.trailers = trailers\n\n        // Record the interaction using captured 'self' context (fire and forget)\n        const responseBody = Buffer.concat(responseData.body)\n        self[kSnapshotRecorder].record(opts, {\n          statusCode: responseData.statusCode,\n          headers: responseData.headers,\n          body: responseBody,\n          trailers: responseData.trailers\n        })\n          .then(() => handler.onResponseEnd(controller, trailers))\n          .catch((error) => handler.onResponseError(controller, error))\n      }\n    }\n\n    // Use composed agent if available (includes interceptors), otherwise use real agent\n    const agent = this[kRealAgent]\n    return agent.dispatch(opts, recordingHandler)\n  }\n\n  /**\n   * Replays a recorded response\n   *\n   * @param {Object} snapshot - The recorded snapshot to replay.\n   * @param {Object} handler - The handler to call with the response data.\n   * @returns {void}\n   */\n  #replaySnapshot (snapshot, handler) {\n    try {\n      const { response } = snapshot\n\n      const controller = {\n        pause () { },\n        resume () { },\n        abort (reason) {\n          this.aborted = true\n          this.reason = reason\n        },\n\n        aborted: false,\n        paused: false\n      }\n\n      handler.onRequestStart(controller)\n\n      handler.onResponseStart(controller, response.statusCode, response.headers)\n\n      // Body is always stored as base64 string\n      const body = Buffer.from(response.body, 'base64')\n      handler.onResponseData(controller, body)\n\n      handler.onResponseEnd(controller, response.trailers)\n    } catch (error) {\n      handler.onError?.(error)\n    }\n  }\n\n  /**\n   * Loads snapshots from file\n   *\n   * @param {string} [filePath] - Optional file path to load snapshots from.\n   * @returns {Promise<void>} - Resolves when snapshots are loaded.\n   */\n  async loadSnapshots (filePath) {\n    await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath])\n    this[kSnapshotLoaded] = true\n\n    // In playback mode, set up MockAgent interceptors for all snapshots\n    if (this[kSnapshotMode] === 'playback') {\n      this.#setupMockInterceptors()\n    }\n  }\n\n  /**\n   * Saves snapshots to file\n   *\n   * @param {string} [filePath] - Optional file path to save snapshots to.\n   * @returns {Promise<void>} - Resolves when snapshots are saved.\n   */\n  async saveSnapshots (filePath) {\n    return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath])\n  }\n\n  /**\n   * Sets up MockAgent interceptors based on recorded snapshots.\n   *\n   * This method creates MockAgent interceptors for each recorded snapshot,\n   * allowing the SnapshotAgent to fall back to MockAgent's standard intercept\n   * mechanism in playback mode. Each interceptor is configured to persist\n   * (remain active for multiple requests) and responds with the recorded\n   * response data.\n   *\n   * Called automatically when loading snapshots in playback mode.\n   *\n   * @returns {void}\n   */\n  #setupMockInterceptors () {\n    for (const snapshot of this[kSnapshotRecorder].getSnapshots()) {\n      const { request, responses, response } = snapshot\n      const url = new URL(request.url)\n\n      const mockPool = this.get(url.origin)\n\n      // Handle both new format (responses array) and legacy format (response object)\n      const responseData = responses ? responses[0] : response\n      if (!responseData) continue\n\n      mockPool.intercept({\n        path: url.pathname + url.search,\n        method: request.method,\n        headers: request.headers,\n        body: request.body\n      }).reply(responseData.statusCode, responseData.body, {\n        headers: responseData.headers,\n        trailers: responseData.trailers\n      }).persist()\n    }\n  }\n\n  /**\n   * Gets the snapshot recorder\n   * @return {SnapshotRecorder} - The snapshot recorder instance\n   */\n  getRecorder () {\n    return this[kSnapshotRecorder]\n  }\n\n  /**\n   * Gets the current mode\n   * @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode\n   */\n  getMode () {\n    return this[kSnapshotMode]\n  }\n\n  /**\n   * Clears all snapshots\n   * @returns {void}\n   */\n  clearSnapshots () {\n    this[kSnapshotRecorder].clear()\n  }\n\n  /**\n   * Resets call counts for all snapshots (useful for test cleanup)\n   * @returns {void}\n   */\n  resetCallCounts () {\n    this[kSnapshotRecorder].resetCallCounts()\n  }\n\n  /**\n   * Deletes a specific snapshot by request options\n   * @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot\n   * @return {Promise<boolean>} - Returns true if the snapshot was deleted, false if not found\n   */\n  deleteSnapshot (requestOpts) {\n    return this[kSnapshotRecorder].deleteSnapshot(requestOpts)\n  }\n\n  /**\n   * Gets information about a specific snapshot\n   * @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found\n   */\n  getSnapshotInfo (requestOpts) {\n    return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)\n  }\n\n  /**\n   * Replaces all snapshots with new data (full replacement)\n   * @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record<string, import('./snapshot-recorder').SnapshotEntry>} snapshotData - New snapshot data to replace existing snapshots\n   * @returns {void}\n   */\n  replaceSnapshots (snapshotData) {\n    this[kSnapshotRecorder].replaceSnapshots(snapshotData)\n  }\n\n  /**\n   * Closes the agent, saving snapshots and cleaning up resources.\n   *\n   * @returns {Promise<void>}\n   */\n  async close () {\n    await this[kSnapshotRecorder].close()\n    await this[kRealAgent]?.close()\n    await super.close()\n  }\n}\n\nmodule.exports = SnapshotAgent\n","'use strict'\n\n// We include a version number for the Dispatcher API. In case of breaking changes,\n// this version number must be increased to avoid conflicts.\nconst globalDispatcher = Symbol.for('undici.globalDispatcher.1')\nconst { InvalidArgumentError } = require('./core/errors')\nconst Agent = require('./dispatcher/agent')\n\nif (getGlobalDispatcher() === undefined) {\n  setGlobalDispatcher(new Agent())\n}\n\nfunction setGlobalDispatcher (agent) {\n  if (!agent || typeof agent.dispatch !== 'function') {\n    throw new InvalidArgumentError('Argument agent must implement Agent')\n  }\n  Object.defineProperty(globalThis, globalDispatcher, {\n    value: agent,\n    writable: true,\n    enumerable: false,\n    configurable: false\n  })\n}\n\nfunction getGlobalDispatcher () {\n  return globalThis[globalDispatcher]\n}\n\n// These are the globals that can be installed by undici.install().\n// Not exported by index.js to avoid use outside of this module.\nconst installedExports = /** @type {const} */ (\n  [\n    'fetch',\n    'Headers',\n    'Response',\n    'Request',\n    'FormData',\n    'WebSocket',\n    'CloseEvent',\n    'ErrorEvent',\n    'MessageEvent',\n    'EventSource'\n  ]\n)\n\nmodule.exports = {\n  setGlobalDispatcher,\n  getGlobalDispatcher,\n  installedExports\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst WrapHandler = require('./wrap-handler')\n\n/**\n * @deprecated\n */\nmodule.exports = class DecoratorHandler {\n  #handler\n  #onCompleteCalled = false\n  #onErrorCalled = false\n  #onResponseStartCalled = false\n\n  constructor (handler) {\n    if (typeof handler !== 'object' || handler === null) {\n      throw new TypeError('handler must be an object')\n    }\n    this.#handler = WrapHandler.wrap(handler)\n  }\n\n  onRequestStart (...args) {\n    this.#handler.onRequestStart?.(...args)\n  }\n\n  onRequestUpgrade (...args) {\n    assert(!this.#onCompleteCalled)\n    assert(!this.#onErrorCalled)\n\n    return this.#handler.onRequestUpgrade?.(...args)\n  }\n\n  onResponseStart (...args) {\n    assert(!this.#onCompleteCalled)\n    assert(!this.#onErrorCalled)\n    assert(!this.#onResponseStartCalled)\n\n    this.#onResponseStartCalled = true\n\n    return this.#handler.onResponseStart?.(...args)\n  }\n\n  onResponseData (...args) {\n    assert(!this.#onCompleteCalled)\n    assert(!this.#onErrorCalled)\n\n    return this.#handler.onResponseData?.(...args)\n  }\n\n  onResponseEnd (...args) {\n    assert(!this.#onCompleteCalled)\n    assert(!this.#onErrorCalled)\n\n    this.#onCompleteCalled = true\n    return this.#handler.onResponseEnd?.(...args)\n  }\n\n  onResponseError (...args) {\n    this.#onErrorCalled = true\n    return this.#handler.onResponseError?.(...args)\n  }\n\n  /**\n   * @deprecated\n   */\n  onBodySent () {}\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst { kBodyUsed } = require('../core/symbols')\nconst assert = require('node:assert')\nconst { InvalidArgumentError } = require('../core/errors')\nconst EE = require('node:events')\n\nconst redirectableStatusCodes = [300, 301, 302, 303, 307, 308]\n\nconst kBody = Symbol('body')\n\nconst noop = () => {}\n\nclass BodyAsyncIterable {\n  constructor (body) {\n    this[kBody] = body\n    this[kBodyUsed] = false\n  }\n\n  async * [Symbol.asyncIterator] () {\n    assert(!this[kBodyUsed], 'disturbed')\n    this[kBodyUsed] = true\n    yield * this[kBody]\n  }\n}\n\nclass RedirectHandler {\n  static buildDispatch (dispatcher, maxRedirections) {\n    if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n      throw new InvalidArgumentError('maxRedirections must be a positive number')\n    }\n\n    const dispatch = dispatcher.dispatch.bind(dispatcher)\n    return (opts, originalHandler) => dispatch(opts, new RedirectHandler(dispatch, maxRedirections, opts, originalHandler))\n  }\n\n  constructor (dispatch, maxRedirections, opts, handler) {\n    if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n      throw new InvalidArgumentError('maxRedirections must be a positive number')\n    }\n\n    this.dispatch = dispatch\n    this.location = null\n    const { maxRedirections: _, ...cleanOpts } = opts\n    this.opts = cleanOpts // opts must be a copy, exclude maxRedirections\n    this.maxRedirections = maxRedirections\n    this.handler = handler\n    this.history = []\n\n    if (util.isStream(this.opts.body)) {\n      // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n      // so that it can be dispatched again?\n      // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n      if (util.bodyLength(this.opts.body) === 0) {\n        this.opts.body\n          .on('data', function () {\n            assert(false)\n          })\n      }\n\n      if (typeof this.opts.body.readableDidRead !== 'boolean') {\n        this.opts.body[kBodyUsed] = false\n        EE.prototype.on.call(this.opts.body, 'data', function () {\n          this[kBodyUsed] = true\n        })\n      }\n    } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {\n      // TODO (fix): We can't access ReadableStream internal state\n      // to determine whether or not it has been disturbed. This is just\n      // a workaround.\n      this.opts.body = new BodyAsyncIterable(this.opts.body)\n    } else if (\n      this.opts.body &&\n      typeof this.opts.body !== 'string' &&\n      !ArrayBuffer.isView(this.opts.body) &&\n      util.isIterable(this.opts.body) &&\n      !util.isFormDataLike(this.opts.body)\n    ) {\n      // TODO: Should we allow re-using iterable if !this.opts.idempotent\n      // or through some other flag?\n      this.opts.body = new BodyAsyncIterable(this.opts.body)\n    }\n  }\n\n  onRequestStart (controller, context) {\n    this.handler.onRequestStart?.(controller, { ...context, history: this.history })\n  }\n\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n  }\n\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {\n      throw new Error('max redirects')\n    }\n\n    // https://tools.ietf.org/html/rfc7231#section-6.4.2\n    // https://fetch.spec.whatwg.org/#http-redirect-fetch\n    // In case of HTTP 301 or 302 with POST, change the method to GET\n    if ((statusCode === 301 || statusCode === 302) && this.opts.method === 'POST') {\n      this.opts.method = 'GET'\n      if (util.isStream(this.opts.body)) {\n        util.destroy(this.opts.body.on('error', noop))\n      }\n      this.opts.body = null\n    }\n\n    // https://tools.ietf.org/html/rfc7231#section-6.4.4\n    // In case of HTTP 303, always replace method to be either HEAD or GET\n    if (statusCode === 303 && this.opts.method !== 'HEAD') {\n      this.opts.method = 'GET'\n      if (util.isStream(this.opts.body)) {\n        util.destroy(this.opts.body.on('error', noop))\n      }\n      this.opts.body = null\n    }\n\n    this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1\n      ? null\n      : headers.location\n\n    if (this.opts.origin) {\n      this.history.push(new URL(this.opts.path, this.opts.origin))\n    }\n\n    if (!this.location) {\n      this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n      return\n    }\n\n    const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))\n    const path = search ? `${pathname}${search}` : pathname\n\n    // Check for redirect loops by seeing if we've already visited this URL in our history\n    // This catches the case where Client/Pool try to handle cross-origin redirects but fail\n    // and keep redirecting to the same URL in an infinite loop\n    const redirectUrlString = `${origin}${path}`\n    for (const historyUrl of this.history) {\n      if (historyUrl.toString() === redirectUrlString) {\n        throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`)\n      }\n    }\n\n    // Remove headers referring to the original URL.\n    // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.\n    // https://tools.ietf.org/html/rfc7231#section-6.4\n    this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)\n    this.opts.path = path\n    this.opts.origin = origin\n    this.opts.query = null\n  }\n\n  onResponseData (controller, chunk) {\n    if (this.location) {\n      /*\n        https://tools.ietf.org/html/rfc7231#section-6.4\n\n        TLDR: undici always ignores 3xx response bodies.\n\n        Redirection is used to serve the requested resource from another URL, so it assumes that\n        no body is generated (and thus can be ignored). Even though generating a body is not prohibited.\n\n        For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually\n        (which means it's optional and not mandated) contain just an hyperlink to the value of\n        the Location response header, so the body can be ignored safely.\n\n        For status 300, which is \"Multiple Choices\", the spec mentions both generating a Location\n        response header AND a response body with the other possible location to follow.\n        Since the spec explicitly chooses not to specify a format for such body and leave it to\n        servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.\n      */\n    } else {\n      this.handler.onResponseData?.(controller, chunk)\n    }\n  }\n\n  onResponseEnd (controller, trailers) {\n    if (this.location) {\n      /*\n        https://tools.ietf.org/html/rfc7231#section-6.4\n\n        TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections\n        and neither are useful if present.\n\n        See comment on onData method above for more detailed information.\n      */\n      this.dispatch(this.opts, this)\n    } else {\n      this.handler.onResponseEnd(controller, trailers)\n    }\n  }\n\n  onResponseError (controller, error) {\n    this.handler.onResponseError?.(controller, error)\n  }\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4.4\nfunction shouldRemoveHeader (header, removeContent, unknownOrigin) {\n  if (header.length === 4) {\n    return util.headerNameToString(header) === 'host'\n  }\n  if (removeContent && util.headerNameToString(header).startsWith('content-')) {\n    return true\n  }\n  if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {\n    const name = util.headerNameToString(header)\n    return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'\n  }\n  return false\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4\nfunction cleanRequestHeaders (headers, removeContent, unknownOrigin) {\n  const ret = []\n  if (Array.isArray(headers)) {\n    for (let i = 0; i < headers.length; i += 2) {\n      if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {\n        ret.push(headers[i], headers[i + 1])\n      }\n    }\n  } else if (headers && typeof headers === 'object') {\n    const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers)\n\n    for (const [key, value] of entries) {\n      if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {\n        ret.push(key, value)\n      }\n    }\n  } else {\n    assert(headers == null, 'headers must be an object or an array')\n  }\n  return ret\n}\n\nmodule.exports = RedirectHandler\n","'use strict'\n\nconst RedirectHandler = require('../handler/redirect-handler')\n\nfunction createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections } = {}) {\n  return (dispatch) => {\n    return function Intercept (opts, handler) {\n      const { maxRedirections = defaultMaxRedirections, ...rest } = opts\n\n      if (maxRedirections == null || maxRedirections === 0) {\n        return dispatch(opts, handler)\n      }\n\n      const dispatchOpts = { ...rest } // Stop sub dispatcher from also redirecting.\n      const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler)\n      return dispatch(dispatchOpts, redirectHandler)\n    }\n  }\n}\n\nmodule.exports = createRedirectInterceptor\n","'use strict'\n\n// const { parseHeaders } = require('../core/util')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { ResponseError } = require('../core/errors')\n\nclass ResponseErrorHandler extends DecoratorHandler {\n  #statusCode\n  #contentType\n  #decoder\n  #headers\n  #body\n\n  constructor (_opts, { handler }) {\n    super(handler)\n  }\n\n  #checkContentType (contentType) {\n    return (this.#contentType ?? '').indexOf(contentType) === 0\n  }\n\n  onRequestStart (controller, context) {\n    this.#statusCode = 0\n    this.#contentType = null\n    this.#decoder = null\n    this.#headers = null\n    this.#body = ''\n\n    return super.onRequestStart(controller, context)\n  }\n\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    this.#statusCode = statusCode\n    this.#headers = headers\n    this.#contentType = headers['content-type']\n\n    if (this.#statusCode < 400) {\n      return super.onResponseStart(controller, statusCode, headers, statusMessage)\n    }\n\n    if (this.#checkContentType('application/json') || this.#checkContentType('text/plain')) {\n      this.#decoder = new TextDecoder('utf-8')\n    }\n  }\n\n  onResponseData (controller, chunk) {\n    if (this.#statusCode < 400) {\n      return super.onResponseData(controller, chunk)\n    }\n\n    this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ''\n  }\n\n  onResponseEnd (controller, trailers) {\n    if (this.#statusCode >= 400) {\n      this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? ''\n\n      if (this.#checkContentType('application/json')) {\n        try {\n          this.#body = JSON.parse(this.#body)\n        } catch {\n          // Do nothing...\n        }\n      }\n\n      let err\n      const stackTraceLimit = Error.stackTraceLimit\n      Error.stackTraceLimit = 0\n      try {\n        err = new ResponseError('Response Error', this.#statusCode, {\n          body: this.#body,\n          headers: this.#headers\n        })\n      } finally {\n        Error.stackTraceLimit = stackTraceLimit\n      }\n\n      super.onResponseError(controller, err)\n    } else {\n      super.onResponseEnd(controller, trailers)\n    }\n  }\n\n  onResponseError (controller, err) {\n    super.onResponseError(controller, err)\n  }\n}\n\nmodule.exports = () => {\n  return (dispatch) => {\n    return function Intercept (opts, handler) {\n      return dispatch(opts, new ResponseErrorHandler(opts, { handler }))\n    }\n  }\n}\n","'use strict'\nconst RetryHandler = require('../handler/retry-handler')\n\nmodule.exports = globalOpts => {\n  return dispatch => {\n    return function retryInterceptor (opts, handler) {\n      return dispatch(\n        opts,\n        new RetryHandler(\n          { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } },\n          {\n            handler,\n            dispatch\n          }\n        )\n      )\n    }\n  }\n}\n","'use strict'\n\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst DecoratorHandler = require('../handler/decorator-handler')\n\nclass DumpHandler extends DecoratorHandler {\n  #maxSize = 1024 * 1024\n  #dumped = false\n  #size = 0\n  #controller = null\n  aborted = false\n  reason = false\n\n  constructor ({ maxSize, signal }, handler) {\n    if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) {\n      throw new InvalidArgumentError('maxSize must be a number greater than 0')\n    }\n\n    super(handler)\n\n    this.#maxSize = maxSize ?? this.#maxSize\n    // this.#handler = handler\n  }\n\n  #abort (reason) {\n    this.aborted = true\n    this.reason = reason\n  }\n\n  onRequestStart (controller, context) {\n    controller.abort = this.#abort.bind(this)\n    this.#controller = controller\n\n    return super.onRequestStart(controller, context)\n  }\n\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    const contentLength = headers['content-length']\n\n    if (contentLength != null && contentLength > this.#maxSize) {\n      throw new RequestAbortedError(\n        `Response size (${contentLength}) larger than maxSize (${\n          this.#maxSize\n        })`\n      )\n    }\n\n    if (this.aborted === true) {\n      return true\n    }\n\n    return super.onResponseStart(controller, statusCode, headers, statusMessage)\n  }\n\n  onResponseError (controller, err) {\n    if (this.#dumped) {\n      return\n    }\n\n    // On network errors before connect, controller will be null\n    err = this.#controller?.reason ?? err\n\n    super.onResponseError(controller, err)\n  }\n\n  onResponseData (controller, chunk) {\n    this.#size = this.#size + chunk.length\n\n    if (this.#size >= this.#maxSize) {\n      this.#dumped = true\n\n      if (this.aborted === true) {\n        super.onResponseError(controller, this.reason)\n      } else {\n        super.onResponseEnd(controller, {})\n      }\n    }\n\n    return true\n  }\n\n  onResponseEnd (controller, trailers) {\n    if (this.#dumped) {\n      return\n    }\n\n    if (this.#controller.aborted === true) {\n      super.onResponseError(controller, this.reason)\n      return\n    }\n\n    super.onResponseEnd(controller, trailers)\n  }\n}\n\nfunction createDumpInterceptor (\n  { maxSize: defaultMaxSize } = {\n    maxSize: 1024 * 1024\n  }\n) {\n  return dispatch => {\n    return function Intercept (opts, handler) {\n      const { dumpMaxSize = defaultMaxSize } = opts\n\n      const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler)\n\n      return dispatch(opts, dumpHandler)\n    }\n  }\n}\n\nmodule.exports = createDumpInterceptor\n","'use strict'\nconst { isIP } = require('node:net')\nconst { lookup } = require('node:dns')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { InvalidArgumentError, InformationalError } = require('../core/errors')\nconst maxInt = Math.pow(2, 31) - 1\n\nfunction hasSafeIterator (headers) {\n  const prototype = Object.getPrototypeOf(headers)\n  const ownIterator = Object.prototype.hasOwnProperty.call(headers, Symbol.iterator)\n  return ownIterator || (prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === 'function')\n}\n\nfunction isHostHeader (key) {\n  return typeof key === 'string' && key.toLowerCase() === 'host'\n}\n\nfunction normalizeHeaders (headers) {\n  if (headers == null) {\n    return null\n  }\n\n  if (Array.isArray(headers)) {\n    if (headers.length === 0 || !Array.isArray(headers[0])) {\n      return headers\n    }\n\n    const normalized = []\n    for (const header of headers) {\n      if (Array.isArray(header) && header.length === 2) {\n        normalized.push(header[0], header[1])\n      } else {\n        normalized.push(header)\n      }\n    }\n\n    return normalized\n  }\n\n  if (typeof headers === 'object' && hasSafeIterator(headers)) {\n    const normalized = []\n    for (const header of headers) {\n      if (Array.isArray(header) && header.length === 2) {\n        normalized.push(header[0], header[1])\n      } else {\n        normalized.push(header)\n      }\n    }\n\n    return normalized\n  }\n\n  return headers\n}\n\nfunction hasHostHeader (headers) {\n  if (headers == null) {\n    return false\n  }\n\n  if (Array.isArray(headers)) {\n    if (headers.length === 0) {\n      return false\n    }\n\n    for (let i = 0; i < headers.length; i += 2) {\n      if (isHostHeader(headers[i])) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  if (typeof headers === 'object') {\n    for (const key in headers) {\n      if (isHostHeader(key)) {\n        return true\n      }\n    }\n  }\n\n  return false\n}\n\nfunction withHostHeader (host, headers) {\n  const normalizedHeaders = normalizeHeaders(headers)\n\n  if (hasHostHeader(normalizedHeaders)) {\n    return normalizedHeaders\n  }\n\n  if (Array.isArray(normalizedHeaders)) {\n    return ['host', host, ...normalizedHeaders]\n  }\n\n  if (normalizedHeaders && typeof normalizedHeaders === 'object') {\n    return {\n      host,\n      ...normalizedHeaders\n    }\n  }\n\n  return { host }\n}\n\nclass DNSStorage {\n  #maxItems = 0\n  #records = new Map()\n\n  constructor (opts) {\n    this.#maxItems = opts.maxItems\n  }\n\n  get size () {\n    return this.#records.size\n  }\n\n  get (hostname) {\n    return this.#records.get(hostname) ?? null\n  }\n\n  set (hostname, records) {\n    this.#records.set(hostname, records)\n  }\n\n  delete (hostname) {\n    this.#records.delete(hostname)\n  }\n\n  // Delegate to storage decide can we do more lookups or not\n  full () {\n    return this.size >= this.#maxItems\n  }\n}\n\nclass DNSInstance {\n  #maxTTL = 0\n  #maxItems = 0\n  dualStack = true\n  affinity = null\n  lookup = null\n  pick = null\n  storage = null\n\n  constructor (opts) {\n    this.#maxTTL = opts.maxTTL\n    this.#maxItems = opts.maxItems\n    this.dualStack = opts.dualStack\n    this.affinity = opts.affinity\n    this.lookup = opts.lookup ?? this.#defaultLookup\n    this.pick = opts.pick ?? this.#defaultPick\n    this.storage = opts.storage ?? new DNSStorage(opts)\n  }\n\n  runLookup (origin, opts, cb) {\n    const ips = this.storage.get(origin.hostname)\n\n    // If full, we just return the origin\n    if (ips == null && this.storage.full()) {\n      cb(null, origin)\n      return\n    }\n\n    const newOpts = {\n      affinity: this.affinity,\n      dualStack: this.dualStack,\n      lookup: this.lookup,\n      pick: this.pick,\n      ...opts.dns,\n      maxTTL: this.#maxTTL,\n      maxItems: this.#maxItems\n    }\n\n    // If no IPs we lookup\n    if (ips == null) {\n      this.lookup(origin, newOpts, (err, addresses) => {\n        if (err || addresses == null || addresses.length === 0) {\n          cb(err ?? new InformationalError('No DNS entries found'))\n          return\n        }\n\n        this.setRecords(origin, addresses)\n        const records = this.storage.get(origin.hostname)\n\n        const ip = this.pick(\n          origin,\n          records,\n          newOpts.affinity\n        )\n\n        let port\n        if (typeof ip.port === 'number') {\n          port = `:${ip.port}`\n        } else if (origin.port !== '') {\n          port = `:${origin.port}`\n        } else {\n          port = ''\n        }\n\n        cb(\n          null,\n          new URL(`${origin.protocol}//${\n            ip.family === 6 ? `[${ip.address}]` : ip.address\n          }${port}`)\n        )\n      })\n    } else {\n      // If there's IPs we pick\n      const ip = this.pick(\n        origin,\n        ips,\n        newOpts.affinity\n      )\n\n      // If no IPs we lookup - deleting old records\n      if (ip == null) {\n        this.storage.delete(origin.hostname)\n        this.runLookup(origin, opts, cb)\n        return\n      }\n\n      let port\n      if (typeof ip.port === 'number') {\n        port = `:${ip.port}`\n      } else if (origin.port !== '') {\n        port = `:${origin.port}`\n      } else {\n        port = ''\n      }\n\n      cb(\n        null,\n        new URL(`${origin.protocol}//${\n          ip.family === 6 ? `[${ip.address}]` : ip.address\n        }${port}`)\n      )\n    }\n  }\n\n  #defaultLookup (origin, opts, cb) {\n    lookup(\n      origin.hostname,\n      {\n        all: true,\n        family: this.dualStack === false ? this.affinity : 0,\n        order: 'ipv4first'\n      },\n      (err, addresses) => {\n        if (err) {\n          return cb(err)\n        }\n\n        const results = new Map()\n\n        for (const addr of addresses) {\n          // On linux we found duplicates, we attempt to remove them with\n          // the latest record\n          results.set(`${addr.address}:${addr.family}`, addr)\n        }\n\n        cb(null, results.values())\n      }\n    )\n  }\n\n  #defaultPick (origin, hostnameRecords, affinity) {\n    let ip = null\n    const { records, offset } = hostnameRecords\n\n    let family\n    if (this.dualStack) {\n      if (affinity == null) {\n        // Balance between ip families\n        if (offset == null || offset === maxInt) {\n          hostnameRecords.offset = 0\n          affinity = 4\n        } else {\n          hostnameRecords.offset++\n          affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4\n        }\n      }\n\n      if (records[affinity] != null && records[affinity].ips.length > 0) {\n        family = records[affinity]\n      } else {\n        family = records[affinity === 4 ? 6 : 4]\n      }\n    } else {\n      family = records[affinity]\n    }\n\n    // If no IPs we return null\n    if (family == null || family.ips.length === 0) {\n      return ip\n    }\n\n    if (family.offset == null || family.offset === maxInt) {\n      family.offset = 0\n    } else {\n      family.offset++\n    }\n\n    const position = family.offset % family.ips.length\n    ip = family.ips[position] ?? null\n\n    if (ip == null) {\n      return ip\n    }\n\n    if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n      // We delete expired records\n      // It is possible that they have different TTL, so we manage them individually\n      family.ips.splice(position, 1)\n      return this.pick(origin, hostnameRecords, affinity)\n    }\n\n    return ip\n  }\n\n  pickFamily (origin, ipFamily) {\n    const records = this.storage.get(origin.hostname)?.records\n    if (!records) {\n      return null\n    }\n\n    const family = records[ipFamily]\n    if (!family) {\n      return null\n    }\n\n    if (family.offset == null || family.offset === maxInt) {\n      family.offset = 0\n    } else {\n      family.offset++\n    }\n\n    const position = family.offset % family.ips.length\n    const ip = family.ips[position] ?? null\n    if (ip == null) {\n      return ip\n    }\n\n    if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n      // We delete expired records\n      // It is possible that they have different TTL, so we manage them individually\n      family.ips.splice(position, 1)\n    }\n\n    return ip\n  }\n\n  setRecords (origin, addresses) {\n    const timestamp = Date.now()\n    const records = { records: { 4: null, 6: null } }\n    let minTTL = this.#maxTTL\n    for (const record of addresses) {\n      record.timestamp = timestamp\n      if (typeof record.ttl === 'number') {\n        // The record TTL is expected to be in ms\n        record.ttl = Math.min(record.ttl, this.#maxTTL)\n        minTTL = Math.min(minTTL, record.ttl)\n      } else {\n        record.ttl = this.#maxTTL\n      }\n\n      const familyRecords = records.records[record.family] ?? { ips: [] }\n\n      familyRecords.ips.push(record)\n      records.records[record.family] = familyRecords\n    }\n\n    // We provide a default TTL if external storage will be used without TTL per record-level support\n    this.storage.set(origin.hostname, records, { ttl: minTTL })\n  }\n\n  deleteRecords (origin) {\n    this.storage.delete(origin.hostname)\n  }\n\n  getHandler (meta, opts) {\n    return new DNSDispatchHandler(this, meta, opts)\n  }\n}\n\nclass DNSDispatchHandler extends DecoratorHandler {\n  #state = null\n  #opts = null\n  #dispatch = null\n  #origin = null\n  #controller = null\n  #newOrigin = null\n  #firstTry = true\n\n  constructor (state, { origin, handler, dispatch, newOrigin }, opts) {\n    super(handler)\n    this.#origin = origin\n    this.#newOrigin = newOrigin\n    this.#opts = { ...opts }\n    this.#state = state\n    this.#dispatch = dispatch\n  }\n\n  onResponseError (controller, err) {\n    switch (err.code) {\n      case 'ETIMEDOUT':\n      case 'ECONNREFUSED': {\n        if (this.#state.dualStack) {\n          if (!this.#firstTry) {\n            super.onResponseError(controller, err)\n            return\n          }\n          this.#firstTry = false\n\n          // Pick an ip address from the other family\n          const otherFamily = this.#newOrigin.hostname[0] === '[' ? 4 : 6\n          const ip = this.#state.pickFamily(this.#origin, otherFamily)\n          if (ip == null) {\n            super.onResponseError(controller, err)\n            return\n          }\n\n          let port\n          if (typeof ip.port === 'number') {\n            port = `:${ip.port}`\n          } else if (this.#origin.port !== '') {\n            port = `:${this.#origin.port}`\n          } else {\n            port = ''\n          }\n\n          const dispatchOpts = {\n            ...this.#opts,\n            origin: `${this.#origin.protocol}//${\n              ip.family === 6 ? `[${ip.address}]` : ip.address\n            }${port}`,\n            headers: withHostHeader(this.#origin.host, this.#opts.headers)\n          }\n          this.#dispatch(dispatchOpts, this)\n          return\n        }\n\n        // if dual-stack disabled, we error out\n        super.onResponseError(controller, err)\n        break\n      }\n      case 'ENOTFOUND':\n        this.#state.deleteRecords(this.#origin)\n        super.onResponseError(controller, err)\n        break\n      default:\n        super.onResponseError(controller, err)\n        break\n    }\n  }\n}\n\nmodule.exports = interceptorOpts => {\n  if (\n    interceptorOpts?.maxTTL != null &&\n    (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0)\n  ) {\n    throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number')\n  }\n\n  if (\n    interceptorOpts?.maxItems != null &&\n    (typeof interceptorOpts?.maxItems !== 'number' ||\n      interceptorOpts?.maxItems < 1)\n  ) {\n    throw new InvalidArgumentError(\n      'Invalid maxItems. Must be a positive number and greater than zero'\n    )\n  }\n\n  if (\n    interceptorOpts?.affinity != null &&\n    interceptorOpts?.affinity !== 4 &&\n    interceptorOpts?.affinity !== 6\n  ) {\n    throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6')\n  }\n\n  if (\n    interceptorOpts?.dualStack != null &&\n    typeof interceptorOpts?.dualStack !== 'boolean'\n  ) {\n    throw new InvalidArgumentError('Invalid dualStack. Must be a boolean')\n  }\n\n  if (\n    interceptorOpts?.lookup != null &&\n    typeof interceptorOpts?.lookup !== 'function'\n  ) {\n    throw new InvalidArgumentError('Invalid lookup. Must be a function')\n  }\n\n  if (\n    interceptorOpts?.pick != null &&\n    typeof interceptorOpts?.pick !== 'function'\n  ) {\n    throw new InvalidArgumentError('Invalid pick. Must be a function')\n  }\n\n  if (\n    interceptorOpts?.storage != null &&\n    (typeof interceptorOpts?.storage?.get !== 'function' ||\n      typeof interceptorOpts?.storage?.set !== 'function' ||\n      typeof interceptorOpts?.storage?.full !== 'function' ||\n      typeof interceptorOpts?.storage?.delete !== 'function'\n    )\n  ) {\n    throw new InvalidArgumentError('Invalid storage. Must be a object with methods: { get, set, full, delete }')\n  }\n\n  const dualStack = interceptorOpts?.dualStack ?? true\n  let affinity\n  if (dualStack) {\n    affinity = interceptorOpts?.affinity ?? null\n  } else {\n    affinity = interceptorOpts?.affinity ?? 4\n  }\n\n  const opts = {\n    maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms\n    lookup: interceptorOpts?.lookup ?? null,\n    pick: interceptorOpts?.pick ?? null,\n    dualStack,\n    affinity,\n    maxItems: interceptorOpts?.maxItems ?? Infinity,\n    storage: interceptorOpts?.storage\n  }\n\n  const instance = new DNSInstance(opts)\n\n  return dispatch => {\n    return function dnsInterceptor (origDispatchOpts, handler) {\n      const origin =\n        origDispatchOpts.origin.constructor === URL\n          ? origDispatchOpts.origin\n          : new URL(origDispatchOpts.origin)\n\n      if (isIP(origin.hostname) !== 0) {\n        return dispatch(origDispatchOpts, handler)\n      }\n\n      instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {\n        if (err) {\n          return handler.onResponseError(null, err)\n        }\n\n        const dispatchOpts = {\n          ...origDispatchOpts,\n          servername: origin.hostname, // For SNI on TLS\n          origin: newOrigin.origin,\n          headers: withHostHeader(origin.host, origDispatchOpts.headers)\n        }\n\n        dispatch(\n          dispatchOpts,\n          instance.getHandler(\n            { origin, dispatch, handler, newOrigin },\n            origDispatchOpts\n          )\n        )\n      })\n\n      return true\n    }\n  }\n}\n","'use strict'\n\nconst {\n  safeHTTPMethods,\n  pathHasQueryOrFragment,\n  hasSafeIterator\n} = require('../core/util')\n\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts\n */\nfunction makeCacheKey (opts) {\n  if (!opts.origin) {\n    throw new Error('opts.origin is undefined')\n  }\n\n  let fullPath = opts.path || '/'\n\n  if (opts.query && !pathHasQueryOrFragment(opts.path)) {\n    fullPath = serializePathWithQuery(fullPath, opts.query)\n  }\n\n  return {\n    origin: opts.origin.toString(),\n    method: opts.method,\n    path: fullPath,\n    headers: opts.headers\n  }\n}\n\n/**\n * @param {Record<string, string[] | string>}\n * @returns {Record<string, string[] | string>}\n */\nfunction normalizeHeaders (opts) {\n  let headers\n  if (opts.headers == null) {\n    headers = {}\n  } else if (typeof opts.headers === 'object') {\n    headers = {}\n\n    if (hasSafeIterator(opts.headers)) {\n      for (const x of opts.headers) {\n        if (!Array.isArray(x)) {\n          throw new Error('opts.headers is not a valid header map')\n        }\n        const [key, val] = x\n        if (typeof key !== 'string' || typeof val !== 'string') {\n          throw new Error('opts.headers is not a valid header map')\n        }\n        headers[key.toLowerCase()] = val\n      }\n    } else {\n      for (const key of Object.keys(opts.headers)) {\n        headers[key.toLowerCase()] = opts.headers[key]\n      }\n    }\n  } else {\n    throw new Error('opts.headers is not an object')\n  }\n\n  return headers\n}\n\n/**\n * @param {any} key\n */\nfunction assertCacheKey (key) {\n  if (typeof key !== 'object') {\n    throw new TypeError(`expected key to be object, got ${typeof key}`)\n  }\n\n  for (const property of ['origin', 'method', 'path']) {\n    if (typeof key[property] !== 'string') {\n      throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`)\n    }\n  }\n\n  if (key.headers !== undefined && typeof key.headers !== 'object') {\n    throw new TypeError(`expected headers to be object, got ${typeof key}`)\n  }\n}\n\n/**\n * @param {any} value\n */\nfunction assertCacheValue (value) {\n  if (typeof value !== 'object') {\n    throw new TypeError(`expected value to be object, got ${typeof value}`)\n  }\n\n  for (const property of ['statusCode', 'cachedAt', 'staleAt', 'deleteAt']) {\n    if (typeof value[property] !== 'number') {\n      throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`)\n    }\n  }\n\n  if (typeof value.statusMessage !== 'string') {\n    throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`)\n  }\n\n  if (value.headers != null && typeof value.headers !== 'object') {\n    throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`)\n  }\n\n  if (value.vary !== undefined && typeof value.vary !== 'object') {\n    throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`)\n  }\n\n  if (value.etag !== undefined && typeof value.etag !== 'string') {\n    throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`)\n  }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-cache-control\n * @see https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\n\n * @param {string | string[]} header\n * @returns {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n */\nfunction parseCacheControlHeader (header) {\n  /**\n   * @type {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n   */\n  const output = {}\n\n  let directives\n  if (Array.isArray(header)) {\n    directives = []\n\n    for (const directive of header) {\n      directives.push(...directive.split(','))\n    }\n  } else {\n    directives = header.split(',')\n  }\n\n  for (let i = 0; i < directives.length; i++) {\n    const directive = directives[i].toLowerCase()\n    const keyValueDelimiter = directive.indexOf('=')\n\n    let key\n    let value\n    if (keyValueDelimiter !== -1) {\n      key = directive.substring(0, keyValueDelimiter).trimStart()\n      value = directive.substring(keyValueDelimiter + 1)\n    } else {\n      key = directive.trim()\n    }\n\n    switch (key) {\n      case 'min-fresh':\n      case 'max-stale':\n      case 'max-age':\n      case 's-maxage':\n      case 'stale-while-revalidate':\n      case 'stale-if-error': {\n        if (value === undefined || value[0] === ' ') {\n          continue\n        }\n\n        if (\n          value.length >= 2 &&\n          value[0] === '\"' &&\n          value[value.length - 1] === '\"'\n        ) {\n          value = value.substring(1, value.length - 1)\n        }\n\n        const parsedValue = parseInt(value, 10)\n        // eslint-disable-next-line no-self-compare\n        if (parsedValue !== parsedValue) {\n          continue\n        }\n\n        if (key === 'max-age' && key in output && output[key] >= parsedValue) {\n          continue\n        }\n\n        output[key] = parsedValue\n\n        break\n      }\n      case 'private':\n      case 'no-cache': {\n        if (value) {\n          // The private and no-cache directives can be unqualified (aka just\n          //  `private` or `no-cache`) or qualified (w/ a value). When they're\n          //  qualified, it's a list of headers like `no-cache=header1`,\n          //  `no-cache=\"header1\"`, or `no-cache=\"header1, header2\"`\n          // If we're given multiple headers, the comma messes us up since\n          //  we split the full header by commas. So, let's loop through the\n          //  remaining parts in front of us until we find one that ends in a\n          //  quote. We can then just splice all of the parts in between the\n          //  starting quote and the ending quote out of the directives array\n          //  and continue parsing like normal.\n          // https://www.rfc-editor.org/rfc/rfc9111.html#name-no-cache-2\n          if (value[0] === '\"') {\n            // Something like `no-cache=\"some-header\"` OR `no-cache=\"some-header, another-header\"`.\n\n            // Add the first header on and cut off the leading quote\n            const headers = [value.substring(1)]\n\n            let foundEndingQuote = value[value.length - 1] === '\"'\n            if (!foundEndingQuote) {\n              // Something like `no-cache=\"some-header, another-header\"`\n              //  This can still be something invalid, e.g. `no-cache=\"some-header, ...`\n              for (let j = i + 1; j < directives.length; j++) {\n                const nextPart = directives[j]\n                const nextPartLength = nextPart.length\n\n                headers.push(nextPart.trim())\n\n                if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '\"') {\n                  foundEndingQuote = true\n                  break\n                }\n              }\n            }\n\n            if (foundEndingQuote) {\n              let lastHeader = headers[headers.length - 1]\n              if (lastHeader[lastHeader.length - 1] === '\"') {\n                lastHeader = lastHeader.substring(0, lastHeader.length - 1)\n                headers[headers.length - 1] = lastHeader\n              }\n\n              if (key in output) {\n                output[key] = output[key].concat(headers)\n              } else {\n                output[key] = headers\n              }\n            }\n          } else {\n            // Something like `no-cache=\"some-header\"`\n            if (key in output) {\n              output[key] = output[key].concat(value)\n            } else {\n              output[key] = [value]\n            }\n          }\n\n          break\n        }\n      }\n      // eslint-disable-next-line no-fallthrough\n      case 'public':\n      case 'no-store':\n      case 'must-revalidate':\n      case 'proxy-revalidate':\n      case 'immutable':\n      case 'no-transform':\n      case 'must-understand':\n      case 'only-if-cached':\n        if (value) {\n          // These are qualified (something like `public=...`) when they aren't\n          //  allowed to be, skip\n          continue\n        }\n\n        output[key] = true\n        break\n      default:\n        // Ignore unknown directives as per https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.3-1\n        continue\n    }\n  }\n\n  return output\n}\n\n/**\n * @param {string | string[]} varyHeader Vary header from the server\n * @param {Record<string, string | string[]>} headers Request headers\n * @returns {Record<string, string | string[]>}\n */\nfunction parseVaryHeader (varyHeader, headers) {\n  if (typeof varyHeader === 'string' && varyHeader.includes('*')) {\n    return headers\n  }\n\n  const output = /** @type {Record<string, string | string[] | null>} */ ({})\n\n  const varyingHeaders = typeof varyHeader === 'string'\n    ? varyHeader.split(',')\n    : varyHeader\n\n  for (const header of varyingHeaders) {\n    const trimmedHeader = header.trim().toLowerCase()\n\n    output[trimmedHeader] = headers[trimmedHeader] ?? null\n  }\n\n  return output\n}\n\n/**\n * Note: this deviates from the spec a little. Empty etags (\"\", W/\"\") are valid,\n *  however, including them in cached resposnes serves little to no purpose.\n *\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-etag\n *\n * @param {string} etag\n * @returns {boolean}\n */\nfunction isEtagUsable (etag) {\n  if (etag.length <= 2) {\n    // Shortest an etag can be is two chars (just \"\"). This is where we deviate\n    //  from the spec requiring a min of 3 chars however\n    return false\n  }\n\n  if (etag[0] === '\"' && etag[etag.length - 1] === '\"') {\n    // ETag: \"\"asd123\"\" or ETag: \"W/\"asd123\"\", kinda undefined behavior in the\n    //  spec. Some servers will accept these while others don't.\n    // ETag: \"asd123\"\n    return !(etag[1] === '\"' || etag.startsWith('\"W/'))\n  }\n\n  if (etag.startsWith('W/\"') && etag[etag.length - 1] === '\"') {\n    // ETag: W/\"\", also where we deviate from the spec & require a min of 3\n    //  chars\n    // ETag: for W/\"\", W/\"asd123\"\n    return etag.length !== 4\n  }\n\n  // Anything else\n  return false\n}\n\n/**\n * @param {unknown} store\n * @returns {asserts store is import('../../types/cache-interceptor.d.ts').default.CacheStore}\n */\nfunction assertCacheStore (store, name = 'CacheStore') {\n  if (typeof store !== 'object' || store === null) {\n    throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? 'null' : typeof store}`)\n  }\n\n  for (const fn of ['get', 'createWriteStream', 'delete']) {\n    if (typeof store[fn] !== 'function') {\n      throw new TypeError(`${name} needs to have a \\`${fn}()\\` function`)\n    }\n  }\n}\n/**\n * @param {unknown} methods\n * @returns {asserts methods is import('../../types/cache-interceptor.d.ts').default.CacheMethods[]}\n */\nfunction assertCacheMethods (methods, name = 'CacheMethods') {\n  if (!Array.isArray(methods)) {\n    throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? 'null' : typeof methods}`)\n  }\n\n  if (methods.length === 0) {\n    throw new TypeError(`${name} needs to have at least one method`)\n  }\n\n  for (const method of methods) {\n    if (!safeHTTPMethods.includes(method)) {\n      throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(', ')}, got ${method}`)\n    }\n  }\n}\n\n/**\n * Creates a string key for request deduplication purposes.\n * This key is used to identify in-flight requests that can be shared.\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {Set<string>} [excludeHeaders] Set of lowercase header names to exclude from the key\n * @returns {string}\n */\nfunction makeDeduplicationKey (cacheKey, excludeHeaders) {\n  // Create a deterministic string key from the cache key\n  // Include origin, method, path, and sorted headers\n  let key = `${cacheKey.origin}:${cacheKey.method}:${cacheKey.path}`\n\n  if (cacheKey.headers) {\n    const sortedHeaders = Object.keys(cacheKey.headers).sort()\n    for (const header of sortedHeaders) {\n      // Skip excluded headers\n      if (excludeHeaders?.has(header.toLowerCase())) {\n        continue\n      }\n      const value = cacheKey.headers[header]\n      key += `:${header}=${Array.isArray(value) ? value.join(',') : value}`\n    }\n  }\n\n  return key\n}\n\nmodule.exports = {\n  makeCacheKey,\n  normalizeHeaders,\n  assertCacheKey,\n  assertCacheValue,\n  parseCacheControlHeader,\n  parseVaryHeader,\n  isEtagUsable,\n  assertCacheMethods,\n  assertCacheStore,\n  makeDeduplicationKey\n}\n","'use strict'\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseHttpDate (date) {\n  // Sun, 06 Nov 1994 08:49:37 GMT    ; IMF-fixdate\n  // Sun Nov  6 08:49:37 1994         ; ANSI C's asctime() format\n  // Sunday, 06-Nov-94 08:49:37 GMT   ; obsolete RFC 850 format\n\n  switch (date[3]) {\n    case ',': return parseImfDate(date)\n    case ' ': return parseAscTimeDate(date)\n    default: return parseRfc850Date(date)\n  }\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#preferred.date.format\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseImfDate (date) {\n  if (\n    date.length !== 29 ||\n    date[4] !== ' ' ||\n    date[7] !== ' ' ||\n    date[11] !== ' ' ||\n    date[16] !== ' ' ||\n    date[19] !== ':' ||\n    date[22] !== ':' ||\n    date[25] !== ' ' ||\n    date[26] !== 'G' ||\n    date[27] !== 'M' ||\n    date[28] !== 'T'\n  ) {\n    return undefined\n  }\n\n  let weekday = -1\n  if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n    weekday = 0\n  } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n    weekday = 1\n  } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n    weekday = 2\n  } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n    weekday = 3\n  } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n    weekday = 4\n  } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n    weekday = 5\n  } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n    weekday = 6\n  } else {\n    return undefined // Not a valid day of the week\n  }\n\n  let day = 0\n  if (date[5] === '0') {\n    // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n    const code = date.charCodeAt(6)\n    if (code < 49 || code > 57) {\n      return undefined // Not a digit\n    }\n    day = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(5)\n    if (code1 < 49 || code1 > 51) {\n      return undefined // Not a digit between 1 and 3\n    }\n    const code2 = date.charCodeAt(6)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let monthIdx = -1\n  if (\n    (date[8] === 'J' && date[9] === 'a' && date[10] === 'n')\n  ) {\n    monthIdx = 0 // Jan\n  } else if (\n    (date[8] === 'F' && date[9] === 'e' && date[10] === 'b')\n  ) {\n    monthIdx = 1 // Feb\n  } else if (\n    (date[8] === 'M' && date[9] === 'a')\n  ) {\n    if (date[10] === 'r') {\n      monthIdx = 2 // Mar\n    } else if (date[10] === 'y') {\n      monthIdx = 4 // May\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[8] === 'J')\n  ) {\n    if (date[9] === 'a' && date[10] === 'n') {\n      monthIdx = 0 // Jan\n    } else if (date[9] === 'u') {\n      if (date[10] === 'n') {\n        monthIdx = 5 // Jun\n      } else if (date[10] === 'l') {\n        monthIdx = 6 // Jul\n      } else {\n        return undefined // Invalid month\n      }\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[8] === 'A')\n  ) {\n    if (date[9] === 'p' && date[10] === 'r') {\n      monthIdx = 3 // Apr\n    } else if (date[9] === 'u' && date[10] === 'g') {\n      monthIdx = 7 // Aug\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[8] === 'S' && date[9] === 'e' && date[10] === 'p')\n  ) {\n    monthIdx = 8 // Sep\n  } else if (\n    (date[8] === 'O' && date[9] === 'c' && date[10] === 't')\n  ) {\n    monthIdx = 9 // Oct\n  } else if (\n    (date[8] === 'N' && date[9] === 'o' && date[10] === 'v')\n  ) {\n    monthIdx = 10 // Nov\n  } else if (\n    (date[8] === 'D' && date[9] === 'e' && date[10] === 'c')\n  ) {\n    monthIdx = 11 // Dec\n  } else {\n    // Not a valid month\n    return undefined\n  }\n\n  const yearDigit1 = date.charCodeAt(12)\n  if (yearDigit1 < 48 || yearDigit1 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit2 = date.charCodeAt(13)\n  if (yearDigit2 < 48 || yearDigit2 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit3 = date.charCodeAt(14)\n  if (yearDigit3 < 48 || yearDigit3 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit4 = date.charCodeAt(15)\n  if (yearDigit4 < 48 || yearDigit4 > 57) {\n    return undefined // Not a digit\n  }\n  const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n  let hour = 0\n  if (date[17] === '0') {\n    const code = date.charCodeAt(18)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    hour = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(17)\n    if (code1 < 48 || code1 > 50) {\n      return undefined // Not a digit between 0 and 2\n    }\n    const code2 = date.charCodeAt(18)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    if (code1 === 50 && code2 > 51) {\n      return undefined // Hour cannot be greater than 23\n    }\n    hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let minute = 0\n  if (date[20] === '0') {\n    const code = date.charCodeAt(21)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    minute = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(20)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(21)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let second = 0\n  if (date[23] === '0') {\n    const code = date.charCodeAt(24)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    second = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(23)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(24)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n  return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseAscTimeDate (date) {\n  // This is assumed to be in UTC\n\n  if (\n    date.length !== 24 ||\n    date[7] !== ' ' ||\n    date[10] !== ' ' ||\n    date[19] !== ' '\n  ) {\n    return undefined\n  }\n\n  let weekday = -1\n  if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n    weekday = 0\n  } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n    weekday = 1\n  } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n    weekday = 2\n  } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n    weekday = 3\n  } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n    weekday = 4\n  } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n    weekday = 5\n  } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n    weekday = 6\n  } else {\n    return undefined // Not a valid day of the week\n  }\n\n  let monthIdx = -1\n  if (\n    (date[4] === 'J' && date[5] === 'a' && date[6] === 'n')\n  ) {\n    monthIdx = 0 // Jan\n  } else if (\n    (date[4] === 'F' && date[5] === 'e' && date[6] === 'b')\n  ) {\n    monthIdx = 1 // Feb\n  } else if (\n    (date[4] === 'M' && date[5] === 'a')\n  ) {\n    if (date[6] === 'r') {\n      monthIdx = 2 // Mar\n    } else if (date[6] === 'y') {\n      monthIdx = 4 // May\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[4] === 'J')\n  ) {\n    if (date[5] === 'a' && date[6] === 'n') {\n      monthIdx = 0 // Jan\n    } else if (date[5] === 'u') {\n      if (date[6] === 'n') {\n        monthIdx = 5 // Jun\n      } else if (date[6] === 'l') {\n        monthIdx = 6 // Jul\n      } else {\n        return undefined // Invalid month\n      }\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[4] === 'A')\n  ) {\n    if (date[5] === 'p' && date[6] === 'r') {\n      monthIdx = 3 // Apr\n    } else if (date[5] === 'u' && date[6] === 'g') {\n      monthIdx = 7 // Aug\n    } else {\n      return undefined // Invalid month\n    }\n  } else if (\n    (date[4] === 'S' && date[5] === 'e' && date[6] === 'p')\n  ) {\n    monthIdx = 8 // Sep\n  } else if (\n    (date[4] === 'O' && date[5] === 'c' && date[6] === 't')\n  ) {\n    monthIdx = 9 // Oct\n  } else if (\n    (date[4] === 'N' && date[5] === 'o' && date[6] === 'v')\n  ) {\n    monthIdx = 10 // Nov\n  } else if (\n    (date[4] === 'D' && date[5] === 'e' && date[6] === 'c')\n  ) {\n    monthIdx = 11 // Dec\n  } else {\n    // Not a valid month\n    return undefined\n  }\n\n  let day = 0\n  if (date[8] === ' ') {\n    // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n    const code = date.charCodeAt(9)\n    if (code < 49 || code > 57) {\n      return undefined // Not a digit\n    }\n    day = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(8)\n    if (code1 < 49 || code1 > 51) {\n      return undefined // Not a digit between 1 and 3\n    }\n    const code2 = date.charCodeAt(9)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let hour = 0\n  if (date[11] === '0') {\n    const code = date.charCodeAt(12)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    hour = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(11)\n    if (code1 < 48 || code1 > 50) {\n      return undefined // Not a digit between 0 and 2\n    }\n    const code2 = date.charCodeAt(12)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    if (code1 === 50 && code2 > 51) {\n      return undefined // Hour cannot be greater than 23\n    }\n    hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let minute = 0\n  if (date[14] === '0') {\n    const code = date.charCodeAt(15)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    minute = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(14)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(15)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let second = 0\n  if (date[17] === '0') {\n    const code = date.charCodeAt(18)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    second = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(17)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(18)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  const yearDigit1 = date.charCodeAt(20)\n  if (yearDigit1 < 48 || yearDigit1 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit2 = date.charCodeAt(21)\n  if (yearDigit2 < 48 || yearDigit2 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit3 = date.charCodeAt(22)\n  if (yearDigit3 < 48 || yearDigit3 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit4 = date.charCodeAt(23)\n  if (yearDigit4 < 48 || yearDigit4 > 57) {\n    return undefined // Not a digit\n  }\n  const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n  const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n  return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseRfc850Date (date) {\n  let commaIndex = -1\n\n  let weekday = -1\n  if (date[0] === 'S') {\n    if (date[1] === 'u' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n      weekday = 0 // Sunday\n      commaIndex = 6\n    } else if (date[1] === 'a' && date[2] === 't' && date[3] === 'u' && date[4] === 'r' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n      weekday = 6 // Saturday\n      commaIndex = 8\n    }\n  } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n    weekday = 1 // Monday\n    commaIndex = 6\n  } else if (date[0] === 'T') {\n    if (date[1] === 'u' && date[2] === 'e' && date[3] === 's' && date[4] === 'd' && date[5] === 'a' && date[6] === 'y') {\n      weekday = 2 // Tuesday\n      commaIndex = 7\n    } else if (date[1] === 'h' && date[2] === 'u' && date[3] === 'r' && date[4] === 's' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n      weekday = 4 // Thursday\n      commaIndex = 8\n    }\n  } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd' && date[3] === 'n' && date[4] === 'e' && date[5] === 's' && date[6] === 'd' && date[7] === 'a' && date[8] === 'y') {\n    weekday = 3 // Wednesday\n    commaIndex = 9\n  } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n    weekday = 5 // Friday\n    commaIndex = 6\n  } else {\n    // Not a valid day name\n    return undefined\n  }\n\n  if (\n    date[commaIndex] !== ',' ||\n    (date.length - commaIndex - 1) !== 23 ||\n    date[commaIndex + 1] !== ' ' ||\n    date[commaIndex + 4] !== '-' ||\n    date[commaIndex + 8] !== '-' ||\n    date[commaIndex + 11] !== ' ' ||\n    date[commaIndex + 14] !== ':' ||\n    date[commaIndex + 17] !== ':' ||\n    date[commaIndex + 20] !== ' ' ||\n    date[commaIndex + 21] !== 'G' ||\n    date[commaIndex + 22] !== 'M' ||\n    date[commaIndex + 23] !== 'T'\n  ) {\n    return undefined\n  }\n\n  let day = 0\n  if (date[commaIndex + 2] === '0') {\n    // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n    const code = date.charCodeAt(commaIndex + 3)\n    if (code < 49 || code > 57) {\n      return undefined // Not a digit\n    }\n    day = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(commaIndex + 2)\n    if (code1 < 49 || code1 > 51) {\n      return undefined // Not a digit between 1 and 3\n    }\n    const code2 = date.charCodeAt(commaIndex + 3)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let monthIdx = -1\n  if (\n    (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'n')\n  ) {\n    monthIdx = 0 // Jan\n  } else if (\n    (date[commaIndex + 5] === 'F' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'b')\n  ) {\n    monthIdx = 1 // Feb\n  } else if (\n    (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'r')\n  ) {\n    monthIdx = 2 // Mar\n  } else if (\n    (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'p' && date[commaIndex + 7] === 'r')\n  ) {\n    monthIdx = 3 // Apr\n  } else if (\n    (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'y')\n  ) {\n    monthIdx = 4 // May\n  } else if (\n    (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'n')\n  ) {\n    monthIdx = 5 // Jun\n  } else if (\n    (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'l')\n  ) {\n    monthIdx = 6 // Jul\n  } else if (\n    (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'g')\n  ) {\n    monthIdx = 7 // Aug\n  } else if (\n    (date[commaIndex + 5] === 'S' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'p')\n  ) {\n    monthIdx = 8 // Sep\n  } else if (\n    (date[commaIndex + 5] === 'O' && date[commaIndex + 6] === 'c' && date[commaIndex + 7] === 't')\n  ) {\n    monthIdx = 9 // Oct\n  } else if (\n    (date[commaIndex + 5] === 'N' && date[commaIndex + 6] === 'o' && date[commaIndex + 7] === 'v')\n  ) {\n    monthIdx = 10 // Nov\n  } else if (\n    (date[commaIndex + 5] === 'D' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'c')\n  ) {\n    monthIdx = 11 // Dec\n  } else {\n    // Not a valid month\n    return undefined\n  }\n\n  const yearDigit1 = date.charCodeAt(commaIndex + 9)\n  if (yearDigit1 < 48 || yearDigit1 > 57) {\n    return undefined // Not a digit\n  }\n  const yearDigit2 = date.charCodeAt(commaIndex + 10)\n  if (yearDigit2 < 48 || yearDigit2 > 57) {\n    return undefined // Not a digit\n  }\n\n  let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48) // Convert ASCII codes to number\n\n  // RFC 6265 states that the year is in the range 1970-2069.\n  // @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.1\n  //\n  // 3. If the year-value is greater than or equal to 70 and less than or\n  //    equal to 99, increment the year-value by 1900.\n  // 4. If the year-value is greater than or equal to 0 and less than or\n  //    equal to 69, increment the year-value by 2000.\n  year += year < 70 ? 2000 : 1900\n\n  let hour = 0\n  if (date[commaIndex + 12] === '0') {\n    const code = date.charCodeAt(commaIndex + 13)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    hour = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(commaIndex + 12)\n    if (code1 < 48 || code1 > 50) {\n      return undefined // Not a digit between 0 and 2\n    }\n    const code2 = date.charCodeAt(commaIndex + 13)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    if (code1 === 50 && code2 > 51) {\n      return undefined // Hour cannot be greater than 23\n    }\n    hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let minute = 0\n  if (date[commaIndex + 15] === '0') {\n    const code = date.charCodeAt(commaIndex + 16)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    minute = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(commaIndex + 15)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(commaIndex + 16)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  let second = 0\n  if (date[commaIndex + 18] === '0') {\n    const code = date.charCodeAt(commaIndex + 19)\n    if (code < 48 || code > 57) {\n      return undefined // Not a digit\n    }\n    second = code - 48 // Convert ASCII code to number\n  } else {\n    const code1 = date.charCodeAt(commaIndex + 18)\n    if (code1 < 48 || code1 > 53) {\n      return undefined // Not a digit between 0 and 5\n    }\n    const code2 = date.charCodeAt(commaIndex + 19)\n    if (code2 < 48 || code2 > 57) {\n      return undefined // Not a digit\n    }\n    second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n  }\n\n  const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n  return result.getUTCDay() === weekday ? result : undefined\n}\n\nmodule.exports = {\n  parseHttpDate\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst {\n  parseCacheControlHeader,\n  parseVaryHeader,\n  isEtagUsable\n} = require('../util/cache')\nconst { parseHttpDate } = require('../util/date.js')\n\nfunction noop () {}\n\n// Status codes that we can use some heuristics on to cache\nconst HEURISTICALLY_CACHEABLE_STATUS_CODES = [\n  200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501\n]\n\n// Status codes which semantic is not handled by the cache\n// https://datatracker.ietf.org/doc/html/rfc9111#section-3\n// This list should not grow beyond 206 unless the RFC is updated\n// by a newer one including more. Please introduce another list if\n// implementing caching of responses with the 'must-understand' directive.\nconst NOT_UNDERSTOOD_STATUS_CODES = [\n  206\n]\n\nconst MAX_RESPONSE_AGE = 2147483647000\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n *\n * @implements {DispatchHandler}\n */\nclass CacheHandler {\n  /**\n   * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n   */\n  #cacheKey\n\n  /**\n   * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']}\n   */\n  #cacheType\n\n  /**\n   * @type {number | undefined}\n   */\n  #cacheByDefault\n\n  /**\n   * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore}\n   */\n  #store\n\n  /**\n   * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n   */\n  #handler\n\n  /**\n   * @type {import('node:stream').Writable | undefined}\n   */\n  #writeStream\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n   */\n  constructor ({ store, type, cacheByDefault }, cacheKey, handler) {\n    this.#store = store\n    this.#cacheType = type\n    this.#cacheByDefault = cacheByDefault\n    this.#cacheKey = cacheKey\n    this.#handler = handler\n  }\n\n  onRequestStart (controller, context) {\n    this.#writeStream?.destroy()\n    this.#writeStream = undefined\n    this.#handler.onRequestStart?.(controller, context)\n  }\n\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {number} statusCode\n   * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n   * @param {string} statusMessage\n   */\n  onResponseStart (\n    controller,\n    statusCode,\n    resHeaders,\n    statusMessage\n  ) {\n    const downstreamOnHeaders = () =>\n      this.#handler.onResponseStart?.(\n        controller,\n        statusCode,\n        resHeaders,\n        statusMessage\n      )\n    const handler = this\n\n    if (\n      !util.safeHTTPMethods.includes(this.#cacheKey.method) &&\n      statusCode >= 200 &&\n      statusCode <= 399\n    ) {\n      // Successful response to an unsafe method, delete it from cache\n      //  https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response\n      try {\n        this.#store.delete(this.#cacheKey)?.catch?.(noop)\n      } catch {\n        // Fail silently\n      }\n      return downstreamOnHeaders()\n    }\n\n    const cacheControlHeader = resHeaders['cache-control']\n    const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode)\n    if (\n      !cacheControlHeader &&\n      !resHeaders['expires'] &&\n      !heuristicallyCacheable &&\n      !this.#cacheByDefault\n    ) {\n      // Don't have anything to tell us this response is cachable and we're not\n      //  caching by default\n      return downstreamOnHeaders()\n    }\n\n    const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}\n    if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {\n      return downstreamOnHeaders()\n    }\n\n    const now = Date.now()\n    const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined\n    if (resAge && resAge >= MAX_RESPONSE_AGE) {\n      // Response considered stale\n      return downstreamOnHeaders()\n    }\n\n    const resDate = typeof resHeaders.date === 'string'\n      ? parseHttpDate(resHeaders.date)\n      : undefined\n\n    const staleAt =\n      determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ??\n      this.#cacheByDefault\n    if (staleAt === undefined || (resAge && resAge > staleAt)) {\n      return downstreamOnHeaders()\n    }\n\n    const baseTime = resDate ? resDate.getTime() : now\n    const absoluteStaleAt = staleAt + baseTime\n    if (now >= absoluteStaleAt) {\n      // Response is already stale\n      return downstreamOnHeaders()\n    }\n\n    let varyDirectives\n    if (this.#cacheKey.headers && resHeaders.vary) {\n      varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers)\n      if (!varyDirectives) {\n        // Parse error\n        return downstreamOnHeaders()\n      }\n    }\n\n    const deleteAt = determineDeleteAt(baseTime, cacheControlDirectives, absoluteStaleAt)\n    const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives)\n\n    /**\n     * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n     */\n    const value = {\n      statusCode,\n      statusMessage,\n      headers: strippedHeaders,\n      vary: varyDirectives,\n      cacheControlDirectives,\n      cachedAt: resAge ? now - resAge : now,\n      staleAt: absoluteStaleAt,\n      deleteAt\n    }\n\n    // Not modified, re-use the cached value\n    // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-304-not-modified\n    if (statusCode === 304) {\n      const handle304 = (cachedValue) => {\n        if (!cachedValue) {\n          // Do not create a new cache entry, as a 304 won't have a body - so cannot be cached.\n          return downstreamOnHeaders()\n        }\n\n        // Re-use the cached value: statuscode, statusmessage, headers and body\n        value.statusCode = cachedValue.statusCode\n        value.statusMessage = cachedValue.statusMessage\n        value.etag = cachedValue.etag\n        value.headers = { ...cachedValue.headers, ...strippedHeaders }\n\n        downstreamOnHeaders()\n\n        this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n        if (!this.#writeStream || !cachedValue?.body) {\n          return\n        }\n\n        if (typeof cachedValue.body.values === 'function') {\n          const bodyIterator = cachedValue.body.values()\n\n          const streamCachedBody = () => {\n            for (const chunk of bodyIterator) {\n              const full = this.#writeStream.write(chunk) === false\n              this.#handler.onResponseData?.(controller, chunk)\n              // when stream is full stop writing until we get a 'drain' event\n              if (full) {\n                break\n              }\n            }\n          }\n\n          this.#writeStream\n            .on('error', function () {\n              handler.#writeStream = undefined\n              handler.#store.delete(handler.#cacheKey)\n            })\n            .on('drain', () => {\n              streamCachedBody()\n            })\n            .on('close', function () {\n              if (handler.#writeStream === this) {\n                handler.#writeStream = undefined\n              }\n            })\n\n          streamCachedBody()\n        } else if (typeof cachedValue.body.on === 'function') {\n          // Readable stream body (e.g. from async/remote cache stores)\n          cachedValue.body\n            .on('data', (chunk) => {\n              this.#writeStream.write(chunk)\n              this.#handler.onResponseData?.(controller, chunk)\n            })\n            .on('end', () => {\n              this.#writeStream.end()\n            })\n            .on('error', () => {\n              this.#writeStream = undefined\n              this.#store.delete(this.#cacheKey)\n            })\n\n          this.#writeStream\n            .on('error', function () {\n              handler.#writeStream = undefined\n              handler.#store.delete(handler.#cacheKey)\n            })\n            .on('close', function () {\n              if (handler.#writeStream === this) {\n                handler.#writeStream = undefined\n              }\n            })\n        }\n      }\n\n      /**\n       * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n       */\n      const result = this.#store.get(this.#cacheKey)\n      if (result && typeof result.then === 'function') {\n        result.then(handle304)\n      } else {\n        handle304(result)\n      }\n    } else {\n      if (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) {\n        value.etag = resHeaders.etag\n      }\n\n      this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n      if (!this.#writeStream) {\n        return downstreamOnHeaders()\n      }\n\n      this.#writeStream\n        .on('drain', () => controller.resume())\n        .on('error', function () {\n          // TODO (fix): Make error somehow observable?\n          handler.#writeStream = undefined\n\n          // Delete the value in case the cache store is holding onto state from\n          //  the call to createWriteStream\n          handler.#store.delete(handler.#cacheKey)\n        })\n        .on('close', function () {\n          if (handler.#writeStream === this) {\n            handler.#writeStream = undefined\n          }\n\n          // TODO (fix): Should we resume even if was paused downstream?\n          controller.resume()\n        })\n\n      downstreamOnHeaders()\n    }\n  }\n\n  onResponseData (controller, chunk) {\n    if (this.#writeStream?.write(chunk) === false) {\n      controller.pause()\n    }\n\n    this.#handler.onResponseData?.(controller, chunk)\n  }\n\n  onResponseEnd (controller, trailers) {\n    this.#writeStream?.end()\n    this.#handler.onResponseEnd?.(controller, trailers)\n  }\n\n  onResponseError (controller, err) {\n    this.#writeStream?.destroy(err)\n    this.#writeStream = undefined\n    this.#handler.onResponseError?.(controller, err)\n  }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n *\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]\n */\nfunction canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {\n  // Status code must be final and understood.\n  if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {\n    return false\n  }\n  // Responses with neither status codes that are heuristically cacheable, nor \"explicit enough\" caching\n  // directives, are not cacheable. \"Explicit enough\": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3\n  if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&\n    !cacheControlDirectives.public &&\n    cacheControlDirectives['max-age'] === undefined &&\n    // RFC 9111: a private response directive, if the cache is not shared\n    !(cacheControlDirectives.private && cacheType === 'private') &&\n    !(cacheControlDirectives['s-maxage'] !== undefined && cacheType === 'shared')\n  ) {\n    return false\n  }\n\n  if (cacheControlDirectives['no-store']) {\n    return false\n  }\n\n  if (cacheType === 'shared' && cacheControlDirectives.private === true) {\n    return false\n  }\n\n  // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5\n  if (resHeaders.vary?.includes('*')) {\n    return false\n  }\n\n  // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n  if (reqHeaders?.authorization) {\n    if (\n      !cacheControlDirectives.public &&\n      !cacheControlDirectives['s-maxage'] &&\n      !cacheControlDirectives['must-revalidate']\n    ) {\n      return false\n    }\n\n    if (typeof reqHeaders.authorization !== 'string') {\n      return false\n    }\n\n    if (\n      Array.isArray(cacheControlDirectives['no-cache']) &&\n      cacheControlDirectives['no-cache'].includes('authorization')\n    ) {\n      return false\n    }\n\n    if (\n      Array.isArray(cacheControlDirectives['private']) &&\n      cacheControlDirectives['private'].includes('authorization')\n    ) {\n      return false\n    }\n  }\n\n  return true\n}\n\n/**\n * @param {string | string[]} ageHeader\n * @returns {number | undefined}\n */\nfunction getAge (ageHeader) {\n  const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader)\n\n  return isNaN(age) ? undefined : age * 1000\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} now\n * @param {number | undefined} age\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {Date | undefined} responseDate\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n *\n * @returns {number | undefined} time that the value is stale at in seconds or undefined if it shouldn't be cached\n */\nfunction determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) {\n  if (cacheType === 'shared') {\n    // Prioritize s-maxage since we're a shared cache\n    //  s-maxage > max-age > Expire\n    //  https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10-3\n    const sMaxAge = cacheControlDirectives['s-maxage']\n    if (sMaxAge !== undefined) {\n      return sMaxAge > 0 ? sMaxAge * 1000 : undefined\n    }\n  }\n\n  const maxAge = cacheControlDirectives['max-age']\n  if (maxAge !== undefined) {\n    return maxAge > 0 ? maxAge * 1000 : undefined\n  }\n\n  if (typeof resHeaders.expires === 'string') {\n    // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3\n    const expiresDate = parseHttpDate(resHeaders.expires)\n    if (expiresDate) {\n      if (now >= expiresDate.getTime()) {\n        return undefined\n      }\n\n      if (responseDate) {\n        if (responseDate >= expiresDate) {\n          return undefined\n        }\n\n        if (age !== undefined && age > (expiresDate - responseDate)) {\n          return undefined\n        }\n      }\n\n      return expiresDate.getTime() - now\n    }\n  }\n\n  if (typeof resHeaders['last-modified'] === 'string') {\n    // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh\n    const lastModified = new Date(resHeaders['last-modified'])\n    if (isValidDate(lastModified)) {\n      if (lastModified.getTime() >= now) {\n        return undefined\n      }\n\n      const responseAge = now - lastModified.getTime()\n\n      return responseAge * 0.1\n    }\n  }\n\n  if (cacheControlDirectives.immutable) {\n    // https://www.rfc-editor.org/rfc/rfc8246.html#section-2.2\n    return 31536000\n  }\n\n  return undefined\n}\n\n/**\n * @param {number} now\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {number} staleAt\n */\nfunction determineDeleteAt (now, cacheControlDirectives, staleAt) {\n  let staleWhileRevalidate = -Infinity\n  let staleIfError = -Infinity\n  let immutable = -Infinity\n\n  if (cacheControlDirectives['stale-while-revalidate']) {\n    staleWhileRevalidate = staleAt + (cacheControlDirectives['stale-while-revalidate'] * 1000)\n  }\n\n  if (cacheControlDirectives['stale-if-error']) {\n    staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000)\n  }\n\n  if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {\n    immutable = now + 31536000000\n  }\n\n  // When no stale directives or immutable flag, add a revalidation buffer\n  // equal to the freshness lifetime so the entry survives past staleAt long\n  // enough to be revalidated instead of silently disappearing.\n  if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {\n    const freshnessLifetime = staleAt - now\n    return staleAt + freshnessLifetime\n  }\n\n  return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable)\n}\n\n/**\n * Strips headers required to be removed in cached responses\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @returns {Record<string, string | string []>}\n */\nfunction stripNecessaryHeaders (resHeaders, cacheControlDirectives) {\n  const headersToRemove = [\n    'connection',\n    'proxy-authenticate',\n    'proxy-authentication-info',\n    'proxy-authorization',\n    'proxy-connection',\n    'te',\n    'transfer-encoding',\n    'upgrade',\n    // We'll add age back when serving it\n    'age'\n  ]\n\n  if (resHeaders['connection']) {\n    if (Array.isArray(resHeaders['connection'])) {\n      // connection: a\n      // connection: b\n      headersToRemove.push(...resHeaders['connection'].map(header => header.trim()))\n    } else {\n      // connection: a, b\n      headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim()))\n    }\n  }\n\n  if (Array.isArray(cacheControlDirectives['no-cache'])) {\n    headersToRemove.push(...cacheControlDirectives['no-cache'])\n  }\n\n  if (Array.isArray(cacheControlDirectives['private'])) {\n    headersToRemove.push(...cacheControlDirectives['private'])\n  }\n\n  let strippedHeaders\n  for (const headerName of headersToRemove) {\n    if (resHeaders[headerName]) {\n      strippedHeaders ??= { ...resHeaders }\n      delete strippedHeaders[headerName]\n    }\n  }\n\n  return strippedHeaders ?? resHeaders\n}\n\n/**\n * @param {Date} date\n * @returns {boolean}\n */\nfunction isValidDate (date) {\n  return date instanceof Date && Number.isFinite(date.valueOf())\n}\n\nmodule.exports = CacheHandler\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { EventEmitter } = require('node:events')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheKey} CacheKey\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheValue} CacheValue\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @typedef {import('../../types/cache-interceptor.d.ts').default.GetResult} GetResult\n */\n\n/**\n * @implements {CacheStore}\n * @extends {EventEmitter}\n */\nclass MemoryCacheStore extends EventEmitter {\n  #maxCount = 1024\n  #maxSize = 104857600 // 100MB\n  #maxEntrySize = 5242880 // 5MB\n\n  #size = 0\n  #count = 0\n  #entries = new Map()\n  #hasEmittedMaxSizeEvent = false\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts]\n   */\n  constructor (opts) {\n    super()\n    if (opts) {\n      if (typeof opts !== 'object') {\n        throw new TypeError('MemoryCacheStore options must be an object')\n      }\n\n      if (opts.maxCount !== undefined) {\n        if (\n          typeof opts.maxCount !== 'number' ||\n          !Number.isInteger(opts.maxCount) ||\n          opts.maxCount < 0\n        ) {\n          throw new TypeError('MemoryCacheStore options.maxCount must be a non-negative integer')\n        }\n        this.#maxCount = opts.maxCount\n      }\n\n      if (opts.maxSize !== undefined) {\n        if (\n          typeof opts.maxSize !== 'number' ||\n          !Number.isInteger(opts.maxSize) ||\n          opts.maxSize < 0\n        ) {\n          throw new TypeError('MemoryCacheStore options.maxSize must be a non-negative integer')\n        }\n        this.#maxSize = opts.maxSize\n      }\n\n      if (opts.maxEntrySize !== undefined) {\n        if (\n          typeof opts.maxEntrySize !== 'number' ||\n          !Number.isInteger(opts.maxEntrySize) ||\n          opts.maxEntrySize < 0\n        ) {\n          throw new TypeError('MemoryCacheStore options.maxEntrySize must be a non-negative integer')\n        }\n        this.#maxEntrySize = opts.maxEntrySize\n      }\n    }\n  }\n\n  /**\n   * Get the current size of the cache in bytes\n   * @returns {number} The current size of the cache in bytes\n   */\n  get size () {\n    return this.#size\n  }\n\n  /**\n   * Check if the cache is full (either max size or max count reached)\n   * @returns {boolean} True if the cache is full, false otherwise\n   */\n  isFull () {\n    return this.#size >= this.#maxSize || this.#count >= this.#maxCount\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req\n   * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}\n   */\n  get (key) {\n    assertCacheKey(key)\n\n    const topLevelKey = `${key.origin}:${key.path}`\n\n    const now = Date.now()\n    const entries = this.#entries.get(topLevelKey)\n\n    const entry = entries ? findEntry(key, entries, now) : null\n\n    return entry == null\n      ? undefined\n      : {\n          statusMessage: entry.statusMessage,\n          statusCode: entry.statusCode,\n          headers: entry.headers,\n          body: entry.body,\n          vary: entry.vary ? entry.vary : undefined,\n          etag: entry.etag,\n          cacheControlDirectives: entry.cacheControlDirectives,\n          cachedAt: entry.cachedAt,\n          staleAt: entry.staleAt,\n          deleteAt: entry.deleteAt\n        }\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val\n   * @returns {Writable | undefined}\n   */\n  createWriteStream (key, val) {\n    assertCacheKey(key)\n    assertCacheValue(val)\n\n    const topLevelKey = `${key.origin}:${key.path}`\n\n    const store = this\n    const entry = { ...key, ...val, body: [], size: 0 }\n\n    return new Writable({\n      write (chunk, encoding, callback) {\n        if (typeof chunk === 'string') {\n          chunk = Buffer.from(chunk, encoding)\n        }\n\n        entry.size += chunk.byteLength\n\n        if (entry.size >= store.#maxEntrySize) {\n          this.destroy()\n        } else {\n          entry.body.push(chunk)\n        }\n\n        callback(null)\n      },\n      final (callback) {\n        let entries = store.#entries.get(topLevelKey)\n        if (!entries) {\n          entries = []\n          store.#entries.set(topLevelKey, entries)\n        }\n        const previousEntry = findEntry(key, entries, Date.now())\n        if (previousEntry) {\n          const index = entries.indexOf(previousEntry)\n          entries.splice(index, 1, entry)\n          store.#size -= previousEntry.size\n        } else {\n          entries.push(entry)\n          store.#count += 1\n        }\n\n        store.#size += entry.size\n\n        // Check if cache is full and emit event if needed\n        if (store.#size > store.#maxSize || store.#count > store.#maxCount) {\n          // Emit maxSizeExceeded event if we haven't already\n          if (!store.#hasEmittedMaxSizeEvent) {\n            store.emit('maxSizeExceeded', {\n              size: store.#size,\n              maxSize: store.#maxSize,\n              count: store.#count,\n              maxCount: store.#maxCount\n            })\n            store.#hasEmittedMaxSizeEvent = true\n          }\n\n          // Perform eviction\n          for (const [key, entries] of store.#entries) {\n            for (const entry of entries.splice(0, entries.length / 2)) {\n              store.#size -= entry.size\n              store.#count -= 1\n            }\n            if (entries.length === 0) {\n              store.#entries.delete(key)\n            }\n          }\n\n          // Reset the event flag after eviction\n          if (store.#size < store.#maxSize && store.#count < store.#maxCount) {\n            store.#hasEmittedMaxSizeEvent = false\n          }\n        }\n\n        callback(null)\n      }\n    })\n  }\n\n  /**\n   * @param {CacheKey} key\n   */\n  delete (key) {\n    if (typeof key !== 'object') {\n      throw new TypeError(`expected key to be object, got ${typeof key}`)\n    }\n\n    const topLevelKey = `${key.origin}:${key.path}`\n\n    for (const entry of this.#entries.get(topLevelKey) ?? []) {\n      this.#size -= entry.size\n      this.#count -= 1\n    }\n    this.#entries.delete(topLevelKey)\n  }\n}\n\nfunction findEntry (key, entries, now) {\n  return entries.find((entry) => (\n    entry.deleteAt > now &&\n    entry.method === key.method &&\n    (entry.vary == null || Object.keys(entry.vary).every(headerName => {\n      if (entry.vary[headerName] === null) {\n        return key.headers[headerName] === undefined\n      }\n\n      return entry.vary[headerName] === key.headers[headerName]\n    }))\n  ))\n}\n\nmodule.exports = MemoryCacheStore\n","'use strict'\n\nconst assert = require('node:assert')\n\n/**\n * This takes care of revalidation requests we send to the origin. If we get\n *  a response indicating that what we have is cached (via a HTTP 304), we can\n *  continue using the cached value. Otherwise, we'll receive the new response\n *  here, which we then just pass on to the next handler (most likely a\n *  CacheHandler). Note that this assumes the proper headers were already\n *  included in the request to tell the origin that we want to revalidate the\n *  response (i.e. if-modified-since or if-none-match).\n *\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation\n *\n * @implements {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n */\nclass CacheRevalidationHandler {\n  #successful = false\n\n  /**\n   * @type {((boolean, any) => void) | null}\n   */\n  #callback\n\n  /**\n   * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)}\n   */\n  #handler\n\n  #context\n\n  /**\n   * @type {boolean}\n   */\n  #allowErrorStatusCodes\n\n  /**\n   * @param {(boolean) => void} callback Function to call if the cached value is valid\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler\n   * @param {boolean} allowErrorStatusCodes\n   */\n  constructor (callback, handler, allowErrorStatusCodes) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function')\n    }\n\n    this.#callback = callback\n    this.#handler = handler\n    this.#allowErrorStatusCodes = allowErrorStatusCodes\n  }\n\n  onRequestStart (_, context) {\n    this.#successful = false\n    this.#context = context\n  }\n\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n  }\n\n  onResponseStart (\n    controller,\n    statusCode,\n    headers,\n    statusMessage\n  ) {\n    assert(this.#callback != null)\n\n    // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-a-validation-respo\n    // https://datatracker.ietf.org/doc/html/rfc5861#section-4\n    this.#successful = statusCode === 304 ||\n      (this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504)\n    this.#callback(this.#successful, this.#context)\n    this.#callback = null\n\n    if (this.#successful) {\n      return true\n    }\n\n    this.#handler.onRequestStart?.(controller, this.#context)\n    this.#handler.onResponseStart?.(\n      controller,\n      statusCode,\n      headers,\n      statusMessage\n    )\n  }\n\n  onResponseData (controller, chunk) {\n    if (this.#successful) {\n      return\n    }\n\n    return this.#handler.onResponseData?.(controller, chunk)\n  }\n\n  onResponseEnd (controller, trailers) {\n    if (this.#successful) {\n      return\n    }\n\n    this.#handler.onResponseEnd?.(controller, trailers)\n  }\n\n  onResponseError (controller, err) {\n    if (this.#successful) {\n      return\n    }\n\n    if (this.#callback) {\n      this.#callback(false)\n      this.#callback = null\n    }\n\n    if (typeof this.#handler.onResponseError === 'function') {\n      this.#handler.onResponseError(controller, err)\n    } else {\n      throw err\n    }\n  }\n}\n\nmodule.exports = CacheRevalidationHandler\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst util = require('../core/util')\nconst CacheHandler = require('../handler/cache-handler')\nconst MemoryCacheStore = require('../cache/memory-cache-store')\nconst CacheRevalidationHandler = require('../handler/cache-revalidation-handler')\nconst { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require('../util/cache.js')\nconst { AbortError } = require('../core/errors.js')\n\n/**\n * @param {(string | RegExp)[] | undefined} origins\n * @param {string} name\n */\nfunction assertCacheOrigins (origins, name) {\n  if (origins === undefined) return\n  if (!Array.isArray(origins)) {\n    throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`)\n  }\n  for (let i = 0; i < origins.length; i++) {\n    const origin = origins[i]\n    if (typeof origin !== 'string' && !(origin instanceof RegExp)) {\n      throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)\n    }\n  }\n}\n\nconst nop = () => {}\n\n/**\n * @typedef {(options: import('../../types/dispatcher.d.ts').default.DispatchOptions, handler: import('../../types/dispatcher.d.ts').default.DispatchHandler) => void} DispatchFn\n */\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @returns {boolean}\n */\nfunction needsRevalidation (result, cacheControlDirectives, { headers = {} }) {\n  // Always revalidate requests with the no-cache request directive.\n  if (cacheControlDirectives?.['no-cache']) {\n    return true\n  }\n\n  // Always revalidate requests with unqualified no-cache response directive.\n  if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) {\n    return true\n  }\n\n  // Always revalidate requests with conditional headers.\n  if (headers['if-modified-since'] || headers['if-none-match']) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @returns {boolean}\n */\nfunction isStale (result, cacheControlDirectives) {\n  const now = Date.now()\n  if (now > result.staleAt) {\n    // Response is stale\n    if (cacheControlDirectives?.['max-stale']) {\n      // There's a threshold where we can serve stale responses, let's see if\n      //  we're in it\n      // https://www.rfc-editor.org/rfc/rfc9111.html#name-max-stale\n      const gracePeriod = result.staleAt + (cacheControlDirectives['max-stale'] * 1000)\n      return now > gracePeriod\n    }\n\n    return true\n  }\n\n  if (cacheControlDirectives?.['min-fresh']) {\n    // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.3\n\n    // At this point, staleAt is always > now\n    const timeLeftTillStale = result.staleAt - now\n    const threshold = cacheControlDirectives['min-fresh'] * 1000\n\n    return timeLeftTillStale <= threshold\n  }\n\n  return false\n}\n\n/**\n * Check if we're within the stale-while-revalidate window for a stale response\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @returns {boolean}\n */\nfunction withinStaleWhileRevalidateWindow (result) {\n  const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']\n  if (!staleWhileRevalidate) {\n    return false\n  }\n\n  const now = Date.now()\n  const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)\n  return now <= staleWhileRevalidateExpiry\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n */\nfunction handleUncachedResponse (\n  dispatch,\n  globalOpts,\n  cacheKey,\n  handler,\n  opts,\n  reqCacheControl\n) {\n  if (reqCacheControl?.['only-if-cached']) {\n    let aborted = false\n    try {\n      if (typeof handler.onConnect === 'function') {\n        handler.onConnect(() => {\n          aborted = true\n        })\n\n        if (aborted) {\n          return\n        }\n      }\n\n      if (typeof handler.onHeaders === 'function') {\n        handler.onHeaders(504, [], nop, 'Gateway Timeout')\n        if (aborted) {\n          return\n        }\n      }\n\n      if (typeof handler.onComplete === 'function') {\n        handler.onComplete([])\n      }\n    } catch (err) {\n      if (typeof handler.onError === 'function') {\n        handler.onError(err)\n      }\n    }\n\n    return true\n  }\n\n  return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n}\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {number} age\n * @param {any} context\n * @param {boolean} isStale\n */\nfunction sendCachedValue (handler, opts, result, age, context, isStale) {\n  // TODO (perf): Readable.from path can be optimized...\n  const stream = util.isStream(result.body)\n    ? result.body\n    : Readable.from(result.body ?? [])\n\n  assert(!stream.destroyed, 'stream should not be destroyed')\n  assert(!stream.readableDidRead, 'stream should not be readableDidRead')\n\n  const controller = {\n    resume () {\n      stream.resume()\n    },\n    pause () {\n      stream.pause()\n    },\n    get paused () {\n      return stream.isPaused()\n    },\n    get aborted () {\n      return stream.destroyed\n    },\n    get reason () {\n      return stream.errored\n    },\n    abort (reason) {\n      stream.destroy(reason ?? new AbortError())\n    }\n  }\n\n  stream\n    .on('error', function (err) {\n      if (!this.readableEnded) {\n        if (typeof handler.onResponseError === 'function') {\n          handler.onResponseError(controller, err)\n        } else {\n          throw err\n        }\n      }\n    })\n    .on('close', function () {\n      if (!this.errored) {\n        handler.onResponseEnd?.(controller, {})\n      }\n    })\n\n  handler.onRequestStart?.(controller, context)\n\n  if (stream.destroyed) {\n    return\n  }\n\n  // Add the age header\n  // https://www.rfc-editor.org/rfc/rfc9111.html#name-age\n  const headers = { ...result.headers, age: String(age) }\n\n  if (isStale) {\n    // Add warning header\n    //  https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning\n    headers.warning = '110 - \"response is stale\"'\n  }\n\n  handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage)\n\n  if (opts.method === 'HEAD') {\n    stream.destroy()\n  } else {\n    stream.on('data', function (chunk) {\n      handler.onResponseData?.(controller, chunk)\n    })\n  }\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} result\n */\nfunction handleResult (\n  dispatch,\n  globalOpts,\n  cacheKey,\n  handler,\n  opts,\n  reqCacheControl,\n  result\n) {\n  if (!result) {\n    return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)\n  }\n\n  const now = Date.now()\n  if (now > result.deleteAt) {\n    // Response is expired, cache store shouldn't have given this to us\n    return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n  }\n\n  const age = Math.round((now - result.cachedAt) / 1000)\n  if (reqCacheControl?.['max-age'] && age >= reqCacheControl['max-age']) {\n    // Response is considered expired for this specific request\n    //  https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.1\n    return dispatch(opts, handler)\n  }\n\n  const stale = isStale(result, reqCacheControl)\n  const revalidate = needsRevalidation(result, reqCacheControl, opts)\n\n  // Check if the response is stale\n  if (stale || revalidate) {\n    if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {\n      // If body is a stream we can't revalidate...\n      // TODO (fix): This could be less strict...\n      return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n    }\n\n    // RFC 5861: If we're within stale-while-revalidate window, serve stale immediately\n    // and revalidate in background, unless immediate revalidation is necessary\n    if (!revalidate && withinStaleWhileRevalidateWindow(result)) {\n      // Serve stale response immediately\n      sendCachedValue(handler, opts, result, age, null, true)\n\n      // Start background revalidation (fire-and-forget)\n      queueMicrotask(() => {\n        const headers = {\n          ...opts.headers,\n          'if-modified-since': new Date(result.cachedAt).toUTCString()\n        }\n\n        if (result.etag) {\n          headers['if-none-match'] = result.etag\n        }\n\n        if (result.vary) {\n          for (const key in result.vary) {\n            if (result.vary[key] != null) {\n              headers[key] = result.vary[key]\n            }\n          }\n        }\n\n        // Background revalidation - update cache if we get new data\n        dispatch(\n          {\n            ...opts,\n            headers\n          },\n          new CacheHandler(globalOpts, cacheKey, {\n            // Silent handler that just updates the cache\n            onRequestStart () {},\n            onRequestUpgrade () {},\n            onResponseStart () {},\n            onResponseData () {},\n            onResponseEnd () {},\n            onResponseError () {}\n          })\n        )\n      })\n\n      return true\n    }\n\n    let withinStaleIfErrorThreshold = false\n    const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']\n    if (staleIfErrorExpiry) {\n      withinStaleIfErrorThreshold = now < (result.staleAt + (staleIfErrorExpiry * 1000))\n    }\n\n    const headers = {\n      ...opts.headers,\n      'if-modified-since': new Date(result.cachedAt).toUTCString()\n    }\n\n    if (result.etag) {\n      headers['if-none-match'] = result.etag\n    }\n\n    if (result.vary) {\n      for (const key in result.vary) {\n        if (result.vary[key] != null) {\n          headers[key] = result.vary[key]\n        }\n      }\n    }\n\n    // We need to revalidate the response\n    return dispatch(\n      {\n        ...opts,\n        headers\n      },\n      new CacheRevalidationHandler(\n        (success, context) => {\n          if (success) {\n            // TODO: successful revalidation should be considered fresh (not give stale warning).\n            sendCachedValue(handler, opts, result, age, context, stale)\n          } else if (util.isStream(result.body)) {\n            result.body.on('error', nop).destroy()\n          }\n        },\n        new CacheHandler(globalOpts, cacheKey, handler),\n        withinStaleIfErrorThreshold\n      )\n    )\n  }\n\n  // Dump request body.\n  if (util.isStream(opts.body)) {\n    opts.body.on('error', nop).destroy()\n  }\n\n  sendCachedValue(handler, opts, result, age, null, false)\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n  const {\n    store = new MemoryCacheStore(),\n    methods = ['GET'],\n    cacheByDefault = undefined,\n    type = 'shared',\n    origins = undefined\n  } = opts\n\n  if (typeof opts !== 'object' || opts === null) {\n    throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n  }\n\n  assertCacheStore(store, 'opts.store')\n  assertCacheMethods(methods, 'opts.methods')\n  assertCacheOrigins(origins, 'opts.origins')\n\n  if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {\n    throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)\n  }\n\n  if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') {\n    throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`)\n  }\n\n  const globalOpts = {\n    store,\n    methods,\n    cacheByDefault,\n    type\n  }\n\n  const safeMethodsToNotCache = util.safeHTTPMethods.filter(method => methods.includes(method) === false)\n\n  return dispatch => {\n    return (opts, handler) => {\n      if (!opts.origin || safeMethodsToNotCache.includes(opts.method)) {\n        // Not a method we want to cache or we don't have the origin, skip\n        return dispatch(opts, handler)\n      }\n\n      // Check if origin is in whitelist\n      if (origins !== undefined) {\n        const requestOrigin = opts.origin.toString().toLowerCase()\n        let isAllowed = false\n\n        for (let i = 0; i < origins.length; i++) {\n          const allowed = origins[i]\n          if (typeof allowed === 'string') {\n            if (allowed.toLowerCase() === requestOrigin) {\n              isAllowed = true\n              break\n            }\n          } else if (allowed.test(requestOrigin)) {\n            isAllowed = true\n            break\n          }\n        }\n\n        if (!isAllowed) {\n          return dispatch(opts, handler)\n        }\n      }\n\n      opts = {\n        ...opts,\n        headers: normalizeHeaders(opts)\n      }\n\n      const reqCacheControl = opts.headers?.['cache-control']\n        ? parseCacheControlHeader(opts.headers['cache-control'])\n        : undefined\n\n      if (reqCacheControl?.['no-store']) {\n        return dispatch(opts, handler)\n      }\n\n      /**\n       * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n       */\n      const cacheKey = makeCacheKey(opts)\n      const result = store.get(cacheKey)\n\n      if (result && typeof result.then === 'function') {\n        return result\n          .then(result => handleResult(dispatch,\n            globalOpts,\n            cacheKey,\n            handler,\n            opts,\n            reqCacheControl,\n            result\n          ))\n      } else {\n        return handleResult(\n          dispatch,\n          globalOpts,\n          cacheKey,\n          handler,\n          opts,\n          reqCacheControl,\n          result\n        )\n      }\n    }\n  }\n}\n","'use strict'\n\nconst { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')\nconst { pipeline } = require('node:stream')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { runtimeFeatures } = require('../util/runtime-features')\n\n/** @typedef {import('node:stream').Transform} Transform */\n/** @typedef {import('node:stream').Transform} Controller */\n/** @typedef {Transform&import('node:zlib').Zlib} DecompressorStream */\n\n/** @type {Record<string, () => DecompressorStream>} */\nconst supportedEncodings = {\n  gzip: createGunzip,\n  'x-gzip': createGunzip,\n  br: createBrotliDecompress,\n  deflate: createInflate,\n  compress: createInflate,\n  'x-compress': createInflate,\n  ...(runtimeFeatures.has('zstd') ? { zstd: createZstdDecompress } : {})\n}\n\nconst defaultSkipStatusCodes = /** @type {const} */ ([204, 304])\n\nlet warningEmitted = /** @type {boolean} */ (false)\n\n/**\n * @typedef {Object} DecompressHandlerOptions\n * @property {number[]|Readonly<number[]>} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for\n * @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)\n */\n\nclass DecompressHandler extends DecoratorHandler {\n  /** @type {Transform[]} */\n  #decompressors = []\n  /** @type {Readonly<number[]>} */\n  #skipStatusCodes\n  /** @type {boolean} */\n  #skipErrorResponses\n\n  constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {\n    super(handler)\n    this.#skipStatusCodes = skipStatusCodes\n    this.#skipErrorResponses = skipErrorResponses\n  }\n\n  /**\n   * Determines if decompression should be skipped based on encoding and status code\n   * @param {string} contentEncoding - Content-Encoding header value\n   * @param {number} statusCode - HTTP status code of the response\n   * @returns {boolean} - True if decompression should be skipped\n   */\n  #shouldSkipDecompression (contentEncoding, statusCode) {\n    if (!contentEncoding || statusCode < 200) return true\n    if (this.#skipStatusCodes.includes(statusCode)) return true\n    if (this.#skipErrorResponses && statusCode >= 400) return true\n    return false\n  }\n\n  /**\n   * Creates a chain of decompressors for multiple content encodings\n   *\n   * @param {string} encodings - Comma-separated list of content encodings\n   * @returns {Array<DecompressorStream>} - Array of decompressor streams\n   * @throws {Error} - If the number of content-encodings exceeds the maximum allowed\n   */\n  #createDecompressionChain (encodings) {\n    const parts = encodings.split(',')\n\n    // Limit the number of content-encodings to prevent resource exhaustion.\n    // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n    const maxContentEncodings = 5\n    if (parts.length > maxContentEncodings) {\n      throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`)\n    }\n\n    /** @type {DecompressorStream[]} */\n    const decompressors = []\n\n    for (let i = parts.length - 1; i >= 0; i--) {\n      const encoding = parts[i].trim()\n      if (!encoding) continue\n\n      if (!supportedEncodings[encoding]) {\n        decompressors.length = 0 // Clear if unsupported encoding\n        return decompressors // Unsupported encoding\n      }\n\n      decompressors.push(supportedEncodings[encoding]())\n    }\n\n    return decompressors\n  }\n\n  /**\n   * Sets up event handlers for a decompressor stream using readable events\n   * @param {DecompressorStream} decompressor - The decompressor stream\n   * @param {Controller} controller - The controller to coordinate with\n   * @returns {void}\n   */\n  #setupDecompressorEvents (decompressor, controller) {\n    decompressor.on('readable', () => {\n      let chunk\n      while ((chunk = decompressor.read()) !== null) {\n        const result = super.onResponseData(controller, chunk)\n        if (result === false) {\n          break\n        }\n      }\n    })\n\n    decompressor.on('error', (error) => {\n      super.onResponseError(controller, error)\n    })\n  }\n\n  /**\n   * Sets up event handling for a single decompressor\n   * @param {Controller} controller - The controller to handle events\n   * @returns {void}\n   */\n  #setupSingleDecompressor (controller) {\n    const decompressor = this.#decompressors[0]\n    this.#setupDecompressorEvents(decompressor, controller)\n\n    decompressor.on('end', () => {\n      super.onResponseEnd(controller, {})\n    })\n  }\n\n  /**\n   * Sets up event handling for multiple chained decompressors using pipeline\n   * @param {Controller} controller - The controller to handle events\n   * @returns {void}\n   */\n  #setupMultipleDecompressors (controller) {\n    const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]\n    this.#setupDecompressorEvents(lastDecompressor, controller)\n\n    pipeline(this.#decompressors, (err) => {\n      if (err) {\n        super.onResponseError(controller, err)\n        return\n      }\n      super.onResponseEnd(controller, {})\n    })\n  }\n\n  /**\n   * Cleans up decompressor references to prevent memory leaks\n   * @returns {void}\n   */\n  #cleanupDecompressors () {\n    this.#decompressors.length = 0\n  }\n\n  /**\n   * @param {Controller} controller\n   * @param {number} statusCode\n   * @param {Record<string, string | string[] | undefined>} headers\n   * @param {string} statusMessage\n   * @returns {void}\n   */\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    const contentEncoding = headers['content-encoding']\n\n    // If content encoding is not supported or status code is in skip list\n    if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {\n      return super.onResponseStart(controller, statusCode, headers, statusMessage)\n    }\n\n    const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase())\n\n    if (decompressors.length === 0) {\n      this.#cleanupDecompressors()\n      return super.onResponseStart(controller, statusCode, headers, statusMessage)\n    }\n\n    this.#decompressors = decompressors\n\n    // Remove compression headers since we're decompressing\n    const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers\n\n    if (this.#decompressors.length === 1) {\n      this.#setupSingleDecompressor(controller)\n    } else {\n      this.#setupMultipleDecompressors(controller)\n    }\n\n    return super.onResponseStart(controller, statusCode, newHeaders, statusMessage)\n  }\n\n  /**\n   * @param {Controller} controller\n   * @param {Buffer} chunk\n   * @returns {void}\n   */\n  onResponseData (controller, chunk) {\n    if (this.#decompressors.length > 0) {\n      this.#decompressors[0].write(chunk)\n      return\n    }\n    super.onResponseData(controller, chunk)\n  }\n\n  /**\n   * @param {Controller} controller\n   * @param {Record<string, string | string[]> | undefined} trailers\n   * @returns {void}\n   */\n  onResponseEnd (controller, trailers) {\n    if (this.#decompressors.length > 0) {\n      this.#decompressors[0].end()\n      this.#cleanupDecompressors()\n      return\n    }\n    super.onResponseEnd(controller, trailers)\n  }\n\n  /**\n   * @param {Controller} controller\n   * @param {Error} err\n   * @returns {void}\n   */\n  onResponseError (controller, err) {\n    if (this.#decompressors.length > 0) {\n      for (const decompressor of this.#decompressors) {\n        decompressor.destroy(err)\n      }\n      this.#cleanupDecompressors()\n    }\n    super.onResponseError(controller, err)\n  }\n}\n\n/**\n * Creates a decompression interceptor for HTTP responses\n * @param {DecompressHandlerOptions} [options] - Options for the interceptor\n * @returns {Function} - Interceptor function\n */\nfunction createDecompressInterceptor (options = {}) {\n  // Emit experimental warning only once\n  if (!warningEmitted) {\n    process.emitWarning(\n      'DecompressInterceptor is experimental and subject to change',\n      'ExperimentalWarning'\n    )\n    warningEmitted = true\n  }\n\n  return (dispatch) => {\n    return (opts, handler) => {\n      const decompressHandler = new DecompressHandler(handler, options)\n      return dispatch(opts, decompressHandler)\n    }\n  }\n}\n\nmodule.exports = createDecompressInterceptor\n","'use strict'\n\nconst { RequestAbortedError } = require('../core/errors')\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n */\n\nconst DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024\n\n/**\n * @typedef {Object} WaitingHandler\n * @property {DispatchHandler} handler\n * @property {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @property {Buffer[]} bufferedChunks\n * @property {number} bufferedBytes\n * @property {object | null} pendingTrailers\n * @property {boolean} done\n */\n\n/**\n * Handler that forwards response events to multiple waiting handlers.\n * Used for request deduplication.\n *\n * @implements {DispatchHandler}\n */\nclass DeduplicationHandler {\n  /**\n   * @type {DispatchHandler}\n   */\n  #primaryHandler\n\n  /**\n   * @type {WaitingHandler[]}\n   */\n  #waitingHandlers = []\n\n  /**\n   * @type {number}\n   */\n  #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE\n\n  /**\n   * @type {number}\n   */\n  #statusCode = 0\n\n  /**\n   * @type {Record<string, string | string[]>}\n   */\n  #headers = {}\n\n  /**\n   * @type {string}\n   */\n  #statusMessage = ''\n\n  /**\n   * @type {boolean}\n   */\n  #aborted = false\n\n  /**\n   * @type {boolean}\n   */\n  #responseStarted = false\n\n  /**\n   * @type {boolean}\n   */\n  #responseDataStarted = false\n\n  /**\n   * @type {boolean}\n   */\n  #completed = false\n\n  /**\n   * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}\n   */\n  #controller = null\n\n  /**\n   * @type {(() => void) | null}\n   */\n  #onComplete = null\n\n  /**\n   * @param {DispatchHandler} primaryHandler The primary handler\n   * @param {() => void} onComplete Callback when request completes\n   * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler\n   */\n  constructor (primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {\n    this.#primaryHandler = primaryHandler\n    this.#onComplete = onComplete\n    this.#maxBufferSize = maxBufferSize\n  }\n\n  /**\n   * Add a waiting handler that will receive response events.\n   * Returns false if deduplication can no longer safely attach this handler.\n   *\n   * @param {DispatchHandler} handler\n   * @returns {boolean}\n   */\n  addWaitingHandler (handler) {\n    if (this.#completed || this.#responseDataStarted) {\n      return false\n    }\n\n    const waitingHandler = this.#createWaitingHandler(handler)\n    const waitingController = waitingHandler.controller\n\n    try {\n      handler.onRequestStart?.(waitingController, null)\n\n      if (waitingController.aborted) {\n        waitingHandler.done = true\n        return true\n      }\n\n      if (this.#responseStarted) {\n        handler.onResponseStart?.(\n          waitingController,\n          this.#statusCode,\n          this.#headers,\n          this.#statusMessage\n        )\n      }\n    } catch {\n      // Ignore errors from waiting handlers\n      waitingHandler.done = true\n      return true\n    }\n\n    if (!waitingController.aborted) {\n      this.#waitingHandlers.push(waitingHandler)\n    }\n\n    return true\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {any} context\n   */\n  onRequestStart (controller, context) {\n    this.#controller = controller\n    this.#primaryHandler.onRequestStart?.(controller, context)\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {number} statusCode\n   * @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers\n   * @param {Socket} socket\n   */\n  onRequestUpgrade (controller, statusCode, headers, socket) {\n    this.#primaryHandler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {number} statusCode\n   * @param {Record<string, string | string[]>} headers\n   * @param {string} statusMessage\n   */\n  onResponseStart (controller, statusCode, headers, statusMessage) {\n    this.#responseStarted = true\n    this.#statusCode = statusCode\n    this.#headers = headers\n    this.#statusMessage = statusMessage\n\n    this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n\n    for (const waitingHandler of this.#waitingHandlers) {\n      const { handler, controller: waitingController } = waitingHandler\n\n      if (waitingHandler.done || waitingController.aborted) {\n        waitingHandler.done = true\n        continue\n      }\n\n      try {\n        handler.onResponseStart?.(\n          waitingController,\n          statusCode,\n          headers,\n          statusMessage\n        )\n      } catch {\n        // Ignore errors from waiting handlers\n      }\n\n      if (waitingController.aborted) {\n        waitingHandler.done = true\n      }\n    }\n\n    this.#pruneDoneWaitingHandlers()\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {Buffer} chunk\n   */\n  onResponseData (controller, chunk) {\n    if (this.#aborted || this.#completed) {\n      return\n    }\n\n    this.#responseDataStarted = true\n\n    this.#primaryHandler.onResponseData?.(controller, chunk)\n\n    for (const waitingHandler of this.#waitingHandlers) {\n      const { handler, controller: waitingController } = waitingHandler\n\n      if (waitingHandler.done || waitingController.aborted) {\n        waitingHandler.done = true\n        continue\n      }\n\n      if (waitingController.paused) {\n        this.#bufferWaitingChunk(waitingHandler, chunk)\n        continue\n      }\n\n      try {\n        handler.onResponseData?.(waitingController, chunk)\n      } catch {\n        // Ignore errors from waiting handlers\n      }\n\n      if (waitingController.aborted) {\n        waitingHandler.done = true\n        waitingHandler.bufferedChunks = []\n        waitingHandler.bufferedBytes = 0\n      }\n    }\n\n    this.#pruneDoneWaitingHandlers()\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {object} trailers\n   */\n  onResponseEnd (controller, trailers) {\n    if (this.#aborted || this.#completed) {\n      return\n    }\n\n    this.#completed = true\n    this.#primaryHandler.onResponseEnd?.(controller, trailers)\n\n    for (const waitingHandler of this.#waitingHandlers) {\n      if (waitingHandler.done || waitingHandler.controller.aborted) {\n        waitingHandler.done = true\n        continue\n      }\n\n      this.#flushWaitingHandler(waitingHandler)\n\n      if (waitingHandler.done || waitingHandler.controller.aborted) {\n        waitingHandler.done = true\n        continue\n      }\n\n      if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {\n        waitingHandler.pendingTrailers = trailers\n        continue\n      }\n\n      try {\n        waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers)\n      } catch {\n        // Ignore errors from waiting handlers\n      }\n\n      waitingHandler.done = true\n    }\n\n    this.#pruneDoneWaitingHandlers()\n    this.#onComplete?.()\n  }\n\n  /**\n   * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n   * @param {Error} err\n   */\n  onResponseError (controller, err) {\n    if (this.#completed) {\n      return\n    }\n\n    this.#aborted = true\n    this.#completed = true\n\n    this.#primaryHandler.onResponseError?.(controller, err)\n\n    for (const waitingHandler of this.#waitingHandlers) {\n      this.#errorWaitingHandler(waitingHandler, err)\n    }\n\n    this.#waitingHandlers = []\n    this.#onComplete?.()\n  }\n\n  /**\n   * @param {DispatchHandler} handler\n   * @returns {WaitingHandler}\n   */\n  #createWaitingHandler (handler) {\n    /** @type {WaitingHandler} */\n    const waitingHandler = {\n      handler,\n      controller: null,\n      bufferedChunks: [],\n      bufferedBytes: 0,\n      pendingTrailers: null,\n      done: false\n    }\n\n    const state = {\n      aborted: false,\n      paused: false,\n      reason: null\n    }\n\n    waitingHandler.controller = {\n      resume: () => {\n        if (state.aborted) {\n          return\n        }\n\n        state.paused = false\n        this.#flushWaitingHandler(waitingHandler)\n\n        if (\n          this.#completed &&\n          waitingHandler.pendingTrailers &&\n          waitingHandler.bufferedChunks.length === 0 &&\n          !state.paused &&\n          !state.aborted\n        ) {\n          try {\n            waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers)\n          } catch {\n            // Ignore errors from waiting handlers\n          }\n\n          waitingHandler.pendingTrailers = null\n          waitingHandler.done = true\n        }\n\n        this.#pruneDoneWaitingHandlers()\n      },\n      pause: () => {\n        if (!state.aborted) {\n          state.paused = true\n        }\n      },\n      get paused () { return state.paused },\n      get aborted () { return state.aborted },\n      get reason () { return state.reason },\n      abort: (reason) => {\n        state.aborted = true\n        state.reason = reason ?? null\n        waitingHandler.done = true\n        waitingHandler.pendingTrailers = null\n        waitingHandler.bufferedChunks = []\n        waitingHandler.bufferedBytes = 0\n      }\n    }\n\n    return waitingHandler\n  }\n\n  /**\n   * @param {WaitingHandler} waitingHandler\n   * @param {Buffer} chunk\n   */\n  #bufferWaitingChunk (waitingHandler, chunk) {\n    if (waitingHandler.done || waitingHandler.controller.aborted) {\n      waitingHandler.done = true\n      waitingHandler.bufferedChunks = []\n      waitingHandler.bufferedBytes = 0\n      return\n    }\n\n    const bufferedChunk = Buffer.from(chunk)\n    waitingHandler.bufferedChunks.push(bufferedChunk)\n    waitingHandler.bufferedBytes += bufferedChunk.length\n\n    if (waitingHandler.bufferedBytes > this.#maxBufferSize) {\n      const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`)\n      this.#errorWaitingHandler(waitingHandler, err)\n    }\n  }\n\n  /**\n   * @param {WaitingHandler} waitingHandler\n   */\n  #flushWaitingHandler (waitingHandler) {\n    const { handler, controller } = waitingHandler\n\n    while (\n      !waitingHandler.done &&\n      !controller.aborted &&\n      !controller.paused &&\n      waitingHandler.bufferedChunks.length > 0\n    ) {\n      const bufferedChunk = waitingHandler.bufferedChunks.shift()\n      waitingHandler.bufferedBytes -= bufferedChunk.length\n\n      try {\n        handler.onResponseData?.(controller, bufferedChunk)\n      } catch {\n        // Ignore errors from waiting handlers\n      }\n\n      if (controller.aborted) {\n        waitingHandler.done = true\n        waitingHandler.pendingTrailers = null\n        waitingHandler.bufferedChunks = []\n        waitingHandler.bufferedBytes = 0\n        break\n      }\n    }\n  }\n\n  /**\n   * @param {WaitingHandler} waitingHandler\n   * @param {Error} err\n   */\n  #errorWaitingHandler (waitingHandler, err) {\n    if (waitingHandler.done) {\n      return\n    }\n\n    waitingHandler.done = true\n    waitingHandler.pendingTrailers = null\n    waitingHandler.bufferedChunks = []\n    waitingHandler.bufferedBytes = 0\n\n    try {\n      waitingHandler.controller.abort(err)\n      waitingHandler.handler.onResponseError?.(waitingHandler.controller, err)\n    } catch {\n      // Ignore errors from waiting handlers\n    }\n  }\n\n  #pruneDoneWaitingHandlers () {\n    this.#waitingHandlers = this.#waitingHandlers.filter(waitingHandler => waitingHandler.done === false)\n  }\n}\n\nmodule.exports = DeduplicationHandler\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('../core/util')\nconst DeduplicationHandler = require('../handler/deduplication-handler')\nconst { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = require('../util/cache.js')\n\nconst pendingRequestsChannel = diagnosticsChannel.channel('undici:request:pending-requests')\n\n/**\n * @param {import('../../types/interceptors.d.ts').default.DeduplicateInterceptorOpts} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n  const {\n    methods = ['GET'],\n    skipHeaderNames = [],\n    excludeHeaderNames = [],\n    maxBufferSize = 5 * 1024 * 1024\n  } = opts\n\n  if (typeof opts !== 'object' || opts === null) {\n    throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n  }\n\n  if (!Array.isArray(methods)) {\n    throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`)\n  }\n\n  for (const method of methods) {\n    if (!util.safeHTTPMethods.includes(method)) {\n      throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`)\n    }\n  }\n\n  if (!Array.isArray(skipHeaderNames)) {\n    throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`)\n  }\n\n  if (!Array.isArray(excludeHeaderNames)) {\n    throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)\n  }\n\n  if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {\n    throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)\n  }\n\n  // Convert to lowercase Set for case-insensitive header matching\n  const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()))\n\n  // Convert to lowercase Set for case-insensitive header exclusion from deduplication key\n  const excludeHeaderNamesSet = new Set(excludeHeaderNames.map(name => name.toLowerCase()))\n\n  /**\n   * Map of pending requests for deduplication\n   * @type {Map<string, DeduplicationHandler>}\n   */\n  const pendingRequests = new Map()\n\n  return dispatch => {\n    return (opts, handler) => {\n      if (!opts.origin || methods.includes(opts.method) === false) {\n        return dispatch(opts, handler)\n      }\n\n      opts = {\n        ...opts,\n        headers: normalizeHeaders(opts)\n      }\n\n      // Skip deduplication if request contains any of the specified headers\n      if (skipHeaderNamesSet.size > 0) {\n        for (const headerName of Object.keys(opts.headers)) {\n          if (skipHeaderNamesSet.has(headerName.toLowerCase())) {\n            return dispatch(opts, handler)\n          }\n        }\n      }\n\n      const cacheKey = makeCacheKey(opts)\n      const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet)\n\n      // Check if there's already a pending request for this key\n      const pendingHandler = pendingRequests.get(dedupeKey)\n      if (pendingHandler) {\n        // Add this handler to the waiting list when safe.\n        // If body streaming has already started, this request must be sent independently.\n        if (pendingHandler.addWaitingHandler(handler)) {\n          return true\n        }\n\n        return dispatch(opts, handler)\n      }\n\n      // Create a new deduplication handler\n      const deduplicationHandler = new DeduplicationHandler(\n        handler,\n        () => {\n          // Clean up when request completes\n          pendingRequests.delete(dedupeKey)\n          if (pendingRequestsChannel.hasSubscribers) {\n            pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' })\n          }\n        },\n        maxBufferSize\n      )\n\n      // Register the pending request\n      pendingRequests.set(dedupeKey, deduplicationHandler)\n      if (pendingRequestsChannel.hasSubscribers) {\n        pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'added' })\n      }\n\n      return dispatch(opts, deduplicationHandler)\n    }\n  }\n}\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\nlet DatabaseSync\n\nconst VERSION = 3\n\n// 2gb\nconst MAX_ENTRY_SIZE = 2 * 1000 * 1000 * 1000\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @implements {CacheStore}\n *\n * @typedef {{\n *  id: Readonly<number>,\n *  body?: Uint8Array\n *  statusCode: number\n *  statusMessage: string\n *  headers?: string\n *  vary?: string\n *  etag?: string\n *  cacheControlDirectives?: string\n *  cachedAt: number\n *  staleAt: number\n *  deleteAt: number\n * }} SqliteStoreValue\n */\nmodule.exports = class SqliteCacheStore {\n  #maxEntrySize = MAX_ENTRY_SIZE\n  #maxCount = Infinity\n\n  /**\n   * @type {import('node:sqlite').DatabaseSync}\n   */\n  #db\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #getValuesQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #updateValueQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #insertValueQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #deleteExpiredValuesQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #deleteByUrlQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync}\n   */\n  #countEntriesQuery\n\n  /**\n   * @type {import('node:sqlite').StatementSync | null}\n   */\n  #deleteOldValuesQuery\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts\n   */\n  constructor (opts) {\n    if (opts) {\n      if (typeof opts !== 'object') {\n        throw new TypeError('SqliteCacheStore options must be an object')\n      }\n\n      if (opts.maxEntrySize !== undefined) {\n        if (\n          typeof opts.maxEntrySize !== 'number' ||\n          !Number.isInteger(opts.maxEntrySize) ||\n          opts.maxEntrySize < 0\n        ) {\n          throw new TypeError('SqliteCacheStore options.maxEntrySize must be a non-negative integer')\n        }\n\n        if (opts.maxEntrySize > MAX_ENTRY_SIZE) {\n          throw new TypeError('SqliteCacheStore options.maxEntrySize must be less than 2gb')\n        }\n\n        this.#maxEntrySize = opts.maxEntrySize\n      }\n\n      if (opts.maxCount !== undefined) {\n        if (\n          typeof opts.maxCount !== 'number' ||\n          !Number.isInteger(opts.maxCount) ||\n          opts.maxCount < 0\n        ) {\n          throw new TypeError('SqliteCacheStore options.maxCount must be a non-negative integer')\n        }\n        this.#maxCount = opts.maxCount\n      }\n    }\n\n    if (!DatabaseSync) {\n      DatabaseSync = require('node:sqlite').DatabaseSync\n    }\n    this.#db = new DatabaseSync(opts?.location ?? ':memory:')\n\n    this.#db.exec(`\n      PRAGMA journal_mode = WAL;\n      PRAGMA synchronous = NORMAL;\n      PRAGMA temp_store = memory;\n      PRAGMA optimize;\n\n      CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} (\n        -- Data specific to us\n        id INTEGER PRIMARY KEY AUTOINCREMENT,\n        url TEXT NOT NULL,\n        method TEXT NOT NULL,\n\n        -- Data returned to the interceptor\n        body BUF NULL,\n        deleteAt INTEGER NOT NULL,\n        statusCode INTEGER NOT NULL,\n        statusMessage TEXT NOT NULL,\n        headers TEXT NULL,\n        cacheControlDirectives TEXT NULL,\n        etag TEXT NULL,\n        vary TEXT NULL,\n        cachedAt INTEGER NOT NULL,\n        staleAt INTEGER NOT NULL\n      );\n\n      CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_getValuesQuery ON cacheInterceptorV${VERSION}(url, method, deleteAt);\n      CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteByUrlQuery ON cacheInterceptorV${VERSION}(deleteAt);\n    `)\n\n    this.#getValuesQuery = this.#db.prepare(`\n      SELECT\n        id,\n        body,\n        deleteAt,\n        statusCode,\n        statusMessage,\n        headers,\n        etag,\n        cacheControlDirectives,\n        vary,\n        cachedAt,\n        staleAt\n      FROM cacheInterceptorV${VERSION}\n      WHERE\n        url = ?\n        AND method = ?\n      ORDER BY\n        deleteAt ASC\n    `)\n\n    this.#updateValueQuery = this.#db.prepare(`\n      UPDATE cacheInterceptorV${VERSION} SET\n        body = ?,\n        deleteAt = ?,\n        statusCode = ?,\n        statusMessage = ?,\n        headers = ?,\n        etag = ?,\n        cacheControlDirectives = ?,\n        cachedAt = ?,\n        staleAt = ?\n      WHERE\n        id = ?\n    `)\n\n    this.#insertValueQuery = this.#db.prepare(`\n      INSERT INTO cacheInterceptorV${VERSION} (\n        url,\n        method,\n        body,\n        deleteAt,\n        statusCode,\n        statusMessage,\n        headers,\n        etag,\n        cacheControlDirectives,\n        vary,\n        cachedAt,\n        staleAt\n      ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n    `)\n\n    this.#deleteByUrlQuery = this.#db.prepare(\n      `DELETE FROM cacheInterceptorV${VERSION} WHERE url = ?`\n    )\n\n    this.#countEntriesQuery = this.#db.prepare(\n      `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION}`\n    )\n\n    this.#deleteExpiredValuesQuery = this.#db.prepare(\n      `DELETE FROM cacheInterceptorV${VERSION} WHERE deleteAt <= ?`\n    )\n\n    this.#deleteOldValuesQuery = this.#maxCount === Infinity\n      ? null\n      : this.#db.prepare(`\n        DELETE FROM cacheInterceptorV${VERSION}\n        WHERE id IN (\n          SELECT\n            id\n          FROM cacheInterceptorV${VERSION}\n          ORDER BY cachedAt DESC\n          LIMIT ?\n        )\n      `)\n  }\n\n  close () {\n    this.#db.close()\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @returns {(import('../../types/cache-interceptor.d.ts').default.GetResult & { body?: Buffer }) | undefined}\n   */\n  get (key) {\n    assertCacheKey(key)\n\n    const value = this.#findValue(key)\n    return value\n      ? {\n          body: value.body ? Buffer.from(value.body.buffer, value.body.byteOffset, value.body.byteLength) : undefined,\n          statusCode: value.statusCode,\n          statusMessage: value.statusMessage,\n          headers: value.headers ? JSON.parse(value.headers) : undefined,\n          etag: value.etag ? value.etag : undefined,\n          vary: value.vary ? JSON.parse(value.vary) : undefined,\n          cacheControlDirectives: value.cacheControlDirectives\n            ? JSON.parse(value.cacheControlDirectives)\n            : undefined,\n          cachedAt: value.cachedAt,\n          staleAt: value.staleAt,\n          deleteAt: value.deleteAt\n        }\n      : undefined\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: null | Buffer | Array<Buffer>}} value\n   */\n  set (key, value) {\n    assertCacheKey(key)\n\n    const url = this.#makeValueUrl(key)\n    const body = Array.isArray(value.body) ? Buffer.concat(value.body) : value.body\n    const size = body?.byteLength\n\n    if (size && size > this.#maxEntrySize) {\n      return\n    }\n\n    const existingValue = this.#findValue(key, true)\n    if (existingValue) {\n      // Updating an existing response, let's overwrite it\n      this.#updateValueQuery.run(\n        body,\n        value.deleteAt,\n        value.statusCode,\n        value.statusMessage,\n        value.headers ? JSON.stringify(value.headers) : null,\n        value.etag ? value.etag : null,\n        value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n        value.cachedAt,\n        value.staleAt,\n        existingValue.id\n      )\n    } else {\n      this.#prune()\n      // New response, let's insert it\n      this.#insertValueQuery.run(\n        url,\n        key.method,\n        body,\n        value.deleteAt,\n        value.statusCode,\n        value.statusMessage,\n        value.headers ? JSON.stringify(value.headers) : null,\n        value.etag ? value.etag : null,\n        value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n        value.vary ? JSON.stringify(value.vary) : null,\n        value.cachedAt,\n        value.staleAt\n      )\n    }\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value\n   * @returns {Writable | undefined}\n   */\n  createWriteStream (key, value) {\n    assertCacheKey(key)\n    assertCacheValue(value)\n\n    let size = 0\n    /**\n     * @type {Buffer[] | null}\n     */\n    const body = []\n    const store = this\n\n    return new Writable({\n      decodeStrings: true,\n      write (chunk, encoding, callback) {\n        size += chunk.byteLength\n\n        if (size < store.#maxEntrySize) {\n          body.push(chunk)\n        } else {\n          this.destroy()\n        }\n\n        callback()\n      },\n      final (callback) {\n        store.set(key, { ...value, body })\n        callback()\n      }\n    })\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   */\n  delete (key) {\n    if (typeof key !== 'object') {\n      throw new TypeError(`expected key to be object, got ${typeof key}`)\n    }\n\n    this.#deleteByUrlQuery.run(this.#makeValueUrl(key))\n  }\n\n  #prune () {\n    if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) {\n      return 0\n    }\n\n    {\n      const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes\n      if (removed) {\n        return removed\n      }\n    }\n\n    {\n      const removed = this.#deleteOldValuesQuery?.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes\n      if (removed) {\n        return removed\n      }\n    }\n\n    return 0\n  }\n\n  /**\n   * Counts the number of rows in the cache\n   * @returns {Number}\n   */\n  get size () {\n    const { total } = this.#countEntriesQuery.get()\n    return total\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @returns {string}\n   */\n  #makeValueUrl (key) {\n    return `${key.origin}/${key.path}`\n  }\n\n  /**\n   * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n   * @param {boolean} [canBeExpired=false]\n   * @returns {SqliteStoreValue | undefined}\n   */\n  #findValue (key, canBeExpired = false) {\n    const url = this.#makeValueUrl(key)\n    const { headers, method } = key\n\n    /**\n     * @type {SqliteStoreValue[]}\n     */\n    const values = this.#getValuesQuery.all(url, method)\n\n    if (values.length === 0) {\n      return undefined\n    }\n\n    const now = Date.now()\n    for (const value of values) {\n      if (now >= value.deleteAt && !canBeExpired) {\n        return undefined\n      }\n\n      let matches = true\n\n      if (value.vary) {\n        const vary = JSON.parse(value.vary)\n\n        for (const header in vary) {\n          if (!headerValueEquals(headers[header], vary[header])) {\n            matches = false\n            break\n          }\n        }\n      }\n\n      if (matches) {\n        return value\n      }\n    }\n\n    return undefined\n  }\n}\n\n/**\n * @param {string|string[]|null|undefined} lhs\n * @param {string|string[]|null|undefined} rhs\n * @returns {boolean}\n */\nfunction headerValueEquals (lhs, rhs) {\n  if (lhs == null && rhs == null) {\n    return true\n  }\n\n  if ((lhs == null && rhs != null) ||\n      (lhs != null && rhs == null)) {\n    return false\n  }\n\n  if (Array.isArray(lhs) && Array.isArray(rhs)) {\n    if (lhs.length !== rhs.length) {\n      return false\n    }\n\n    return lhs.every((x, i) => x === rhs[i])\n  }\n\n  return lhs === rhs\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst { kConstruct } = require('../../core/symbols')\nconst { kEnumerableProperty } = require('../../core/util')\nconst {\n  iteratorMixin,\n  isValidHeaderName,\n  isValidHeaderValue\n} = require('./util')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst util = require('node:util')\n\n/**\n * @param {number} code\n * @returns {code is (0x0a | 0x0d | 0x09 | 0x20)}\n */\nfunction isHTTPWhiteSpaceCharCode (code) {\n  return code === 0x0a || code === 0x0d || code === 0x09 || code === 0x20\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize\n * @param {string} potentialValue\n * @returns {string}\n */\nfunction headerValueNormalize (potentialValue) {\n  //  To normalize a byte sequence potentialValue, remove\n  //  any leading and trailing HTTP whitespace bytes from\n  //  potentialValue.\n  let i = 0; let j = potentialValue.length\n\n  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j\n  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i\n\n  return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)\n}\n\n/**\n * @param {Headers} headers\n * @param {Array|Object} object\n */\nfunction fill (headers, object) {\n  // To fill a Headers object headers with a given object object, run these steps:\n\n  // 1. If object is a sequence, then for each header in object:\n  // Note: webidl conversion to array has already been done.\n  if (Array.isArray(object)) {\n    for (let i = 0; i < object.length; ++i) {\n      const header = object[i]\n      // 1. If header does not contain exactly two items, then throw a TypeError.\n      if (header.length !== 2) {\n        throw webidl.errors.exception({\n          header: 'Headers constructor',\n          message: `expected name/value pair to be length 2, found ${header.length}.`\n        })\n      }\n\n      // 2. Append (header’s first item, header’s second item) to headers.\n      appendHeader(headers, header[0], header[1])\n    }\n  } else if (typeof object === 'object' && object !== null) {\n    // Note: null should throw\n\n    // 2. Otherwise, object is a record, then for each key → value in object,\n    //    append (key, value) to headers\n    const keys = Object.keys(object)\n    for (let i = 0; i < keys.length; ++i) {\n      appendHeader(headers, keys[i], object[keys[i]])\n    }\n  } else {\n    throw webidl.errors.conversionFailed({\n      prefix: 'Headers constructor',\n      argument: 'Argument 1',\n      types: ['sequence<sequence<ByteString>>', 'record<ByteString, ByteString>']\n    })\n  }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-headers-append\n * @param {Headers} headers\n * @param {string} name\n * @param {string} value\n */\nfunction appendHeader (headers, name, value) {\n  // 1. Normalize value.\n  value = headerValueNormalize(value)\n\n  // 2. If name is not a header name or value is not a\n  //    header value, then throw a TypeError.\n  if (!isValidHeaderName(name)) {\n    throw webidl.errors.invalidArgument({\n      prefix: 'Headers.append',\n      value: name,\n      type: 'header name'\n    })\n  } else if (!isValidHeaderValue(value)) {\n    throw webidl.errors.invalidArgument({\n      prefix: 'Headers.append',\n      value,\n      type: 'header value'\n    })\n  }\n\n  // 3. If headers’s guard is \"immutable\", then throw a TypeError.\n  // 4. Otherwise, if headers’s guard is \"request\" and name is a\n  //    forbidden header name, return.\n  // 5. Otherwise, if headers’s guard is \"request-no-cors\":\n  //    TODO\n  // Note: undici does not implement forbidden header names\n  if (getHeadersGuard(headers) === 'immutable') {\n    throw new TypeError('immutable')\n  }\n\n  // 6. Otherwise, if headers’s guard is \"response\" and name is a\n  //    forbidden response-header name, return.\n\n  // 7. Append (name, value) to headers’s header list.\n  return getHeadersList(headers).append(name, value, false)\n\n  // 8. If headers’s guard is \"request-no-cors\", then remove\n  //    privileged no-CORS request headers from headers\n}\n\n// https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n/**\n * @param {Headers} target\n */\nfunction headersListSortAndCombine (target) {\n  const headersList = getHeadersList(target)\n\n  if (!headersList) {\n    return []\n  }\n\n  if (headersList.sortedMap) {\n    return headersList.sortedMap\n  }\n\n  // 1. Let headers be an empty list of headers with the key being the name\n  //    and value the value.\n  const headers = []\n\n  // 2. Let names be the result of convert header names to a sorted-lowercase\n  //    set with all the names of the headers in list.\n  const names = headersList.toSortedArray()\n\n  const cookies = headersList.cookies\n\n  // fast-path\n  if (cookies === null || cookies.length === 1) {\n    // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`\n    return (headersList.sortedMap = names)\n  }\n\n  // 3. For each name of names:\n  for (let i = 0; i < names.length; ++i) {\n    const { 0: name, 1: value } = names[i]\n    // 1. If name is `set-cookie`, then:\n    if (name === 'set-cookie') {\n      // 1. Let values be a list of all values of headers in list whose name\n      //    is a byte-case-insensitive match for name, in order.\n\n      // 2. For each value of values:\n      // 1. Append (name, value) to headers.\n      for (let j = 0; j < cookies.length; ++j) {\n        headers.push([name, cookies[j]])\n      }\n    } else {\n      // 2. Otherwise:\n\n      // 1. Let value be the result of getting name from list.\n\n      // 2. Assert: value is non-null.\n      // Note: This operation was done by `HeadersList#toSortedArray`.\n\n      // 3. Append (name, value) to headers.\n      headers.push([name, value])\n    }\n  }\n\n  // 4. Return headers.\n  return (headersList.sortedMap = headers)\n}\n\nfunction compareHeaderName (a, b) {\n  return a[0] < b[0] ? -1 : 1\n}\n\nclass HeadersList {\n  /** @type {[string, string][]|null} */\n  cookies = null\n\n  sortedMap\n  headersMap\n\n  constructor (init) {\n    if (init instanceof HeadersList) {\n      this.headersMap = new Map(init.headersMap)\n      this.sortedMap = init.sortedMap\n      this.cookies = init.cookies === null ? null : [...init.cookies]\n    } else {\n      this.headersMap = new Map(init)\n      this.sortedMap = null\n    }\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#header-list-contains\n   * @param {string} name\n   * @param {boolean} isLowerCase\n   */\n  contains (name, isLowerCase) {\n    // A header list list contains a header name name if list\n    // contains a header whose name is a byte-case-insensitive\n    // match for name.\n\n    return this.headersMap.has(isLowerCase ? name : name.toLowerCase())\n  }\n\n  clear () {\n    this.headersMap.clear()\n    this.sortedMap = null\n    this.cookies = null\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#concept-header-list-append\n   * @param {string} name\n   * @param {string} value\n   * @param {boolean} isLowerCase\n   */\n  append (name, value, isLowerCase) {\n    this.sortedMap = null\n\n    // 1. If list contains name, then set name to the first such\n    //    header’s name.\n    const lowercaseName = isLowerCase ? name : name.toLowerCase()\n    const exists = this.headersMap.get(lowercaseName)\n\n    // 2. Append (name, value) to list.\n    if (exists) {\n      const delimiter = lowercaseName === 'cookie' ? '; ' : ', '\n      this.headersMap.set(lowercaseName, {\n        name: exists.name,\n        value: `${exists.value}${delimiter}${value}`\n      })\n    } else {\n      this.headersMap.set(lowercaseName, { name, value })\n    }\n\n    if (lowercaseName === 'set-cookie') {\n      (this.cookies ??= []).push(value)\n    }\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#concept-header-list-set\n   * @param {string} name\n   * @param {string} value\n   * @param {boolean} isLowerCase\n   */\n  set (name, value, isLowerCase) {\n    this.sortedMap = null\n    const lowercaseName = isLowerCase ? name : name.toLowerCase()\n\n    if (lowercaseName === 'set-cookie') {\n      this.cookies = [value]\n    }\n\n    // 1. If list contains name, then set the value of\n    //    the first such header to value and remove the\n    //    others.\n    // 2. Otherwise, append header (name, value) to list.\n    this.headersMap.set(lowercaseName, { name, value })\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#concept-header-list-delete\n   * @param {string} name\n   * @param {boolean} isLowerCase\n   */\n  delete (name, isLowerCase) {\n    this.sortedMap = null\n    if (!isLowerCase) name = name.toLowerCase()\n\n    if (name === 'set-cookie') {\n      this.cookies = null\n    }\n\n    this.headersMap.delete(name)\n  }\n\n  /**\n   * @see https://fetch.spec.whatwg.org/#concept-header-list-get\n   * @param {string} name\n   * @param {boolean} isLowerCase\n   * @returns {string | null}\n   */\n  get (name, isLowerCase) {\n    // 1. If list does not contain name, then return null.\n    // 2. Return the values of all headers in list whose name\n    //    is a byte-case-insensitive match for name,\n    //    separated from each other by 0x2C 0x20, in order.\n    return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null\n  }\n\n  * [Symbol.iterator] () {\n    // use the lowercased name\n    for (const { 0: name, 1: { value } } of this.headersMap) {\n      yield [name, value]\n    }\n  }\n\n  get entries () {\n    const headers = {}\n\n    if (this.headersMap.size !== 0) {\n      for (const { name, value } of this.headersMap.values()) {\n        headers[name] = value\n      }\n    }\n\n    return headers\n  }\n\n  rawValues () {\n    return this.headersMap.values()\n  }\n\n  get entriesList () {\n    const headers = []\n\n    if (this.headersMap.size !== 0) {\n      for (const { 0: lowerName, 1: { name, value } } of this.headersMap) {\n        if (lowerName === 'set-cookie') {\n          for (const cookie of this.cookies) {\n            headers.push([name, cookie])\n          }\n        } else {\n          headers.push([name, value])\n        }\n      }\n    }\n\n    return headers\n  }\n\n  // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set\n  toSortedArray () {\n    const size = this.headersMap.size\n    const array = new Array(size)\n    // In most cases, you will use the fast-path.\n    // fast-path: Use binary insertion sort for small arrays.\n    if (size <= 32) {\n      if (size === 0) {\n        // If empty, it is an empty array. To avoid the first index assignment.\n        return array\n      }\n      // Improve performance by unrolling loop and avoiding double-loop.\n      // Double-loop-less version of the binary insertion sort.\n      const iterator = this.headersMap[Symbol.iterator]()\n      const firstValue = iterator.next().value\n      // set [name, value] to first index.\n      array[0] = [firstValue[0], firstValue[1].value]\n      // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n      // 3.2.2. Assert: value is non-null.\n      assert(firstValue[1].value !== null)\n      for (\n        let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value;\n        i < size;\n        ++i\n      ) {\n        // get next value\n        value = iterator.next().value\n        // set [name, value] to current index.\n        x = array[i] = [value[0], value[1].value]\n        // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n        // 3.2.2. Assert: value is non-null.\n        assert(x[1] !== null)\n        left = 0\n        right = i\n        // binary search\n        while (left < right) {\n          // middle index\n          pivot = left + ((right - left) >> 1)\n          // compare header name\n          if (array[pivot][0] <= x[0]) {\n            left = pivot + 1\n          } else {\n            right = pivot\n          }\n        }\n        if (i !== pivot) {\n          j = i\n          while (j > left) {\n            array[j] = array[--j]\n          }\n          array[left] = x\n        }\n      }\n      /* c8 ignore next 4 */\n      if (!iterator.next().done) {\n        // This is for debugging and will never be called.\n        throw new TypeError('Unreachable')\n      }\n      return array\n    } else {\n      // This case would be a rare occurrence.\n      // slow-path: fallback\n      let i = 0\n      for (const { 0: name, 1: { value } } of this.headersMap) {\n        array[i++] = [name, value]\n        // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n        // 3.2.2. Assert: value is non-null.\n        assert(value !== null)\n      }\n      return array.sort(compareHeaderName)\n    }\n  }\n}\n\n// https://fetch.spec.whatwg.org/#headers-class\nclass Headers {\n  #guard\n  /**\n   * @type {HeadersList}\n   */\n  #headersList\n\n  /**\n   * @param {HeadersInit|Symbol} [init]\n   * @returns\n   */\n  constructor (init = undefined) {\n    webidl.util.markAsUncloneable(this)\n\n    if (init === kConstruct) {\n      return\n    }\n\n    this.#headersList = new HeadersList()\n\n    // The new Headers(init) constructor steps are:\n\n    // 1. Set this’s guard to \"none\".\n    this.#guard = 'none'\n\n    // 2. If init is given, then fill this with init.\n    if (init !== undefined) {\n      init = webidl.converters.HeadersInit(init, 'Headers constructor', 'init')\n      fill(this, init)\n    }\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-append\n  append (name, value) {\n    webidl.brandCheck(this, Headers)\n\n    webidl.argumentLengthCheck(arguments, 2, 'Headers.append')\n\n    const prefix = 'Headers.append'\n    name = webidl.converters.ByteString(name, prefix, 'name')\n    value = webidl.converters.ByteString(value, prefix, 'value')\n\n    return appendHeader(this, name, value)\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-delete\n  delete (name) {\n    webidl.brandCheck(this, Headers)\n\n    webidl.argumentLengthCheck(arguments, 1, 'Headers.delete')\n\n    const prefix = 'Headers.delete'\n    name = webidl.converters.ByteString(name, prefix, 'name')\n\n    // 1. If name is not a header name, then throw a TypeError.\n    if (!isValidHeaderName(name)) {\n      throw webidl.errors.invalidArgument({\n        prefix: 'Headers.delete',\n        value: name,\n        type: 'header name'\n      })\n    }\n\n    // 2. If this’s guard is \"immutable\", then throw a TypeError.\n    // 3. Otherwise, if this’s guard is \"request\" and name is a\n    //    forbidden header name, return.\n    // 4. Otherwise, if this’s guard is \"request-no-cors\", name\n    //    is not a no-CORS-safelisted request-header name, and\n    //    name is not a privileged no-CORS request-header name,\n    //    return.\n    // 5. Otherwise, if this’s guard is \"response\" and name is\n    //    a forbidden response-header name, return.\n    // Note: undici does not implement forbidden header names\n    if (this.#guard === 'immutable') {\n      throw new TypeError('immutable')\n    }\n\n    // 6. If this’s header list does not contain name, then\n    //    return.\n    if (!this.#headersList.contains(name, false)) {\n      return\n    }\n\n    // 7. Delete name from this’s header list.\n    // 8. If this’s guard is \"request-no-cors\", then remove\n    //    privileged no-CORS request headers from this.\n    this.#headersList.delete(name, false)\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-get\n  get (name) {\n    webidl.brandCheck(this, Headers)\n\n    webidl.argumentLengthCheck(arguments, 1, 'Headers.get')\n\n    const prefix = 'Headers.get'\n    name = webidl.converters.ByteString(name, prefix, 'name')\n\n    // 1. If name is not a header name, then throw a TypeError.\n    if (!isValidHeaderName(name)) {\n      throw webidl.errors.invalidArgument({\n        prefix,\n        value: name,\n        type: 'header name'\n      })\n    }\n\n    // 2. Return the result of getting name from this’s header\n    //    list.\n    return this.#headersList.get(name, false)\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-has\n  has (name) {\n    webidl.brandCheck(this, Headers)\n\n    webidl.argumentLengthCheck(arguments, 1, 'Headers.has')\n\n    const prefix = 'Headers.has'\n    name = webidl.converters.ByteString(name, prefix, 'name')\n\n    // 1. If name is not a header name, then throw a TypeError.\n    if (!isValidHeaderName(name)) {\n      throw webidl.errors.invalidArgument({\n        prefix,\n        value: name,\n        type: 'header name'\n      })\n    }\n\n    // 2. Return true if this’s header list contains name;\n    //    otherwise false.\n    return this.#headersList.contains(name, false)\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-set\n  set (name, value) {\n    webidl.brandCheck(this, Headers)\n\n    webidl.argumentLengthCheck(arguments, 2, 'Headers.set')\n\n    const prefix = 'Headers.set'\n    name = webidl.converters.ByteString(name, prefix, 'name')\n    value = webidl.converters.ByteString(value, prefix, 'value')\n\n    // 1. Normalize value.\n    value = headerValueNormalize(value)\n\n    // 2. If name is not a header name or value is not a\n    //    header value, then throw a TypeError.\n    if (!isValidHeaderName(name)) {\n      throw webidl.errors.invalidArgument({\n        prefix,\n        value: name,\n        type: 'header name'\n      })\n    } else if (!isValidHeaderValue(value)) {\n      throw webidl.errors.invalidArgument({\n        prefix,\n        value,\n        type: 'header value'\n      })\n    }\n\n    // 3. If this’s guard is \"immutable\", then throw a TypeError.\n    // 4. Otherwise, if this’s guard is \"request\" and name is a\n    //    forbidden header name, return.\n    // 5. Otherwise, if this’s guard is \"request-no-cors\" and\n    //    name/value is not a no-CORS-safelisted request-header,\n    //    return.\n    // 6. Otherwise, if this’s guard is \"response\" and name is a\n    //    forbidden response-header name, return.\n    // Note: undici does not implement forbidden header names\n    if (this.#guard === 'immutable') {\n      throw new TypeError('immutable')\n    }\n\n    // 7. Set (name, value) in this’s header list.\n    // 8. If this’s guard is \"request-no-cors\", then remove\n    //    privileged no-CORS request headers from this\n    this.#headersList.set(name, value, false)\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie\n  getSetCookie () {\n    webidl.brandCheck(this, Headers)\n\n    // 1. If this’s header list does not contain `Set-Cookie`, then return « ».\n    // 2. Return the values of all headers in this’s header list whose name is\n    //    a byte-case-insensitive match for `Set-Cookie`, in order.\n\n    const list = this.#headersList.cookies\n\n    if (list) {\n      return [...list]\n    }\n\n    return []\n  }\n\n  [util.inspect.custom] (depth, options) {\n    options.depth ??= depth\n\n    return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`\n  }\n\n  static getHeadersGuard (o) {\n    return o.#guard\n  }\n\n  static setHeadersGuard (o, guard) {\n    o.#guard = guard\n  }\n\n  /**\n   * @param {Headers} o\n   */\n  static getHeadersList (o) {\n    return o.#headersList\n  }\n\n  /**\n   * @param {Headers} target\n   * @param {HeadersList} list\n   */\n  static setHeadersList (target, list) {\n    target.#headersList = list\n  }\n}\n\nconst { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers\nReflect.deleteProperty(Headers, 'getHeadersGuard')\nReflect.deleteProperty(Headers, 'setHeadersGuard')\nReflect.deleteProperty(Headers, 'getHeadersList')\nReflect.deleteProperty(Headers, 'setHeadersList')\n\niteratorMixin('Headers', Headers, headersListSortAndCombine, 0, 1)\n\nObject.defineProperties(Headers.prototype, {\n  append: kEnumerableProperty,\n  delete: kEnumerableProperty,\n  get: kEnumerableProperty,\n  has: kEnumerableProperty,\n  set: kEnumerableProperty,\n  getSetCookie: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'Headers',\n    configurable: true\n  },\n  [util.inspect.custom]: {\n    enumerable: false\n  }\n})\n\nwebidl.converters.HeadersInit = function (V, prefix, argument) {\n  if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n    const iterator = Reflect.get(V, Symbol.iterator)\n\n    // A work-around to ensure we send the properly-cased Headers when V is a Headers object.\n    // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.\n    if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object\n      try {\n        return getHeadersList(V).entriesList\n      } catch {\n        // fall-through\n      }\n    }\n\n    if (typeof iterator === 'function') {\n      return webidl.converters['sequence<sequence<ByteString>>'](V, prefix, argument, iterator.bind(V))\n    }\n\n    return webidl.converters['record<ByteString, ByteString>'](V, prefix, argument)\n  }\n\n  throw webidl.errors.conversionFailed({\n    prefix: 'Headers constructor',\n    argument: 'Argument 1',\n    types: ['sequence<sequence<ByteString>>', 'record<ByteString, ByteString>']\n  })\n}\n\nmodule.exports = {\n  fill,\n  // for test.\n  compareHeaderName,\n  Headers,\n  HeadersList,\n  getHeadersGuard,\n  setHeadersGuard,\n  setHeadersList,\n  getHeadersList\n}\n","'use strict'\n\nconst { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require('./headers')\nconst { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = require('./body')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst { kEnumerableProperty } = util\nconst {\n  isValidReasonPhrase,\n  isCancelled,\n  isAborted,\n  isErrorLike,\n  environmentSettingsObject: relevantRealm\n} = require('./util')\nconst {\n  redirectStatusSet,\n  nullBodyStatus\n} = require('./constants')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { isomorphicEncode, serializeJavascriptValueToJSONString } = require('../infra')\n\nconst textEncoder = new TextEncoder('utf-8')\n\n// https://fetch.spec.whatwg.org/#response-class\nclass Response {\n  /** @type {Headers} */\n  #headers\n\n  #state\n\n  // Creates network error Response.\n  static error () {\n    // The static error() method steps are to return the result of creating a\n    // Response object, given a new network error, \"immutable\", and this’s\n    // relevant Realm.\n    const responseObject = fromInnerResponse(makeNetworkError(), 'immutable')\n\n    return responseObject\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-response-json\n  static json (data, init = undefined) {\n    webidl.argumentLengthCheck(arguments, 1, 'Response.json')\n\n    if (init !== null) {\n      init = webidl.converters.ResponseInit(init)\n    }\n\n    // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.\n    const bytes = textEncoder.encode(\n      serializeJavascriptValueToJSONString(data)\n    )\n\n    // 2. Let body be the result of extracting bytes.\n    const body = extractBody(bytes)\n\n    // 3. Let responseObject be the result of creating a Response object, given a new response,\n    //    \"response\", and this’s relevant Realm.\n    const responseObject = fromInnerResponse(makeResponse({}), 'response')\n\n    // 4. Perform initialize a response given responseObject, init, and (body, \"application/json\").\n    initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })\n\n    // 5. Return responseObject.\n    return responseObject\n  }\n\n  // Creates a redirect Response that redirects to url with status status.\n  static redirect (url, status = 302) {\n    webidl.argumentLengthCheck(arguments, 1, 'Response.redirect')\n\n    url = webidl.converters.USVString(url)\n    status = webidl.converters['unsigned short'](status)\n\n    // 1. Let parsedURL be the result of parsing url with current settings\n    // object’s API base URL.\n    // 2. If parsedURL is failure, then throw a TypeError.\n    // TODO: base-URL?\n    let parsedURL\n    try {\n      parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl)\n    } catch (err) {\n      throw new TypeError(`Failed to parse URL from ${url}`, { cause: err })\n    }\n\n    // 3. If status is not a redirect status, then throw a RangeError.\n    if (!redirectStatusSet.has(status)) {\n      throw new RangeError(`Invalid status code ${status}`)\n    }\n\n    // 4. Let responseObject be the result of creating a Response object,\n    // given a new response, \"immutable\", and this’s relevant Realm.\n    const responseObject = fromInnerResponse(makeResponse({}), 'immutable')\n\n    // 5. Set responseObject’s response’s status to status.\n    responseObject.#state.status = status\n\n    // 6. Let value be parsedURL, serialized and isomorphic encoded.\n    const value = isomorphicEncode(URLSerializer(parsedURL))\n\n    // 7. Append `Location`/value to responseObject’s response’s header list.\n    responseObject.#state.headersList.append('location', value, true)\n\n    // 8. Return responseObject.\n    return responseObject\n  }\n\n  // https://fetch.spec.whatwg.org/#dom-response\n  constructor (body = null, init = undefined) {\n    webidl.util.markAsUncloneable(this)\n\n    if (body === kConstruct) {\n      return\n    }\n\n    if (body !== null) {\n      body = webidl.converters.BodyInit(body, 'Response', 'body')\n    }\n\n    init = webidl.converters.ResponseInit(init)\n\n    // 1. Set this’s response to a new response.\n    this.#state = makeResponse({})\n\n    // 2. Set this’s headers to a new Headers object with this’s relevant\n    // Realm, whose header list is this’s response’s header list and guard\n    // is \"response\".\n    this.#headers = new Headers(kConstruct)\n    setHeadersGuard(this.#headers, 'response')\n    setHeadersList(this.#headers, this.#state.headersList)\n\n    // 3. Let bodyWithType be null.\n    let bodyWithType = null\n\n    // 4. If body is non-null, then set bodyWithType to the result of extracting body.\n    if (body != null) {\n      const [extractedBody, type] = extractBody(body)\n      bodyWithType = { body: extractedBody, type }\n    }\n\n    // 5. Perform initialize a response given this, init, and bodyWithType.\n    initializeResponse(this, init, bodyWithType)\n  }\n\n  // Returns response’s type, e.g., \"cors\".\n  get type () {\n    webidl.brandCheck(this, Response)\n\n    // The type getter steps are to return this’s response’s type.\n    return this.#state.type\n  }\n\n  // Returns response’s URL, if it has one; otherwise the empty string.\n  get url () {\n    webidl.brandCheck(this, Response)\n\n    const urlList = this.#state.urlList\n\n    // The url getter steps are to return the empty string if this’s\n    // response’s URL is null; otherwise this’s response’s URL,\n    // serialized with exclude fragment set to true.\n    const url = urlList[urlList.length - 1] ?? null\n\n    if (url === null) {\n      return ''\n    }\n\n    return URLSerializer(url, true)\n  }\n\n  // Returns whether response was obtained through a redirect.\n  get redirected () {\n    webidl.brandCheck(this, Response)\n\n    // The redirected getter steps are to return true if this’s response’s URL\n    // list has more than one item; otherwise false.\n    return this.#state.urlList.length > 1\n  }\n\n  // Returns response’s status.\n  get status () {\n    webidl.brandCheck(this, Response)\n\n    // The status getter steps are to return this’s response’s status.\n    return this.#state.status\n  }\n\n  // Returns whether response’s status is an ok status.\n  get ok () {\n    webidl.brandCheck(this, Response)\n\n    // The ok getter steps are to return true if this’s response’s status is an\n    // ok status; otherwise false.\n    return this.#state.status >= 200 && this.#state.status <= 299\n  }\n\n  // Returns response’s status message.\n  get statusText () {\n    webidl.brandCheck(this, Response)\n\n    // The statusText getter steps are to return this’s response’s status\n    // message.\n    return this.#state.statusText\n  }\n\n  // Returns response’s headers as Headers.\n  get headers () {\n    webidl.brandCheck(this, Response)\n\n    // The headers getter steps are to return this’s headers.\n    return this.#headers\n  }\n\n  get body () {\n    webidl.brandCheck(this, Response)\n\n    return this.#state.body ? this.#state.body.stream : null\n  }\n\n  get bodyUsed () {\n    webidl.brandCheck(this, Response)\n\n    return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n  }\n\n  // Returns a clone of response.\n  clone () {\n    webidl.brandCheck(this, Response)\n\n    // 1. If this is unusable, then throw a TypeError.\n    if (bodyUnusable(this.#state)) {\n      throw webidl.errors.exception({\n        header: 'Response.clone',\n        message: 'Body has already been consumed.'\n      })\n    }\n\n    // 2. Let clonedResponse be the result of cloning this’s response.\n    const clonedResponse = cloneResponse(this.#state)\n\n    // Note: To re-register because of a new stream.\n    // Don't set finalizers other than for fetch responses.\n    if (this.#state.urlList.length !== 0 && this.#state.body?.stream) {\n      streamRegistry.register(this, new WeakRef(this.#state.body.stream))\n    }\n\n    // 3. Return the result of creating a Response object, given\n    // clonedResponse, this’s headers’s guard, and this’s relevant Realm.\n    return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers))\n  }\n\n  [nodeUtil.inspect.custom] (depth, options) {\n    if (options.depth === null) {\n      options.depth = 2\n    }\n\n    options.colors ??= true\n\n    const properties = {\n      status: this.status,\n      statusText: this.statusText,\n      headers: this.headers,\n      body: this.body,\n      bodyUsed: this.bodyUsed,\n      ok: this.ok,\n      redirected: this.redirected,\n      type: this.type,\n      url: this.url\n    }\n\n    return `Response ${nodeUtil.formatWithOptions(options, properties)}`\n  }\n\n  /**\n   * @param {Response} response\n   */\n  static getResponseHeaders (response) {\n    return response.#headers\n  }\n\n  /**\n   * @param {Response} response\n   * @param {Headers} newHeaders\n   */\n  static setResponseHeaders (response, newHeaders) {\n    response.#headers = newHeaders\n  }\n\n  /**\n   * @param {Response} response\n   */\n  static getResponseState (response) {\n    return response.#state\n  }\n\n  /**\n   * @param {Response} response\n   * @param {any} newState\n   */\n  static setResponseState (response, newState) {\n    response.#state = newState\n  }\n}\n\nconst { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response\nReflect.deleteProperty(Response, 'getResponseHeaders')\nReflect.deleteProperty(Response, 'setResponseHeaders')\nReflect.deleteProperty(Response, 'getResponseState')\nReflect.deleteProperty(Response, 'setResponseState')\n\nmixinBody(Response, getResponseState)\n\nObject.defineProperties(Response.prototype, {\n  type: kEnumerableProperty,\n  url: kEnumerableProperty,\n  status: kEnumerableProperty,\n  ok: kEnumerableProperty,\n  redirected: kEnumerableProperty,\n  statusText: kEnumerableProperty,\n  headers: kEnumerableProperty,\n  clone: kEnumerableProperty,\n  body: kEnumerableProperty,\n  bodyUsed: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'Response',\n    configurable: true\n  }\n})\n\nObject.defineProperties(Response, {\n  json: kEnumerableProperty,\n  redirect: kEnumerableProperty,\n  error: kEnumerableProperty\n})\n\n// https://fetch.spec.whatwg.org/#concept-response-clone\nfunction cloneResponse (response) {\n  // To clone a response response, run these steps:\n\n  // 1. If response is a filtered response, then return a new identical\n  // filtered response whose internal response is a clone of response’s\n  // internal response.\n  if (response.internalResponse) {\n    return filterResponse(\n      cloneResponse(response.internalResponse),\n      response.type\n    )\n  }\n\n  // 2. Let newResponse be a copy of response, except for its body.\n  const newResponse = makeResponse({ ...response, body: null })\n\n  // 3. If response’s body is non-null, then set newResponse’s body to the\n  // result of cloning response’s body.\n  if (response.body != null) {\n    newResponse.body = cloneBody(response.body)\n  }\n\n  // 4. Return newResponse.\n  return newResponse\n}\n\nfunction makeResponse (init) {\n  return {\n    aborted: false,\n    rangeRequested: false,\n    timingAllowPassed: false,\n    requestIncludesCredentials: false,\n    type: 'default',\n    status: 200,\n    timingInfo: null,\n    cacheState: '',\n    statusText: '',\n    ...init,\n    headersList: init?.headersList\n      ? new HeadersList(init?.headersList)\n      : new HeadersList(),\n    urlList: init?.urlList ? [...init.urlList] : []\n  }\n}\n\nfunction makeNetworkError (reason) {\n  const isError = isErrorLike(reason)\n  return makeResponse({\n    type: 'error',\n    status: 0,\n    error: isError\n      ? reason\n      : new Error(reason ? String(reason) : reason),\n    aborted: reason && reason.name === 'AbortError'\n  })\n}\n\n// @see https://fetch.spec.whatwg.org/#concept-network-error\nfunction isNetworkError (response) {\n  return (\n    // A network error is a response whose type is \"error\",\n    response.type === 'error' &&\n    // status is 0\n    response.status === 0\n  )\n}\n\nfunction makeFilteredResponse (response, state) {\n  state = {\n    internalResponse: response,\n    ...state\n  }\n\n  return new Proxy(response, {\n    get (target, p) {\n      return p in state ? state[p] : target[p]\n    },\n    set (target, p, value) {\n      assert(!(p in state))\n      target[p] = value\n      return true\n    }\n  })\n}\n\n// https://fetch.spec.whatwg.org/#concept-filtered-response\nfunction filterResponse (response, type) {\n  // Set response to the following filtered response with response as its\n  // internal response, depending on request’s response tainting:\n  if (type === 'basic') {\n    // A basic filtered response is a filtered response whose type is \"basic\"\n    // and header list excludes any headers in internal response’s header list\n    // whose name is a forbidden response-header name.\n\n    // Note: undici does not implement forbidden response-header names\n    return makeFilteredResponse(response, {\n      type: 'basic',\n      headersList: response.headersList\n    })\n  } else if (type === 'cors') {\n    // A CORS filtered response is a filtered response whose type is \"cors\"\n    // and header list excludes any headers in internal response’s header\n    // list whose name is not a CORS-safelisted response-header name, given\n    // internal response’s CORS-exposed header-name list.\n\n    // Note: undici does not implement CORS-safelisted response-header names\n    return makeFilteredResponse(response, {\n      type: 'cors',\n      headersList: response.headersList\n    })\n  } else if (type === 'opaque') {\n    // An opaque filtered response is a filtered response whose type is\n    // \"opaque\", URL list is the empty list, status is 0, status message\n    // is the empty byte sequence, header list is empty, and body is null.\n\n    return makeFilteredResponse(response, {\n      type: 'opaque',\n      urlList: [],\n      status: 0,\n      statusText: '',\n      body: null\n    })\n  } else if (type === 'opaqueredirect') {\n    // An opaque-redirect filtered response is a filtered response whose type\n    // is \"opaqueredirect\", status is 0, status message is the empty byte\n    // sequence, header list is empty, and body is null.\n\n    return makeFilteredResponse(response, {\n      type: 'opaqueredirect',\n      status: 0,\n      statusText: '',\n      headersList: [],\n      body: null\n    })\n  } else {\n    assert(false)\n  }\n}\n\n// https://fetch.spec.whatwg.org/#appropriate-network-error\nfunction makeAppropriateNetworkError (fetchParams, err = null) {\n  // 1. Assert: fetchParams is canceled.\n  assert(isCancelled(fetchParams))\n\n  // 2. Return an aborted network error if fetchParams is aborted;\n  // otherwise return a network error.\n  return isAborted(fetchParams)\n    ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))\n    : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))\n}\n\n// https://whatpr.org/fetch/1392.html#initialize-a-response\nfunction initializeResponse (response, init, body) {\n  // 1. If init[\"status\"] is not in the range 200 to 599, inclusive, then\n  //    throw a RangeError.\n  if (init.status !== null && (init.status < 200 || init.status > 599)) {\n    throw new RangeError('init[\"status\"] must be in the range of 200 to 599, inclusive.')\n  }\n\n  // 2. If init[\"statusText\"] does not match the reason-phrase token production,\n  //    then throw a TypeError.\n  if ('statusText' in init && init.statusText != null) {\n    // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:\n    //   reason-phrase  = *( HTAB / SP / VCHAR / obs-text )\n    if (!isValidReasonPhrase(String(init.statusText))) {\n      throw new TypeError('Invalid statusText')\n    }\n  }\n\n  // 3. Set response’s response’s status to init[\"status\"].\n  if ('status' in init && init.status != null) {\n    getResponseState(response).status = init.status\n  }\n\n  // 4. Set response’s response’s status message to init[\"statusText\"].\n  if ('statusText' in init && init.statusText != null) {\n    getResponseState(response).statusText = init.statusText\n  }\n\n  // 5. If init[\"headers\"] exists, then fill response’s headers with init[\"headers\"].\n  if ('headers' in init && init.headers != null) {\n    fill(getResponseHeaders(response), init.headers)\n  }\n\n  // 6. If body was given, then:\n  if (body) {\n    // 1. If response's status is a null body status, then throw a TypeError.\n    if (nullBodyStatus.includes(response.status)) {\n      throw webidl.errors.exception({\n        header: 'Response constructor',\n        message: `Invalid response status code ${response.status}`\n      })\n    }\n\n    // 2. Set response's body to body's body.\n    getResponseState(response).body = body.body\n\n    // 3. If body's type is non-null and response's header list does not contain\n    //    `Content-Type`, then append (`Content-Type`, body's type) to response's header list.\n    if (body.type != null && !getResponseState(response).headersList.contains('content-type', true)) {\n      getResponseState(response).headersList.append('content-type', body.type, true)\n    }\n  }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#response-create\n * @param {any} innerResponse\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Response}\n */\nfunction fromInnerResponse (innerResponse, guard) {\n  const response = new Response(kConstruct)\n  setResponseState(response, innerResponse)\n  const headers = new Headers(kConstruct)\n  setResponseHeaders(response, headers)\n  setHeadersList(headers, innerResponse.headersList)\n  setHeadersGuard(headers, guard)\n\n  // Note: If innerResponse's urlList contains a URL, it is a fetch response.\n  if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) {\n    // If the target (response) is reclaimed, the cleanup callback may be called at some point with\n    // the held value provided for it (innerResponse.body.stream). The held value can be any value:\n    // a primitive or an object, even undefined. If the held value is an object, the registry keeps\n    // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n    streamRegistry.register(response, new WeakRef(innerResponse.body.stream))\n  }\n\n  return response\n}\n\n// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit\nwebidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {\n  if (typeof V === 'string') {\n    return webidl.converters.USVString(V, prefix, name)\n  }\n\n  if (webidl.is.Blob(V)) {\n    return V\n  }\n\n  if (webidl.is.BufferSource(V)) {\n    return V\n  }\n\n  if (webidl.is.FormData(V)) {\n    return V\n  }\n\n  if (webidl.is.URLSearchParams(V)) {\n    return V\n  }\n\n  return webidl.converters.DOMString(V, prefix, name)\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit\nwebidl.converters.BodyInit = function (V, prefix, argument) {\n  if (webidl.is.ReadableStream(V)) {\n    return V\n  }\n\n  // Note: the spec doesn't include async iterables,\n  // this is an undici extension.\n  if (V?.[Symbol.asyncIterator]) {\n    return V\n  }\n\n  return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument)\n}\n\nwebidl.converters.ResponseInit = webidl.dictionaryConverter([\n  {\n    key: 'status',\n    converter: webidl.converters['unsigned short'],\n    defaultValue: () => 200\n  },\n  {\n    key: 'statusText',\n    converter: webidl.converters.ByteString,\n    defaultValue: () => ''\n  },\n  {\n    key: 'headers',\n    converter: webidl.converters.HeadersInit\n  }\n])\n\nwebidl.is.Response = webidl.util.MakeTypeAssertion(Response)\n\nmodule.exports = {\n  isNetworkError,\n  makeNetworkError,\n  makeResponse,\n  makeAppropriateNetworkError,\n  filterResponse,\n  Response,\n  cloneResponse,\n  fromInnerResponse,\n  getResponseState\n}\n","/* globals AbortController */\n\n'use strict'\n\nconst { extractBody, mixinBody, cloneBody, bodyUnusable } = require('./body')\nconst { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require('./headers')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst {\n  isValidHTTPToken,\n  sameOrigin,\n  environmentSettingsObject\n} = require('./util')\nconst {\n  forbiddenMethodsSet,\n  corsSafeListedMethodsSet,\n  referrerPolicy,\n  requestRedirect,\n  requestMode,\n  requestCredentials,\n  requestCache,\n  requestDuplex\n} = require('./constants')\nconst { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { getMaxListeners, setMaxListeners, defaultMaxListeners } = require('node:events')\n\nconst kAbortController = Symbol('abortController')\n\nconst requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {\n  signal.removeEventListener('abort', abort)\n})\n\nconst dependentControllerMap = new WeakMap()\n\nlet abortSignalHasEventHandlerLeakWarning\n\ntry {\n  abortSignalHasEventHandlerLeakWarning = getMaxListeners(new AbortController().signal) > 0\n} catch {\n  abortSignalHasEventHandlerLeakWarning = false\n}\n\nfunction buildAbort (acRef) {\n  return abort\n\n  function abort () {\n    const ac = acRef.deref()\n    if (ac !== undefined) {\n      // Currently, there is a problem with FinalizationRegistry.\n      // https://github.com/nodejs/node/issues/49344\n      // https://github.com/nodejs/node/issues/47748\n      // In the case of abort, the first step is to unregister from it.\n      // If the controller can refer to it, it is still registered.\n      // It will be removed in the future.\n      requestFinalizer.unregister(abort)\n\n      // Unsubscribe a listener.\n      // FinalizationRegistry will no longer be called, so this must be done.\n      this.removeEventListener('abort', abort)\n\n      ac.abort(this.reason)\n\n      const controllerList = dependentControllerMap.get(ac.signal)\n\n      if (controllerList !== undefined) {\n        if (controllerList.size !== 0) {\n          for (const ref of controllerList) {\n            const ctrl = ref.deref()\n            if (ctrl !== undefined) {\n              ctrl.abort(this.reason)\n            }\n          }\n          controllerList.clear()\n        }\n        dependentControllerMap.delete(ac.signal)\n      }\n    }\n  }\n}\n\nlet patchMethodWarning = false\n\n// https://fetch.spec.whatwg.org/#request-class\nclass Request {\n  /** @type {AbortSignal} */\n  #signal\n\n  /** @type {import('../../dispatcher/dispatcher')} */\n  #dispatcher\n\n  /** @type {Headers} */\n  #headers\n\n  #state\n\n  // https://fetch.spec.whatwg.org/#dom-request\n  constructor (input, init = undefined) {\n    webidl.util.markAsUncloneable(this)\n\n    if (input === kConstruct) {\n      return\n    }\n\n    const prefix = 'Request constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    input = webidl.converters.RequestInfo(input)\n    init = webidl.converters.RequestInit(init)\n\n    // 1. Let request be null.\n    let request = null\n\n    // 2. Let fallbackMode be null.\n    let fallbackMode = null\n\n    // 3. Let baseURL be this’s relevant settings object’s API base URL.\n    const baseUrl = environmentSettingsObject.settingsObject.baseUrl\n\n    // 4. Let signal be null.\n    let signal = null\n\n    // 5. If input is a string, then:\n    if (typeof input === 'string') {\n      this.#dispatcher = init.dispatcher\n\n      // 1. Let parsedURL be the result of parsing input with baseURL.\n      // 2. If parsedURL is failure, then throw a TypeError.\n      let parsedURL\n      try {\n        parsedURL = new URL(input, baseUrl)\n      } catch (err) {\n        throw new TypeError('Failed to parse URL from ' + input, { cause: err })\n      }\n\n      // 3. If parsedURL includes credentials, then throw a TypeError.\n      if (parsedURL.username || parsedURL.password) {\n        throw new TypeError(\n          'Request cannot be constructed from a URL that includes credentials: ' +\n            input\n        )\n      }\n\n      // 4. Set request to a new request whose URL is parsedURL.\n      request = makeRequest({ urlList: [parsedURL] })\n\n      // 5. Set fallbackMode to \"cors\".\n      fallbackMode = 'cors'\n    } else {\n      // 6. Otherwise:\n\n      // 7. Assert: input is a Request object.\n      assert(webidl.is.Request(input))\n\n      // 8. Set request to input’s request.\n      request = input.#state\n\n      // 9. Set signal to input’s signal.\n      signal = input.#signal\n\n      this.#dispatcher = init.dispatcher || input.#dispatcher\n    }\n\n    // 7. Let origin be this’s relevant settings object’s origin.\n    const origin = environmentSettingsObject.settingsObject.origin\n\n    // 8. Let window be \"client\".\n    let window = 'client'\n\n    // 9. If request’s window is an environment settings object and its origin\n    // is same origin with origin, then set window to request’s window.\n    if (\n      request.window?.constructor?.name === 'EnvironmentSettingsObject' &&\n      sameOrigin(request.window, origin)\n    ) {\n      window = request.window\n    }\n\n    // 10. If init[\"window\"] exists and is non-null, then throw a TypeError.\n    if (init.window != null) {\n      throw new TypeError(`'window' option '${window}' must be null`)\n    }\n\n    // 11. If init[\"window\"] exists, then set window to \"no-window\".\n    if ('window' in init) {\n      window = 'no-window'\n    }\n\n    // 12. Set request to a new request with the following properties:\n    request = makeRequest({\n      // URL request’s URL.\n      // undici implementation note: this is set as the first item in request's urlList in makeRequest\n      // method request’s method.\n      method: request.method,\n      // header list A copy of request’s header list.\n      // undici implementation note: headersList is cloned in makeRequest\n      headersList: request.headersList,\n      // unsafe-request flag Set.\n      unsafeRequest: request.unsafeRequest,\n      // client This’s relevant settings object.\n      client: environmentSettingsObject.settingsObject,\n      // window window.\n      window,\n      // priority request’s priority.\n      priority: request.priority,\n      // origin request’s origin. The propagation of the origin is only significant for navigation requests\n      // being handled by a service worker. In this scenario a request can have an origin that is different\n      // from the current client.\n      origin: request.origin,\n      // referrer request’s referrer.\n      referrer: request.referrer,\n      // referrer policy request’s referrer policy.\n      referrerPolicy: request.referrerPolicy,\n      // mode request’s mode.\n      mode: request.mode,\n      // credentials mode request’s credentials mode.\n      credentials: request.credentials,\n      // cache mode request’s cache mode.\n      cache: request.cache,\n      // redirect mode request’s redirect mode.\n      redirect: request.redirect,\n      // integrity metadata request’s integrity metadata.\n      integrity: request.integrity,\n      // keepalive request’s keepalive.\n      keepalive: request.keepalive,\n      // reload-navigation flag request’s reload-navigation flag.\n      reloadNavigation: request.reloadNavigation,\n      // history-navigation flag request’s history-navigation flag.\n      historyNavigation: request.historyNavigation,\n      // URL list A clone of request’s URL list.\n      urlList: [...request.urlList]\n    })\n\n    const initHasKey = Object.keys(init).length !== 0\n\n    // 13. If init is not empty, then:\n    if (initHasKey) {\n      // 1. If request’s mode is \"navigate\", then set it to \"same-origin\".\n      if (request.mode === 'navigate') {\n        request.mode = 'same-origin'\n      }\n\n      // 2. Unset request’s reload-navigation flag.\n      request.reloadNavigation = false\n\n      // 3. Unset request’s history-navigation flag.\n      request.historyNavigation = false\n\n      // 4. Set request’s origin to \"client\".\n      request.origin = 'client'\n\n      // 5. Set request’s referrer to \"client\"\n      request.referrer = 'client'\n\n      // 6. Set request’s referrer policy to the empty string.\n      request.referrerPolicy = ''\n\n      // 7. Set request’s URL to request’s current URL.\n      request.url = request.urlList[request.urlList.length - 1]\n\n      // 8. Set request’s URL list to « request’s URL ».\n      request.urlList = [request.url]\n    }\n\n    // 14. If init[\"referrer\"] exists, then:\n    if (init.referrer !== undefined) {\n      // 1. Let referrer be init[\"referrer\"].\n      const referrer = init.referrer\n\n      // 2. If referrer is the empty string, then set request’s referrer to \"no-referrer\".\n      if (referrer === '') {\n        request.referrer = 'no-referrer'\n      } else {\n        // 1. Let parsedReferrer be the result of parsing referrer with\n        // baseURL.\n        // 2. If parsedReferrer is failure, then throw a TypeError.\n        let parsedReferrer\n        try {\n          parsedReferrer = new URL(referrer, baseUrl)\n        } catch (err) {\n          throw new TypeError(`Referrer \"${referrer}\" is not a valid URL.`, { cause: err })\n        }\n\n        // 3. If one of the following is true\n        // - parsedReferrer’s scheme is \"about\" and path is the string \"client\"\n        // - parsedReferrer’s origin is not same origin with origin\n        // then set request’s referrer to \"client\".\n        if (\n          (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||\n          (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl))\n        ) {\n          request.referrer = 'client'\n        } else {\n          // 4. Otherwise, set request’s referrer to parsedReferrer.\n          request.referrer = parsedReferrer\n        }\n      }\n    }\n\n    // 15. If init[\"referrerPolicy\"] exists, then set request’s referrer policy\n    // to it.\n    if (init.referrerPolicy !== undefined) {\n      request.referrerPolicy = init.referrerPolicy\n    }\n\n    // 16. Let mode be init[\"mode\"] if it exists, and fallbackMode otherwise.\n    let mode\n    if (init.mode !== undefined) {\n      mode = init.mode\n    } else {\n      mode = fallbackMode\n    }\n\n    // 17. If mode is \"navigate\", then throw a TypeError.\n    if (mode === 'navigate') {\n      throw webidl.errors.exception({\n        header: 'Request constructor',\n        message: 'invalid request mode navigate.'\n      })\n    }\n\n    // 18. If mode is non-null, set request’s mode to mode.\n    if (mode != null) {\n      request.mode = mode\n    }\n\n    // 19. If init[\"credentials\"] exists, then set request’s credentials mode\n    // to it.\n    if (init.credentials !== undefined) {\n      request.credentials = init.credentials\n    }\n\n    // 18. If init[\"cache\"] exists, then set request’s cache mode to it.\n    if (init.cache !== undefined) {\n      request.cache = init.cache\n    }\n\n    // 21. If request’s cache mode is \"only-if-cached\" and request’s mode is\n    // not \"same-origin\", then throw a TypeError.\n    if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {\n      throw new TypeError(\n        \"'only-if-cached' can be set only with 'same-origin' mode\"\n      )\n    }\n\n    // 22. If init[\"redirect\"] exists, then set request’s redirect mode to it.\n    if (init.redirect !== undefined) {\n      request.redirect = init.redirect\n    }\n\n    // 23. If init[\"integrity\"] exists, then set request’s integrity metadata to it.\n    if (init.integrity != null) {\n      request.integrity = String(init.integrity)\n    }\n\n    // 24. If init[\"keepalive\"] exists, then set request’s keepalive to it.\n    if (init.keepalive !== undefined) {\n      request.keepalive = Boolean(init.keepalive)\n    }\n\n    // 25. If init[\"method\"] exists, then:\n    if (init.method !== undefined) {\n      // 1. Let method be init[\"method\"].\n      let method = init.method\n\n      const mayBeNormalized = normalizedMethodRecords[method]\n\n      if (mayBeNormalized !== undefined) {\n        // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones\n        request.method = mayBeNormalized\n      } else {\n        // 2. If method is not a method or method is a forbidden method, then\n        // throw a TypeError.\n        if (!isValidHTTPToken(method)) {\n          throw new TypeError(`'${method}' is not a valid HTTP method.`)\n        }\n\n        const upperCase = method.toUpperCase()\n\n        if (forbiddenMethodsSet.has(upperCase)) {\n          throw new TypeError(`'${method}' HTTP method is unsupported.`)\n        }\n\n        // 3. Normalize method.\n        // https://fetch.spec.whatwg.org/#concept-method-normalize\n        // Note: must be in uppercase\n        method = normalizedMethodRecordsBase[upperCase] ?? method\n\n        // 4. Set request’s method to method.\n        request.method = method\n      }\n\n      if (!patchMethodWarning && request.method === 'patch') {\n        process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', {\n          code: 'UNDICI-FETCH-patch'\n        })\n\n        patchMethodWarning = true\n      }\n    }\n\n    // 26. If init[\"signal\"] exists, then set signal to it.\n    if (init.signal !== undefined) {\n      signal = init.signal\n    }\n\n    // 27. Set this’s request to request.\n    this.#state = request\n\n    // 28. Set this’s signal to a new AbortSignal object with this’s relevant\n    // Realm.\n    // TODO: could this be simplified with AbortSignal.any\n    // (https://dom.spec.whatwg.org/#dom-abortsignal-any)\n    const ac = new AbortController()\n    this.#signal = ac.signal\n\n    // 29. If signal is not null, then make this’s signal follow signal.\n    if (signal != null) {\n      if (signal.aborted) {\n        ac.abort(signal.reason)\n      } else {\n        // Keep a strong ref to ac while request object\n        // is alive. This is needed to prevent AbortController\n        // from being prematurely garbage collected.\n        // See, https://github.com/nodejs/undici/issues/1926.\n        this[kAbortController] = ac\n\n        const acRef = new WeakRef(ac)\n        const abort = buildAbort(acRef)\n\n        // If the max amount of listeners is equal to the default, increase it\n        if (abortSignalHasEventHandlerLeakWarning && getMaxListeners(signal) === defaultMaxListeners) {\n          setMaxListeners(1500, signal)\n        }\n\n        util.addAbortListener(signal, abort)\n        // The third argument must be a registry key to be unregistered.\n        // Without it, you cannot unregister.\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n        // abort is used as the unregister key. (because it is unique)\n        requestFinalizer.register(ac, { signal, abort }, abort)\n      }\n    }\n\n    // 30. Set this’s headers to a new Headers object with this’s relevant\n    // Realm, whose header list is request’s header list and guard is\n    // \"request\".\n    this.#headers = new Headers(kConstruct)\n    setHeadersList(this.#headers, request.headersList)\n    setHeadersGuard(this.#headers, 'request')\n\n    // 31. If this’s request’s mode is \"no-cors\", then:\n    if (mode === 'no-cors') {\n      // 1. If this’s request’s method is not a CORS-safelisted method,\n      // then throw a TypeError.\n      if (!corsSafeListedMethodsSet.has(request.method)) {\n        throw new TypeError(\n          `'${request.method} is unsupported in no-cors mode.`\n        )\n      }\n\n      // 2. Set this’s headers’s guard to \"request-no-cors\".\n      setHeadersGuard(this.#headers, 'request-no-cors')\n    }\n\n    // 32. If init is not empty, then:\n    if (initHasKey) {\n      /** @type {HeadersList} */\n      const headersList = getHeadersList(this.#headers)\n      // 1. Let headers be a copy of this’s headers and its associated header\n      // list.\n      // 2. If init[\"headers\"] exists, then set headers to init[\"headers\"].\n      const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)\n\n      // 3. Empty this’s headers’s header list.\n      headersList.clear()\n\n      // 4. If headers is a Headers object, then for each header in its header\n      // list, append header’s name/header’s value to this’s headers.\n      if (headers instanceof HeadersList) {\n        for (const { name, value } of headers.rawValues()) {\n          headersList.append(name, value, false)\n        }\n        // Note: Copy the `set-cookie` meta-data.\n        headersList.cookies = headers.cookies\n      } else {\n        // 5. Otherwise, fill this’s headers with headers.\n        fillHeaders(this.#headers, headers)\n      }\n    }\n\n    // 33. Let inputBody be input’s request’s body if input is a Request\n    // object; otherwise null.\n    const inputBody = webidl.is.Request(input) ? input.#state.body : null\n\n    // 34. If either init[\"body\"] exists and is non-null or inputBody is\n    // non-null, and request’s method is `GET` or `HEAD`, then throw a\n    // TypeError.\n    if (\n      (init.body != null || inputBody != null) &&\n      (request.method === 'GET' || request.method === 'HEAD')\n    ) {\n      throw new TypeError('Request with GET/HEAD method cannot have body.')\n    }\n\n    // 35. Let initBody be null.\n    let initBody = null\n\n    // 36. If init[\"body\"] exists and is non-null, then:\n    if (init.body != null) {\n      // 1. Let Content-Type be null.\n      // 2. Set initBody and Content-Type to the result of extracting\n      // init[\"body\"], with keepalive set to request’s keepalive.\n      const [extractedBody, contentType] = extractBody(\n        init.body,\n        request.keepalive\n      )\n      initBody = extractedBody\n\n      // 3, If Content-Type is non-null and this’s headers’s header list does\n      // not contain `Content-Type`, then append `Content-Type`/Content-Type to\n      // this’s headers.\n      if (contentType && !getHeadersList(this.#headers).contains('content-type', true)) {\n        this.#headers.append('content-type', contentType, true)\n      }\n    }\n\n    // 37. Let inputOrInitBody be initBody if it is non-null; otherwise\n    // inputBody.\n    const inputOrInitBody = initBody ?? inputBody\n\n    // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is\n    // null, then:\n    if (inputOrInitBody != null && inputOrInitBody.source == null) {\n      // 1. If initBody is non-null and init[\"duplex\"] does not exist,\n      //    then throw a TypeError.\n      if (initBody != null && init.duplex == null) {\n        throw new TypeError('RequestInit: duplex option is required when sending a body.')\n      }\n\n      // 2. If this’s request’s mode is neither \"same-origin\" nor \"cors\",\n      // then throw a TypeError.\n      if (request.mode !== 'same-origin' && request.mode !== 'cors') {\n        throw new TypeError(\n          'If request is made from ReadableStream, mode should be \"same-origin\" or \"cors\"'\n        )\n      }\n\n      // 3. Set this’s request’s use-CORS-preflight flag.\n      request.useCORSPreflightFlag = true\n    }\n\n    // 39. Let finalBody be inputOrInitBody.\n    let finalBody = inputOrInitBody\n\n    // 40. If initBody is null and inputBody is non-null, then:\n    if (initBody == null && inputBody != null) {\n      // 1. If input is unusable, then throw a TypeError.\n      if (bodyUnusable(input.#state)) {\n        throw new TypeError(\n          'Cannot construct a Request with a Request object that has already been used.'\n        )\n      }\n\n      // 2. Set finalBody to the result of creating a proxy for inputBody.\n      // https://streams.spec.whatwg.org/#readablestream-create-a-proxy\n      const identityTransform = new TransformStream()\n      inputBody.stream.pipeThrough(identityTransform)\n      finalBody = {\n        source: inputBody.source,\n        length: inputBody.length,\n        stream: identityTransform.readable\n      }\n    }\n\n    // 41. Set this’s request’s body to finalBody.\n    this.#state.body = finalBody\n  }\n\n  // Returns request’s HTTP method, which is \"GET\" by default.\n  get method () {\n    webidl.brandCheck(this, Request)\n\n    // The method getter steps are to return this’s request’s method.\n    return this.#state.method\n  }\n\n  // Returns the URL of request as a string.\n  get url () {\n    webidl.brandCheck(this, Request)\n\n    // The url getter steps are to return this’s request’s URL, serialized.\n    return URLSerializer(this.#state.url)\n  }\n\n  // Returns a Headers object consisting of the headers associated with request.\n  // Note that headers added in the network layer by the user agent will not\n  // be accounted for in this object, e.g., the \"Host\" header.\n  get headers () {\n    webidl.brandCheck(this, Request)\n\n    // The headers getter steps are to return this’s headers.\n    return this.#headers\n  }\n\n  // Returns the kind of resource requested by request, e.g., \"document\"\n  // or \"script\".\n  get destination () {\n    webidl.brandCheck(this, Request)\n\n    // The destination getter are to return this’s request’s destination.\n    return this.#state.destination\n  }\n\n  // Returns the referrer of request. Its value can be a same-origin URL if\n  // explicitly set in init, the empty string to indicate no referrer, and\n  // \"about:client\" when defaulting to the global’s default. This is used\n  // during fetching to determine the value of the `Referer` header of the\n  // request being made.\n  get referrer () {\n    webidl.brandCheck(this, Request)\n\n    // 1. If this’s request’s referrer is \"no-referrer\", then return the\n    // empty string.\n    if (this.#state.referrer === 'no-referrer') {\n      return ''\n    }\n\n    // 2. If this’s request’s referrer is \"client\", then return\n    // \"about:client\".\n    if (this.#state.referrer === 'client') {\n      return 'about:client'\n    }\n\n    // Return this’s request’s referrer, serialized.\n    return this.#state.referrer.toString()\n  }\n\n  // Returns the referrer policy associated with request.\n  // This is used during fetching to compute the value of the request’s\n  // referrer.\n  get referrerPolicy () {\n    webidl.brandCheck(this, Request)\n\n    // The referrerPolicy getter steps are to return this’s request’s referrer policy.\n    return this.#state.referrerPolicy\n  }\n\n  // Returns the mode associated with request, which is a string indicating\n  // whether the request will use CORS, or will be restricted to same-origin\n  // URLs.\n  get mode () {\n    webidl.brandCheck(this, Request)\n\n    // The mode getter steps are to return this’s request’s mode.\n    return this.#state.mode\n  }\n\n  // Returns the credentials mode associated with request,\n  // which is a string indicating whether credentials will be sent with the\n  // request always, never, or only when sent to a same-origin URL.\n  get credentials () {\n    webidl.brandCheck(this, Request)\n\n    // The credentials getter steps are to return this’s request’s credentials mode.\n    return this.#state.credentials\n  }\n\n  // Returns the cache mode associated with request,\n  // which is a string indicating how the request will\n  // interact with the browser’s cache when fetching.\n  get cache () {\n    webidl.brandCheck(this, Request)\n\n    // The cache getter steps are to return this’s request’s cache mode.\n    return this.#state.cache\n  }\n\n  // Returns the redirect mode associated with request,\n  // which is a string indicating how redirects for the\n  // request will be handled during fetching. A request\n  // will follow redirects by default.\n  get redirect () {\n    webidl.brandCheck(this, Request)\n\n    // The redirect getter steps are to return this’s request’s redirect mode.\n    return this.#state.redirect\n  }\n\n  // Returns request’s subresource integrity metadata, which is a\n  // cryptographic hash of the resource being fetched. Its value\n  // consists of multiple hashes separated by whitespace. [SRI]\n  get integrity () {\n    webidl.brandCheck(this, Request)\n\n    // The integrity getter steps are to return this’s request’s integrity\n    // metadata.\n    return this.#state.integrity\n  }\n\n  // Returns a boolean indicating whether or not request can outlive the\n  // global in which it was created.\n  get keepalive () {\n    webidl.brandCheck(this, Request)\n\n    // The keepalive getter steps are to return this’s request’s keepalive.\n    return this.#state.keepalive\n  }\n\n  // Returns a boolean indicating whether or not request is for a reload\n  // navigation.\n  get isReloadNavigation () {\n    webidl.brandCheck(this, Request)\n\n    // The isReloadNavigation getter steps are to return true if this’s\n    // request’s reload-navigation flag is set; otherwise false.\n    return this.#state.reloadNavigation\n  }\n\n  // Returns a boolean indicating whether or not request is for a history\n  // navigation (a.k.a. back-forward navigation).\n  get isHistoryNavigation () {\n    webidl.brandCheck(this, Request)\n\n    // The isHistoryNavigation getter steps are to return true if this’s request’s\n    // history-navigation flag is set; otherwise false.\n    return this.#state.historyNavigation\n  }\n\n  // Returns the signal associated with request, which is an AbortSignal\n  // object indicating whether or not request has been aborted, and its\n  // abort event handler.\n  get signal () {\n    webidl.brandCheck(this, Request)\n\n    // The signal getter steps are to return this’s signal.\n    return this.#signal\n  }\n\n  get body () {\n    webidl.brandCheck(this, Request)\n\n    return this.#state.body ? this.#state.body.stream : null\n  }\n\n  get bodyUsed () {\n    webidl.brandCheck(this, Request)\n\n    return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n  }\n\n  get duplex () {\n    webidl.brandCheck(this, Request)\n\n    return 'half'\n  }\n\n  // Returns a clone of request.\n  clone () {\n    webidl.brandCheck(this, Request)\n\n    // 1. If this is unusable, then throw a TypeError.\n    if (bodyUnusable(this.#state)) {\n      throw new TypeError('unusable')\n    }\n\n    // 2. Let clonedRequest be the result of cloning this’s request.\n    const clonedRequest = cloneRequest(this.#state)\n\n    // 3. Let clonedRequestObject be the result of creating a Request object,\n    // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.\n    // 4. Make clonedRequestObject’s signal follow this’s signal.\n    const ac = new AbortController()\n    if (this.signal.aborted) {\n      ac.abort(this.signal.reason)\n    } else {\n      let list = dependentControllerMap.get(this.signal)\n      if (list === undefined) {\n        list = new Set()\n        dependentControllerMap.set(this.signal, list)\n      }\n      const acRef = new WeakRef(ac)\n      list.add(acRef)\n      util.addAbortListener(\n        ac.signal,\n        buildAbort(acRef)\n      )\n    }\n\n    // 4. Return clonedRequestObject.\n    return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers))\n  }\n\n  [nodeUtil.inspect.custom] (depth, options) {\n    if (options.depth === null) {\n      options.depth = 2\n    }\n\n    options.colors ??= true\n\n    const properties = {\n      method: this.method,\n      url: this.url,\n      headers: this.headers,\n      destination: this.destination,\n      referrer: this.referrer,\n      referrerPolicy: this.referrerPolicy,\n      mode: this.mode,\n      credentials: this.credentials,\n      cache: this.cache,\n      redirect: this.redirect,\n      integrity: this.integrity,\n      keepalive: this.keepalive,\n      isReloadNavigation: this.isReloadNavigation,\n      isHistoryNavigation: this.isHistoryNavigation,\n      signal: this.signal\n    }\n\n    return `Request ${nodeUtil.formatWithOptions(options, properties)}`\n  }\n\n  /**\n   * @param {Request} request\n   * @param {AbortSignal} newSignal\n   */\n  static setRequestSignal (request, newSignal) {\n    request.#signal = newSignal\n    return request\n  }\n\n  /**\n   * @param {Request} request\n   */\n  static getRequestDispatcher (request) {\n    return request.#dispatcher\n  }\n\n  /**\n   * @param {Request} request\n   * @param {import('../../dispatcher/dispatcher')} newDispatcher\n   */\n  static setRequestDispatcher (request, newDispatcher) {\n    request.#dispatcher = newDispatcher\n  }\n\n  /**\n   * @param {Request} request\n   * @param {Headers} newHeaders\n   */\n  static setRequestHeaders (request, newHeaders) {\n    request.#headers = newHeaders\n  }\n\n  /**\n   * @param {Request} request\n   */\n  static getRequestState (request) {\n    return request.#state\n  }\n\n  /**\n   * @param {Request} request\n   * @param {any} newState\n   */\n  static setRequestState (request, newState) {\n    request.#state = newState\n  }\n}\n\nconst { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request\nReflect.deleteProperty(Request, 'setRequestSignal')\nReflect.deleteProperty(Request, 'getRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestHeaders')\nReflect.deleteProperty(Request, 'getRequestState')\nReflect.deleteProperty(Request, 'setRequestState')\n\nmixinBody(Request, getRequestState)\n\n// https://fetch.spec.whatwg.org/#requests\nfunction makeRequest (init) {\n  return {\n    method: init.method ?? 'GET',\n    localURLsOnly: init.localURLsOnly ?? false,\n    unsafeRequest: init.unsafeRequest ?? false,\n    body: init.body ?? null,\n    client: init.client ?? null,\n    reservedClient: init.reservedClient ?? null,\n    replacesClientId: init.replacesClientId ?? '',\n    window: init.window ?? 'client',\n    keepalive: init.keepalive ?? false,\n    serviceWorkers: init.serviceWorkers ?? 'all',\n    initiator: init.initiator ?? '',\n    destination: init.destination ?? '',\n    priority: init.priority ?? null,\n    origin: init.origin ?? 'client',\n    policyContainer: init.policyContainer ?? 'client',\n    referrer: init.referrer ?? 'client',\n    referrerPolicy: init.referrerPolicy ?? '',\n    mode: init.mode ?? 'no-cors',\n    useCORSPreflightFlag: init.useCORSPreflightFlag ?? false,\n    credentials: init.credentials ?? 'same-origin',\n    useCredentials: init.useCredentials ?? false,\n    cache: init.cache ?? 'default',\n    redirect: init.redirect ?? 'follow',\n    integrity: init.integrity ?? '',\n    cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '',\n    parserMetadata: init.parserMetadata ?? '',\n    reloadNavigation: init.reloadNavigation ?? false,\n    historyNavigation: init.historyNavigation ?? false,\n    userActivation: init.userActivation ?? false,\n    taintedOrigin: init.taintedOrigin ?? false,\n    redirectCount: init.redirectCount ?? 0,\n    responseTainting: init.responseTainting ?? 'basic',\n    preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false,\n    done: init.done ?? false,\n    timingAllowFailed: init.timingAllowFailed ?? false,\n    useURLCredentials: init.useURLCredentials ?? undefined,\n    traversableForUserPrompts: init.traversableForUserPrompts ?? 'client',\n    urlList: init.urlList,\n    url: init.urlList[0],\n    headersList: init.headersList\n      ? new HeadersList(init.headersList)\n      : new HeadersList()\n  }\n}\n\n// https://fetch.spec.whatwg.org/#concept-request-clone\nfunction cloneRequest (request) {\n  // To clone a request request, run these steps:\n\n  // 1. Let newRequest be a copy of request, except for its body.\n  const newRequest = makeRequest({ ...request, body: null })\n\n  // 2. If request’s body is non-null, set newRequest’s body to the\n  // result of cloning request’s body.\n  if (request.body != null) {\n    newRequest.body = cloneBody(request.body)\n  }\n\n  // 3. Return newRequest.\n  return newRequest\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-create\n * @param {any} innerRequest\n * @param {import('../../dispatcher/agent')} dispatcher\n * @param {AbortSignal} signal\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Request}\n */\nfunction fromInnerRequest (innerRequest, dispatcher, signal, guard) {\n  const request = new Request(kConstruct)\n  setRequestState(request, innerRequest)\n  setRequestDispatcher(request, dispatcher)\n  setRequestSignal(request, signal)\n  const headers = new Headers(kConstruct)\n  setRequestHeaders(request, headers)\n  setHeadersList(headers, innerRequest.headersList)\n  setHeadersGuard(headers, guard)\n  return request\n}\n\nObject.defineProperties(Request.prototype, {\n  method: kEnumerableProperty,\n  url: kEnumerableProperty,\n  headers: kEnumerableProperty,\n  redirect: kEnumerableProperty,\n  clone: kEnumerableProperty,\n  signal: kEnumerableProperty,\n  duplex: kEnumerableProperty,\n  destination: kEnumerableProperty,\n  body: kEnumerableProperty,\n  bodyUsed: kEnumerableProperty,\n  isHistoryNavigation: kEnumerableProperty,\n  isReloadNavigation: kEnumerableProperty,\n  keepalive: kEnumerableProperty,\n  integrity: kEnumerableProperty,\n  cache: kEnumerableProperty,\n  credentials: kEnumerableProperty,\n  attribute: kEnumerableProperty,\n  referrerPolicy: kEnumerableProperty,\n  referrer: kEnumerableProperty,\n  mode: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'Request',\n    configurable: true\n  }\n})\n\nwebidl.is.Request = webidl.util.MakeTypeAssertion(Request)\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').Request|string}\n *\n * @see https://fetch.spec.whatwg.org/#requestinfo\n */\nwebidl.converters.RequestInfo = function (V) {\n  if (typeof V === 'string') {\n    return webidl.converters.USVString(V)\n  }\n\n  if (webidl.is.Request(V)) {\n    return V\n  }\n\n  return webidl.converters.USVString(V)\n}\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').RequestInit}\n * @see https://fetch.spec.whatwg.org/#requestinit\n */\nwebidl.converters.RequestInit = webidl.dictionaryConverter([\n  {\n    key: 'method',\n    converter: webidl.converters.ByteString\n  },\n  {\n    key: 'headers',\n    converter: webidl.converters.HeadersInit\n  },\n  {\n    key: 'body',\n    converter: webidl.nullableConverter(\n      webidl.converters.BodyInit\n    )\n  },\n  {\n    key: 'referrer',\n    converter: webidl.converters.USVString\n  },\n  {\n    key: 'referrerPolicy',\n    converter: webidl.converters.DOMString,\n    // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy\n    allowedValues: referrerPolicy\n  },\n  {\n    key: 'mode',\n    converter: webidl.converters.DOMString,\n    // https://fetch.spec.whatwg.org/#concept-request-mode\n    allowedValues: requestMode\n  },\n  {\n    key: 'credentials',\n    converter: webidl.converters.DOMString,\n    // https://fetch.spec.whatwg.org/#requestcredentials\n    allowedValues: requestCredentials\n  },\n  {\n    key: 'cache',\n    converter: webidl.converters.DOMString,\n    // https://fetch.spec.whatwg.org/#requestcache\n    allowedValues: requestCache\n  },\n  {\n    key: 'redirect',\n    converter: webidl.converters.DOMString,\n    // https://fetch.spec.whatwg.org/#requestredirect\n    allowedValues: requestRedirect\n  },\n  {\n    key: 'integrity',\n    converter: webidl.converters.DOMString\n  },\n  {\n    key: 'keepalive',\n    converter: webidl.converters.boolean\n  },\n  {\n    key: 'signal',\n    converter: webidl.nullableConverter(\n      (signal) => webidl.converters.AbortSignal(\n        signal,\n        'RequestInit',\n        'signal'\n      )\n    )\n  },\n  {\n    key: 'window',\n    converter: webidl.converters.any\n  },\n  {\n    key: 'duplex',\n    converter: webidl.converters.DOMString,\n    allowedValues: requestDuplex\n  },\n  {\n    key: 'dispatcher', // undici specific option\n    converter: webidl.converters.any\n  },\n  {\n    key: 'priority',\n    converter: webidl.converters.DOMString,\n    allowedValues: ['high', 'low', 'auto'],\n    defaultValue: () => 'auto'\n  }\n])\n\nmodule.exports = {\n  Request,\n  makeRequest,\n  fromInnerRequest,\n  cloneRequest,\n  getRequestDispatcher,\n  getRequestState\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\n/**\n * @typedef {object} Metadata\n * @property {SRIHashAlgorithm} alg - The algorithm used for the hash.\n * @property {string} val - The base64-encoded hash value.\n */\n\n/**\n * @typedef {Metadata[]} MetadataList\n */\n\n/**\n * @typedef {('sha256' | 'sha384' | 'sha512')} SRIHashAlgorithm\n */\n\n/**\n * @type {Map<SRIHashAlgorithm, number>}\n *\n * The valid SRI hash algorithm token set is the ordered set « \"sha256\",\n * \"sha384\", \"sha512\" » (corresponding to SHA-256, SHA-384, and SHA-512\n * respectively). The ordering of this set is meaningful, with stronger\n * algorithms appearing later in the set.\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#valid-sri-hash-algorithm-token-set\n */\nconst validSRIHashAlgorithmTokenSet = new Map([['sha256', 0], ['sha384', 1], ['sha512', 2]])\n\n// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable\n/** @type {import('node:crypto')} */\nlet crypto\n\nif (runtimeFeatures.has('crypto')) {\n  crypto = require('node:crypto')\n  const cryptoHashes = crypto.getHashes()\n\n  // If no hashes are available, we cannot support SRI.\n  if (cryptoHashes.length === 0) {\n    validSRIHashAlgorithmTokenSet.clear()\n  }\n\n  for (const algorithm of validSRIHashAlgorithmTokenSet.keys()) {\n    // If the algorithm is not supported, remove it from the list.\n    if (cryptoHashes.includes(algorithm) === false) {\n      validSRIHashAlgorithmTokenSet.delete(algorithm)\n    }\n  }\n} else {\n  // If crypto is not available, we cannot support SRI.\n  validSRIHashAlgorithmTokenSet.clear()\n}\n\n/**\n * @typedef GetSRIHashAlgorithmIndex\n * @type {(algorithm: SRIHashAlgorithm) => number}\n * @param {SRIHashAlgorithm} algorithm\n * @returns {number} The index of the algorithm in the valid SRI hash algorithm\n * token set.\n */\n\nconst getSRIHashAlgorithmIndex = /** @type {GetSRIHashAlgorithmIndex} */ (Map.prototype.get.bind(\n  validSRIHashAlgorithmTokenSet))\n\n/**\n * @typedef IsValidSRIHashAlgorithm\n * @type {(algorithm: string) => algorithm is SRIHashAlgorithm}\n * @param {*} algorithm\n * @returns {algorithm is SRIHashAlgorithm}\n */\n\nconst isValidSRIHashAlgorithm = /** @type {IsValidSRIHashAlgorithm} */ (\n  Map.prototype.has.bind(validSRIHashAlgorithmTokenSet)\n)\n\n/**\n * @param {Uint8Array} bytes\n * @param {string} metadataList\n * @returns {boolean}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist\n */\nconst bytesMatch = runtimeFeatures.has('crypto') === false || validSRIHashAlgorithmTokenSet.size === 0\n  // If node is not built with OpenSSL support, we cannot check\n  // a request's integrity, so allow it by default (the spec will\n  // allow requests if an invalid hash is given, as precedence).\n  ? () => true\n  : (bytes, metadataList) => {\n    // 1. Let parsedMetadata be the result of parsing metadataList.\n      const parsedMetadata = parseMetadata(metadataList)\n\n      // 2. If parsedMetadata is empty set, return true.\n      if (parsedMetadata.length === 0) {\n        return true\n      }\n\n      // 3. Let metadata be the result of getting the strongest\n      //    metadata from parsedMetadata.\n      const metadata = getStrongestMetadata(parsedMetadata)\n\n      // 4. For each item in metadata:\n      for (const item of metadata) {\n      // 1. Let algorithm be the item[\"alg\"].\n        const algorithm = item.alg\n\n        // 2. Let expectedValue be the item[\"val\"].\n        const expectedValue = item.val\n\n        // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e\n        // \"be liberal with padding\". This is annoying, and it's not even in the spec.\n\n        // 3. Let actualValue be the result of applying algorithm to bytes .\n        const actualValue = applyAlgorithmToBytes(algorithm, bytes)\n\n        // 4. If actualValue is a case-sensitive match for expectedValue,\n        //    return true.\n        if (caseSensitiveMatch(actualValue, expectedValue)) {\n          return true\n        }\n      }\n\n      // 5. Return false.\n      return false\n    }\n\n/**\n * @param {MetadataList} metadataList\n * @returns {MetadataList} The strongest hash algorithm from the metadata list.\n */\nfunction getStrongestMetadata (metadataList) {\n  // 1. Let result be the empty set and strongest be the empty string.\n  const result = []\n  /** @type {Metadata|null} */\n  let strongest = null\n\n  // 2. For each item in set:\n  for (const item of metadataList) {\n    // 1. Assert: item[\"alg\"] is a valid SRI hash algorithm token.\n    assert(isValidSRIHashAlgorithm(item.alg), 'Invalid SRI hash algorithm token')\n\n    // 2. If result is the empty set, then:\n    if (result.length === 0) {\n      // 1. Append item to result.\n      result.push(item)\n\n      // 2. Set strongest to item.\n      strongest = item\n\n      // 3. Continue.\n      continue\n    }\n\n    // 3. Let currentAlgorithm be strongest[\"alg\"], and currentAlgorithmIndex be\n    // the index of currentAlgorithm in the valid SRI hash algorithm token set.\n    const currentAlgorithm = /** @type {Metadata} */ (strongest).alg\n    const currentAlgorithmIndex = getSRIHashAlgorithmIndex(currentAlgorithm)\n\n    // 4. Let newAlgorithm be the item[\"alg\"], and newAlgorithmIndex be the\n    // index of newAlgorithm in the valid SRI hash algorithm token set.\n    const newAlgorithm = item.alg\n    const newAlgorithmIndex = getSRIHashAlgorithmIndex(newAlgorithm)\n\n    // 5. If newAlgorithmIndex is less than currentAlgorithmIndex, then continue.\n    if (newAlgorithmIndex < currentAlgorithmIndex) {\n      continue\n\n    // 6. Otherwise, if newAlgorithmIndex is greater than\n    // currentAlgorithmIndex:\n    } else if (newAlgorithmIndex > currentAlgorithmIndex) {\n      // 1. Set strongest to item.\n      strongest = item\n\n      // 2. Set result to « item ».\n      result[0] = item\n      result.length = 1\n\n    // 7. Otherwise, newAlgorithmIndex and currentAlgorithmIndex are the same\n    // value. Append item to result.\n    } else {\n      result.push(item)\n    }\n  }\n\n  // 3. Return result.\n  return result\n}\n\n/**\n * @param {string} metadata\n * @returns {MetadataList}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n */\nfunction parseMetadata (metadata) {\n  // 1. Let result be the empty set.\n  /** @type {MetadataList} */\n  const result = []\n\n  // 2. For each item returned by splitting metadata on spaces:\n  for (const item of metadata.split(' ')) {\n    // 1. Let expression-and-options be the result of splitting item on U+003F (?).\n    const expressionAndOptions = item.split('?', 1)\n\n    // 2. Let algorithm-expression be expression-and-options[0].\n    const algorithmExpression = expressionAndOptions[0]\n\n    // 3. Let base64-value be the empty string.\n    let base64Value = ''\n\n    // 4. Let algorithm-and-value be the result of splitting algorithm-expression on U+002D (-).\n    const algorithmAndValue = [algorithmExpression.slice(0, 6), algorithmExpression.slice(7)]\n\n    // 5. Let algorithm be algorithm-and-value[0].\n    const algorithm = algorithmAndValue[0]\n\n    // 6. If algorithm is not a valid SRI hash algorithm token, then continue.\n    if (!isValidSRIHashAlgorithm(algorithm)) {\n      continue\n    }\n\n    // 7. If algorithm-and-value[1] exists, set base64-value to\n    // algorithm-and-value[1].\n    if (algorithmAndValue[1]) {\n      base64Value = algorithmAndValue[1]\n    }\n\n    // 8. Let metadata be the ordered map\n    // «[\"alg\" → algorithm, \"val\" → base64-value]».\n    const metadata = {\n      alg: algorithm,\n      val: base64Value\n    }\n\n    // 9. Append metadata to result.\n    result.push(metadata)\n  }\n\n  // 3. Return result.\n  return result\n}\n\n/**\n * Applies the specified hash algorithm to the given bytes\n *\n * @typedef {(algorithm: SRIHashAlgorithm, bytes: Uint8Array) => string} ApplyAlgorithmToBytes\n * @param {SRIHashAlgorithm} algorithm\n * @param {Uint8Array} bytes\n * @returns {string}\n */\nconst applyAlgorithmToBytes = (algorithm, bytes) => {\n  return crypto.hash(algorithm, bytes, 'base64')\n}\n\n/**\n * Compares two base64 strings, allowing for base64url\n * in the second string.\n *\n * @param {string} actualValue base64 encoded string\n * @param {string} expectedValue base64 or base64url encoded string\n * @returns {boolean}\n */\nfunction caseSensitiveMatch (actualValue, expectedValue) {\n  // Ignore padding characters from the end of the strings by\n  // decreasing the length by 1 or 2 if the last characters are `=`.\n  let actualValueLength = actualValue.length\n  if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n    actualValueLength -= 1\n  }\n  if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n    actualValueLength -= 1\n  }\n  let expectedValueLength = expectedValue.length\n  if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n    expectedValueLength -= 1\n  }\n  if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n    expectedValueLength -= 1\n  }\n\n  if (actualValueLength !== expectedValueLength) {\n    return false\n  }\n\n  for (let i = 0; i < actualValueLength; ++i) {\n    if (\n      actualValue[i] === expectedValue[i] ||\n      (actualValue[i] === '+' && expectedValue[i] === '-') ||\n      (actualValue[i] === '/' && expectedValue[i] === '_')\n    ) {\n      continue\n    }\n    return false\n  }\n\n  return true\n}\n\nmodule.exports = {\n  applyAlgorithmToBytes,\n  bytesMatch,\n  caseSensitiveMatch,\n  isValidSRIHashAlgorithm,\n  getStrongestMetadata,\n  parseMetadata\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst {\n  makeNetworkError,\n  makeAppropriateNetworkError,\n  filterResponse,\n  makeResponse,\n  fromInnerResponse,\n  getResponseState\n} = require('./response')\nconst { HeadersList } = require('./headers')\nconst { Request, cloneRequest, getRequestDispatcher, getRequestState } = require('./request')\nconst zlib = require('node:zlib')\nconst {\n  makePolicyContainer,\n  clonePolicyContainer,\n  requestBadPort,\n  TAOCheck,\n  appendRequestOriginHeader,\n  responseLocationURL,\n  requestCurrentURL,\n  setRequestReferrerPolicyOnRedirect,\n  tryUpgradeRequestToAPotentiallyTrustworthyURL,\n  createOpaqueTimingInfo,\n  appendFetchMetadata,\n  corsCheck,\n  crossOriginResourcePolicyCheck,\n  determineRequestsReferrer,\n  coarsenedSharedCurrentTime,\n  sameOrigin,\n  isCancelled,\n  isAborted,\n  isErrorLike,\n  fullyReadBody,\n  readableStreamClose,\n  urlIsLocal,\n  urlIsHttpHttpsScheme,\n  urlHasHttpsScheme,\n  clampAndCoarsenConnectionTimingInfo,\n  simpleRangeHeaderValue,\n  buildContentRange,\n  createInflate,\n  extractMimeType,\n  hasAuthenticationEntry,\n  includesCredentials,\n  isTraversableNavigable\n} = require('./util')\nconst assert = require('node:assert')\nconst { safelyExtractBody, extractBody } = require('./body')\nconst {\n  redirectStatusSet,\n  nullBodyStatus,\n  safeMethodsSet,\n  requestBodyHeader,\n  subresourceSet\n} = require('./constants')\nconst EE = require('node:events')\nconst { Readable, pipeline, finished, isErrored, isReadable } = require('node:stream')\nconst { addAbortListener, bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require('./data-url')\nconst { getGlobalDispatcher } = require('../../global')\nconst { webidl } = require('../webidl')\nconst { STATUS_CODES } = require('node:http')\nconst { bytesMatch } = require('../subresource-integrity/subresource-integrity')\nconst { createDeferredPromise } = require('../../util/promise')\nconst { isomorphicEncode } = require('../infra')\nconst { runtimeFeatures } = require('../../util/runtime-features')\n\n// Node.js v23.8.0+ and v22.15.0+ supports Zstandard\nconst hasZstd = runtimeFeatures.has('zstd')\n\nconst GET_OR_HEAD = ['GET', 'HEAD']\n\nconst defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'\n  ? 'node'\n  : 'undici'\n\n/** @type {import('buffer').resolveObjectURL} */\nlet resolveObjectURL\n\nclass Fetch extends EE {\n  constructor (dispatcher) {\n    super()\n\n    this.dispatcher = dispatcher\n    this.connection = null\n    this.dump = false\n    this.state = 'ongoing'\n  }\n\n  terminate (reason) {\n    if (this.state !== 'ongoing') {\n      return\n    }\n\n    this.state = 'terminated'\n    this.connection?.destroy(reason)\n    this.emit('terminated', reason)\n  }\n\n  // https://fetch.spec.whatwg.org/#fetch-controller-abort\n  abort (error) {\n    if (this.state !== 'ongoing') {\n      return\n    }\n\n    // 1. Set controller’s state to \"aborted\".\n    this.state = 'aborted'\n\n    // 2. Let fallbackError be an \"AbortError\" DOMException.\n    // 3. Set error to fallbackError if it is not given.\n    if (!error) {\n      error = new DOMException('The operation was aborted.', 'AbortError')\n    }\n\n    // 4. Let serializedError be StructuredSerialize(error).\n    //    If that threw an exception, catch it, and let\n    //    serializedError be StructuredSerialize(fallbackError).\n\n    // 5. Set controller’s serialized abort reason to serializedError.\n    this.serializedAbortReason = error\n\n    this.connection?.destroy(error)\n    this.emit('terminated', error)\n  }\n}\n\nfunction handleFetchDone (response) {\n  finalizeAndReportTiming(response, 'fetch')\n}\n\n// https://fetch.spec.whatwg.org/#fetch-method\nfunction fetch (input, init = undefined) {\n  webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch')\n\n  // 1. Let p be a new promise.\n  let p = createDeferredPromise()\n\n  // 2. Let requestObject be the result of invoking the initial value of\n  // Request as constructor with input and init as arguments. If this throws\n  // an exception, reject p with it and return p.\n  let requestObject\n\n  try {\n    requestObject = new Request(input, init)\n  } catch (e) {\n    p.reject(e)\n    return p.promise\n  }\n\n  // 3. Let request be requestObject’s request.\n  const request = getRequestState(requestObject)\n\n  // 4. If requestObject’s signal’s aborted flag is set, then:\n  if (requestObject.signal.aborted) {\n    // 1. Abort the fetch() call with p, request, null, and\n    //    requestObject’s signal’s abort reason.\n    abortFetch(p, request, null, requestObject.signal.reason, null)\n\n    // 2. Return p.\n    return p.promise\n  }\n\n  // 5. Let globalObject be request’s client’s global object.\n  const globalObject = request.client.globalObject\n\n  // 6. If globalObject is a ServiceWorkerGlobalScope object, then set\n  // request’s service-workers mode to \"none\".\n  if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {\n    request.serviceWorkers = 'none'\n  }\n\n  // 7. Let responseObject be null.\n  let responseObject = null\n\n  // 8. Let relevantRealm be this’s relevant Realm.\n\n  // 9. Let locallyAborted be false.\n  let locallyAborted = false\n\n  // 10. Let controller be null.\n  let controller = null\n\n  // 11. Add the following abort steps to requestObject’s signal:\n  addAbortListener(\n    requestObject.signal,\n    () => {\n      // 1. Set locallyAborted to true.\n      locallyAborted = true\n\n      // 2. Assert: controller is non-null.\n      assert(controller != null)\n\n      // 3. Abort controller with requestObject’s signal’s abort reason.\n      controller.abort(requestObject.signal.reason)\n\n      const realResponse = responseObject?.deref()\n\n      // 4. Abort the fetch() call with p, request, responseObject,\n      //    and requestObject’s signal’s abort reason.\n      abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller)\n    }\n  )\n\n  // 12. Let handleFetchDone given response response be to finalize and\n  // report timing with response, globalObject, and \"fetch\".\n  // see function handleFetchDone\n\n  // 13. Set controller to the result of calling fetch given request,\n  // with processResponseEndOfBody set to handleFetchDone, and processResponse\n  // given response being these substeps:\n\n  const processResponse = (response) => {\n    // 1. If locallyAborted is true, terminate these substeps.\n    if (locallyAborted) {\n      return\n    }\n\n    // 2. If response’s aborted flag is set, then:\n    if (response.aborted) {\n      // 1. Let deserializedError be the result of deserialize a serialized\n      //    abort reason given controller’s serialized abort reason and\n      //    relevantRealm.\n\n      // 2. Abort the fetch() call with p, request, responseObject, and\n      //    deserializedError.\n\n      abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller)\n      return\n    }\n\n    // 3. If response is a network error, then reject p with a TypeError\n    // and terminate these substeps.\n    if (response.type === 'error') {\n      p.reject(new TypeError('fetch failed', { cause: response.error }))\n      return\n    }\n\n    // 4. Set responseObject to the result of creating a Response object,\n    // given response, \"immutable\", and relevantRealm.\n    responseObject = new WeakRef(fromInnerResponse(response, 'immutable'))\n\n    // 5. Resolve p with responseObject.\n    p.resolve(responseObject.deref())\n    p = null\n  }\n\n  controller = fetching({\n    request,\n    processResponseEndOfBody: handleFetchDone,\n    processResponse,\n    dispatcher: getRequestDispatcher(requestObject), // undici\n    // Keep requestObject alive to prevent its AbortController from being GC'd\n    // See https://github.com/nodejs/undici/issues/4627\n    requestObject\n  })\n\n  // 14. Return p.\n  return p.promise\n}\n\n// https://fetch.spec.whatwg.org/#finalize-and-report-timing\nfunction finalizeAndReportTiming (response, initiatorType = 'other') {\n  // 1. If response is an aborted network error, then return.\n  if (response.type === 'error' && response.aborted) {\n    return\n  }\n\n  // 2. If response’s URL list is null or empty, then return.\n  if (!response.urlList?.length) {\n    return\n  }\n\n  // 3. Let originalURL be response’s URL list[0].\n  const originalURL = response.urlList[0]\n\n  // 4. Let timingInfo be response’s timing info.\n  let timingInfo = response.timingInfo\n\n  // 5. Let cacheState be response’s cache state.\n  let cacheState = response.cacheState\n\n  // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.\n  if (!urlIsHttpHttpsScheme(originalURL)) {\n    return\n  }\n\n  // 7. If timingInfo is null, then return.\n  if (timingInfo === null) {\n    return\n  }\n\n  // 8. If response’s timing allow passed flag is not set, then:\n  if (!response.timingAllowPassed) {\n    //  1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.\n    timingInfo = createOpaqueTimingInfo({\n      startTime: timingInfo.startTime\n    })\n\n    //  2. Set cacheState to the empty string.\n    cacheState = ''\n  }\n\n  // 9. Set timingInfo’s end time to the coarsened shared current time\n  // given global’s relevant settings object’s cross-origin isolated\n  // capability.\n  // TODO: given global’s relevant settings object’s cross-origin isolated\n  // capability?\n  timingInfo.endTime = coarsenedSharedCurrentTime()\n\n  // 10. Set response’s timing info to timingInfo.\n  response.timingInfo = timingInfo\n\n  // 11. Mark resource timing for timingInfo, originalURL, initiatorType,\n  // global, and cacheState.\n  markResourceTiming(\n    timingInfo,\n    originalURL.href,\n    initiatorType,\n    globalThis,\n    cacheState,\n    '', // bodyType\n    response.status\n  )\n}\n\n// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing\nconst markResourceTiming = performance.markResourceTiming\n\n// https://fetch.spec.whatwg.org/#abort-fetch\nfunction abortFetch (p, request, responseObject, error, controller /* undici-specific */) {\n  // 1. Reject promise with error.\n  if (p) {\n    // We might have already resolved the promise at this stage\n    p.reject(error)\n  }\n\n  // 2. If request’s body is not null and is readable, then cancel request’s\n  // body with error.\n  if (request.body?.stream != null && isReadable(request.body.stream)) {\n    request.body.stream.cancel(error).catch((err) => {\n      if (err.code === 'ERR_INVALID_STATE') {\n        // Node bug?\n        return\n      }\n      throw err\n    })\n  }\n\n  // 3. If responseObject is null, then return.\n  if (responseObject == null) {\n    return\n  }\n\n  // 4. Let response be responseObject’s response.\n  const response = getResponseState(responseObject)\n\n  // 5. If response’s body is not null and is readable, then error response’s\n  // body with error.\n  if (response.body?.stream != null && isReadable(response.body.stream)) {\n    controller.error(error)\n  }\n}\n\n// https://fetch.spec.whatwg.org/#fetching\nfunction fetching ({\n  request,\n  processRequestBodyChunkLength,\n  processRequestEndOfBody,\n  processResponse,\n  processResponseEndOfBody,\n  processResponseConsumeBody,\n  useParallelQueue = false,\n  dispatcher = getGlobalDispatcher(), // undici\n  requestObject = null // Keep alive to prevent AbortController GC, see #4627\n}) {\n  // Ensure that the dispatcher is set accordingly\n  assert(dispatcher)\n\n  // 1. Let taskDestination be null.\n  let taskDestination = null\n\n  // 2. Let crossOriginIsolatedCapability be false.\n  let crossOriginIsolatedCapability = false\n\n  // 3. If request’s client is non-null, then:\n  if (request.client != null) {\n    // 1. Set taskDestination to request’s client’s global object.\n    taskDestination = request.client.globalObject\n\n    // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin\n    // isolated capability.\n    crossOriginIsolatedCapability =\n      request.client.crossOriginIsolatedCapability\n  }\n\n  // 4. If useParallelQueue is true, then set taskDestination to the result of\n  // starting a new parallel queue.\n  // TODO\n\n  // 5. Let timingInfo be a new fetch timing info whose start time and\n  // post-redirect start time are the coarsened shared current time given\n  // crossOriginIsolatedCapability.\n  const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)\n  const timingInfo = createOpaqueTimingInfo({\n    startTime: currentTime\n  })\n\n  // 6. Let fetchParams be a new fetch params whose\n  // request is request,\n  // timing info is timingInfo,\n  // process request body chunk length is processRequestBodyChunkLength,\n  // process request end-of-body is processRequestEndOfBody,\n  // process response is processResponse,\n  // process response consume body is processResponseConsumeBody,\n  // process response end-of-body is processResponseEndOfBody,\n  // task destination is taskDestination,\n  // and cross-origin isolated capability is crossOriginIsolatedCapability.\n  const fetchParams = {\n    controller: new Fetch(dispatcher),\n    request,\n    timingInfo,\n    processRequestBodyChunkLength,\n    processRequestEndOfBody,\n    processResponse,\n    processResponseConsumeBody,\n    processResponseEndOfBody,\n    taskDestination,\n    crossOriginIsolatedCapability,\n    // Keep requestObject alive to prevent its AbortController from being GC'd\n    requestObject\n  }\n\n  // 7. If request’s body is a byte sequence, then set request’s body to\n  //    request’s body as a body.\n  // NOTE: Since fetching is only called from fetch, body should already be\n  // extracted.\n  assert(!request.body || request.body.stream)\n\n  // 8. If request’s window is \"client\", then set request’s window to request’s\n  // client, if request’s client’s global object is a Window object; otherwise\n  // \"no-window\".\n  if (request.window === 'client') {\n    // TODO: What if request.client is null?\n    request.window =\n      request.client?.globalObject?.constructor?.name === 'Window'\n        ? request.client\n        : 'no-window'\n  }\n\n  // 9. If request’s origin is \"client\", then set request’s origin to request’s\n  // client’s origin.\n  if (request.origin === 'client') {\n    request.origin = request.client.origin\n  }\n\n  // 10. If all of the following conditions are true:\n  // TODO\n\n  // 11. If request’s policy container is \"client\", then:\n  if (request.policyContainer === 'client') {\n    // 1. If request’s client is non-null, then set request’s policy\n    // container to a clone of request’s client’s policy container. [HTML]\n    if (request.client != null) {\n      request.policyContainer = clonePolicyContainer(\n        request.client.policyContainer\n      )\n    } else {\n      // 2. Otherwise, set request’s policy container to a new policy\n      // container.\n      request.policyContainer = makePolicyContainer()\n    }\n  }\n\n  // 12. If request’s header list does not contain `Accept`, then:\n  if (!request.headersList.contains('accept', true)) {\n    // 1. Let value be `*/*`.\n    const value = '*/*'\n\n    // 2. A user agent should set value to the first matching statement, if\n    // any, switching on request’s destination:\n    // \"document\"\n    // \"frame\"\n    // \"iframe\"\n    // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`\n    // \"image\"\n    // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`\n    // \"style\"\n    // `text/css,*/*;q=0.1`\n    // TODO\n\n    // 3. Append `Accept`/value to request’s header list.\n    request.headersList.append('accept', value, true)\n  }\n\n  // 13. If request’s header list does not contain `Accept-Language`, then\n  // user agents should append `Accept-Language`/an appropriate value to\n  // request’s header list.\n  if (!request.headersList.contains('accept-language', true)) {\n    request.headersList.append('accept-language', '*', true)\n  }\n\n  // 14. If request’s priority is null, then use request’s initiator and\n  // destination appropriately in setting request’s priority to a\n  // user-agent-defined object.\n  if (request.priority === null) {\n    // TODO\n  }\n\n  // 15. If request is a subresource request, then:\n  if (subresourceSet.has(request.destination)) {\n    // TODO\n  }\n\n  // 16. Run main fetch given fetchParams.\n  mainFetch(fetchParams, false)\n\n  // 17. Return fetchParam's controller\n  return fetchParams.controller\n}\n\n// https://fetch.spec.whatwg.org/#concept-main-fetch\nasync function mainFetch (fetchParams, recursive) {\n  try {\n    // 1. Let request be fetchParams’s request.\n    const request = fetchParams.request\n\n    // 2. Let response be null.\n    let response = null\n\n    // 3. If request’s local-URLs-only flag is set and request’s current URL is\n    // not local, then set response to a network error.\n    if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {\n      response = makeNetworkError('local URLs only')\n    }\n\n    // 4. Run report Content Security Policy violations for request.\n    // TODO\n\n    // 5. Upgrade request to a potentially trustworthy URL, if appropriate.\n    tryUpgradeRequestToAPotentiallyTrustworthyURL(request)\n\n    // 6. If should request be blocked due to a bad port, should fetching request\n    // be blocked as mixed content, or should request be blocked by Content\n    // Security Policy returns blocked, then set response to a network error.\n    if (requestBadPort(request) === 'blocked') {\n      response = makeNetworkError('bad port')\n    }\n    // TODO: should fetching request be blocked as mixed content?\n    // TODO: should request be blocked by Content Security Policy?\n\n    // 7. If request’s referrer policy is the empty string, then set request’s\n    // referrer policy to request’s policy container’s referrer policy.\n    if (request.referrerPolicy === '') {\n      request.referrerPolicy = request.policyContainer.referrerPolicy\n    }\n\n    // 8. If request’s referrer is not \"no-referrer\", then set request’s\n    // referrer to the result of invoking determine request’s referrer.\n    if (request.referrer !== 'no-referrer') {\n      request.referrer = determineRequestsReferrer(request)\n    }\n\n    // 9. Set request’s current URL’s scheme to \"https\" if all of the following\n    // conditions are true:\n    // - request’s current URL’s scheme is \"http\"\n    // - request’s current URL’s host is a domain\n    // - Matching request’s current URL’s host per Known HSTS Host Domain Name\n    //   Matching results in either a superdomain match with an asserted\n    //   includeSubDomains directive or a congruent match (with or without an\n    //   asserted includeSubDomains directive). [HSTS]\n    // TODO\n\n    // 10. If recursive is false, then run the remaining steps in parallel.\n    // TODO\n\n    // 11. If response is null, then set response to the result of running\n    // the steps corresponding to the first matching statement:\n    if (response === null) {\n      const currentURL = requestCurrentURL(request)\n      if (\n        // - request’s current URL’s origin is same origin with request’s origin,\n        //   and request’s response tainting is \"basic\"\n        (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||\n        // request’s current URL’s scheme is \"data\"\n        (currentURL.protocol === 'data:') ||\n        // - request’s mode is \"navigate\" or \"websocket\"\n        (request.mode === 'navigate' || request.mode === 'websocket')\n      ) {\n        // 1. Set request’s response tainting to \"basic\".\n        request.responseTainting = 'basic'\n\n        // 2. Return the result of running scheme fetch given fetchParams.\n        response = await schemeFetch(fetchParams)\n\n      // request’s mode is \"same-origin\"\n      } else if (request.mode === 'same-origin') {\n        // 1. Return a network error.\n        response = makeNetworkError('request mode cannot be \"same-origin\"')\n\n      // request’s mode is \"no-cors\"\n      } else if (request.mode === 'no-cors') {\n        // 1. If request’s redirect mode is not \"follow\", then return a network\n        // error.\n        if (request.redirect !== 'follow') {\n          response = makeNetworkError(\n            'redirect mode cannot be \"follow\" for \"no-cors\" request'\n          )\n        } else {\n          // 2. Set request’s response tainting to \"opaque\".\n          request.responseTainting = 'opaque'\n\n          // 3. Return the result of running scheme fetch given fetchParams.\n          response = await schemeFetch(fetchParams)\n        }\n      // request’s current URL’s scheme is not an HTTP(S) scheme\n      } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {\n        // Return a network error.\n        response = makeNetworkError('URL scheme must be a HTTP(S) scheme')\n\n        // - request’s use-CORS-preflight flag is set\n        // - request’s unsafe-request flag is set and either request’s method is\n        //   not a CORS-safelisted method or CORS-unsafe request-header names with\n        //   request’s header list is not empty\n        //    1. Set request’s response tainting to \"cors\".\n        //    2. Let corsWithPreflightResponse be the result of running HTTP fetch\n        //    given fetchParams and true.\n        //    3. If corsWithPreflightResponse is a network error, then clear cache\n        //    entries using request.\n        //    4. Return corsWithPreflightResponse.\n        // TODO\n\n      // Otherwise\n      } else {\n        //    1. Set request’s response tainting to \"cors\".\n        request.responseTainting = 'cors'\n\n        //    2. Return the result of running HTTP fetch given fetchParams.\n        response = await httpFetch(fetchParams)\n      }\n    }\n\n    // 12. If recursive is true, then return response.\n    if (recursive) {\n      return response\n    }\n\n    // 13. If response is not a network error and response is not a filtered\n    // response, then:\n    if (response.status !== 0 && !response.internalResponse) {\n      // If request’s response tainting is \"cors\", then:\n      if (request.responseTainting === 'cors') {\n        // 1. Let headerNames be the result of extracting header list values\n        // given `Access-Control-Expose-Headers` and response’s header list.\n        // TODO\n        // 2. If request’s credentials mode is not \"include\" and headerNames\n        // contains `*`, then set response’s CORS-exposed header-name list to\n        // all unique header names in response’s header list.\n        // TODO\n        // 3. Otherwise, if headerNames is not null or failure, then set\n        // response’s CORS-exposed header-name list to headerNames.\n        // TODO\n      }\n\n      // Set response to the following filtered response with response as its\n      // internal response, depending on request’s response tainting:\n      if (request.responseTainting === 'basic') {\n        response = filterResponse(response, 'basic')\n      } else if (request.responseTainting === 'cors') {\n        response = filterResponse(response, 'cors')\n      } else if (request.responseTainting === 'opaque') {\n        response = filterResponse(response, 'opaque')\n      } else {\n        assert(false)\n      }\n    }\n\n    // 14. Let internalResponse be response, if response is a network error,\n    // and response’s internal response otherwise.\n    let internalResponse =\n      response.status === 0 ? response : response.internalResponse\n\n    // 15. If internalResponse’s URL list is empty, then set it to a clone of\n    // request’s URL list.\n    if (internalResponse.urlList.length === 0) {\n      internalResponse.urlList.push(...request.urlList)\n    }\n\n    // 16. If request’s timing allow failed flag is unset, then set\n    // internalResponse’s timing allow passed flag.\n    if (!request.timingAllowFailed) {\n      response.timingAllowPassed = true\n    }\n\n    // 17. If response is not a network error and any of the following returns\n    // blocked\n    // - should internalResponse to request be blocked as mixed content\n    // - should internalResponse to request be blocked by Content Security Policy\n    // - should internalResponse to request be blocked due to its MIME type\n    // - should internalResponse to request be blocked due to nosniff\n    // TODO\n\n    // 18. If response’s type is \"opaque\", internalResponse’s status is 206,\n    // internalResponse’s range-requested flag is set, and request’s header\n    // list does not contain `Range`, then set response and internalResponse\n    // to a network error.\n    if (\n      response.type === 'opaque' &&\n      internalResponse.status === 206 &&\n      internalResponse.rangeRequested &&\n      !request.headers.contains('range', true)\n    ) {\n      response = internalResponse = makeNetworkError()\n    }\n\n    // 19. If response is not a network error and either request’s method is\n    // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,\n    // set internalResponse’s body to null and disregard any enqueuing toward\n    // it (if any).\n    if (\n      response.status !== 0 &&\n      (request.method === 'HEAD' ||\n        request.method === 'CONNECT' ||\n        nullBodyStatus.includes(internalResponse.status))\n    ) {\n      internalResponse.body = null\n      fetchParams.controller.dump = true\n    }\n\n    // 20. If request’s integrity metadata is not the empty string, then:\n    if (request.integrity) {\n      // 1. Let processBodyError be this step: run fetch finale given fetchParams\n      // and a network error.\n      const processBodyError = (reason) =>\n        fetchFinale(fetchParams, makeNetworkError(reason))\n\n      // 2. If request’s response tainting is \"opaque\", or response’s body is null,\n      // then run processBodyError and abort these steps.\n      if (request.responseTainting === 'opaque' || response.body == null) {\n        processBodyError(response.error)\n        return\n      }\n\n      // 3. Let processBody given bytes be these steps:\n      const processBody = (bytes) => {\n        // 1. If bytes do not match request’s integrity metadata,\n        // then run processBodyError and abort these steps. [SRI]\n        if (!bytesMatch(bytes, request.integrity)) {\n          processBodyError('integrity mismatch')\n          return\n        }\n\n        // 2. Set response’s body to bytes as a body.\n        response.body = safelyExtractBody(bytes)[0]\n\n        // 3. Run fetch finale given fetchParams and response.\n        fetchFinale(fetchParams, response)\n      }\n\n      // 4. Fully read response’s body given processBody and processBodyError.\n      fullyReadBody(response.body, processBody, processBodyError)\n    } else {\n      // 21. Otherwise, run fetch finale given fetchParams and response.\n      fetchFinale(fetchParams, response)\n    }\n  } catch (err) {\n    fetchParams.controller.terminate(err)\n  }\n}\n\n// https://fetch.spec.whatwg.org/#concept-scheme-fetch\n// given a fetch params fetchParams\nfunction schemeFetch (fetchParams) {\n  // Note: since the connection is destroyed on redirect, which sets fetchParams to a\n  // cancelled state, we do not want this condition to trigger *unless* there have been\n  // no redirects. See https://github.com/nodejs/undici/issues/1776\n  // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n  if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {\n    return Promise.resolve(makeAppropriateNetworkError(fetchParams))\n  }\n\n  // 2. Let request be fetchParams’s request.\n  const { request } = fetchParams\n\n  const { protocol: scheme } = requestCurrentURL(request)\n\n  // 3. Switch on request’s current URL’s scheme and run the associated steps:\n  switch (scheme) {\n    case 'about:': {\n      // If request’s current URL’s path is the string \"blank\", then return a new response\n      // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,\n      // and body is the empty byte sequence as a body.\n\n      // Otherwise, return a network error.\n      return Promise.resolve(makeNetworkError('about scheme is not supported'))\n    }\n    case 'blob:': {\n      if (!resolveObjectURL) {\n        resolveObjectURL = require('node:buffer').resolveObjectURL\n      }\n\n      // 1. Let blobURLEntry be request’s current URL’s blob URL entry.\n      const blobURLEntry = requestCurrentURL(request)\n\n      // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56\n      // Buffer.resolveObjectURL does not ignore URL queries.\n      if (blobURLEntry.search.length !== 0) {\n        return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))\n      }\n\n      const blob = resolveObjectURL(blobURLEntry.toString())\n\n      // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s\n      //    object is not a Blob object, then return a network error.\n      if (request.method !== 'GET' || !webidl.is.Blob(blob)) {\n        return Promise.resolve(makeNetworkError('invalid method'))\n      }\n\n      // 3. Let blob be blobURLEntry’s object.\n      // Note: done above\n\n      // 4. Let response be a new response.\n      const response = makeResponse()\n\n      // 5. Let fullLength be blob’s size.\n      const fullLength = blob.size\n\n      // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded.\n      const serializedFullLength = isomorphicEncode(`${fullLength}`)\n\n      // 7. Let type be blob’s type.\n      const type = blob.type\n\n      // 8. If request’s header list does not contain `Range`:\n      // 9. Otherwise:\n      if (!request.headersList.contains('range', true)) {\n        // 1. Let bodyWithType be the result of safely extracting blob.\n        // Note: in the FileAPI a blob \"object\" is a Blob *or* a MediaSource.\n        // In node, this can only ever be a Blob. Therefore we can safely\n        // use extractBody directly.\n        const bodyWithType = extractBody(blob)\n\n        // 2. Set response’s status message to `OK`.\n        response.statusText = 'OK'\n\n        // 3. Set response’s body to bodyWithType’s body.\n        response.body = bodyWithType[0]\n\n        // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ».\n        response.headersList.set('content-length', serializedFullLength, true)\n        response.headersList.set('content-type', type, true)\n      } else {\n        // 1. Set response’s range-requested flag.\n        response.rangeRequested = true\n\n        // 2. Let rangeHeader be the result of getting `Range` from request’s header list.\n        const rangeHeader = request.headersList.get('range', true)\n\n        // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true.\n        const rangeValue = simpleRangeHeaderValue(rangeHeader, true)\n\n        // 4. If rangeValue is failure, then return a network error.\n        if (rangeValue === 'failure') {\n          return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n        }\n\n        // 5. Let (rangeStart, rangeEnd) be rangeValue.\n        let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue\n\n        // 6. If rangeStart is null:\n        // 7. Otherwise:\n        if (rangeStart === null) {\n          // 1. Set rangeStart to fullLength − rangeEnd.\n          rangeStart = fullLength - rangeEnd\n\n          // 2. Set rangeEnd to rangeStart + rangeEnd − 1.\n          rangeEnd = rangeStart + rangeEnd - 1\n        } else {\n          // 1. If rangeStart is greater than or equal to fullLength, then return a network error.\n          if (rangeStart >= fullLength) {\n            return Promise.resolve(makeNetworkError('Range start is greater than the blob\\'s size.'))\n          }\n\n          // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set\n          //    rangeEnd to fullLength − 1.\n          if (rangeEnd === null || rangeEnd >= fullLength) {\n            rangeEnd = fullLength - 1\n          }\n        }\n\n        // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart,\n        //    rangeEnd + 1, and type.\n        const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type)\n\n        // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob.\n        // Note: same reason as mentioned above as to why we use extractBody\n        const slicedBodyWithType = extractBody(slicedBlob)\n\n        // 10. Set response’s body to slicedBodyWithType’s body.\n        response.body = slicedBodyWithType[0]\n\n        // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded.\n        const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`)\n\n        // 12. Let contentRange be the result of invoking build a content range given rangeStart,\n        //     rangeEnd, and fullLength.\n        const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength)\n\n        // 13. Set response’s status to 206.\n        response.status = 206\n\n        // 14. Set response’s status message to `Partial Content`.\n        response.statusText = 'Partial Content'\n\n        // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength),\n        //     (`Content-Type`, type), (`Content-Range`, contentRange) ».\n        response.headersList.set('content-length', serializedSlicedLength, true)\n        response.headersList.set('content-type', type, true)\n        response.headersList.set('content-range', contentRange, true)\n      }\n\n      // 10. Return response.\n      return Promise.resolve(response)\n    }\n    case 'data:': {\n      // 1. Let dataURLStruct be the result of running the\n      //    data: URL processor on request’s current URL.\n      const currentURL = requestCurrentURL(request)\n      const dataURLStruct = dataURLProcessor(currentURL)\n\n      // 2. If dataURLStruct is failure, then return a\n      //    network error.\n      if (dataURLStruct === 'failure') {\n        return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n      }\n\n      // 3. Let mimeType be dataURLStruct’s MIME type, serialized.\n      const mimeType = serializeAMimeType(dataURLStruct.mimeType)\n\n      // 4. Return a response whose status message is `OK`,\n      //    header list is « (`Content-Type`, mimeType) »,\n      //    and body is dataURLStruct’s body as a body.\n      return Promise.resolve(makeResponse({\n        statusText: 'OK',\n        headersList: [\n          ['content-type', { name: 'Content-Type', value: mimeType }]\n        ],\n        body: safelyExtractBody(dataURLStruct.body)[0]\n      }))\n    }\n    case 'file:': {\n      // For now, unfortunate as it is, file URLs are left as an exercise for the reader.\n      // When in doubt, return a network error.\n      return Promise.resolve(makeNetworkError('not implemented... yet...'))\n    }\n    case 'http:':\n    case 'https:': {\n      // Return the result of running HTTP fetch given fetchParams.\n\n      return httpFetch(fetchParams)\n        .catch((err) => makeNetworkError(err))\n    }\n    default: {\n      return Promise.resolve(makeNetworkError('unknown scheme'))\n    }\n  }\n}\n\n// https://fetch.spec.whatwg.org/#finalize-response\nfunction finalizeResponse (fetchParams, response) {\n  // 1. Set fetchParams’s request’s done flag.\n  fetchParams.request.done = true\n\n  // 2, If fetchParams’s process response done is not null, then queue a fetch\n  // task to run fetchParams’s process response done given response, with\n  // fetchParams’s task destination.\n  if (fetchParams.processResponseDone != null) {\n    queueMicrotask(() => fetchParams.processResponseDone(response))\n  }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-finale\nfunction fetchFinale (fetchParams, response) {\n  // 1. Let timingInfo be fetchParams’s timing info.\n  let timingInfo = fetchParams.timingInfo\n\n  // 2. If response is not a network error and fetchParams’s request’s client is a secure context,\n  //    then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting\n  //    `Server-Timing` from response’s internal response’s header list.\n  // TODO\n\n  // 3. Let processResponseEndOfBody be the following steps:\n  const processResponseEndOfBody = () => {\n    // 1. Let unsafeEndTime be the unsafe shared current time.\n    const unsafeEndTime = Date.now() // ?\n\n    // 2. If fetchParams’s request’s destination is \"document\", then set fetchParams’s controller’s\n    //    full timing info to fetchParams’s timing info.\n    if (fetchParams.request.destination === 'document') {\n      fetchParams.controller.fullTimingInfo = timingInfo\n    }\n\n    // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global:\n    fetchParams.controller.reportTimingSteps = () => {\n      // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return.\n      if (!urlIsHttpHttpsScheme(fetchParams.request.url)) {\n        return\n      }\n\n      // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global.\n      timingInfo.endTime = unsafeEndTime\n\n      // 3. Let cacheState be response’s cache state.\n      let cacheState = response.cacheState\n\n      // 4. Let bodyInfo be response’s body info.\n      const bodyInfo = response.bodyInfo\n\n      // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an\n      //    opaque timing info for timingInfo and set cacheState to the empty string.\n      if (!response.timingAllowPassed) {\n        timingInfo = createOpaqueTimingInfo(timingInfo)\n\n        cacheState = ''\n      }\n\n      // 6. Let responseStatus be 0.\n      let responseStatus = 0\n\n      // 7. If fetchParams’s request’s mode is not \"navigate\" or response’s has-cross-origin-redirects is false:\n      if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) {\n        // 1. Set responseStatus to response’s status.\n        responseStatus = response.status\n\n        // 2. Let mimeType be the result of extracting a MIME type from response’s header list.\n        const mimeType = extractMimeType(response.headersList)\n\n        // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType.\n        if (mimeType !== 'failure') {\n          bodyInfo.contentType = minimizeSupportedMimeType(mimeType)\n        }\n      }\n\n      // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo,\n      //    fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo,\n      //    and responseStatus.\n      if (fetchParams.request.initiatorType != null) {\n        markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus)\n      }\n    }\n\n    // 4. Let processResponseEndOfBodyTask be the following steps:\n    const processResponseEndOfBodyTask = () => {\n      // 1. Set fetchParams’s request’s done flag.\n      fetchParams.request.done = true\n\n      // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process\n      //    response end-of-body given response.\n      if (fetchParams.processResponseEndOfBody != null) {\n        queueMicrotask(() => fetchParams.processResponseEndOfBody(response))\n      }\n\n      // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s\n      //    global object is fetchParams’s task destination, then run fetchParams’s controller’s report\n      //    timing steps given fetchParams’s request’s client’s global object.\n      if (fetchParams.request.initiatorType != null) {\n        fetchParams.controller.reportTimingSteps()\n      }\n    }\n\n    // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination\n    queueMicrotask(() => processResponseEndOfBodyTask())\n  }\n\n  // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s\n  //    process response given response, with fetchParams’s task destination.\n  if (fetchParams.processResponse != null) {\n    queueMicrotask(() => {\n      fetchParams.processResponse(response)\n      fetchParams.processResponse = null\n    })\n  }\n\n  // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response.\n  const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response)\n\n  // 6. If internalResponse’s body is null, then run processResponseEndOfBody.\n  // 7. Otherwise:\n  if (internalResponse.body == null) {\n    processResponseEndOfBody()\n  } else {\n    // mcollina: all the following steps of the specs are skipped.\n    // The internal transform stream is not needed.\n    // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541\n\n    // 1. Let transformStream be a new TransformStream.\n    // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream.\n    // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm\n    //    set to processResponseEndOfBody.\n    // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream.\n\n    finished(internalResponse.body.stream, () => {\n      processResponseEndOfBody()\n    })\n  }\n}\n\n// https://fetch.spec.whatwg.org/#http-fetch\nasync function httpFetch (fetchParams) {\n  // 1. Let request be fetchParams’s request.\n  const request = fetchParams.request\n\n  // 2. Let response be null.\n  let response = null\n\n  // 3. Let actualResponse be null.\n  let actualResponse = null\n\n  // 4. Let timingInfo be fetchParams’s timing info.\n  const timingInfo = fetchParams.timingInfo\n\n  // 5. If request’s service-workers mode is \"all\", then:\n  if (request.serviceWorkers === 'all') {\n    // TODO\n  }\n\n  // 6. If response is null, then:\n  if (response === null) {\n    // 1. If makeCORSPreflight is true and one of these conditions is true:\n    // TODO\n\n    // 2. If request’s redirect mode is \"follow\", then set request’s\n    // service-workers mode to \"none\".\n    if (request.redirect === 'follow') {\n      request.serviceWorkers = 'none'\n    }\n\n    // 3. Set response and actualResponse to the result of running\n    // HTTP-network-or-cache fetch given fetchParams.\n    actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)\n\n    // 4. If request’s response tainting is \"cors\" and a CORS check\n    // for request and response returns failure, then return a network error.\n    if (\n      request.responseTainting === 'cors' &&\n      corsCheck(request, response) === 'failure'\n    ) {\n      return makeNetworkError('cors failure')\n    }\n\n    // 5. If the TAO check for request and response returns failure, then set\n    // request’s timing allow failed flag.\n    if (TAOCheck(request, response) === 'failure') {\n      request.timingAllowFailed = true\n    }\n  }\n\n  // 7. If either request’s response tainting or response’s type\n  // is \"opaque\", and the cross-origin resource policy check with\n  // request’s origin, request’s client, request’s destination,\n  // and actualResponse returns blocked, then return a network error.\n  if (\n    (request.responseTainting === 'opaque' || response.type === 'opaque') &&\n    crossOriginResourcePolicyCheck(\n      request.origin,\n      request.client,\n      request.destination,\n      actualResponse\n    ) === 'blocked'\n  ) {\n    return makeNetworkError('blocked')\n  }\n\n  // 8. If actualResponse’s status is a redirect status, then:\n  if (redirectStatusSet.has(actualResponse.status)) {\n    // 1. If actualResponse’s status is not 303, request’s body is not null,\n    // and the connection uses HTTP/2, then user agents may, and are even\n    // encouraged to, transmit an RST_STREAM frame.\n    // See, https://github.com/whatwg/fetch/issues/1288\n    if (request.redirect !== 'manual') {\n      fetchParams.controller.connection.destroy(undefined, false)\n    }\n\n    // 2. Switch on request’s redirect mode:\n    if (request.redirect === 'error') {\n      // Set response to a network error.\n      response = makeNetworkError('unexpected redirect')\n    } else if (request.redirect === 'manual') {\n      // Set response to an opaque-redirect filtered response whose internal\n      // response is actualResponse.\n      // NOTE(spec): On the web this would return an `opaqueredirect` response,\n      // but that doesn't make sense server side.\n      // See https://github.com/nodejs/undici/issues/1193.\n      response = actualResponse\n    } else if (request.redirect === 'follow') {\n      // Set response to the result of running HTTP-redirect fetch given\n      // fetchParams and response.\n      response = await httpRedirectFetch(fetchParams, response)\n    } else {\n      assert(false)\n    }\n  }\n\n  // 9. Set response’s timing info to timingInfo.\n  response.timingInfo = timingInfo\n\n  // 10. Return response.\n  return response\n}\n\n// https://fetch.spec.whatwg.org/#http-redirect-fetch\nfunction httpRedirectFetch (fetchParams, response) {\n  // 1. Let request be fetchParams’s request.\n  const request = fetchParams.request\n\n  // 2. Let actualResponse be response, if response is not a filtered response,\n  // and response’s internal response otherwise.\n  const actualResponse = response.internalResponse\n    ? response.internalResponse\n    : response\n\n  // 3. Let locationURL be actualResponse’s location URL given request’s current\n  // URL’s fragment.\n  let locationURL\n\n  try {\n    locationURL = responseLocationURL(\n      actualResponse,\n      requestCurrentURL(request).hash\n    )\n\n    // 4. If locationURL is null, then return response.\n    if (locationURL == null) {\n      return response\n    }\n  } catch (err) {\n    // 5. If locationURL is failure, then return a network error.\n    return Promise.resolve(makeNetworkError(err))\n  }\n\n  // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network\n  // error.\n  if (!urlIsHttpHttpsScheme(locationURL)) {\n    return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))\n  }\n\n  // 7. If request’s redirect count is 20, then return a network error.\n  if (request.redirectCount === 20) {\n    return Promise.resolve(makeNetworkError('redirect count exceeded'))\n  }\n\n  // 8. Increase request’s redirect count by 1.\n  request.redirectCount += 1\n\n  // 9. If request’s mode is \"cors\", locationURL includes credentials, and\n  // request’s origin is not same origin with locationURL’s origin, then return\n  //  a network error.\n  if (\n    request.mode === 'cors' &&\n    (locationURL.username || locationURL.password) &&\n    !sameOrigin(request, locationURL)\n  ) {\n    return Promise.resolve(makeNetworkError('cross origin not allowed for request mode \"cors\"'))\n  }\n\n  // 10. If request’s response tainting is \"cors\" and locationURL includes\n  // credentials, then return a network error.\n  if (\n    request.responseTainting === 'cors' &&\n    (locationURL.username || locationURL.password)\n  ) {\n    return Promise.resolve(makeNetworkError(\n      'URL cannot contain credentials for request mode \"cors\"'\n    ))\n  }\n\n  // 11. If actualResponse’s status is not 303, request’s body is non-null,\n  // and request’s body’s source is null, then return a network error.\n  if (\n    actualResponse.status !== 303 &&\n    request.body != null &&\n    request.body.source == null\n  ) {\n    return Promise.resolve(makeNetworkError())\n  }\n\n  // 12. If one of the following is true\n  // - actualResponse’s status is 301 or 302 and request’s method is `POST`\n  // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`\n  if (\n    ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||\n    (actualResponse.status === 303 &&\n      !GET_OR_HEAD.includes(request.method))\n  ) {\n    // then:\n    // 1. Set request’s method to `GET` and request’s body to null.\n    request.method = 'GET'\n    request.body = null\n\n    // 2. For each headerName of request-body-header name, delete headerName from\n    // request’s header list.\n    for (const headerName of requestBodyHeader) {\n      request.headersList.delete(headerName)\n    }\n  }\n\n  // 13. If request’s current URL’s origin is not same origin with locationURL’s\n  //     origin, then for each headerName of CORS non-wildcard request-header name,\n  //     delete headerName from request’s header list.\n  if (!sameOrigin(requestCurrentURL(request), locationURL)) {\n    // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name\n    request.headersList.delete('authorization', true)\n\n    // https://fetch.spec.whatwg.org/#authentication-entries\n    request.headersList.delete('proxy-authorization', true)\n\n    // \"Cookie\" and \"Host\" are forbidden request-headers, which undici doesn't implement.\n    request.headersList.delete('cookie', true)\n    request.headersList.delete('host', true)\n  }\n\n  // 14. If request's body is non-null, then set request's body to the first return\n  // value of safely extracting request's body's source.\n  if (request.body != null) {\n    assert(request.body.source != null)\n    request.body = safelyExtractBody(request.body.source)[0]\n  }\n\n  // 15. Let timingInfo be fetchParams’s timing info.\n  const timingInfo = fetchParams.timingInfo\n\n  // 16. Set timingInfo’s redirect end time and post-redirect start time to the\n  // coarsened shared current time given fetchParams’s cross-origin isolated\n  // capability.\n  timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =\n    coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n\n  // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s\n  //  redirect start time to timingInfo’s start time.\n  if (timingInfo.redirectStartTime === 0) {\n    timingInfo.redirectStartTime = timingInfo.startTime\n  }\n\n  // 18. Append locationURL to request’s URL list.\n  request.urlList.push(locationURL)\n\n  // 19. Invoke set request’s referrer policy on redirect on request and\n  // actualResponse.\n  setRequestReferrerPolicyOnRedirect(request, actualResponse)\n\n  // 20. Return the result of running main fetch given fetchParams and true.\n  return mainFetch(fetchParams, true)\n}\n\n// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch\nasync function httpNetworkOrCacheFetch (\n  fetchParams,\n  isAuthenticationFetch = false,\n  isNewConnectionFetch = false\n) {\n  // 1. Let request be fetchParams’s request.\n  const request = fetchParams.request\n\n  // 2. Let httpFetchParams be null.\n  let httpFetchParams = null\n\n  // 3. Let httpRequest be null.\n  let httpRequest = null\n\n  // 4. Let response be null.\n  let response = null\n\n  // 5. Let storedResponse be null.\n  // TODO: cache\n\n  // 6. Let httpCache be null.\n  const httpCache = null\n\n  // 7. Let the revalidatingFlag be unset.\n  const revalidatingFlag = false\n\n  // 8. Run these steps, but abort when the ongoing fetch is terminated:\n\n  //    1. If request’s window is \"no-window\" and request’s redirect mode is\n  //    \"error\", then set httpFetchParams to fetchParams and httpRequest to\n  //    request.\n  if (request.window === 'no-window' && request.redirect === 'error') {\n    httpFetchParams = fetchParams\n    httpRequest = request\n  } else {\n    // Otherwise:\n\n    // 1. Set httpRequest to a clone of request.\n    httpRequest = cloneRequest(request)\n\n    // 2. Set httpFetchParams to a copy of fetchParams.\n    httpFetchParams = { ...fetchParams }\n\n    // 3. Set httpFetchParams’s request to httpRequest.\n    httpFetchParams.request = httpRequest\n  }\n\n  //    3. Let includeCredentials be true if one of\n  const includeCredentials =\n    request.credentials === 'include' ||\n    (request.credentials === 'same-origin' &&\n      request.responseTainting === 'basic')\n\n  //    4. Let contentLength be httpRequest’s body’s length, if httpRequest’s\n  //    body is non-null; otherwise null.\n  const contentLength = httpRequest.body ? httpRequest.body.length : null\n\n  //    5. Let contentLengthHeaderValue be null.\n  let contentLengthHeaderValue = null\n\n  //    6. If httpRequest’s body is null and httpRequest’s method is `POST` or\n  //    `PUT`, then set contentLengthHeaderValue to `0`.\n  if (\n    httpRequest.body == null &&\n    ['POST', 'PUT'].includes(httpRequest.method)\n  ) {\n    contentLengthHeaderValue = '0'\n  }\n\n  //    7. If contentLength is non-null, then set contentLengthHeaderValue to\n  //    contentLength, serialized and isomorphic encoded.\n  if (contentLength != null) {\n    contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)\n  }\n\n  //    8. If contentLengthHeaderValue is non-null, then append\n  //    `Content-Length`/contentLengthHeaderValue to httpRequest’s header\n  //    list.\n  if (contentLengthHeaderValue != null) {\n    httpRequest.headersList.append('content-length', contentLengthHeaderValue, true)\n  }\n\n  //    9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,\n  //    contentLengthHeaderValue) to httpRequest’s header list.\n\n  //    10. If contentLength is non-null and httpRequest’s keepalive is true,\n  //    then:\n  if (contentLength != null && httpRequest.keepalive) {\n    // NOTE: keepalive is a noop outside of browser context.\n  }\n\n  //    11. If httpRequest’s referrer is a URL, then append\n  //    `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,\n  //     to httpRequest’s header list.\n  if (webidl.is.URL(httpRequest.referrer)) {\n    httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true)\n  }\n\n  //    12. Append a request `Origin` header for httpRequest.\n  appendRequestOriginHeader(httpRequest)\n\n  //    13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]\n  appendFetchMetadata(httpRequest)\n\n  //    14. If httpRequest’s header list does not contain `User-Agent`, then\n  //    user agents should append `User-Agent`/default `User-Agent` value to\n  //    httpRequest’s header list.\n  if (!httpRequest.headersList.contains('user-agent', true)) {\n    httpRequest.headersList.append('user-agent', defaultUserAgent, true)\n  }\n\n  //    15. If httpRequest’s cache mode is \"default\" and httpRequest’s header\n  //    list contains `If-Modified-Since`, `If-None-Match`,\n  //    `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set\n  //    httpRequest’s cache mode to \"no-store\".\n  if (\n    httpRequest.cache === 'default' &&\n    (httpRequest.headersList.contains('if-modified-since', true) ||\n      httpRequest.headersList.contains('if-none-match', true) ||\n      httpRequest.headersList.contains('if-unmodified-since', true) ||\n      httpRequest.headersList.contains('if-match', true) ||\n      httpRequest.headersList.contains('if-range', true))\n  ) {\n    httpRequest.cache = 'no-store'\n  }\n\n  //    16. If httpRequest’s cache mode is \"no-cache\", httpRequest’s prevent\n  //    no-cache cache-control header modification flag is unset, and\n  //    httpRequest’s header list does not contain `Cache-Control`, then append\n  //    `Cache-Control`/`max-age=0` to httpRequest’s header list.\n  if (\n    httpRequest.cache === 'no-cache' &&\n    !httpRequest.preventNoCacheCacheControlHeaderModification &&\n    !httpRequest.headersList.contains('cache-control', true)\n  ) {\n    httpRequest.headersList.append('cache-control', 'max-age=0', true)\n  }\n\n  //    17. If httpRequest’s cache mode is \"no-store\" or \"reload\", then:\n  if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {\n    // 1. If httpRequest’s header list does not contain `Pragma`, then append\n    // `Pragma`/`no-cache` to httpRequest’s header list.\n    if (!httpRequest.headersList.contains('pragma', true)) {\n      httpRequest.headersList.append('pragma', 'no-cache', true)\n    }\n\n    // 2. If httpRequest’s header list does not contain `Cache-Control`,\n    // then append `Cache-Control`/`no-cache` to httpRequest’s header list.\n    if (!httpRequest.headersList.contains('cache-control', true)) {\n      httpRequest.headersList.append('cache-control', 'no-cache', true)\n    }\n  }\n\n  //    18. If httpRequest’s header list contains `Range`, then append\n  //    `Accept-Encoding`/`identity` to httpRequest’s header list.\n  if (httpRequest.headersList.contains('range', true)) {\n    httpRequest.headersList.append('accept-encoding', 'identity', true)\n  }\n\n  //    19. Modify httpRequest’s header list per HTTP. Do not append a given\n  //    header if httpRequest’s header list contains that header’s name.\n  //    TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129\n  if (!httpRequest.headersList.contains('accept-encoding', true)) {\n    if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {\n      httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true)\n    } else {\n      httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true)\n    }\n  }\n\n  httpRequest.headersList.delete('host', true)\n\n  //    21. If includeCredentials is true, then:\n  if (includeCredentials) {\n    // 1. If the user agent is not configured to block cookies for httpRequest\n    // (see section 7 of [COOKIES]), then:\n    // TODO: credentials\n\n    // 2. If httpRequest’s header list does not contain `Authorization`, then:\n    if (!httpRequest.headersList.contains('authorization', true)) {\n      // 1. Let authorizationValue be null.\n      let authorizationValue = null\n\n      // 2. If there’s an authentication entry for httpRequest and either\n      //    httpRequest’s use-URL-credentials flag is unset or httpRequest’s\n      //    current URL does not include credentials, then set\n      //    authorizationValue to authentication entry.\n      if (hasAuthenticationEntry(httpRequest) && (\n        httpRequest.useURLCredentials === undefined || !includesCredentials(requestCurrentURL(httpRequest))\n      )) {\n        // TODO\n      } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) {\n        // 3. Otherwise, if httpRequest’s current URL does include credentials\n        //    and isAuthenticationFetch is true, set authorizationValue to\n        //    httpRequest’s current URL, converted to an `Authorization` value\n        const { username, password } = requestCurrentURL(httpRequest)\n        authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`\n      }\n\n      // 4. If authorizationValue is non-null, then append (`Authorization`,\n      //    authorizationValue) to httpRequest’s header list.\n      if (authorizationValue !== null) {\n        httpRequest.headersList.append('Authorization', authorizationValue, false)\n      }\n    }\n  }\n\n  //    21. If there’s a proxy-authentication entry, use it as appropriate.\n  //    TODO: proxy-authentication\n\n  //    22. Set httpCache to the result of determining the HTTP cache\n  //    partition, given httpRequest.\n  //    TODO: cache\n\n  //    23. If httpCache is null, then set httpRequest’s cache mode to\n  //    \"no-store\".\n  if (httpCache == null) {\n    httpRequest.cache = 'no-store'\n  }\n\n  //    24. If httpRequest’s cache mode is neither \"no-store\" nor \"reload\",\n  //    then:\n  if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') {\n    // TODO: cache\n  }\n\n  // 9. If aborted, then return the appropriate network error for fetchParams.\n  // TODO\n\n  // 10. If response is null, then:\n  if (response == null) {\n    // 1. If httpRequest’s cache mode is \"only-if-cached\", then return a\n    // network error.\n    if (httpRequest.cache === 'only-if-cached') {\n      return makeNetworkError('only if cached')\n    }\n\n    // 2. Let forwardResponse be the result of running HTTP-network fetch\n    // given httpFetchParams, includeCredentials, and isNewConnectionFetch.\n    const forwardResponse = await httpNetworkFetch(\n      httpFetchParams,\n      includeCredentials,\n      isNewConnectionFetch\n    )\n\n    // 3. If httpRequest’s method is unsafe and forwardResponse’s status is\n    // in the range 200 to 399, inclusive, invalidate appropriate stored\n    // responses in httpCache, as per the \"Invalidation\" chapter of HTTP\n    // Caching, and set storedResponse to null. [HTTP-CACHING]\n    if (\n      !safeMethodsSet.has(httpRequest.method) &&\n      forwardResponse.status >= 200 &&\n      forwardResponse.status <= 399\n    ) {\n      // TODO: cache\n    }\n\n    // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,\n    // then:\n    if (revalidatingFlag && forwardResponse.status === 304) {\n      // TODO: cache\n    }\n\n    // 5. If response is null, then:\n    if (response == null) {\n      // 1. Set response to forwardResponse.\n      response = forwardResponse\n\n      // 2. Store httpRequest and forwardResponse in httpCache, as per the\n      // \"Storing Responses in Caches\" chapter of HTTP Caching. [HTTP-CACHING]\n      // TODO: cache\n    }\n  }\n\n  // 11. Set response’s URL list to a clone of httpRequest’s URL list.\n  response.urlList = [...httpRequest.urlList]\n\n  // 12. If httpRequest’s header list contains `Range`, then set response’s\n  // range-requested flag.\n  if (httpRequest.headersList.contains('range', true)) {\n    response.rangeRequested = true\n  }\n\n  // 13. Set response’s request-includes-credentials to includeCredentials.\n  response.requestIncludesCredentials = includeCredentials\n\n  // 14. If response’s status is 401, httpRequest’s response tainting is not \"cors\",\n  //     includeCredentials is true, and request’s traversable for user prompts is\n  //     a traversable navigable:\n  //\n  //     In Node.js there is no traversable navigable to prompt the user, but we\n  //     still need to handle URL-embedded credentials so authentication retries\n  //     for WebSocket handshakes continue to work.\n  if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && (\n    request.useURLCredentials !== undefined ||\n    isTraversableNavigable(request.traversableForUserPrompts)\n  )) {\n    // 2. If request’s body is non-null, then:\n    if (request.body != null) {\n      // 1. If request’s body’s source is null, then return a network error.\n      if (request.body.source == null) {\n        // Note: In Node.js, this code path should not be reached because\n        // isTraversableNavigable() returns false for non-navigable contexts.\n        // However, we handle it gracefully by returning the response instead of\n        // a network error, as we won't actually retry the request.\n        // This aligns with the Fetch spec discussion in whatwg/fetch#1132,\n        // which allows implementations flexibility when credentials can't be obtained.\n        return response\n      }\n\n      // 2. Set request’s body to the body of the result of safely extracting\n      //    request’s body’s source.\n      request.body = safelyExtractBody(request.body.source)[0]\n    }\n\n    // 3. If request’s use-URL-credentials flag is unset or isAuthenticationFetch is\n    //    true, then:\n    if (request.useURLCredentials === undefined || isAuthenticationFetch) {\n      // 1. If fetchParams is canceled, then return the appropriate network error\n      //    for fetchParams.\n      if (isCancelled(fetchParams)) {\n        return makeAppropriateNetworkError(fetchParams)\n      }\n\n      // 2. Let username and password be the result of prompting the end user for a\n      //    username and password, respectively, in request’s traversable for user prompts.\n      // TODO\n\n      // 3. Set the username given request’s current URL and username.\n      // requestCurrentURL(request).username = TODO\n\n      // 4. Set the password given request’s current URL and password.\n      // requestCurrentURL(request).password = TODO\n\n      // In browsers, the user will be prompted to enter a username/password before the request\n      // is re-sent. To prevent an infinite 401 loop, return the response for now.\n      // https://github.com/nodejs/undici/pull/4756\n      return response\n    }\n\n    // 4. Set response to the result of running HTTP-network-or-cache fetch given\n    //    fetchParams and true.\n    fetchParams.controller.connection.destroy()\n\n    response = await httpNetworkOrCacheFetch(fetchParams, true)\n  }\n\n  // 15. If response’s status is 407, then:\n  if (response.status === 407) {\n    // 1. If request’s window is \"no-window\", then return a network error.\n    if (request.window === 'no-window') {\n      return makeNetworkError()\n    }\n\n    // 2. ???\n\n    // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n    if (isCancelled(fetchParams)) {\n      return makeAppropriateNetworkError(fetchParams)\n    }\n\n    // 4. Prompt the end user as appropriate in request’s window and store\n    // the result as a proxy-authentication entry. [HTTP-AUTH]\n    // TODO: Invoke some kind of callback?\n\n    // 5. Set response to the result of running HTTP-network-or-cache fetch given\n    // fetchParams.\n    // TODO\n    return makeNetworkError('proxy authentication required')\n  }\n\n  // 16. If all of the following are true\n  if (\n    // response’s status is 421\n    response.status === 421 &&\n    // isNewConnectionFetch is false\n    !isNewConnectionFetch &&\n    // request’s body is null, or request’s body is non-null and request’s body’s source is non-null\n    (request.body == null || request.body.source != null)\n  ) {\n    // then:\n\n    // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n    if (isCancelled(fetchParams)) {\n      return makeAppropriateNetworkError(fetchParams)\n    }\n\n    // 2. Set response to the result of running HTTP-network-or-cache\n    // fetch given fetchParams, isAuthenticationFetch, and true.\n\n    // TODO (spec): The spec doesn't specify this but we need to cancel\n    // the active response before we can start a new one.\n    // https://github.com/whatwg/fetch/issues/1293\n    fetchParams.controller.connection.destroy()\n\n    response = await httpNetworkOrCacheFetch(\n      fetchParams,\n      isAuthenticationFetch,\n      true\n    )\n  }\n\n  // 17. If isAuthenticationFetch is true, then create an authentication entry\n  if (isAuthenticationFetch) {\n    // TODO\n  }\n\n  // 18. Return response.\n  return response\n}\n\n// https://fetch.spec.whatwg.org/#http-network-fetch\nasync function httpNetworkFetch (\n  fetchParams,\n  includeCredentials = false,\n  forceNewConnection = false\n) {\n  assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)\n\n  fetchParams.controller.connection = {\n    abort: null,\n    destroyed: false,\n    destroy (err, abort = true) {\n      if (!this.destroyed) {\n        this.destroyed = true\n        if (abort) {\n          this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))\n        }\n      }\n    }\n  }\n\n  // 1. Let request be fetchParams’s request.\n  const request = fetchParams.request\n\n  // 2. Let response be null.\n  let response = null\n\n  // 3. Let timingInfo be fetchParams’s timing info.\n  const timingInfo = fetchParams.timingInfo\n\n  // 4. Let httpCache be the result of determining the HTTP cache partition,\n  // given request.\n  // TODO: cache\n  const httpCache = null\n\n  // 5. If httpCache is null, then set request’s cache mode to \"no-store\".\n  if (httpCache == null) {\n    request.cache = 'no-store'\n  }\n\n  // 6. Let networkPartitionKey be the result of determining the network\n  // partition key given request.\n  // TODO\n\n  // 7. Let newConnection be \"yes\" if forceNewConnection is true; otherwise\n  // \"no\".\n  const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars\n\n  // 8. Switch on request’s mode:\n  if (request.mode === 'websocket') {\n    // Let connection be the result of obtaining a WebSocket connection,\n    // given request’s current URL.\n    // TODO\n  } else {\n    // Let connection be the result of obtaining a connection, given\n    // networkPartitionKey, request’s current URL’s origin,\n    // includeCredentials, and forceNewConnection.\n    // TODO\n  }\n\n  // 9. Run these steps, but abort when the ongoing fetch is terminated:\n\n  //    1. If connection is failure, then return a network error.\n\n  //    2. Set timingInfo’s final connection timing info to the result of\n  //    calling clamp and coarsen connection timing info with connection’s\n  //    timing info, timingInfo’s post-redirect start time, and fetchParams’s\n  //    cross-origin isolated capability.\n\n  //    3. If connection is not an HTTP/2 connection, request’s body is non-null,\n  //    and request’s body’s source is null, then append (`Transfer-Encoding`,\n  //    `chunked`) to request’s header list.\n\n  //    4. Set timingInfo’s final network-request start time to the coarsened\n  //    shared current time given fetchParams’s cross-origin isolated\n  //    capability.\n\n  //    5. Set response to the result of making an HTTP request over connection\n  //    using request with the following caveats:\n\n  //        - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]\n  //        [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]\n\n  //        - If request’s body is non-null, and request’s body’s source is null,\n  //        then the user agent may have a buffer of up to 64 kibibytes and store\n  //        a part of request’s body in that buffer. If the user agent reads from\n  //        request’s body beyond that buffer’s size and the user agent needs to\n  //        resend request, then instead return a network error.\n\n  //        - Set timingInfo’s final network-response start time to the coarsened\n  //        shared current time given fetchParams’s cross-origin isolated capability,\n  //        immediately after the user agent’s HTTP parser receives the first byte\n  //        of the response (e.g., frame header bytes for HTTP/2 or response status\n  //        line for HTTP/1.x).\n\n  //        - Wait until all the headers are transmitted.\n\n  //        - Any responses whose status is in the range 100 to 199, inclusive,\n  //        and is not 101, are to be ignored, except for the purposes of setting\n  //        timingInfo’s final network-response start time above.\n\n  //    - If request’s header list contains `Transfer-Encoding`/`chunked` and\n  //    response is transferred via HTTP/1.0 or older, then return a network\n  //    error.\n\n  //    - If the HTTP request results in a TLS client certificate dialog, then:\n\n  //        1. If request’s window is an environment settings object, make the\n  //        dialog available in request’s window.\n\n  //        2. Otherwise, return a network error.\n\n  // To transmit request’s body body, run these steps:\n  let requestBody = null\n  // 1. If body is null and fetchParams’s process request end-of-body is\n  // non-null, then queue a fetch task given fetchParams’s process request\n  // end-of-body and fetchParams’s task destination.\n  if (request.body == null && fetchParams.processRequestEndOfBody) {\n    queueMicrotask(() => fetchParams.processRequestEndOfBody())\n  } else if (request.body != null) {\n    // 2. Otherwise, if body is non-null:\n\n    //    1. Let processBodyChunk given bytes be these steps:\n    const processBodyChunk = async function * (bytes) {\n      // 1. If the ongoing fetch is terminated, then abort these steps.\n      if (isCancelled(fetchParams)) {\n        return\n      }\n\n      // 2. Run this step in parallel: transmit bytes.\n      yield bytes\n\n      // 3. If fetchParams’s process request body is non-null, then run\n      // fetchParams’s process request body given bytes’s length.\n      fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)\n    }\n\n    // 2. Let processEndOfBody be these steps:\n    const processEndOfBody = () => {\n      // 1. If fetchParams is canceled, then abort these steps.\n      if (isCancelled(fetchParams)) {\n        return\n      }\n\n      // 2. If fetchParams’s process request end-of-body is non-null,\n      // then run fetchParams’s process request end-of-body.\n      if (fetchParams.processRequestEndOfBody) {\n        fetchParams.processRequestEndOfBody()\n      }\n    }\n\n    // 3. Let processBodyError given e be these steps:\n    const processBodyError = (e) => {\n      // 1. If fetchParams is canceled, then abort these steps.\n      if (isCancelled(fetchParams)) {\n        return\n      }\n\n      // 2. If e is an \"AbortError\" DOMException, then abort fetchParams’s controller.\n      if (e.name === 'AbortError') {\n        fetchParams.controller.abort()\n      } else {\n        fetchParams.controller.terminate(e)\n      }\n    }\n\n    // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,\n    // processBodyError, and fetchParams’s task destination.\n    requestBody = (async function * () {\n      try {\n        for await (const bytes of request.body.stream) {\n          yield * processBodyChunk(bytes)\n        }\n        processEndOfBody()\n      } catch (err) {\n        processBodyError(err)\n      }\n    })()\n  }\n\n  try {\n    // socket is only provided for websockets\n    const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })\n\n    if (socket) {\n      response = makeResponse({ status, statusText, headersList, socket })\n    } else {\n      const iterator = body[Symbol.asyncIterator]()\n      fetchParams.controller.next = () => iterator.next()\n\n      response = makeResponse({ status, statusText, headersList })\n    }\n  } catch (err) {\n    // 10. If aborted, then:\n    if (err.name === 'AbortError') {\n      // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n      fetchParams.controller.connection.destroy()\n\n      // 2. Return the appropriate network error for fetchParams.\n      return makeAppropriateNetworkError(fetchParams, err)\n    }\n\n    return makeNetworkError(err)\n  }\n\n  // 11. Let pullAlgorithm be an action that resumes the ongoing fetch\n  // if it is suspended.\n  const pullAlgorithm = () => {\n    return fetchParams.controller.resume()\n  }\n\n  // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s\n  // controller with reason, given reason.\n  const cancelAlgorithm = (reason) => {\n    // If the aborted fetch was already terminated, then we do not\n    // need to do anything.\n    if (!isCancelled(fetchParams)) {\n      fetchParams.controller.abort(reason)\n    }\n  }\n\n  // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by\n  // the user agent.\n  // TODO\n\n  // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object\n  // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.\n  // TODO\n\n  // 15. Let stream be a new ReadableStream.\n  // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm,\n  //     cancelAlgorithm set to cancelAlgorithm.\n  const stream = new ReadableStream(\n    {\n      start (controller) {\n        fetchParams.controller.controller = controller\n      },\n      pull: pullAlgorithm,\n      cancel: cancelAlgorithm,\n      type: 'bytes'\n    }\n  )\n\n  // 17. Run these steps, but abort when the ongoing fetch is terminated:\n\n  //    1. Set response’s body to a new body whose stream is stream.\n  response.body = { stream, source: null, length: null }\n\n  //    2. If response is not a network error and request’s cache mode is\n  //    not \"no-store\", then update response in httpCache for request.\n  //    TODO\n\n  //    3. If includeCredentials is true and the user agent is not configured\n  //    to block cookies for request (see section 7 of [COOKIES]), then run the\n  //    \"set-cookie-string\" parsing algorithm (see section 5.2 of [COOKIES]) on\n  //    the value of each header whose name is a byte-case-insensitive match for\n  //    `Set-Cookie` in response’s header list, if any, and request’s current URL.\n  //    TODO\n\n  // 18. If aborted, then:\n  // TODO\n\n  // 19. Run these steps in parallel:\n\n  //    1. Run these steps, but abort when fetchParams is canceled:\n  if (!fetchParams.controller.resume) {\n    fetchParams.controller.on('terminated', onAborted)\n  }\n\n  fetchParams.controller.resume = async () => {\n    // 1. While true\n    while (true) {\n      // 1-3. See onData...\n\n      // 4. Set bytes to the result of handling content codings given\n      // codings and bytes.\n      let bytes\n      let isFailure\n      try {\n        const { done, value } = await fetchParams.controller.next()\n\n        if (isAborted(fetchParams)) {\n          break\n        }\n\n        bytes = done ? undefined : value\n      } catch (err) {\n        if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {\n          // zlib doesn't like empty streams.\n          bytes = undefined\n        } else {\n          bytes = err\n\n          // err may be propagated from the result of calling readablestream.cancel,\n          // which might not be an error. https://github.com/nodejs/undici/issues/2009\n          isFailure = true\n        }\n      }\n\n      if (bytes === undefined) {\n        // 2. Otherwise, if the bytes transmission for response’s message\n        // body is done normally and stream is readable, then close\n        // stream, finalize response for fetchParams and response, and\n        // abort these in-parallel steps.\n        readableStreamClose(fetchParams.controller.controller)\n\n        finalizeResponse(fetchParams, response)\n\n        return\n      }\n\n      // 5. Increase timingInfo’s decoded body size by bytes’s length.\n      timingInfo.decodedBodySize += bytes?.byteLength ?? 0\n\n      // 6. If bytes is failure, then terminate fetchParams’s controller.\n      if (isFailure) {\n        fetchParams.controller.terminate(bytes)\n        return\n      }\n\n      // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes\n      // into stream.\n      const buffer = new Uint8Array(bytes)\n      if (buffer.byteLength) {\n        fetchParams.controller.controller.enqueue(buffer)\n      }\n\n      // 8. If stream is errored, then terminate the ongoing fetch.\n      if (isErrored(stream)) {\n        fetchParams.controller.terminate()\n        return\n      }\n\n      // 9. If stream doesn’t need more data ask the user agent to suspend\n      // the ongoing fetch.\n      if (fetchParams.controller.controller.desiredSize <= 0) {\n        return\n      }\n    }\n  }\n\n  //    2. If aborted, then:\n  function onAborted (reason) {\n    // 2. If fetchParams is aborted, then:\n    if (isAborted(fetchParams)) {\n      // 1. Set response’s aborted flag.\n      response.aborted = true\n\n      // 2. If stream is readable, then error stream with the result of\n      //    deserialize a serialized abort reason given fetchParams’s\n      //    controller’s serialized abort reason and an\n      //    implementation-defined realm.\n      if (isReadable(stream)) {\n        fetchParams.controller.controller.error(\n          fetchParams.controller.serializedAbortReason\n        )\n      }\n    } else {\n      // 3. Otherwise, if stream is readable, error stream with a TypeError.\n      if (isReadable(stream)) {\n        fetchParams.controller.controller.error(new TypeError('terminated', {\n          cause: isErrorLike(reason) ? reason : undefined\n        }))\n      }\n    }\n\n    // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n    // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.\n    fetchParams.controller.connection.destroy()\n  }\n\n  // 20. Return response.\n  return response\n\n  function dispatch ({ body }) {\n    const url = requestCurrentURL(request)\n    /** @type {import('../../..').Agent} */\n    const agent = fetchParams.controller.dispatcher\n\n    const path = url.pathname + url.search\n    const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?'\n\n    return new Promise((resolve, reject) => agent.dispatch(\n      {\n        path: hasTrailingQuestionMark ? `${path}?` : path,\n        origin: url.origin,\n        method: request.method,\n        body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,\n        headers: request.headersList.entries,\n        maxRedirections: 0,\n        upgrade: request.mode === 'websocket' ? 'websocket' : undefined\n      },\n      {\n        body: null,\n        abort: null,\n\n        onConnect (abort) {\n          // TODO (fix): Do we need connection here?\n          const { connection } = fetchParams.controller\n\n          // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen\n          // connection timing info with connection’s timing info, timingInfo’s post-redirect start\n          // time, and fetchParams’s cross-origin isolated capability.\n          // TODO: implement connection timing\n          timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability)\n\n          if (connection.destroyed) {\n            abort(new DOMException('The operation was aborted.', 'AbortError'))\n          } else {\n            fetchParams.controller.on('terminated', abort)\n            this.abort = connection.abort = abort\n          }\n\n          // Set timingInfo’s final network-request start time to the coarsened shared current time given\n          // fetchParams’s cross-origin isolated capability.\n          timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n        },\n\n        onResponseStarted () {\n          // Set timingInfo’s final network-response start time to the coarsened shared current\n          // time given fetchParams’s cross-origin isolated capability, immediately after the\n          // user agent’s HTTP parser receives the first byte of the response (e.g., frame header\n          // bytes for HTTP/2 or response status line for HTTP/1.x).\n          timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n        },\n\n        onHeaders (status, rawHeaders, resume, statusText) {\n          if (status < 200) {\n            return false\n          }\n\n          const headersList = new HeadersList()\n\n          for (let i = 0; i < rawHeaders.length; i += 2) {\n            const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n            const value = rawHeaders[i + 1]\n            if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n              for (const val of value) {\n                headersList.append(nameStr, val.toString('latin1'), true)\n              }\n            } else {\n              headersList.append(nameStr, value.toString('latin1'), true)\n            }\n          }\n          const location = headersList.get('location', true)\n\n          this.body = new Readable({ read: resume })\n\n          const willFollow = location && request.redirect === 'follow' &&\n            redirectStatusSet.has(status)\n\n          const decoders = []\n\n          // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n          if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {\n            // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n            const contentEncoding = headersList.get('content-encoding', true)\n            // \"All content-coding values are case-insensitive...\"\n            /** @type {string[]} */\n            const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []\n\n            // Limit the number of content-encodings to prevent resource exhaustion.\n            // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n            const maxContentEncodings = 5\n            if (codings.length > maxContentEncodings) {\n              reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`))\n              return true\n            }\n\n            for (let i = codings.length - 1; i >= 0; --i) {\n              const coding = codings[i].trim()\n              // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2\n              if (coding === 'x-gzip' || coding === 'gzip') {\n                decoders.push(zlib.createGunzip({\n                  // Be less strict when decoding compressed responses, since sometimes\n                  // servers send slightly invalid responses that are still accepted\n                  // by common browsers.\n                  // Always using Z_SYNC_FLUSH is what cURL does.\n                  flush: zlib.constants.Z_SYNC_FLUSH,\n                  finishFlush: zlib.constants.Z_SYNC_FLUSH\n                }))\n              } else if (coding === 'deflate') {\n                decoders.push(createInflate({\n                  flush: zlib.constants.Z_SYNC_FLUSH,\n                  finishFlush: zlib.constants.Z_SYNC_FLUSH\n                }))\n              } else if (coding === 'br') {\n                decoders.push(zlib.createBrotliDecompress({\n                  flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n                  finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n                }))\n              } else if (coding === 'zstd' && hasZstd) {\n                decoders.push(zlib.createZstdDecompress({\n                  flush: zlib.constants.ZSTD_e_continue,\n                  finishFlush: zlib.constants.ZSTD_e_end\n                }))\n              } else {\n                decoders.length = 0\n                break\n              }\n            }\n          }\n\n          const onError = this.onError.bind(this)\n\n          resolve({\n            status,\n            statusText,\n            headersList,\n            body: decoders.length\n              ? pipeline(this.body, ...decoders, (err) => {\n                if (err) {\n                  this.onError(err)\n                }\n              }).on('error', onError)\n              : this.body.on('error', onError)\n          })\n\n          return true\n        },\n\n        onData (chunk) {\n          if (fetchParams.controller.dump) {\n            return\n          }\n\n          // 1. If one or more bytes have been transmitted from response’s\n          // message body, then:\n\n          //  1. Let bytes be the transmitted bytes.\n          const bytes = chunk\n\n          //  2. Let codings be the result of extracting header list values\n          //  given `Content-Encoding` and response’s header list.\n          //  See pullAlgorithm.\n\n          //  3. Increase timingInfo’s encoded body size by bytes’s length.\n          timingInfo.encodedBodySize += bytes.byteLength\n\n          //  4. See pullAlgorithm...\n\n          return this.body.push(bytes)\n        },\n\n        onComplete () {\n          if (this.abort) {\n            fetchParams.controller.off('terminated', this.abort)\n          }\n\n          fetchParams.controller.ended = true\n\n          this.body.push(null)\n        },\n\n        onError (error) {\n          if (this.abort) {\n            fetchParams.controller.off('terminated', this.abort)\n          }\n\n          this.body?.destroy(error)\n\n          fetchParams.controller.terminate(error)\n\n          reject(error)\n        },\n\n        onRequestUpgrade (_controller, status, headers, socket) {\n          // We need to support 200 for websocket over h2 as per RFC-8441\n          // Absence of session means H1\n          if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {\n            return false\n          }\n\n          const headersList = new HeadersList()\n\n          for (const [name, value] of Object.entries(headers)) {\n            if (value == null) {\n              continue\n            }\n\n            const headerName = name.toLowerCase()\n\n            if (Array.isArray(value)) {\n              for (const entry of value) {\n                headersList.append(headerName, String(entry), true)\n              }\n            } else {\n              headersList.append(headerName, String(value), true)\n            }\n          }\n\n          resolve({\n            status,\n            statusText: STATUS_CODES[status],\n            headersList,\n            socket\n          })\n\n          return true\n        },\n\n        onUpgrade (status, rawHeaders, socket) {\n          // We need to support 200 for websocket over h2 as per RFC-8441\n          // Absence of session means H1\n          if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {\n            return false\n          }\n\n          const headersList = new HeadersList()\n\n          for (let i = 0; i < rawHeaders.length; i += 2) {\n            const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n            const value = rawHeaders[i + 1]\n            if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n              for (const val of value) {\n                headersList.append(nameStr, val.toString('latin1'), true)\n              }\n            } else {\n              headersList.append(nameStr, value.toString('latin1'), true)\n            }\n          }\n\n          resolve({\n            status,\n            statusText: STATUS_CODES[status],\n            headersList,\n            socket\n          })\n\n          return true\n        }\n      }\n    ))\n  }\n}\n\nmodule.exports = {\n  fetch,\n  Fetch,\n  fetching,\n  finalizeAndReportTiming\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { isValidHeaderName } = require('../fetch/util')\n\n/**\n * @see https://url.spec.whatwg.org/#concept-url-equals\n * @param {URL} A\n * @param {URL} B\n * @param {boolean | undefined} excludeFragment\n * @returns {boolean}\n */\nfunction urlEquals (A, B, excludeFragment = false) {\n  const serializedA = URLSerializer(A, excludeFragment)\n\n  const serializedB = URLSerializer(B, excludeFragment)\n\n  return serializedA === serializedB\n}\n\n/**\n * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262\n * @param {string} header\n */\nfunction getFieldValues (header) {\n  assert(header !== null)\n\n  const values = []\n\n  for (let value of header.split(',')) {\n    value = value.trim()\n\n    if (isValidHeaderName(value)) {\n      values.push(value)\n    }\n  }\n\n  return values\n}\n\nmodule.exports = {\n  urlEquals,\n  getFieldValues\n}\n","'use strict'\n\nconst assert = require('node:assert')\n\nconst { kConstruct } = require('../../core/symbols')\nconst { urlEquals, getFieldValues } = require('./util')\nconst { kEnumerableProperty, isDisturbed } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch/response')\nconst { Request, fromInnerRequest, getRequestState } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { urlIsHttpHttpsScheme, readAllBytes } = require('../fetch/util')\nconst { createDeferredPromise } = require('../../util/promise')\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation\n * @typedef {Object} CacheBatchOperation\n * @property {'delete' | 'put'} type\n * @property {any} request\n * @property {any} response\n * @property {import('../../../types/cache').CacheQueryOptions} options\n */\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list\n * @typedef {[any, any][]} requestResponseList\n */\n\nclass Cache {\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list\n   * @type {requestResponseList}\n   */\n  #relevantRequestResponseList\n\n  constructor () {\n    if (arguments[0] !== kConstruct) {\n      webidl.illegalConstructor()\n    }\n\n    webidl.util.markAsUncloneable(this)\n    this.#relevantRequestResponseList = arguments[1]\n  }\n\n  async match (request, options = {}) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.match'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    request = webidl.converters.RequestInfo(request)\n    options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n    const p = this.#internalMatchAll(request, options, 1)\n\n    if (p.length === 0) {\n      return\n    }\n\n    return p[0]\n  }\n\n  async matchAll (request = undefined, options = {}) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.matchAll'\n    if (request !== undefined) request = webidl.converters.RequestInfo(request)\n    options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n    return this.#internalMatchAll(request, options)\n  }\n\n  async add (request) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.add'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    request = webidl.converters.RequestInfo(request)\n\n    // 1.\n    const requests = [request]\n\n    // 2.\n    const responseArrayPromise = this.addAll(requests)\n\n    // 3.\n    return await responseArrayPromise\n  }\n\n  async addAll (requests) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.addAll'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    // 1.\n    const responsePromises = []\n\n    // 2.\n    const requestList = []\n\n    // 3.\n    for (let request of requests) {\n      if (request === undefined) {\n        throw webidl.errors.conversionFailed({\n          prefix,\n          argument: 'Argument 1',\n          types: ['undefined is not allowed']\n        })\n      }\n\n      request = webidl.converters.RequestInfo(request)\n\n      if (typeof request === 'string') {\n        continue\n      }\n\n      // 3.1\n      const r = getRequestState(request)\n\n      // 3.2\n      if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {\n        throw webidl.errors.exception({\n          header: prefix,\n          message: 'Expected http/s scheme when method is not GET.'\n        })\n      }\n    }\n\n    // 4.\n    /** @type {ReturnType<typeof fetching>[]} */\n    const fetchControllers = []\n\n    // 5.\n    for (const request of requests) {\n      // 5.1\n      const r = getRequestState(new Request(request))\n\n      // 5.2\n      if (!urlIsHttpHttpsScheme(r.url)) {\n        throw webidl.errors.exception({\n          header: prefix,\n          message: 'Expected http/s scheme.'\n        })\n      }\n\n      // 5.4\n      r.initiator = 'fetch'\n      r.destination = 'subresource'\n\n      // 5.5\n      requestList.push(r)\n\n      // 5.6\n      const responsePromise = createDeferredPromise()\n\n      // 5.7\n      fetchControllers.push(fetching({\n        request: r,\n        processResponse (response) {\n          // 1.\n          if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {\n            responsePromise.reject(webidl.errors.exception({\n              header: 'Cache.addAll',\n              message: 'Received an invalid status code or the request failed.'\n            }))\n          } else if (response.headersList.contains('vary')) { // 2.\n            // 2.1\n            const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n            // 2.2\n            for (const fieldValue of fieldValues) {\n              // 2.2.1\n              if (fieldValue === '*') {\n                responsePromise.reject(webidl.errors.exception({\n                  header: 'Cache.addAll',\n                  message: 'invalid vary field value'\n                }))\n\n                for (const controller of fetchControllers) {\n                  controller.abort()\n                }\n\n                return\n              }\n            }\n          }\n        },\n        processResponseEndOfBody (response) {\n          // 1.\n          if (response.aborted) {\n            responsePromise.reject(new DOMException('aborted', 'AbortError'))\n            return\n          }\n\n          // 2.\n          responsePromise.resolve(response)\n        }\n      }))\n\n      // 5.8\n      responsePromises.push(responsePromise.promise)\n    }\n\n    // 6.\n    const p = Promise.all(responsePromises)\n\n    // 7.\n    const responses = await p\n\n    // 7.1\n    const operations = []\n\n    // 7.2\n    let index = 0\n\n    // 7.3\n    for (const response of responses) {\n      // 7.3.1\n      /** @type {CacheBatchOperation} */\n      const operation = {\n        type: 'put', // 7.3.2\n        request: requestList[index], // 7.3.3\n        response // 7.3.4\n      }\n\n      operations.push(operation) // 7.3.5\n\n      index++ // 7.3.6\n    }\n\n    // 7.5\n    const cacheJobPromise = createDeferredPromise()\n\n    // 7.6.1\n    let errorData = null\n\n    // 7.6.2\n    try {\n      this.#batchCacheOperations(operations)\n    } catch (e) {\n      errorData = e\n    }\n\n    // 7.6.3\n    queueMicrotask(() => {\n      // 7.6.3.1\n      if (errorData === null) {\n        cacheJobPromise.resolve(undefined)\n      } else {\n        // 7.6.3.2\n        cacheJobPromise.reject(errorData)\n      }\n    })\n\n    // 7.7\n    return cacheJobPromise.promise\n  }\n\n  async put (request, response) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.put'\n    webidl.argumentLengthCheck(arguments, 2, prefix)\n\n    request = webidl.converters.RequestInfo(request)\n    response = webidl.converters.Response(response, prefix, 'response')\n\n    // 1.\n    let innerRequest = null\n\n    // 2.\n    if (webidl.is.Request(request)) {\n      innerRequest = getRequestState(request)\n    } else { // 3.\n      innerRequest = getRequestState(new Request(request))\n    }\n\n    // 4.\n    if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: 'Expected an http/s scheme when method is not GET'\n      })\n    }\n\n    // 5.\n    const innerResponse = getResponseState(response)\n\n    // 6.\n    if (innerResponse.status === 206) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: 'Got 206 status'\n      })\n    }\n\n    // 7.\n    if (innerResponse.headersList.contains('vary')) {\n      // 7.1.\n      const fieldValues = getFieldValues(innerResponse.headersList.get('vary'))\n\n      // 7.2.\n      for (const fieldValue of fieldValues) {\n        // 7.2.1\n        if (fieldValue === '*') {\n          throw webidl.errors.exception({\n            header: prefix,\n            message: 'Got * vary field value'\n          })\n        }\n      }\n    }\n\n    // 8.\n    if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {\n      throw webidl.errors.exception({\n        header: prefix,\n        message: 'Response body is locked or disturbed'\n      })\n    }\n\n    // 9.\n    const clonedResponse = cloneResponse(innerResponse)\n\n    // 10.\n    const bodyReadPromise = createDeferredPromise()\n\n    // 11.\n    if (innerResponse.body != null) {\n      // 11.1\n      const stream = innerResponse.body.stream\n\n      // 11.2\n      const reader = stream.getReader()\n\n      // 11.3\n      readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject)\n    } else {\n      bodyReadPromise.resolve(undefined)\n    }\n\n    // 12.\n    /** @type {CacheBatchOperation[]} */\n    const operations = []\n\n    // 13.\n    /** @type {CacheBatchOperation} */\n    const operation = {\n      type: 'put', // 14.\n      request: innerRequest, // 15.\n      response: clonedResponse // 16.\n    }\n\n    // 17.\n    operations.push(operation)\n\n    // 19.\n    const bytes = await bodyReadPromise.promise\n\n    if (clonedResponse.body != null) {\n      clonedResponse.body.source = bytes\n    }\n\n    // 19.1\n    const cacheJobPromise = createDeferredPromise()\n\n    // 19.2.1\n    let errorData = null\n\n    // 19.2.2\n    try {\n      this.#batchCacheOperations(operations)\n    } catch (e) {\n      errorData = e\n    }\n\n    // 19.2.3\n    queueMicrotask(() => {\n      // 19.2.3.1\n      if (errorData === null) {\n        cacheJobPromise.resolve()\n      } else { // 19.2.3.2\n        cacheJobPromise.reject(errorData)\n      }\n    })\n\n    return cacheJobPromise.promise\n  }\n\n  async delete (request, options = {}) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.delete'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    request = webidl.converters.RequestInfo(request)\n    options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n    /**\n     * @type {Request}\n     */\n    let r = null\n\n    if (webidl.is.Request(request)) {\n      r = getRequestState(request)\n\n      if (r.method !== 'GET' && !options.ignoreMethod) {\n        return false\n      }\n    } else {\n      assert(typeof request === 'string')\n\n      r = getRequestState(new Request(request))\n    }\n\n    /** @type {CacheBatchOperation[]} */\n    const operations = []\n\n    /** @type {CacheBatchOperation} */\n    const operation = {\n      type: 'delete',\n      request: r,\n      options\n    }\n\n    operations.push(operation)\n\n    const cacheJobPromise = createDeferredPromise()\n\n    let errorData = null\n    let requestResponses\n\n    try {\n      requestResponses = this.#batchCacheOperations(operations)\n    } catch (e) {\n      errorData = e\n    }\n\n    queueMicrotask(() => {\n      if (errorData === null) {\n        cacheJobPromise.resolve(!!requestResponses?.length)\n      } else {\n        cacheJobPromise.reject(errorData)\n      }\n    })\n\n    return cacheJobPromise.promise\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys\n   * @param {any} request\n   * @param {import('../../../types/cache').CacheQueryOptions} options\n   * @returns {Promise<readonly Request[]>}\n   */\n  async keys (request = undefined, options = {}) {\n    webidl.brandCheck(this, Cache)\n\n    const prefix = 'Cache.keys'\n\n    if (request !== undefined) request = webidl.converters.RequestInfo(request)\n    options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n    // 1.\n    let r = null\n\n    // 2.\n    if (request !== undefined) {\n      // 2.1\n      if (webidl.is.Request(request)) {\n        // 2.1.1\n        r = getRequestState(request)\n\n        // 2.1.2\n        if (r.method !== 'GET' && !options.ignoreMethod) {\n          return []\n        }\n      } else if (typeof request === 'string') { // 2.2\n        r = getRequestState(new Request(request))\n      }\n    }\n\n    // 4.\n    const promise = createDeferredPromise()\n\n    // 5.\n    // 5.1\n    const requests = []\n\n    // 5.2\n    if (request === undefined) {\n      // 5.2.1\n      for (const requestResponse of this.#relevantRequestResponseList) {\n        // 5.2.1.1\n        requests.push(requestResponse[0])\n      }\n    } else { // 5.3\n      // 5.3.1\n      const requestResponses = this.#queryCache(r, options)\n\n      // 5.3.2\n      for (const requestResponse of requestResponses) {\n        // 5.3.2.1\n        requests.push(requestResponse[0])\n      }\n    }\n\n    // 5.4\n    queueMicrotask(() => {\n      // 5.4.1\n      const requestList = []\n\n      // 5.4.2\n      for (const request of requests) {\n        const requestObject = fromInnerRequest(\n          request,\n          undefined,\n          new AbortController().signal,\n          'immutable'\n        )\n        // 5.4.2.1\n        requestList.push(requestObject)\n      }\n\n      // 5.4.3\n      promise.resolve(Object.freeze(requestList))\n    })\n\n    return promise.promise\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm\n   * @param {CacheBatchOperation[]} operations\n   * @returns {requestResponseList}\n   */\n  #batchCacheOperations (operations) {\n    // 1.\n    const cache = this.#relevantRequestResponseList\n\n    // 2.\n    const backupCache = [...cache]\n\n    // 3.\n    const addedItems = []\n\n    // 4.1\n    const resultList = []\n\n    try {\n      // 4.2\n      for (const operation of operations) {\n        // 4.2.1\n        if (operation.type !== 'delete' && operation.type !== 'put') {\n          throw webidl.errors.exception({\n            header: 'Cache.#batchCacheOperations',\n            message: 'operation type does not match \"delete\" or \"put\"'\n          })\n        }\n\n        // 4.2.2\n        if (operation.type === 'delete' && operation.response != null) {\n          throw webidl.errors.exception({\n            header: 'Cache.#batchCacheOperations',\n            message: 'delete operation should not have an associated response'\n          })\n        }\n\n        // 4.2.3\n        if (this.#queryCache(operation.request, operation.options, addedItems).length) {\n          throw new DOMException('???', 'InvalidStateError')\n        }\n\n        // 4.2.4\n        let requestResponses\n\n        // 4.2.5\n        if (operation.type === 'delete') {\n          // 4.2.5.1\n          requestResponses = this.#queryCache(operation.request, operation.options)\n\n          // TODO: the spec is wrong, this is needed to pass WPTs\n          if (requestResponses.length === 0) {\n            return []\n          }\n\n          // 4.2.5.2\n          for (const requestResponse of requestResponses) {\n            const idx = cache.indexOf(requestResponse)\n            assert(idx !== -1)\n\n            // 4.2.5.2.1\n            cache.splice(idx, 1)\n          }\n        } else if (operation.type === 'put') { // 4.2.6\n          // 4.2.6.1\n          if (operation.response == null) {\n            throw webidl.errors.exception({\n              header: 'Cache.#batchCacheOperations',\n              message: 'put operation should have an associated response'\n            })\n          }\n\n          // 4.2.6.2\n          const r = operation.request\n\n          // 4.2.6.3\n          if (!urlIsHttpHttpsScheme(r.url)) {\n            throw webidl.errors.exception({\n              header: 'Cache.#batchCacheOperations',\n              message: 'expected http or https scheme'\n            })\n          }\n\n          // 4.2.6.4\n          if (r.method !== 'GET') {\n            throw webidl.errors.exception({\n              header: 'Cache.#batchCacheOperations',\n              message: 'not get method'\n            })\n          }\n\n          // 4.2.6.5\n          if (operation.options != null) {\n            throw webidl.errors.exception({\n              header: 'Cache.#batchCacheOperations',\n              message: 'options must not be defined'\n            })\n          }\n\n          // 4.2.6.6\n          requestResponses = this.#queryCache(operation.request)\n\n          // 4.2.6.7\n          for (const requestResponse of requestResponses) {\n            const idx = cache.indexOf(requestResponse)\n            assert(idx !== -1)\n\n            // 4.2.6.7.1\n            cache.splice(idx, 1)\n          }\n\n          // 4.2.6.8\n          cache.push([operation.request, operation.response])\n\n          // 4.2.6.10\n          addedItems.push([operation.request, operation.response])\n        }\n\n        // 4.2.7\n        resultList.push([operation.request, operation.response])\n      }\n\n      // 4.3\n      return resultList\n    } catch (e) { // 5.\n      // 5.1\n      this.#relevantRequestResponseList.length = 0\n\n      // 5.2\n      this.#relevantRequestResponseList = backupCache\n\n      // 5.3\n      throw e\n    }\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#query-cache\n   * @param {any} requestQuery\n   * @param {import('../../../types/cache').CacheQueryOptions} options\n   * @param {requestResponseList} targetStorage\n   * @returns {requestResponseList}\n   */\n  #queryCache (requestQuery, options, targetStorage) {\n    /** @type {requestResponseList} */\n    const resultList = []\n\n    const storage = targetStorage ?? this.#relevantRequestResponseList\n\n    for (const requestResponse of storage) {\n      const [cachedRequest, cachedResponse] = requestResponse\n      if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {\n        resultList.push(requestResponse)\n      }\n    }\n\n    return resultList\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm\n   * @param {any} requestQuery\n   * @param {any} request\n   * @param {any | null} response\n   * @param {import('../../../types/cache').CacheQueryOptions | undefined} options\n   * @returns {boolean}\n   */\n  #requestMatchesCachedItem (requestQuery, request, response = null, options) {\n    // if (options?.ignoreMethod === false && request.method === 'GET') {\n    //   return false\n    // }\n\n    const queryURL = new URL(requestQuery.url)\n\n    const cachedURL = new URL(request.url)\n\n    if (options?.ignoreSearch) {\n      cachedURL.search = ''\n\n      queryURL.search = ''\n    }\n\n    if (!urlEquals(queryURL, cachedURL, true)) {\n      return false\n    }\n\n    if (\n      response == null ||\n      options?.ignoreVary ||\n      !response.headersList.contains('vary')\n    ) {\n      return true\n    }\n\n    const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n    for (const fieldValue of fieldValues) {\n      if (fieldValue === '*') {\n        return false\n      }\n\n      const requestValue = request.headersList.get(fieldValue)\n      const queryValue = requestQuery.headersList.get(fieldValue)\n\n      // If one has the header and the other doesn't, or one has\n      // a different value than the other, return false\n      if (requestValue !== queryValue) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  #internalMatchAll (request, options, maxResponses = Infinity) {\n    // 1.\n    let r = null\n\n    // 2.\n    if (request !== undefined) {\n      if (webidl.is.Request(request)) {\n        // 2.1.1\n        r = getRequestState(request)\n\n        // 2.1.2\n        if (r.method !== 'GET' && !options.ignoreMethod) {\n          return []\n        }\n      } else if (typeof request === 'string') {\n        // 2.2.1\n        r = getRequestState(new Request(request))\n      }\n    }\n\n    // 5.\n    // 5.1\n    const responses = []\n\n    // 5.2\n    if (request === undefined) {\n      // 5.2.1\n      for (const requestResponse of this.#relevantRequestResponseList) {\n        responses.push(requestResponse[1])\n      }\n    } else { // 5.3\n      // 5.3.1\n      const requestResponses = this.#queryCache(r, options)\n\n      // 5.3.2\n      for (const requestResponse of requestResponses) {\n        responses.push(requestResponse[1])\n      }\n    }\n\n    // 5.4\n    // We don't implement CORs so we don't need to loop over the responses, yay!\n\n    // 5.5.1\n    const responseList = []\n\n    // 5.5.2\n    for (const response of responses) {\n      // 5.5.2.1\n      const responseObject = fromInnerResponse(cloneResponse(response), 'immutable')\n\n      responseList.push(responseObject)\n\n      if (responseList.length >= maxResponses) {\n        break\n      }\n    }\n\n    // 6.\n    return Object.freeze(responseList)\n  }\n}\n\nObject.defineProperties(Cache.prototype, {\n  [Symbol.toStringTag]: {\n    value: 'Cache',\n    configurable: true\n  },\n  match: kEnumerableProperty,\n  matchAll: kEnumerableProperty,\n  add: kEnumerableProperty,\n  addAll: kEnumerableProperty,\n  put: kEnumerableProperty,\n  delete: kEnumerableProperty,\n  keys: kEnumerableProperty\n})\n\nconst cacheQueryOptionConverters = [\n  {\n    key: 'ignoreSearch',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'ignoreMethod',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'ignoreVary',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  }\n]\n\nwebidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters)\n\nwebidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([\n  ...cacheQueryOptionConverters,\n  {\n    key: 'cacheName',\n    converter: webidl.converters.DOMString\n  }\n])\n\nwebidl.converters.Response = webidl.interfaceConverter(\n  webidl.is.Response,\n  'Response'\n)\n\nwebidl.converters['sequence<RequestInfo>'] = webidl.sequenceConverter(\n  webidl.converters.RequestInfo\n)\n\nmodule.exports = {\n  Cache\n}\n","'use strict'\n\nconst { Cache } = require('./cache')\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\nclass CacheStorage {\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map\n   * @type {Map<string, import('./cache').requestResponseList}\n   */\n  #caches = new Map()\n\n  constructor () {\n    if (arguments[0] !== kConstruct) {\n      webidl.illegalConstructor()\n    }\n\n    webidl.util.markAsUncloneable(this)\n  }\n\n  async match (request, options = {}) {\n    webidl.brandCheck(this, CacheStorage)\n    webidl.argumentLengthCheck(arguments, 1, 'CacheStorage.match')\n\n    request = webidl.converters.RequestInfo(request)\n    options = webidl.converters.MultiCacheQueryOptions(options)\n\n    // 1.\n    if (options.cacheName != null) {\n      // 1.1.1.1\n      if (this.#caches.has(options.cacheName)) {\n        // 1.1.1.1.1\n        const cacheList = this.#caches.get(options.cacheName)\n        const cache = new Cache(kConstruct, cacheList)\n\n        return await cache.match(request, options)\n      }\n    } else { // 2.\n      // 2.2\n      for (const cacheList of this.#caches.values()) {\n        const cache = new Cache(kConstruct, cacheList)\n\n        // 2.2.1.2\n        const response = await cache.match(request, options)\n\n        if (response !== undefined) {\n          return response\n        }\n      }\n    }\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#cache-storage-has\n   * @param {string} cacheName\n   * @returns {Promise<boolean>}\n   */\n  async has (cacheName) {\n    webidl.brandCheck(this, CacheStorage)\n\n    const prefix = 'CacheStorage.has'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n    // 2.1.1\n    // 2.2\n    return this.#caches.has(cacheName)\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open\n   * @param {string} cacheName\n   * @returns {Promise<Cache>}\n   */\n  async open (cacheName) {\n    webidl.brandCheck(this, CacheStorage)\n\n    const prefix = 'CacheStorage.open'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n    // 2.1\n    if (this.#caches.has(cacheName)) {\n      // await caches.open('v1') !== await caches.open('v1')\n\n      // 2.1.1\n      const cache = this.#caches.get(cacheName)\n\n      // 2.1.1.1\n      return new Cache(kConstruct, cache)\n    }\n\n    // 2.2\n    const cache = []\n\n    // 2.3\n    this.#caches.set(cacheName, cache)\n\n    // 2.4\n    return new Cache(kConstruct, cache)\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete\n   * @param {string} cacheName\n   * @returns {Promise<boolean>}\n   */\n  async delete (cacheName) {\n    webidl.brandCheck(this, CacheStorage)\n\n    const prefix = 'CacheStorage.delete'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n    return this.#caches.delete(cacheName)\n  }\n\n  /**\n   * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys\n   * @returns {Promise<string[]>}\n   */\n  async keys () {\n    webidl.brandCheck(this, CacheStorage)\n\n    // 2.1\n    const keys = this.#caches.keys()\n\n    // 2.2\n    return [...keys]\n  }\n}\n\nObject.defineProperties(CacheStorage.prototype, {\n  [Symbol.toStringTag]: {\n    value: 'CacheStorage',\n    configurable: true\n  },\n  match: kEnumerableProperty,\n  has: kEnumerableProperty,\n  open: kEnumerableProperty,\n  delete: kEnumerableProperty,\n  keys: kEnumerableProperty\n})\n\nmodule.exports = {\n  CacheStorage\n}\n","'use strict'\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size\nconst maxAttributeValueSize = 1024\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size\nconst maxNameValuePairSize = 4096\n\nmodule.exports = {\n  maxAttributeValueSize,\n  maxNameValuePairSize\n}\n","'use strict'\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction isCTLExcludingHtab (value) {\n  for (let i = 0; i < value.length; ++i) {\n    const code = value.charCodeAt(i)\n\n    if (\n      (code >= 0x00 && code <= 0x08) ||\n      (code >= 0x0A && code <= 0x1F) ||\n      code === 0x7F\n    ) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n CHAR           = <any US-ASCII character (octets 0 - 127)>\n token          = 1*<any CHAR except CTLs or separators>\n separators     = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n                | \",\" | \";\" | \":\" | \"\\\" | <\">\n                | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n                | \"{\" | \"}\" | SP | HT\n * @param {string} name\n */\nfunction validateCookieName (name) {\n  for (let i = 0; i < name.length; ++i) {\n    const code = name.charCodeAt(i)\n\n    if (\n      code < 0x21 || // exclude CTLs (0-31), SP and HT\n      code > 0x7E || // exclude non-ascii and DEL\n      code === 0x22 || // \"\n      code === 0x28 || // (\n      code === 0x29 || // )\n      code === 0x3C || // <\n      code === 0x3E || // >\n      code === 0x40 || // @\n      code === 0x2C || // ,\n      code === 0x3B || // ;\n      code === 0x3A || // :\n      code === 0x5C || // \\\n      code === 0x2F || // /\n      code === 0x5B || // [\n      code === 0x5D || // ]\n      code === 0x3F || // ?\n      code === 0x3D || // =\n      code === 0x7B || // {\n      code === 0x7D // }\n    ) {\n      throw new Error('Invalid cookie name')\n    }\n  }\n}\n\n/**\n cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n                       ; US-ASCII characters excluding CTLs,\n                       ; whitespace DQUOTE, comma, semicolon,\n                       ; and backslash\n * @param {string} value\n */\nfunction validateCookieValue (value) {\n  let len = value.length\n  let i = 0\n\n  // if the value is wrapped in DQUOTE\n  if (value[0] === '\"') {\n    if (len === 1 || value[len - 1] !== '\"') {\n      throw new Error('Invalid cookie value')\n    }\n    --len\n    ++i\n  }\n\n  while (i < len) {\n    const code = value.charCodeAt(i++)\n\n    if (\n      code < 0x21 || // exclude CTLs (0-31)\n      code > 0x7E || // non-ascii and DEL (127)\n      code === 0x22 || // \"\n      code === 0x2C || // ,\n      code === 0x3B || // ;\n      code === 0x5C // \\\n    ) {\n      throw new Error('Invalid cookie value')\n    }\n  }\n}\n\n/**\n * path-value        = <any CHAR except CTLs or \";\">\n * @param {string} path\n */\nfunction validateCookiePath (path) {\n  for (let i = 0; i < path.length; ++i) {\n    const code = path.charCodeAt(i)\n\n    if (\n      code < 0x20 || // exclude CTLs (0-31)\n      code === 0x7F || // DEL\n      code === 0x3B // ;\n    ) {\n      throw new Error('Invalid cookie path')\n    }\n  }\n}\n\n/**\n * I have no idea why these values aren't allowed to be honest,\n * but Deno tests these. - Khafra\n * @param {string} domain\n */\nfunction validateCookieDomain (domain) {\n  if (\n    domain.startsWith('-') ||\n    domain.endsWith('.') ||\n    domain.endsWith('-')\n  ) {\n    throw new Error('Invalid cookie domain')\n  }\n}\n\nconst IMFDays = [\n  'Sun', 'Mon', 'Tue', 'Wed',\n  'Thu', 'Fri', 'Sat'\n]\n\nconst IMFMonths = [\n  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n]\n\nconst IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0'))\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1\n * @param {number|Date} date\n  IMF-fixdate  = day-name \",\" SP date1 SP time-of-day SP GMT\n  ; fixed length/zone/capitalization subset of the format\n  ; see Section 3.3 of [RFC5322]\n\n  day-name     = %x4D.6F.6E ; \"Mon\", case-sensitive\n              / %x54.75.65 ; \"Tue\", case-sensitive\n              / %x57.65.64 ; \"Wed\", case-sensitive\n              / %x54.68.75 ; \"Thu\", case-sensitive\n              / %x46.72.69 ; \"Fri\", case-sensitive\n              / %x53.61.74 ; \"Sat\", case-sensitive\n              / %x53.75.6E ; \"Sun\", case-sensitive\n  date1        = day SP month SP year\n                  ; e.g., 02 Jun 1982\n\n  day          = 2DIGIT\n  month        = %x4A.61.6E ; \"Jan\", case-sensitive\n              / %x46.65.62 ; \"Feb\", case-sensitive\n              / %x4D.61.72 ; \"Mar\", case-sensitive\n              / %x41.70.72 ; \"Apr\", case-sensitive\n              / %x4D.61.79 ; \"May\", case-sensitive\n              / %x4A.75.6E ; \"Jun\", case-sensitive\n              / %x4A.75.6C ; \"Jul\", case-sensitive\n              / %x41.75.67 ; \"Aug\", case-sensitive\n              / %x53.65.70 ; \"Sep\", case-sensitive\n              / %x4F.63.74 ; \"Oct\", case-sensitive\n              / %x4E.6F.76 ; \"Nov\", case-sensitive\n              / %x44.65.63 ; \"Dec\", case-sensitive\n  year         = 4DIGIT\n\n  GMT          = %x47.4D.54 ; \"GMT\", case-sensitive\n\n  time-of-day  = hour \":\" minute \":\" second\n              ; 00:00:00 - 23:59:60 (leap second)\n\n  hour         = 2DIGIT\n  minute       = 2DIGIT\n  second       = 2DIGIT\n */\nfunction toIMFDate (date) {\n  if (typeof date === 'number') {\n    date = new Date(date)\n  }\n\n  return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`\n}\n\n/**\n max-age-av        = \"Max-Age=\" non-zero-digit *DIGIT\n                       ; In practice, both expires-av and max-age-av\n                       ; are limited to dates representable by the\n                       ; user agent.\n * @param {number} maxAge\n */\nfunction validateCookieMaxAge (maxAge) {\n  if (maxAge < 0) {\n    throw new Error('Invalid cookie max-age')\n  }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1\n * @param {import('./index').Cookie} cookie\n */\nfunction stringify (cookie) {\n  if (cookie.name.length === 0) {\n    return null\n  }\n\n  validateCookieName(cookie.name)\n  validateCookieValue(cookie.value)\n\n  const out = [`${cookie.name}=${cookie.value}`]\n\n  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1\n  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2\n  if (cookie.name.startsWith('__Secure-')) {\n    cookie.secure = true\n  }\n\n  if (cookie.name.startsWith('__Host-')) {\n    cookie.secure = true\n    cookie.domain = null\n    cookie.path = '/'\n  }\n\n  if (cookie.secure) {\n    out.push('Secure')\n  }\n\n  if (cookie.httpOnly) {\n    out.push('HttpOnly')\n  }\n\n  if (typeof cookie.maxAge === 'number') {\n    validateCookieMaxAge(cookie.maxAge)\n    out.push(`Max-Age=${cookie.maxAge}`)\n  }\n\n  if (cookie.domain) {\n    validateCookieDomain(cookie.domain)\n    out.push(`Domain=${cookie.domain}`)\n  }\n\n  if (cookie.path) {\n    validateCookiePath(cookie.path)\n    out.push(`Path=${cookie.path}`)\n  }\n\n  if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {\n    out.push(`Expires=${toIMFDate(cookie.expires)}`)\n  }\n\n  if (cookie.sameSite) {\n    out.push(`SameSite=${cookie.sameSite}`)\n  }\n\n  for (const part of cookie.unparsed) {\n    if (!part.includes('=')) {\n      throw new Error('Invalid unparsed')\n    }\n\n    const [key, ...value] = part.split('=')\n\n    out.push(`${key.trim()}=${value.join('=')}`)\n  }\n\n  return out.join('; ')\n}\n\nmodule.exports = {\n  isCTLExcludingHtab,\n  validateCookieName,\n  validateCookiePath,\n  validateCookieValue,\n  toIMFDate,\n  stringify\n}\n","'use strict'\n\nconst { collectASequenceOfCodePointsFast } = require('../infra')\nconst { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')\nconst { isCTLExcludingHtab } = require('./util')\nconst assert = require('node:assert')\nconst { unescape: qsUnescape } = require('node:querystring')\n\n/**\n * @description Parses the field-value attributes of a set-cookie header string.\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} header\n * @returns {import('./index').Cookie|null} if the header is invalid, null will be returned\n */\nfunction parseSetCookie (header) {\n  // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F\n  //    character (CTL characters excluding HTAB): Abort these steps and\n  //    ignore the set-cookie-string entirely.\n  if (isCTLExcludingHtab(header)) {\n    return null\n  }\n\n  let nameValuePair = ''\n  let unparsedAttributes = ''\n  let name = ''\n  let value = ''\n\n  // 2. If the set-cookie-string contains a %x3B (\";\") character:\n  if (header.includes(';')) {\n    // 1. The name-value-pair string consists of the characters up to,\n    //    but not including, the first %x3B (\";\"), and the unparsed-\n    //    attributes consist of the remainder of the set-cookie-string\n    //    (including the %x3B (\";\") in question).\n    const position = { position: 0 }\n\n    nameValuePair = collectASequenceOfCodePointsFast(';', header, position)\n    unparsedAttributes = header.slice(position.position)\n  } else {\n    // Otherwise:\n\n    // 1. The name-value-pair string consists of all the characters\n    //    contained in the set-cookie-string, and the unparsed-\n    //    attributes is the empty string.\n    nameValuePair = header\n  }\n\n  // 3. If the name-value-pair string lacks a %x3D (\"=\") character, then\n  //    the name string is empty, and the value string is the value of\n  //    name-value-pair.\n  if (!nameValuePair.includes('=')) {\n    value = nameValuePair\n  } else {\n    //    Otherwise, the name string consists of the characters up to, but\n    //    not including, the first %x3D (\"=\") character, and the (possibly\n    //    empty) value string consists of the characters after the first\n    //    %x3D (\"=\") character.\n    const position = { position: 0 }\n    name = collectASequenceOfCodePointsFast(\n      '=',\n      nameValuePair,\n      position\n    )\n    value = nameValuePair.slice(position.position + 1)\n  }\n\n  // 4. Remove any leading or trailing WSP characters from the name\n  //    string and the value string.\n  name = name.trim()\n  value = value.trim()\n\n  // 5. If the sum of the lengths of the name string and the value string\n  //    is more than 4096 octets, abort these steps and ignore the set-\n  //    cookie-string entirely.\n  if (name.length + value.length > maxNameValuePairSize) {\n    return null\n  }\n\n  // 6. The cookie-name is the name string, and the cookie-value is the\n  //    value string.\n  // https://datatracker.ietf.org/doc/html/rfc6265\n  // To maximize compatibility with user agents, servers that wish to\n  // store arbitrary data in a cookie-value SHOULD encode that data, for\n  // example, using Base64 [RFC4648].\n  return {\n    name, value: qsUnescape(value), ...parseUnparsedAttributes(unparsedAttributes)\n  }\n}\n\n/**\n * Parses the remaining attributes of a set-cookie header\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} unparsedAttributes\n * @param {Object.<string, unknown>} [cookieAttributeList={}]\n */\nfunction parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {\n  // 1. If the unparsed-attributes string is empty, skip the rest of\n  //    these steps.\n  if (unparsedAttributes.length === 0) {\n    return cookieAttributeList\n  }\n\n  // 2. Discard the first character of the unparsed-attributes (which\n  //    will be a %x3B (\";\") character).\n  assert(unparsedAttributes[0] === ';')\n  unparsedAttributes = unparsedAttributes.slice(1)\n\n  let cookieAv = ''\n\n  // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n  //    character:\n  if (unparsedAttributes.includes(';')) {\n    // 1. Consume the characters of the unparsed-attributes up to, but\n    //    not including, the first %x3B (\";\") character.\n    cookieAv = collectASequenceOfCodePointsFast(\n      ';',\n      unparsedAttributes,\n      { position: 0 }\n    )\n    unparsedAttributes = unparsedAttributes.slice(cookieAv.length)\n  } else {\n    // Otherwise:\n\n    // 1. Consume the remainder of the unparsed-attributes.\n    cookieAv = unparsedAttributes\n    unparsedAttributes = ''\n  }\n\n  // Let the cookie-av string be the characters consumed in this step.\n\n  let attributeName = ''\n  let attributeValue = ''\n\n  // 4. If the cookie-av string contains a %x3D (\"=\") character:\n  if (cookieAv.includes('=')) {\n    // 1. The (possibly empty) attribute-name string consists of the\n    //    characters up to, but not including, the first %x3D (\"=\")\n    //    character, and the (possibly empty) attribute-value string\n    //    consists of the characters after the first %x3D (\"=\")\n    //    character.\n    const position = { position: 0 }\n\n    attributeName = collectASequenceOfCodePointsFast(\n      '=',\n      cookieAv,\n      position\n    )\n    attributeValue = cookieAv.slice(position.position + 1)\n  } else {\n    // Otherwise:\n\n    // 1. The attribute-name string consists of the entire cookie-av\n    //    string, and the attribute-value string is empty.\n    attributeName = cookieAv\n  }\n\n  // 5. Remove any leading or trailing WSP characters from the attribute-\n  //    name string and the attribute-value string.\n  attributeName = attributeName.trim()\n  attributeValue = attributeValue.trim()\n\n  // 6. If the attribute-value is longer than 1024 octets, ignore the\n  //    cookie-av string and return to Step 1 of this algorithm.\n  if (attributeValue.length > maxAttributeValueSize) {\n    return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n  }\n\n  // 7. Process the attribute-name and attribute-value according to the\n  //    requirements in the following subsections.  (Notice that\n  //    attributes with unrecognized attribute-names are ignored.)\n  const attributeNameLowercase = attributeName.toLowerCase()\n\n  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1\n  // If the attribute-name case-insensitively matches the string\n  // \"Expires\", the user agent MUST process the cookie-av as follows.\n  if (attributeNameLowercase === 'expires') {\n    // 1. Let the expiry-time be the result of parsing the attribute-value\n    //    as cookie-date (see Section 5.1.1).\n    const expiryTime = new Date(attributeValue)\n\n    // 2. If the attribute-value failed to parse as a cookie date, ignore\n    //    the cookie-av.\n\n    cookieAttributeList.expires = expiryTime\n  } else if (attributeNameLowercase === 'max-age') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2\n    // If the attribute-name case-insensitively matches the string \"Max-\n    // Age\", the user agent MUST process the cookie-av as follows.\n\n    // 1. If the first character of the attribute-value is not a DIGIT or a\n    //    \"-\" character, ignore the cookie-av.\n    const charCode = attributeValue.charCodeAt(0)\n\n    if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {\n      return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n    }\n\n    // 2. If the remainder of attribute-value contains a non-DIGIT\n    //    character, ignore the cookie-av.\n    if (!/^\\d+$/.test(attributeValue)) {\n      return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n    }\n\n    // 3. Let delta-seconds be the attribute-value converted to an integer.\n    const deltaSeconds = Number(attributeValue)\n\n    // 4. Let cookie-age-limit be the maximum age of the cookie (which\n    //    SHOULD be 400 days or less, see Section 4.1.2.2).\n\n    // 5. Set delta-seconds to the smaller of its present value and cookie-\n    //    age-limit.\n    // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)\n\n    // 6. If delta-seconds is less than or equal to zero (0), let expiry-\n    //    time be the earliest representable date and time.  Otherwise, let\n    //    the expiry-time be the current date and time plus delta-seconds\n    //    seconds.\n    // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds\n\n    // 7. Append an attribute to the cookie-attribute-list with an\n    //    attribute-name of Max-Age and an attribute-value of expiry-time.\n    cookieAttributeList.maxAge = deltaSeconds\n  } else if (attributeNameLowercase === 'domain') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3\n    // If the attribute-name case-insensitively matches the string \"Domain\",\n    // the user agent MUST process the cookie-av as follows.\n\n    // 1. Let cookie-domain be the attribute-value.\n    let cookieDomain = attributeValue\n\n    // 2. If cookie-domain starts with %x2E (\".\"), let cookie-domain be\n    //    cookie-domain without its leading %x2E (\".\").\n    if (cookieDomain[0] === '.') {\n      cookieDomain = cookieDomain.slice(1)\n    }\n\n    // 3. Convert the cookie-domain to lower case.\n    cookieDomain = cookieDomain.toLowerCase()\n\n    // 4. Append an attribute to the cookie-attribute-list with an\n    //    attribute-name of Domain and an attribute-value of cookie-domain.\n    cookieAttributeList.domain = cookieDomain\n  } else if (attributeNameLowercase === 'path') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4\n    // If the attribute-name case-insensitively matches the string \"Path\",\n    // the user agent MUST process the cookie-av as follows.\n\n    // 1. If the attribute-value is empty or if the first character of the\n    //    attribute-value is not %x2F (\"/\"):\n    let cookiePath = ''\n    if (attributeValue.length === 0 || attributeValue[0] !== '/') {\n      // 1. Let cookie-path be the default-path.\n      cookiePath = '/'\n    } else {\n      // Otherwise:\n\n      // 1. Let cookie-path be the attribute-value.\n      cookiePath = attributeValue\n    }\n\n    // 2. Append an attribute to the cookie-attribute-list with an\n    //    attribute-name of Path and an attribute-value of cookie-path.\n    cookieAttributeList.path = cookiePath\n  } else if (attributeNameLowercase === 'secure') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5\n    // If the attribute-name case-insensitively matches the string \"Secure\",\n    // the user agent MUST append an attribute to the cookie-attribute-list\n    // with an attribute-name of Secure and an empty attribute-value.\n\n    cookieAttributeList.secure = true\n  } else if (attributeNameLowercase === 'httponly') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6\n    // If the attribute-name case-insensitively matches the string\n    // \"HttpOnly\", the user agent MUST append an attribute to the cookie-\n    // attribute-list with an attribute-name of HttpOnly and an empty\n    // attribute-value.\n\n    cookieAttributeList.httpOnly = true\n  } else if (attributeNameLowercase === 'samesite') {\n    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7\n    // If the attribute-name case-insensitively matches the string\n    // \"SameSite\", the user agent MUST process the cookie-av as follows:\n\n    // 1. Let enforcement be \"Default\".\n    let enforcement = 'Default'\n\n    const attributeValueLowercase = attributeValue.toLowerCase()\n    // 2. If cookie-av's attribute-value is a case-insensitive match for\n    //    \"None\", set enforcement to \"None\".\n    if (attributeValueLowercase.includes('none')) {\n      enforcement = 'None'\n    }\n\n    // 3. If cookie-av's attribute-value is a case-insensitive match for\n    //    \"Strict\", set enforcement to \"Strict\".\n    if (attributeValueLowercase.includes('strict')) {\n      enforcement = 'Strict'\n    }\n\n    // 4. If cookie-av's attribute-value is a case-insensitive match for\n    //    \"Lax\", set enforcement to \"Lax\".\n    if (attributeValueLowercase.includes('lax')) {\n      enforcement = 'Lax'\n    }\n\n    // 5. Append an attribute to the cookie-attribute-list with an\n    //    attribute-name of \"SameSite\" and an attribute-value of\n    //    enforcement.\n    cookieAttributeList.sameSite = enforcement\n  } else {\n    cookieAttributeList.unparsed ??= []\n\n    cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)\n  }\n\n  // 8. Return to Step 1 of this algorithm.\n  return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n}\n\nmodule.exports = {\n  parseSetCookie,\n  parseUnparsedAttributes\n}\n","'use strict'\n\nconst { parseSetCookie } = require('./parse')\nconst { stringify } = require('./util')\nconst { webidl } = require('../webidl')\nconst { Headers } = require('../fetch/headers')\n\nconst brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean))\n\n/**\n * @typedef {Object} Cookie\n * @property {string} name\n * @property {string} value\n * @property {Date|number} [expires]\n * @property {number} [maxAge]\n * @property {string} [domain]\n * @property {string} [path]\n * @property {boolean} [secure]\n * @property {boolean} [httpOnly]\n * @property {'Strict'|'Lax'|'None'} [sameSite]\n * @property {string[]} [unparsed]\n */\n\n/**\n * @param {Headers} headers\n * @returns {Record<string, string>}\n */\nfunction getCookies (headers) {\n  webidl.argumentLengthCheck(arguments, 1, 'getCookies')\n\n  brandChecks(headers)\n\n  const cookie = headers.get('cookie')\n\n  /** @type {Record<string, string>} */\n  const out = {}\n\n  if (!cookie) {\n    return out\n  }\n\n  for (const piece of cookie.split(';')) {\n    const [name, ...value] = piece.split('=')\n\n    out[name.trim()] = value.join('=')\n  }\n\n  return out\n}\n\n/**\n * @param {Headers} headers\n * @param {string} name\n * @param {{ path?: string, domain?: string }|undefined} attributes\n * @returns {void}\n */\nfunction deleteCookie (headers, name, attributes) {\n  brandChecks(headers)\n\n  const prefix = 'deleteCookie'\n  webidl.argumentLengthCheck(arguments, 2, prefix)\n\n  name = webidl.converters.DOMString(name, prefix, 'name')\n  attributes = webidl.converters.DeleteCookieAttributes(attributes)\n\n  // Matches behavior of\n  // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278\n  setCookie(headers, {\n    name,\n    value: '',\n    expires: new Date(0),\n    ...attributes\n  })\n}\n\n/**\n * @param {Headers} headers\n * @returns {Cookie[]}\n */\nfunction getSetCookies (headers) {\n  webidl.argumentLengthCheck(arguments, 1, 'getSetCookies')\n\n  brandChecks(headers)\n\n  const cookies = headers.getSetCookie()\n\n  if (!cookies) {\n    return []\n  }\n\n  return cookies.map((pair) => parseSetCookie(pair))\n}\n\n/**\n * Parses a cookie string\n * @param {string} cookie\n */\nfunction parseCookie (cookie) {\n  cookie = webidl.converters.DOMString(cookie)\n\n  return parseSetCookie(cookie)\n}\n\n/**\n * @param {Headers} headers\n * @param {Cookie} cookie\n * @returns {void}\n */\nfunction setCookie (headers, cookie) {\n  webidl.argumentLengthCheck(arguments, 2, 'setCookie')\n\n  brandChecks(headers)\n\n  cookie = webidl.converters.Cookie(cookie)\n\n  const str = stringify(cookie)\n\n  if (str) {\n    headers.append('set-cookie', str, true)\n  }\n}\n\nwebidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([\n  {\n    converter: webidl.nullableConverter(webidl.converters.DOMString),\n    key: 'path',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters.DOMString),\n    key: 'domain',\n    defaultValue: () => null\n  }\n])\n\nwebidl.converters.Cookie = webidl.dictionaryConverter([\n  {\n    converter: webidl.converters.DOMString,\n    key: 'name'\n  },\n  {\n    converter: webidl.converters.DOMString,\n    key: 'value'\n  },\n  {\n    converter: webidl.nullableConverter((value) => {\n      if (typeof value === 'number') {\n        return webidl.converters['unsigned long long'](value)\n      }\n\n      return new Date(value)\n    }),\n    key: 'expires',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters['long long']),\n    key: 'maxAge',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters.DOMString),\n    key: 'domain',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters.DOMString),\n    key: 'path',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters.boolean),\n    key: 'secure',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.nullableConverter(webidl.converters.boolean),\n    key: 'httpOnly',\n    defaultValue: () => null\n  },\n  {\n    converter: webidl.converters.USVString,\n    key: 'sameSite',\n    allowedValues: ['Strict', 'Lax', 'None']\n  },\n  {\n    converter: webidl.sequenceConverter(webidl.converters.DOMString),\n    key: 'unparsed',\n    defaultValue: () => []\n  }\n])\n\nmodule.exports = {\n  getCookies,\n  deleteCookie,\n  getSetCookies,\n  setCookie,\n  parseCookie\n}\n","'use strict'\n\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n  #eventInit\n\n  constructor (type, eventInitDict = {}) {\n    if (type === kConstruct) {\n      super(arguments[1], arguments[2])\n      webidl.util.markAsUncloneable(this)\n      return\n    }\n\n    const prefix = 'MessageEvent constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    type = webidl.converters.DOMString(type, prefix, 'type')\n    eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict')\n\n    super(type, eventInitDict)\n\n    this.#eventInit = eventInitDict\n    webidl.util.markAsUncloneable(this)\n  }\n\n  get data () {\n    webidl.brandCheck(this, MessageEvent)\n\n    return this.#eventInit.data\n  }\n\n  get origin () {\n    webidl.brandCheck(this, MessageEvent)\n\n    return this.#eventInit.origin\n  }\n\n  get lastEventId () {\n    webidl.brandCheck(this, MessageEvent)\n\n    return this.#eventInit.lastEventId\n  }\n\n  get source () {\n    webidl.brandCheck(this, MessageEvent)\n\n    return this.#eventInit.source\n  }\n\n  get ports () {\n    webidl.brandCheck(this, MessageEvent)\n\n    if (!Object.isFrozen(this.#eventInit.ports)) {\n      Object.freeze(this.#eventInit.ports)\n    }\n\n    return this.#eventInit.ports\n  }\n\n  initMessageEvent (\n    type,\n    bubbles = false,\n    cancelable = false,\n    data = null,\n    origin = '',\n    lastEventId = '',\n    source = null,\n    ports = []\n  ) {\n    webidl.brandCheck(this, MessageEvent)\n\n    webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent')\n\n    return new MessageEvent(type, {\n      bubbles, cancelable, data, origin, lastEventId, source, ports\n    })\n  }\n\n  static createFastMessageEvent (type, init) {\n    const messageEvent = new MessageEvent(kConstruct, type, init)\n    messageEvent.#eventInit = init\n    messageEvent.#eventInit.data ??= null\n    messageEvent.#eventInit.origin ??= ''\n    messageEvent.#eventInit.lastEventId ??= ''\n    messageEvent.#eventInit.source ??= null\n    messageEvent.#eventInit.ports ??= []\n    return messageEvent\n  }\n}\n\nconst { createFastMessageEvent } = MessageEvent\ndelete MessageEvent.createFastMessageEvent\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n  #eventInit\n\n  constructor (type, eventInitDict = {}) {\n    const prefix = 'CloseEvent constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    type = webidl.converters.DOMString(type, prefix, 'type')\n    eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n    super(type, eventInitDict)\n\n    this.#eventInit = eventInitDict\n    webidl.util.markAsUncloneable(this)\n  }\n\n  get wasClean () {\n    webidl.brandCheck(this, CloseEvent)\n\n    return this.#eventInit.wasClean\n  }\n\n  get code () {\n    webidl.brandCheck(this, CloseEvent)\n\n    return this.#eventInit.code\n  }\n\n  get reason () {\n    webidl.brandCheck(this, CloseEvent)\n\n    return this.#eventInit.reason\n  }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n  #eventInit\n\n  constructor (type, eventInitDict) {\n    const prefix = 'ErrorEvent constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    super(type, eventInitDict)\n    webidl.util.markAsUncloneable(this)\n\n    type = webidl.converters.DOMString(type, prefix, 'type')\n    eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n    this.#eventInit = eventInitDict\n  }\n\n  get message () {\n    webidl.brandCheck(this, ErrorEvent)\n\n    return this.#eventInit.message\n  }\n\n  get filename () {\n    webidl.brandCheck(this, ErrorEvent)\n\n    return this.#eventInit.filename\n  }\n\n  get lineno () {\n    webidl.brandCheck(this, ErrorEvent)\n\n    return this.#eventInit.lineno\n  }\n\n  get colno () {\n    webidl.brandCheck(this, ErrorEvent)\n\n    return this.#eventInit.colno\n  }\n\n  get error () {\n    webidl.brandCheck(this, ErrorEvent)\n\n    return this.#eventInit.error\n  }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n  [Symbol.toStringTag]: {\n    value: 'MessageEvent',\n    configurable: true\n  },\n  data: kEnumerableProperty,\n  origin: kEnumerableProperty,\n  lastEventId: kEnumerableProperty,\n  source: kEnumerableProperty,\n  ports: kEnumerableProperty,\n  initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n  [Symbol.toStringTag]: {\n    value: 'CloseEvent',\n    configurable: true\n  },\n  reason: kEnumerableProperty,\n  code: kEnumerableProperty,\n  wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n  [Symbol.toStringTag]: {\n    value: 'ErrorEvent',\n    configurable: true\n  },\n  message: kEnumerableProperty,\n  filename: kEnumerableProperty,\n  lineno: kEnumerableProperty,\n  colno: kEnumerableProperty,\n  error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(\n  webidl.is.MessagePort,\n  'MessagePort'\n)\n\nwebidl.converters['sequence<MessagePort>'] = webidl.sequenceConverter(\n  webidl.converters.MessagePort\n)\n\nconst eventInit = [\n  {\n    key: 'bubbles',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'cancelable',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'composed',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n  ...eventInit,\n  {\n    key: 'data',\n    converter: webidl.converters.any,\n    defaultValue: () => null\n  },\n  {\n    key: 'origin',\n    converter: webidl.converters.USVString,\n    defaultValue: () => ''\n  },\n  {\n    key: 'lastEventId',\n    converter: webidl.converters.DOMString,\n    defaultValue: () => ''\n  },\n  {\n    key: 'source',\n    // Node doesn't implement WindowProxy or ServiceWorker, so the only\n    // valid value for source is a MessagePort.\n    converter: webidl.nullableConverter(webidl.converters.MessagePort),\n    defaultValue: () => null\n  },\n  {\n    key: 'ports',\n    converter: webidl.converters['sequence<MessagePort>'],\n    defaultValue: () => []\n  }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n  ...eventInit,\n  {\n    key: 'wasClean',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'code',\n    converter: webidl.converters['unsigned short'],\n    defaultValue: () => 0\n  },\n  {\n    key: 'reason',\n    converter: webidl.converters.USVString,\n    defaultValue: () => ''\n  }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n  ...eventInit,\n  {\n    key: 'message',\n    converter: webidl.converters.DOMString,\n    defaultValue: () => ''\n  },\n  {\n    key: 'filename',\n    converter: webidl.converters.USVString,\n    defaultValue: () => ''\n  },\n  {\n    key: 'lineno',\n    converter: webidl.converters['unsigned long'],\n    defaultValue: () => 0\n  },\n  {\n    key: 'colno',\n    converter: webidl.converters['unsigned long'],\n    defaultValue: () => 0\n  },\n  {\n    key: 'error',\n    converter: webidl.converters.any\n  }\n])\n\nmodule.exports = {\n  MessageEvent,\n  CloseEvent,\n  ErrorEvent,\n  createFastMessageEvent\n}\n","'use strict'\n\n/**\n * This is a Globally Unique Identifier unique used to validate that the\n * endpoint accepts websocket connections.\n * @see https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\n * @type {'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'}\n */\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/**\n * @type {PropertyDescriptor}\n */\nconst staticPropertyDescriptors = {\n  enumerable: true,\n  writable: false,\n  configurable: false\n}\n\n/**\n * The states of the WebSocket connection.\n *\n * @readonly\n * @enum\n * @property {0} CONNECTING\n * @property {1} OPEN\n * @property {2} CLOSING\n * @property {3} CLOSED\n */\nconst states = {\n  CONNECTING: 0,\n  OPEN: 1,\n  CLOSING: 2,\n  CLOSED: 3\n}\n\n/**\n * @readonly\n * @enum\n * @property {0} NOT_SENT\n * @property {1} PROCESSING\n * @property {2} SENT\n */\nconst sentCloseFrameState = {\n  SENT: 1,\n  RECEIVED: 2\n}\n\n/**\n * The WebSocket opcodes.\n *\n * @readonly\n * @enum\n * @property {0x0} CONTINUATION\n * @property {0x1} TEXT\n * @property {0x2} BINARY\n * @property {0x8} CLOSE\n * @property {0x9} PING\n * @property {0xA} PONG\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n */\nconst opcodes = {\n  CONTINUATION: 0x0,\n  TEXT: 0x1,\n  BINARY: 0x2,\n  CLOSE: 0x8,\n  PING: 0x9,\n  PONG: 0xA\n}\n\n/**\n * The maximum value for an unsigned 16-bit integer.\n *\n * @type {65535} 2 ** 16 - 1\n */\nconst maxUnsigned16Bit = 65535\n\n/**\n * The states of the parser.\n *\n * @readonly\n * @enum\n * @property {0} INFO\n * @property {2} PAYLOADLENGTH_16\n * @property {3} PAYLOADLENGTH_64\n * @property {4} READ_DATA\n */\nconst parserStates = {\n  INFO: 0,\n  PAYLOADLENGTH_16: 2,\n  PAYLOADLENGTH_64: 3,\n  READ_DATA: 4\n}\n\n/**\n * An empty buffer.\n *\n * @type {Buffer}\n */\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\n/**\n * @readonly\n * @property {1} text\n * @property {2} typedArray\n * @property {3} arrayBuffer\n * @property {4} blob\n */\nconst sendHints = {\n  text: 1,\n  typedArray: 2,\n  arrayBuffer: 3,\n  blob: 4\n}\n\nmodule.exports = {\n  uid,\n  sentCloseFrameState,\n  staticPropertyDescriptors,\n  states,\n  opcodes,\n  maxUnsigned16Bit,\n  parserStates,\n  emptyBuffer,\n  sendHints\n}\n","'use strict'\n\nconst { states, opcodes } = require('./constants')\nconst { isUtf8 } = require('node:buffer')\nconst { removeHTTPWhitespace } = require('../fetch/data-url')\nconst { collectASequenceOfCodePointsFast } = require('../infra')\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isConnecting (readyState) {\n  // If the WebSocket connection is not yet established, and the connection\n  // is not yet closed, then the WebSocket connection is in the CONNECTING state.\n  return readyState === states.CONNECTING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isEstablished (readyState) {\n  // If the server's response is validated as provided for above, it is\n  // said that _The WebSocket Connection is Established_ and that the\n  // WebSocket Connection is in the OPEN state.\n  return readyState === states.OPEN\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosing (readyState) {\n  // Upon either sending or receiving a Close control frame, it is said\n  // that _The WebSocket Closing Handshake is Started_ and that the\n  // WebSocket connection is in the CLOSING state.\n  return readyState === states.CLOSING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosed (readyState) {\n  return readyState === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {(...args: ConstructorParameters<typeof Event>) => Event} eventFactory\n * @param {EventInit | undefined} eventInitDict\n * @returns {void}\n */\nfunction fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) {\n  // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n  // 2. Let event be the result of creating an event given eventConstructor,\n  //    in the relevant realm of target.\n  // 3. Initialize event’s type attribute to e.\n  const event = eventFactory(e, eventInitDict)\n\n  // 4. Initialize any other IDL attributes of event as described in the\n  //    invocation of this algorithm.\n\n  // 5. Return the result of dispatching event at target, with legacy target\n  //    override flag set if set.\n  target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').Handler} handler\n * @param {number} type Opcode\n * @param {Buffer} data application data\n * @returns {void}\n */\nfunction websocketMessageReceived (handler, type, data) {\n  handler.onMessage(type, data)\n}\n\n/**\n * @param {Buffer} buffer\n * @returns {ArrayBuffer}\n */\nfunction toArrayBuffer (buffer) {\n  if (buffer.byteLength === buffer.buffer.byteLength) {\n    return buffer.buffer\n  }\n  return new Uint8Array(buffer).buffer\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n * @returns {boolean}\n */\nfunction isValidSubprotocol (protocol) {\n  // If present, this value indicates one\n  // or more comma-separated subprotocol the client wishes to speak,\n  // ordered by preference.  The elements that comprise this value\n  // MUST be non-empty strings with characters in the range U+0021 to\n  // U+007E not including separator characters as defined in\n  // [RFC2616] and MUST all be unique strings.\n  if (protocol.length === 0) {\n    return false\n  }\n\n  for (let i = 0; i < protocol.length; ++i) {\n    const code = protocol.charCodeAt(i)\n\n    if (\n      code < 0x21 || // CTL, contains SP (0x20) and HT (0x09)\n      code > 0x7E ||\n      code === 0x22 || // \"\n      code === 0x28 || // (\n      code === 0x29 || // )\n      code === 0x2C || // ,\n      code === 0x2F || // /\n      code === 0x3A || // :\n      code === 0x3B || // ;\n      code === 0x3C || // <\n      code === 0x3D || // =\n      code === 0x3E || // >\n      code === 0x3F || // ?\n      code === 0x40 || // @\n      code === 0x5B || // [\n      code === 0x5C || // \\\n      code === 0x5D || // ]\n      code === 0x7B || // {\n      code === 0x7D // }\n    ) {\n      return false\n    }\n  }\n\n  return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n * @returns {boolean}\n */\nfunction isValidStatusCode (code) {\n  if (code >= 1000 && code < 1015) {\n    return (\n      code !== 1004 && // reserved\n      code !== 1005 && // \"MUST NOT be set as a status code\"\n      code !== 1006 // \"MUST NOT be set as a status code\"\n    )\n  }\n\n  return code >= 3000 && code <= 4999\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isControlFrame (opcode) {\n  return (\n    opcode === opcodes.CLOSE ||\n    opcode === opcodes.PING ||\n    opcode === opcodes.PONG\n  )\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isContinuationFrame (opcode) {\n  return opcode === opcodes.CONTINUATION\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isTextBinaryFrame (opcode) {\n  return opcode === opcodes.TEXT || opcode === opcodes.BINARY\n}\n\n/**\n *\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isValidOpcode (opcode) {\n  return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode)\n}\n\n/**\n * Parses a Sec-WebSocket-Extensions header value.\n * @param {string} extensions\n * @returns {Map<string, string>}\n */\n// TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\nfunction parseExtensions (extensions) {\n  const position = { position: 0 }\n  const extensionList = new Map()\n\n  while (position.position < extensions.length) {\n    const pair = collectASequenceOfCodePointsFast(';', extensions, position)\n    const [name, value = ''] = pair.split('=', 2)\n\n    extensionList.set(\n      removeHTTPWhitespace(name, true, false),\n      removeHTTPWhitespace(value, false, true)\n    )\n\n    position.position++\n  }\n\n  return extensionList\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2\n * @description \"client-max-window-bits = 1*DIGIT\"\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidClientWindowBits (value) {\n  // Must have at least one character\n  if (value.length === 0) {\n    return false\n  }\n\n  // Check all characters are ASCII digits\n  for (let i = 0; i < value.length; i++) {\n    const byte = value.charCodeAt(i)\n\n    if (byte < 0x30 || byte > 0x39) {\n      return false\n    }\n  }\n\n  // Check numeric range: zlib requires windowBits in range 8-15\n  const num = Number.parseInt(value, 10)\n  return num >= 8 && num <= 15\n}\n\n/**\n * @see https://whatpr.org/websockets/48/7b748d3...d5570f3.html#get-a-url-record\n * @param {string} url\n * @param {string} [baseURL]\n */\nfunction getURLRecord (url, baseURL) {\n  // 1. Let urlRecord be the result of applying the URL parser to url with baseURL .\n  // 2. If urlRecord is failure, then throw a \" SyntaxError \" DOMException .\n  let urlRecord\n\n  try {\n    urlRecord = new URL(url, baseURL)\n  } catch (e) {\n    throw new DOMException(e, 'SyntaxError')\n  }\n\n  // 3. If urlRecord ’s scheme is \" http \", then set urlRecord ’s scheme to \" ws \".\n  // 4. Otherwise, if urlRecord ’s scheme is \" https \", set urlRecord ’s scheme to \" wss \".\n  if (urlRecord.protocol === 'http:') {\n    urlRecord.protocol = 'ws:'\n  } else if (urlRecord.protocol === 'https:') {\n    urlRecord.protocol = 'wss:'\n  }\n\n  // 5. If urlRecord ’s scheme is not \" ws \" or \" wss \", then throw a \" SyntaxError \" DOMException .\n  if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n    throw new DOMException('expected a ws: or wss: url', 'SyntaxError')\n  }\n\n  // If urlRecord ’s fragment is non-null, then throw a \" SyntaxError \" DOMException .\n  if (urlRecord.hash.length || urlRecord.href.endsWith('#')) {\n    throw new DOMException('hash', 'SyntaxError')\n  }\n\n  // Return urlRecord .\n  return urlRecord\n}\n\n// https://whatpr.org/websockets/48.html#validate-close-code-and-reason\nfunction validateCloseCodeAndReason (code, reason) {\n  // 1. If code is not null, but is neither an integer equal to\n  //    1000 nor an integer in the range 3000 to 4999, inclusive,\n  //    throw an \"InvalidAccessError\" DOMException.\n  if (code !== null) {\n    if (code !== 1000 && (code < 3000 || code > 4999)) {\n      throw new DOMException('invalid code', 'InvalidAccessError')\n    }\n  }\n\n  // 2. If reason is not null, then:\n  if (reason !== null) {\n    // 2.1. Let reasonBytes be the result of UTF-8 encoding reason.\n    // 2.2. If reasonBytes is longer than 123 bytes, then throw a\n    //      \"SyntaxError\" DOMException.\n    const reasonBytesLength = Buffer.byteLength(reason)\n\n    if (reasonBytesLength > 123) {\n      throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, 'SyntaxError')\n    }\n  }\n}\n\n/**\n * Converts a Buffer to utf-8, even on platforms without icu.\n * @type {(buffer: Buffer) => string}\n */\nconst utf8Decode = (() => {\n  if (typeof process.versions.icu === 'string') {\n    const fatalDecoder = new TextDecoder('utf-8', { fatal: true })\n    return fatalDecoder.decode.bind(fatalDecoder)\n  }\n  return function (buffer) {\n    if (isUtf8(buffer)) {\n      return buffer.toString('utf-8')\n    }\n    throw new TypeError('Invalid utf-8 received.')\n  }\n})()\n\nmodule.exports = {\n  isConnecting,\n  isEstablished,\n  isClosing,\n  isClosed,\n  fireEvent,\n  isValidSubprotocol,\n  isValidStatusCode,\n  websocketMessageReceived,\n  utf8Decode,\n  isControlFrame,\n  isContinuationFrame,\n  isTextBinaryFrame,\n  isValidOpcode,\n  parseExtensions,\n  isValidClientWindowBits,\n  toArrayBuffer,\n  getURLRecord,\n  validateCloseCodeAndReason\n}\n","'use strict'\n\nconst { runtimeFeatures } = require('../../util/runtime-features')\nconst { maxUnsigned16Bit, opcodes } = require('./constants')\n\nconst BUFFER_SIZE = 8 * 1024\n\nlet buffer = null\nlet bufIdx = BUFFER_SIZE\n\nconst randomFillSync = runtimeFeatures.has('crypto')\n  ? require('node:crypto').randomFillSync\n  // not full compatibility, but minimum.\n  : function randomFillSync (buffer, _offset, _size) {\n    for (let i = 0; i < buffer.length; ++i) {\n      buffer[i] = Math.random() * 255 | 0\n    }\n    return buffer\n  }\n\nfunction generateMask () {\n  if (bufIdx === BUFFER_SIZE) {\n    bufIdx = 0\n    randomFillSync((buffer ??= Buffer.allocUnsafeSlow(BUFFER_SIZE)), 0, BUFFER_SIZE)\n  }\n  return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]\n}\n\nclass WebsocketFrameSend {\n  /**\n   * @param {Buffer|undefined} data\n   */\n  constructor (data) {\n    this.frameData = data\n  }\n\n  createFrame (opcode) {\n    const frameData = this.frameData\n    const maskKey = generateMask()\n    const bodyLength = frameData?.byteLength ?? 0\n\n    /** @type {number} */\n    let payloadLength = bodyLength // 0-125\n    let offset = 6\n\n    if (bodyLength > maxUnsigned16Bit) {\n      offset += 8 // payload length is next 8 bytes\n      payloadLength = 127\n    } else if (bodyLength > 125) {\n      offset += 2 // payload length is next 2 bytes\n      payloadLength = 126\n    }\n\n    const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n    // Clear first 2 bytes, everything else is overwritten\n    buffer[0] = buffer[1] = 0\n    buffer[0] |= 0x80 // FIN\n    buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n    /*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> */\n    buffer[offset - 4] = maskKey[0]\n    buffer[offset - 3] = maskKey[1]\n    buffer[offset - 2] = maskKey[2]\n    buffer[offset - 1] = maskKey[3]\n\n    buffer[1] = payloadLength\n\n    if (payloadLength === 126) {\n      buffer.writeUInt16BE(bodyLength, 2)\n    } else if (payloadLength === 127) {\n      // Clear extended payload length\n      buffer[2] = buffer[3] = 0\n      buffer.writeUIntBE(bodyLength, 4, 6)\n    }\n\n    buffer[1] |= 0x80 // MASK\n\n    // mask body\n    for (let i = 0; i < bodyLength; ++i) {\n      buffer[offset + i] = frameData[i] ^ maskKey[i & 3]\n    }\n\n    return buffer\n  }\n\n  /**\n   * @param {Uint8Array} buffer\n   */\n  static createFastTextFrame (buffer) {\n    const maskKey = generateMask()\n\n    const bodyLength = buffer.length\n\n    // mask body\n    for (let i = 0; i < bodyLength; ++i) {\n      buffer[i] ^= maskKey[i & 3]\n    }\n\n    let payloadLength = bodyLength\n    let offset = 6\n\n    if (bodyLength > maxUnsigned16Bit) {\n      offset += 8 // payload length is next 8 bytes\n      payloadLength = 127\n    } else if (bodyLength > 125) {\n      offset += 2 // payload length is next 2 bytes\n      payloadLength = 126\n    }\n    const head = Buffer.allocUnsafeSlow(offset)\n\n    head[0] = 0x80 /* FIN */ | opcodes.TEXT /* opcode TEXT */\n    head[1] = payloadLength | 0x80 /* MASK */\n    head[offset - 4] = maskKey[0]\n    head[offset - 3] = maskKey[1]\n    head[offset - 2] = maskKey[2]\n    head[offset - 1] = maskKey[3]\n\n    if (payloadLength === 126) {\n      head.writeUInt16BE(bodyLength, 2)\n    } else if (payloadLength === 127) {\n      head[2] = head[3] = 0\n      head.writeUIntBE(bodyLength, 4, 6)\n    }\n\n    return [head, buffer]\n  }\n}\n\nmodule.exports = {\n  WebsocketFrameSend,\n  generateMask // for benchmark\n}\n","'use strict'\n\nconst { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require('./constants')\nconst { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require('./util')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers, getHeadersList } = require('../fetch/headers')\nconst { getDecodeSplit } = require('../fetch/util')\nconst { WebsocketFrameSend } = require('./frame')\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features')\n\nconst crypto = runtimeFeatures.has('crypto')\n  ? require('node:crypto')\n  : null\n\nlet warningEmitted = false\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').Handler} handler\n * @param {Partial<import('../../../types/websocket').WebSocketInit>} options\n */\nfunction establishWebSocketConnection (url, protocols, client, handler, options) {\n  // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n  //    scheme is \"ws\", and to \"https\" otherwise.\n  const requestURL = url\n\n  requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n  // 2. Let request be a new request, whose URL is requestURL, client is client,\n  //    service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n  //    \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n  //    redirect mode is \"error\", and use-URL-credentials flag is set.\n  const request = makeRequest({\n    urlList: [requestURL],\n    client,\n    serviceWorkers: 'none',\n    referrer: 'no-referrer',\n    mode: 'websocket',\n    credentials: 'include',\n    cache: 'no-store',\n    redirect: 'error',\n    useURLCredentials: true\n  })\n\n  // Note: undici extension, allow setting custom headers.\n  if (options.headers) {\n    const headersList = getHeadersList(new Headers(options.headers))\n\n    request.headersList = headersList\n  }\n\n  // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n  // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n  // Note: both of these are handled by undici currently.\n  // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n  // 5. Let keyValue be a nonce consisting of a randomly selected\n  //    16-byte value that has been forgiving-base64-encoded and\n  //    isomorphic encoded.\n  const keyValue = crypto.randomBytes(16).toString('base64')\n\n  // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n  //    header list.\n  request.headersList.append('sec-websocket-key', keyValue, true)\n\n  // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n  //    header list.\n  request.headersList.append('sec-websocket-version', '13', true)\n\n  // 8. For each protocol in protocols, combine\n  //    (`Sec-WebSocket-Protocol`, protocol) in request’s header\n  //    list.\n  for (const protocol of protocols) {\n    request.headersList.append('sec-websocket-protocol', protocol, true)\n  }\n\n  // 9. Let permessageDeflate be a user-agent defined\n  //    \"permessage-deflate\" extension header value.\n  // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n  const permessageDeflate = 'permessage-deflate; client_max_window_bits'\n\n  // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n  //     request’s header list.\n  request.headersList.append('sec-websocket-extensions', permessageDeflate, true)\n\n  // 11. Fetch request with useParallelQueue set to true, and\n  //     processResponse given response being these steps:\n  const controller = fetching({\n    request,\n    useParallelQueue: true,\n    dispatcher: options.dispatcher,\n    processResponse (response) {\n      // 1. If response is a network error or its status is not 101,\n      //    fail the WebSocket connection.\n      // if (response.type === 'error' || ((response.socket?.session != null && response.status !== 200) && response.status !== 101)) {\n      if (response.type === 'error' || response.status !== 101) {\n        // The presence of a session property on the socket indicates HTTP2\n        // HTTP1\n        if (response.socket?.session == null) {\n          failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.', response.error)\n          return\n        }\n\n        // HTTP2\n        if (response.status !== 200) {\n          failWebsocketConnection(handler, 1002, 'Received network error or non-200 status code.', response.error)\n          return\n        }\n      }\n\n      if (warningEmitted === false && response.socket?.session != null) {\n        process.emitWarning('WebSocket over HTTP2 is experimental, and subject to change.', 'ExperimentalWarning')\n        warningEmitted = true\n      }\n\n      // 2. If protocols is not the empty list and extracting header\n      //    list values given `Sec-WebSocket-Protocol` and response’s\n      //    header list results in null, failure, or the empty byte\n      //    sequence, then fail the WebSocket connection.\n      if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n        failWebsocketConnection(handler, 1002, 'Server did not respond with sent protocols.')\n        return\n      }\n\n      // 3. Follow the requirements stated step 2 to step 6, inclusive,\n      //    of the last set of steps in section 4.1 of The WebSocket\n      //    Protocol to validate response. This either results in fail\n      //    the WebSocket connection or the WebSocket connection is\n      //    established.\n\n      // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n      //    header field contains a value that is not an ASCII case-\n      //    insensitive match for the value \"websocket\", the client MUST\n      //    _Fail the WebSocket Connection_.\n      //    For H2, no upgrade header is expected.\n      if (response.socket.session == null && response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n        failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to \"websocket\".')\n        return\n      }\n\n      // 3. If the response lacks a |Connection| header field or the\n      //    |Connection| header field doesn't contain a token that is an\n      //    ASCII case-insensitive match for the value \"Upgrade\", the client\n      //    MUST _Fail the WebSocket Connection_.\n      //    For H2, no connection header is expected.\n      if (response.socket.session == null && response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n        failWebsocketConnection(handler, 1002, 'Server did not set Connection header to \"upgrade\".')\n        return\n      }\n\n      // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n      //    the |Sec-WebSocket-Accept| contains a value other than the\n      //    base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n      //    Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n      //    E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n      //    trailing whitespace, the client MUST _Fail the WebSocket\n      //    Connection_.\n      const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n      const digest = crypto.hash('sha1', keyValue + uid, 'base64')\n      if (secWSAccept !== digest) {\n        failWebsocketConnection(handler, 1002, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n        return\n      }\n\n      // 5. If the response includes a |Sec-WebSocket-Extensions| header\n      //    field and this header field indicates the use of an extension\n      //    that was not present in the client's handshake (the server has\n      //    indicated an extension not requested by the client), the client\n      //    MUST _Fail the WebSocket Connection_.  (The parsing of this\n      //    header field to determine which extensions are requested is\n      //    discussed in Section 9.1.)\n      const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n      let extensions\n\n      if (secExtension !== null) {\n        extensions = parseExtensions(secExtension)\n\n        if (!extensions.has('permessage-deflate')) {\n          failWebsocketConnection(handler, 1002, 'Sec-WebSocket-Extensions header does not match.')\n          return\n        }\n      }\n\n      // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n      //    and this header field indicates the use of a subprotocol that was\n      //    not present in the client's handshake (the server has indicated a\n      //    subprotocol not requested by the client), the client MUST _Fail\n      //    the WebSocket Connection_.\n      const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n      if (secProtocol !== null) {\n        const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList)\n\n        // The client can request that the server use a specific subprotocol by\n        // including the |Sec-WebSocket-Protocol| field in its handshake.  If it\n        // is specified, the server needs to include the same field and one of\n        // the selected subprotocol values in its response for the connection to\n        // be established.\n        if (!requestProtocols.includes(secProtocol)) {\n          failWebsocketConnection(handler, 1002, 'Protocol was not set in the opening handshake.')\n          return\n        }\n      }\n\n      response.socket.on('data', handler.onSocketData)\n      response.socket.on('close', handler.onSocketClose)\n      response.socket.on('error', handler.onSocketError)\n\n      handler.wasEverConnected = true\n      handler.onConnectionEstablished(response, extensions)\n    }\n  })\n\n  return controller\n}\n\n/**\n * @see https://whatpr.org/websockets/48.html#close-the-websocket\n * @param {import('./websocket').Handler} object\n * @param {number} [code=null]\n * @param {string} [reason='']\n */\nfunction closeWebSocketConnection (object, code, reason, validate = false) {\n  // 1. If code was not supplied, let code be null.\n  code ??= null\n\n  // 2. If reason was not supplied, let reason be the empty string.\n  reason ??= ''\n\n  // 3. Validate close code and reason with code and reason.\n  if (validate) validateCloseCodeAndReason(code, reason)\n\n  // 4. Run the first matching steps from the following list:\n  //     - If object’s ready state is CLOSING (2) or CLOSED (3)\n  //     - If the WebSocket connection is not yet established [WSP]\n  //     - If the WebSocket closing handshake has not yet been started [WSP]\n  //     - Otherwise\n  if (isClosed(object.readyState) || isClosing(object.readyState)) {\n    // Do nothing.\n  } else if (!isEstablished(object.readyState)) {\n    // Fail the WebSocket connection and set object’s ready state to CLOSING (2). [WSP]\n    failWebsocketConnection(object)\n    object.readyState = states.CLOSING\n  } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) {\n    // Upon either sending or receiving a Close control frame, it is said\n    // that _The WebSocket Closing Handshake is Started_ and that the\n    // WebSocket connection is in the CLOSING state.\n\n    const frame = new WebsocketFrameSend()\n\n    // If neither code nor reason is present, the WebSocket Close\n    // message must not have a body.\n\n    // If code is present, then the status code to use in the\n    // WebSocket Close message must be the integer given by code.\n    // If code is null and reason is the empty string, the WebSocket Close frame must not have a body.\n    // If reason is non-empty but code is null, then set code to 1000 (\"Normal Closure\").\n    if (reason.length !== 0 && code === null) {\n      code = 1000\n    }\n\n    // If code is set, then the status code to use in the WebSocket Close frame must be the integer given by code.\n    assert(code === null || Number.isInteger(code))\n\n    if (code === null && reason.length === 0) {\n      frame.frameData = emptyBuffer\n    } else if (code !== null && reason === null) {\n      frame.frameData = Buffer.allocUnsafe(2)\n      frame.frameData.writeUInt16BE(code, 0)\n    } else if (code !== null && reason !== null) {\n      // If reason is also present, then reasonBytes must be\n      // provided in the Close message after the status code.\n      frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason))\n      frame.frameData.writeUInt16BE(code, 0)\n      // the body MAY contain UTF-8-encoded data with value /reason/\n      frame.frameData.write(reason, 2, 'utf-8')\n    } else {\n      frame.frameData = emptyBuffer\n    }\n\n    object.socket.write(frame.createFrame(opcodes.CLOSE))\n\n    object.closeState.add(sentCloseFrameState.SENT)\n\n    // Upon either sending or receiving a Close control frame, it is said\n    // that _The WebSocket Closing Handshake is Started_ and that the\n    // WebSocket connection is in the CLOSING state.\n    object.readyState = states.CLOSING\n  } else {\n    // Set object’s ready state to CLOSING (2).\n    object.readyState = states.CLOSING\n  }\n}\n\n/**\n * @param {import('./websocket').Handler} handler\n * @param {number} code\n * @param {string|undefined} reason\n * @param {unknown} cause\n * @returns {void}\n */\nfunction failWebsocketConnection (handler, code, reason, cause) {\n  // If _The WebSocket Connection is Established_ prior to the point where\n  // the endpoint is required to _Fail the WebSocket Connection_, the\n  // endpoint SHOULD send a Close frame with an appropriate status code\n  // (Section 7.4) before proceeding to _Close the WebSocket Connection_.\n  if (isEstablished(handler.readyState)) {\n    closeWebSocketConnection(handler, code, reason, false)\n  }\n\n  handler.controller.abort()\n\n  if (isConnecting(handler.readyState)) {\n    // If the connection was not established, we must still emit an 'error' and 'close' events\n    handler.onSocketClose()\n  } else if (handler.socket?.destroyed === false) {\n    handler.socket.destroy()\n  }\n}\n\nmodule.exports = {\n  establishWebSocketConnection,\n  failWebsocketConnection,\n  closeWebSocketConnection\n}\n","'use strict'\n\nconst { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require('node:zlib')\nconst { isValidClientWindowBits } = require('./util')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\nconst tail = Buffer.from([0x00, 0x00, 0xff, 0xff])\nconst kBuffer = Symbol('kBuffer')\nconst kLength = Symbol('kLength')\n\n// Default maximum decompressed message size: 4 MB\nconst kDefaultMaxDecompressedSize = 4 * 1024 * 1024\n\nclass PerMessageDeflate {\n  /** @type {import('node:zlib').InflateRaw} */\n  #inflate\n\n  #options = {}\n\n  /** @type {boolean} */\n  #aborted = false\n\n  /** @type {Function|null} */\n  #currentCallback = null\n\n  /**\n   * @param {Map<string, string>} extensions\n   */\n  constructor (extensions) {\n    this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover')\n    this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits')\n  }\n\n  decompress (chunk, fin, callback) {\n    // An endpoint uses the following algorithm to decompress a message.\n    // 1.  Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the\n    //     payload of the message.\n    // 2.  Decompress the resulting data using DEFLATE.\n\n    if (this.#aborted) {\n      callback(new MessageSizeExceededError())\n      return\n    }\n\n    if (!this.#inflate) {\n      let windowBits = Z_DEFAULT_WINDOWBITS\n\n      if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS\n        if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) {\n          callback(new Error('Invalid server_max_window_bits'))\n          return\n        }\n\n        windowBits = Number.parseInt(this.#options.serverMaxWindowBits)\n      }\n\n      try {\n        this.#inflate = createInflateRaw({ windowBits })\n      } catch (err) {\n        callback(err)\n        return\n      }\n      this.#inflate[kBuffer] = []\n      this.#inflate[kLength] = 0\n\n      this.#inflate.on('data', (data) => {\n        if (this.#aborted) {\n          return\n        }\n\n        this.#inflate[kLength] += data.length\n\n        if (this.#inflate[kLength] > kDefaultMaxDecompressedSize) {\n          this.#aborted = true\n          this.#inflate.removeAllListeners()\n          this.#inflate.destroy()\n          this.#inflate = null\n\n          if (this.#currentCallback) {\n            const cb = this.#currentCallback\n            this.#currentCallback = null\n            cb(new MessageSizeExceededError())\n          }\n          return\n        }\n\n        this.#inflate[kBuffer].push(data)\n      })\n\n      this.#inflate.on('error', (err) => {\n        this.#inflate = null\n        callback(err)\n      })\n    }\n\n    this.#currentCallback = callback\n    this.#inflate.write(chunk)\n    if (fin) {\n      this.#inflate.write(tail)\n    }\n\n    this.#inflate.flush(() => {\n      if (this.#aborted || !this.#inflate) {\n        return\n      }\n\n      const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength])\n\n      this.#inflate[kBuffer].length = 0\n      this.#inflate[kLength] = 0\n      this.#currentCallback = null\n\n      callback(null, full)\n    })\n  }\n}\n\nmodule.exports = { PerMessageDeflate }\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst assert = require('node:assert')\nconst { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require('./constants')\nconst {\n  isValidStatusCode,\n  isValidOpcode,\n  websocketMessageReceived,\n  utf8Decode,\n  isControlFrame,\n  isTextBinaryFrame,\n  isContinuationFrame\n} = require('./util')\nconst { failWebsocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { PerMessageDeflate } = require('./permessage-deflate')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nclass ByteParser extends Writable {\n  #buffers = []\n  #fragmentsBytes = 0\n  #byteOffset = 0\n  #loop = false\n\n  #state = parserStates.INFO\n\n  #info = {}\n  #fragments = []\n\n  /** @type {Map<string, PerMessageDeflate>} */\n  #extensions\n\n  /** @type {import('./websocket').Handler} */\n  #handler\n\n  /**\n   * @param {import('./websocket').Handler} handler\n   * @param {Map<string, string>|null} extensions\n   */\n  constructor (handler, extensions) {\n    super()\n\n    this.#handler = handler\n    this.#extensions = extensions == null ? new Map() : extensions\n\n    if (this.#extensions.has('permessage-deflate')) {\n      this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions))\n    }\n  }\n\n  /**\n   * @param {Buffer} chunk\n   * @param {() => void} callback\n   */\n  _write (chunk, _, callback) {\n    this.#buffers.push(chunk)\n    this.#byteOffset += chunk.length\n    this.#loop = true\n\n    this.run(callback)\n  }\n\n  /**\n   * Runs whenever a new chunk is received.\n   * Callback is called whenever there are no more chunks buffering,\n   * or not enough bytes are buffered to parse.\n   */\n  run (callback) {\n    while (this.#loop) {\n      if (this.#state === parserStates.INFO) {\n        // If there aren't enough bytes to parse the payload length, etc.\n        if (this.#byteOffset < 2) {\n          return callback()\n        }\n\n        const buffer = this.consume(2)\n        const fin = (buffer[0] & 0x80) !== 0\n        const opcode = buffer[0] & 0x0F\n        const masked = (buffer[1] & 0x80) === 0x80\n\n        const fragmented = !fin && opcode !== opcodes.CONTINUATION\n        const payloadLength = buffer[1] & 0x7F\n\n        const rsv1 = buffer[0] & 0x40\n        const rsv2 = buffer[0] & 0x20\n        const rsv3 = buffer[0] & 0x10\n\n        if (!isValidOpcode(opcode)) {\n          failWebsocketConnection(this.#handler, 1002, 'Invalid opcode received')\n          return callback()\n        }\n\n        if (masked) {\n          failWebsocketConnection(this.#handler, 1002, 'Frame cannot be masked')\n          return callback()\n        }\n\n        // MUST be 0 unless an extension is negotiated that defines meanings\n        // for non-zero values.  If a nonzero value is received and none of\n        // the negotiated extensions defines the meaning of such a nonzero\n        // value, the receiving endpoint MUST _Fail the WebSocket\n        // Connection_.\n        // This document allocates the RSV1 bit of the WebSocket header for\n        // PMCEs and calls the bit the \"Per-Message Compressed\" bit.  On a\n        // WebSocket connection where a PMCE is in use, this bit indicates\n        // whether a message is compressed or not.\n        if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) {\n          failWebsocketConnection(this.#handler, 1002, 'Expected RSV1 to be clear.')\n          return\n        }\n\n        if (rsv2 !== 0 || rsv3 !== 0) {\n          failWebsocketConnection(this.#handler, 1002, 'RSV1, RSV2, RSV3 must be clear')\n          return\n        }\n\n        if (fragmented && !isTextBinaryFrame(opcode)) {\n          // Only text and binary frames can be fragmented\n          failWebsocketConnection(this.#handler, 1002, 'Invalid frame type was fragmented.')\n          return\n        }\n\n        // If we are already parsing a text/binary frame and do not receive either\n        // a continuation frame or close frame, fail the connection.\n        if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) {\n          failWebsocketConnection(this.#handler, 1002, 'Expected continuation frame')\n          return\n        }\n\n        if (this.#info.fragmented && fragmented) {\n          // A fragmented frame can't be fragmented itself\n          failWebsocketConnection(this.#handler, 1002, 'Fragmented frame exceeded 125 bytes.')\n          return\n        }\n\n        // \"All control frames MUST have a payload length of 125 bytes or less\n        // and MUST NOT be fragmented.\"\n        if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) {\n          failWebsocketConnection(this.#handler, 1002, 'Control frame either too large or fragmented')\n          return\n        }\n\n        if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) {\n          failWebsocketConnection(this.#handler, 1002, 'Unexpected continuation frame')\n          return\n        }\n\n        if (payloadLength <= 125) {\n          this.#info.payloadLength = payloadLength\n          this.#state = parserStates.READ_DATA\n        } else if (payloadLength === 126) {\n          this.#state = parserStates.PAYLOADLENGTH_16\n        } else if (payloadLength === 127) {\n          this.#state = parserStates.PAYLOADLENGTH_64\n        }\n\n        if (isTextBinaryFrame(opcode)) {\n          this.#info.binaryType = opcode\n          this.#info.compressed = rsv1 !== 0\n        }\n\n        this.#info.opcode = opcode\n        this.#info.masked = masked\n        this.#info.fin = fin\n        this.#info.fragmented = fragmented\n      } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n        if (this.#byteOffset < 2) {\n          return callback()\n        }\n\n        const buffer = this.consume(2)\n\n        this.#info.payloadLength = buffer.readUInt16BE(0)\n        this.#state = parserStates.READ_DATA\n      } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n        if (this.#byteOffset < 8) {\n          return callback()\n        }\n\n        const buffer = this.consume(8)\n        const upper = buffer.readUInt32BE(0)\n        const lower = buffer.readUInt32BE(4)\n\n        // 2^31 is the maximum bytes an arraybuffer can contain\n        // on 32-bit systems. Although, on 64-bit systems, this is\n        // 2^53-1 bytes.\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n        // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n        // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n        if (upper !== 0 || lower > 2 ** 31 - 1) {\n          failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.')\n          return\n        }\n\n        this.#info.payloadLength = lower\n        this.#state = parserStates.READ_DATA\n      } else if (this.#state === parserStates.READ_DATA) {\n        if (this.#byteOffset < this.#info.payloadLength) {\n          return callback()\n        }\n\n        const body = this.consume(this.#info.payloadLength)\n\n        if (isControlFrame(this.#info.opcode)) {\n          this.#loop = this.parseControlFrame(body)\n          this.#state = parserStates.INFO\n        } else {\n          if (!this.#info.compressed) {\n            this.writeFragments(body)\n\n            // If the frame is not fragmented, a message has been received.\n            // If the frame is fragmented, it will terminate with a fin bit set\n            // and an opcode of 0 (continuation), therefore we handle that when\n            // parsing continuation frames, not here.\n            if (!this.#info.fragmented && this.#info.fin) {\n              websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n            }\n\n            this.#state = parserStates.INFO\n          } else {\n            this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => {\n              if (error) {\n                // Use 1009 (Message Too Big) for decompression size limit errors\n                const code = error instanceof MessageSizeExceededError ? 1009 : 1007\n                failWebsocketConnection(this.#handler, code, error.message)\n                return\n              }\n\n              this.writeFragments(data)\n\n              if (!this.#info.fin) {\n                this.#state = parserStates.INFO\n                this.#loop = true\n                this.run(callback)\n                return\n              }\n\n              websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n\n              this.#loop = true\n              this.#state = parserStates.INFO\n              this.run(callback)\n            })\n\n            this.#loop = false\n            break\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Take n bytes from the buffered Buffers\n   * @param {number} n\n   * @returns {Buffer}\n   */\n  consume (n) {\n    if (n > this.#byteOffset) {\n      throw new Error('Called consume() before buffers satiated.')\n    } else if (n === 0) {\n      return emptyBuffer\n    }\n\n    this.#byteOffset -= n\n\n    const first = this.#buffers[0]\n\n    if (first.length > n) {\n      // replace with remaining buffer\n      this.#buffers[0] = first.subarray(n, first.length)\n      return first.subarray(0, n)\n    } else if (first.length === n) {\n      // prefect match\n      return this.#buffers.shift()\n    } else {\n      let offset = 0\n      // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n      const buffer = Buffer.allocUnsafeSlow(n)\n      while (offset !== n) {\n        const next = this.#buffers[0]\n        const length = next.length\n\n        if (length + offset === n) {\n          buffer.set(this.#buffers.shift(), offset)\n          break\n        } else if (length + offset > n) {\n          buffer.set(next.subarray(0, n - offset), offset)\n          this.#buffers[0] = next.subarray(n - offset)\n          break\n        } else {\n          buffer.set(this.#buffers.shift(), offset)\n          offset += length\n        }\n      }\n\n      return buffer\n    }\n  }\n\n  writeFragments (fragment) {\n    this.#fragmentsBytes += fragment.length\n    this.#fragments.push(fragment)\n  }\n\n  consumeFragments () {\n    const fragments = this.#fragments\n\n    if (fragments.length === 1) {\n      // single fragment\n      this.#fragmentsBytes = 0\n      return fragments.shift()\n    }\n\n    let offset = 0\n    // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n    const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes)\n\n    for (let i = 0; i < fragments.length; ++i) {\n      const buffer = fragments[i]\n      output.set(buffer, offset)\n      offset += buffer.length\n    }\n\n    this.#fragments = []\n    this.#fragmentsBytes = 0\n\n    return output\n  }\n\n  parseCloseBody (data) {\n    assert(data.length !== 1)\n\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n    /** @type {number|undefined} */\n    let code\n\n    if (data.length >= 2) {\n      // _The WebSocket Connection Close Code_ is\n      // defined as the status code (Section 7.4) contained in the first Close\n      // control frame received by the application\n      code = data.readUInt16BE(0)\n    }\n\n    if (code !== undefined && !isValidStatusCode(code)) {\n      return { code: 1002, reason: 'Invalid status code', error: true }\n    }\n\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n    /** @type {Buffer} */\n    let reason = data.subarray(2)\n\n    // Remove BOM\n    if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n      reason = reason.subarray(3)\n    }\n\n    try {\n      reason = utf8Decode(reason)\n    } catch {\n      return { code: 1007, reason: 'Invalid UTF-8', error: true }\n    }\n\n    return { code, reason, error: false }\n  }\n\n  /**\n   * Parses control frames.\n   * @param {Buffer} body\n   */\n  parseControlFrame (body) {\n    const { opcode, payloadLength } = this.#info\n\n    if (opcode === opcodes.CLOSE) {\n      if (payloadLength === 1) {\n        failWebsocketConnection(this.#handler, 1002, 'Received close frame with a 1-byte body.')\n        return false\n      }\n\n      this.#info.closeInfo = this.parseCloseBody(body)\n\n      if (this.#info.closeInfo.error) {\n        const { code, reason } = this.#info.closeInfo\n\n        failWebsocketConnection(this.#handler, code, reason)\n        return false\n      }\n\n      // Upon receiving such a frame, the other peer sends a\n      // Close frame in response, if it hasn't already sent one.\n      if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n        // If an endpoint receives a Close frame and did not previously send a\n        // Close frame, the endpoint MUST send a Close frame in response.  (When\n        // sending a Close frame in response, the endpoint typically echos the\n        // status code it received.)\n        let body = emptyBuffer\n        if (this.#info.closeInfo.code) {\n          body = Buffer.allocUnsafe(2)\n          body.writeUInt16BE(this.#info.closeInfo.code, 0)\n        }\n        const closeFrame = new WebsocketFrameSend(body)\n\n        this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE))\n        this.#handler.closeState.add(sentCloseFrameState.SENT)\n      }\n\n      // Upon either sending or receiving a Close control frame, it is said\n      // that _The WebSocket Closing Handshake is Started_ and that the\n      // WebSocket connection is in the CLOSING state.\n      this.#handler.readyState = states.CLOSING\n      this.#handler.closeState.add(sentCloseFrameState.RECEIVED)\n\n      return false\n    } else if (opcode === opcodes.PING) {\n      // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n      // response, unless it already received a Close frame.\n      // A Pong frame sent in response to a Ping frame must have identical\n      // \"Application data\"\n\n      if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n        const frame = new WebsocketFrameSend(body)\n\n        this.#handler.socket.write(frame.createFrame(opcodes.PONG))\n\n        this.#handler.onPing(body)\n      }\n    } else if (opcode === opcodes.PONG) {\n      // A Pong frame MAY be sent unsolicited.  This serves as a\n      // unidirectional heartbeat.  A response to an unsolicited Pong frame is\n      // not expected.\n      this.#handler.onPong(body)\n    }\n\n    return true\n  }\n\n  get closingInfo () {\n    return this.#info.closeInfo\n  }\n}\n\nmodule.exports = {\n  ByteParser\n}\n","'use strict'\n\nconst { WebsocketFrameSend } = require('./frame')\nconst { opcodes, sendHints } = require('./constants')\nconst FixedQueue = require('../../dispatcher/fixed-queue')\n\n/**\n * @typedef {object} SendQueueNode\n * @property {Promise<void> | null} promise\n * @property {((...args: any[]) => any)} callback\n * @property {Buffer | null} frame\n */\n\nclass SendQueue {\n  /**\n   * @type {FixedQueue}\n   */\n  #queue = new FixedQueue()\n\n  /**\n   * @type {boolean}\n   */\n  #running = false\n\n  /** @type {import('node:net').Socket} */\n  #socket\n\n  constructor (socket) {\n    this.#socket = socket\n  }\n\n  add (item, cb, hint) {\n    if (hint !== sendHints.blob) {\n      if (!this.#running) {\n        // TODO(@tsctx): support fast-path for string on running\n        if (hint === sendHints.text) {\n          // special fast-path for string\n          const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item)\n          this.#socket.cork()\n          this.#socket.write(head)\n          this.#socket.write(body, cb)\n          this.#socket.uncork()\n        } else {\n          // direct writing\n          this.#socket.write(createFrame(item, hint), cb)\n        }\n      } else {\n        /** @type {SendQueueNode} */\n        const node = {\n          promise: null,\n          callback: cb,\n          frame: createFrame(item, hint)\n        }\n        this.#queue.push(node)\n      }\n      return\n    }\n\n    /** @type {SendQueueNode} */\n    const node = {\n      promise: item.arrayBuffer().then((ab) => {\n        node.promise = null\n        node.frame = createFrame(ab, hint)\n      }),\n      callback: cb,\n      frame: null\n    }\n\n    this.#queue.push(node)\n\n    if (!this.#running) {\n      this.#run()\n    }\n  }\n\n  async #run () {\n    this.#running = true\n    const queue = this.#queue\n    while (!queue.isEmpty()) {\n      const node = queue.shift()\n      // wait pending promise\n      if (node.promise !== null) {\n        await node.promise\n      }\n      // write\n      this.#socket.write(node.frame, node.callback)\n      // cleanup\n      node.callback = node.frame = null\n    }\n    this.#running = false\n  }\n}\n\nfunction createFrame (data, hint) {\n  return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY)\n}\n\nfunction toBuffer (data, hint) {\n  switch (hint) {\n    case sendHints.text:\n    case sendHints.typedArray:\n      return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n    case sendHints.arrayBuffer:\n    case sendHints.blob:\n      return new Uint8Array(data)\n  }\n}\n\nmodule.exports = { SendQueue }\n","'use strict'\n\nconst { isArrayBuffer } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { environmentSettingsObject } = require('../fetch/util')\nconst { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require('./constants')\nconst {\n  isConnecting,\n  isEstablished,\n  isClosing,\n  isClosed,\n  isValidSubprotocol,\n  fireEvent,\n  utf8Decode,\n  toArrayBuffer,\n  getURLRecord\n} = require('./util')\nconst { establishWebSocketConnection, closeWebSocketConnection, failWebsocketConnection } = require('./connection')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { getGlobalDispatcher } = require('../../global')\nconst { ErrorEvent, CloseEvent, createFastMessageEvent } = require('./events')\nconst { SendQueue } = require('./sender')\nconst { WebsocketFrameSend } = require('./frame')\nconst { channels } = require('../../core/diagnostics')\n\nfunction getSocketAddress (socket) {\n  if (typeof socket?.address === 'function') {\n    return socket.address()\n  }\n\n  if (typeof socket?.session?.socket?.address === 'function') {\n    return socket.session.socket.address()\n  }\n\n  return null\n}\n\n/**\n * @typedef {object} Handler\n * @property {(response: any, extensions?: string[]) => void} onConnectionEstablished\n * @property {(opcode: number, data: Buffer) => void} onMessage\n * @property {(error: Error) => void} onParserError\n * @property {() => void} onParserDrain\n * @property {(chunk: Buffer) => void} onSocketData\n * @property {(err: Error) => void} onSocketError\n * @property {() => void} onSocketClose\n * @property {(body: Buffer) => void} onPing\n * @property {(body: Buffer) => void} onPong\n *\n * @property {number} readyState\n * @property {import('stream').Duplex} socket\n * @property {Set<number>} closeState\n * @property {import('../fetch/index').Fetch} controller\n * @property {boolean} [wasEverConnected=false]\n */\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n  #events = {\n    open: null,\n    error: null,\n    close: null,\n    message: null\n  }\n\n  #bufferedAmount = 0\n  #protocol = ''\n  #extensions = ''\n\n  /** @type {SendQueue} */\n  #sendQueue\n\n  /** @type {Handler} */\n  #handler = {\n    onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n    onMessage: (opcode, data) => this.#onMessage(opcode, data),\n    onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n    onParserDrain: () => this.#onParserDrain(),\n    onSocketData: (chunk) => {\n      if (!this.#parser.write(chunk)) {\n        this.#handler.socket.pause()\n      }\n    },\n    onSocketError: (err) => {\n      this.#handler.readyState = states.CLOSING\n\n      if (channels.socketError.hasSubscribers) {\n        channels.socketError.publish(err)\n      }\n\n      this.#handler.socket.destroy()\n    },\n    onSocketClose: () => this.#onSocketClose(),\n    onPing: (body) => {\n      if (channels.ping.hasSubscribers) {\n        channels.ping.publish({\n          payload: body,\n          websocket: this\n        })\n      }\n    },\n    onPong: (body) => {\n      if (channels.pong.hasSubscribers) {\n        channels.pong.publish({\n          payload: body,\n          websocket: this\n        })\n      }\n    },\n\n    readyState: states.CONNECTING,\n    socket: null,\n    closeState: new Set(),\n    controller: null,\n    wasEverConnected: false\n  }\n\n  #url\n  #binaryType\n  /** @type {import('./receiver').ByteParser} */\n  #parser\n\n  /**\n   * @param {string} url\n   * @param {string|string[]} protocols\n   */\n  constructor (url, protocols = []) {\n    super()\n\n    webidl.util.markAsUncloneable(this)\n\n    const prefix = 'WebSocket constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    const options = webidl.converters['DOMString or sequence<DOMString> or WebSocketInit'](protocols, prefix, 'options')\n\n    url = webidl.converters.USVString(url)\n    protocols = options.protocols\n\n    // 1. Let baseURL be this's relevant settings object's API base URL.\n    const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n    // 2. Let urlRecord be the result of getting a URL record given url and baseURL.\n    const urlRecord = getURLRecord(url, baseURL)\n\n    // 3. If protocols is a string, set protocols to a sequence consisting\n    //    of just that string.\n    if (typeof protocols === 'string') {\n      protocols = [protocols]\n    }\n\n    // 4. If any of the values in protocols occur more than once or otherwise\n    //    fail to match the requirements for elements that comprise the value\n    //    of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n    //    protocol, then throw a \"SyntaxError\" DOMException.\n    if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n    }\n\n    if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n    }\n\n    // 5. Set this's url to urlRecord.\n    this.#url = new URL(urlRecord.href)\n\n    // 6. Let client be this's relevant settings object.\n    const client = environmentSettingsObject.settingsObject\n\n    // 7. Run this step in parallel:\n    // 7.1. Establish a WebSocket connection given urlRecord, protocols,\n    //      and client.\n    this.#handler.controller = establishWebSocketConnection(\n      urlRecord,\n      protocols,\n      client,\n      this.#handler,\n      options\n    )\n\n    // Each WebSocket object has an associated ready state, which is a\n    // number representing the state of the connection. Initially it must\n    // be CONNECTING (0).\n    this.#handler.readyState = WebSocket.CONNECTING\n\n    // The extensions attribute must initially return the empty string.\n\n    // The protocol attribute must initially return the empty string.\n\n    // Each WebSocket object has an associated binary type, which is a\n    // BinaryType. Initially it must be \"blob\".\n    this.#binaryType = 'blob'\n  }\n\n  /**\n   * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n   * @param {number|undefined} code\n   * @param {string|undefined} reason\n   */\n  close (code = undefined, reason = undefined) {\n    webidl.brandCheck(this, WebSocket)\n\n    const prefix = 'WebSocket.close'\n\n    if (code !== undefined) {\n      code = webidl.converters['unsigned short'](code, prefix, 'code', webidl.attributes.Clamp)\n    }\n\n    if (reason !== undefined) {\n      reason = webidl.converters.USVString(reason)\n    }\n\n    // 1. If code is the special value \"missing\", then set code to null.\n    code ??= null\n\n    // 2. If reason is the special value \"missing\", then set reason to the empty string.\n    reason ??= ''\n\n    // 3. Close the WebSocket with this, code, and reason.\n    closeWebSocketConnection(this.#handler, code, reason, true)\n  }\n\n  /**\n   * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n   * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n   */\n  send (data) {\n    webidl.brandCheck(this, WebSocket)\n\n    const prefix = 'WebSocket.send'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    data = webidl.converters.WebSocketSendData(data, prefix, 'data')\n\n    // 1. If this's ready state is CONNECTING, then throw an\n    //    \"InvalidStateError\" DOMException.\n    if (isConnecting(this.#handler.readyState)) {\n      throw new DOMException('Sent before connected.', 'InvalidStateError')\n    }\n\n    // 2. Run the appropriate set of steps from the following list:\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n    if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) {\n      return\n    }\n\n    // If data is a string\n    if (typeof data === 'string') {\n      // If the WebSocket connection is established and the WebSocket\n      // closing handshake has not yet started, then the user agent\n      // must send a WebSocket Message comprised of the data argument\n      // using a text frame opcode; if the data cannot be sent, e.g.\n      // because it would need to be buffered but the buffer is full,\n      // the user agent must flag the WebSocket as full and then close\n      // the WebSocket connection. Any invocation of this method with a\n      // string argument that does not throw an exception must increase\n      // the bufferedAmount attribute by the number of bytes needed to\n      // express the argument as UTF-8.\n\n      const buffer = Buffer.from(data)\n\n      this.#bufferedAmount += buffer.byteLength\n      this.#sendQueue.add(buffer, () => {\n        this.#bufferedAmount -= buffer.byteLength\n      }, sendHints.text)\n    } else if (isArrayBuffer(data)) {\n      // If the WebSocket connection is established, and the WebSocket\n      // closing handshake has not yet started, then the user agent must\n      // send a WebSocket Message comprised of data using a binary frame\n      // opcode; if the data cannot be sent, e.g. because it would need\n      // to be buffered but the buffer is full, the user agent must flag\n      // the WebSocket as full and then close the WebSocket connection.\n      // The data to be sent is the data stored in the buffer described\n      // by the ArrayBuffer object. Any invocation of this method with an\n      // ArrayBuffer argument that does not throw an exception must\n      // increase the bufferedAmount attribute by the length of the\n      // ArrayBuffer in bytes.\n\n      this.#bufferedAmount += data.byteLength\n      this.#sendQueue.add(data, () => {\n        this.#bufferedAmount -= data.byteLength\n      }, sendHints.arrayBuffer)\n    } else if (ArrayBuffer.isView(data)) {\n      // If the WebSocket connection is established, and the WebSocket\n      // closing handshake has not yet started, then the user agent must\n      // send a WebSocket Message comprised of data using a binary frame\n      // opcode; if the data cannot be sent, e.g. because it would need to\n      // be buffered but the buffer is full, the user agent must flag the\n      // WebSocket as full and then close the WebSocket connection. The\n      // data to be sent is the data stored in the section of the buffer\n      // described by the ArrayBuffer object that data references. Any\n      // invocation of this method with this kind of argument that does\n      // not throw an exception must increase the bufferedAmount attribute\n      // by the length of data’s buffer in bytes.\n\n      this.#bufferedAmount += data.byteLength\n      this.#sendQueue.add(data, () => {\n        this.#bufferedAmount -= data.byteLength\n      }, sendHints.typedArray)\n    } else if (webidl.is.Blob(data)) {\n      // If the WebSocket connection is established, and the WebSocket\n      // closing handshake has not yet started, then the user agent must\n      // send a WebSocket Message comprised of data using a binary frame\n      // opcode; if the data cannot be sent, e.g. because it would need to\n      // be buffered but the buffer is full, the user agent must flag the\n      // WebSocket as full and then close the WebSocket connection. The data\n      // to be sent is the raw data represented by the Blob object. Any\n      // invocation of this method with a Blob argument that does not throw\n      // an exception must increase the bufferedAmount attribute by the size\n      // of the Blob object’s raw data, in bytes.\n\n      this.#bufferedAmount += data.size\n      this.#sendQueue.add(data, () => {\n        this.#bufferedAmount -= data.size\n      }, sendHints.blob)\n    }\n  }\n\n  get readyState () {\n    webidl.brandCheck(this, WebSocket)\n\n    // The readyState getter steps are to return this's ready state.\n    return this.#handler.readyState\n  }\n\n  get bufferedAmount () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#bufferedAmount\n  }\n\n  get url () {\n    webidl.brandCheck(this, WebSocket)\n\n    // The url getter steps are to return this's url, serialized.\n    return URLSerializer(this.#url)\n  }\n\n  get extensions () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#extensions\n  }\n\n  get protocol () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#protocol\n  }\n\n  get onopen () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#events.open\n  }\n\n  set onopen (fn) {\n    webidl.brandCheck(this, WebSocket)\n\n    if (this.#events.open) {\n      this.removeEventListener('open', this.#events.open)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('open', listener)\n      this.#events.open = fn\n    } else {\n      this.#events.open = null\n    }\n  }\n\n  get onerror () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#events.error\n  }\n\n  set onerror (fn) {\n    webidl.brandCheck(this, WebSocket)\n\n    if (this.#events.error) {\n      this.removeEventListener('error', this.#events.error)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('error', listener)\n      this.#events.error = fn\n    } else {\n      this.#events.error = null\n    }\n  }\n\n  get onclose () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#events.close\n  }\n\n  set onclose (fn) {\n    webidl.brandCheck(this, WebSocket)\n\n    if (this.#events.close) {\n      this.removeEventListener('close', this.#events.close)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('close', listener)\n      this.#events.close = fn\n    } else {\n      this.#events.close = null\n    }\n  }\n\n  get onmessage () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#events.message\n  }\n\n  set onmessage (fn) {\n    webidl.brandCheck(this, WebSocket)\n\n    if (this.#events.message) {\n      this.removeEventListener('message', this.#events.message)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('message', listener)\n      this.#events.message = fn\n    } else {\n      this.#events.message = null\n    }\n  }\n\n  get binaryType () {\n    webidl.brandCheck(this, WebSocket)\n\n    return this.#binaryType\n  }\n\n  set binaryType (type) {\n    webidl.brandCheck(this, WebSocket)\n\n    if (type !== 'blob' && type !== 'arraybuffer') {\n      this.#binaryType = 'blob'\n    } else {\n      this.#binaryType = type\n    }\n  }\n\n  /**\n   * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n   */\n  #onConnectionEstablished (response, parsedExtensions) {\n    // processResponse is called when the \"response's header list has been received and initialized.\"\n    // once this happens, the connection is open\n    this.#handler.socket = response.socket\n\n    const parser = new ByteParser(this.#handler, parsedExtensions)\n    parser.on('drain', () => this.#handler.onParserDrain())\n    parser.on('error', (err) => this.#handler.onParserError(err))\n\n    this.#parser = parser\n    this.#sendQueue = new SendQueue(response.socket)\n\n    // 1. Change the ready state to OPEN (1).\n    this.#handler.readyState = states.OPEN\n\n    // 2. Change the extensions attribute’s value to the extensions in use, if\n    //    it is not the null value.\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n    const extensions = response.headersList.get('sec-websocket-extensions')\n\n    if (extensions !== null) {\n      this.#extensions = extensions\n    }\n\n    // 3. Change the protocol attribute’s value to the subprotocol in use, if\n    //    it is not the null value.\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n    const protocol = response.headersList.get('sec-websocket-protocol')\n\n    if (protocol !== null) {\n      this.#protocol = protocol\n    }\n\n    // 4. Fire an event named open at the WebSocket object.\n    fireEvent('open', this)\n\n    if (channels.open.hasSubscribers) {\n      // Convert headers to a plain object for the event\n      const headers = response.headersList.entries\n      channels.open.publish({\n        address: getSocketAddress(response.socket),\n        protocol: this.#protocol,\n        extensions: this.#extensions,\n        websocket: this,\n        handshakeResponse: {\n          status: response.status,\n          statusText: response.statusText,\n          headers\n        }\n      })\n    }\n  }\n\n  #onMessage (type, data) {\n    // 1. If ready state is not OPEN (1), then return.\n    if (this.#handler.readyState !== states.OPEN) {\n      return\n    }\n\n    // 2. Let dataForEvent be determined by switching on type and binary type:\n    let dataForEvent\n\n    if (type === opcodes.TEXT) {\n      // -> type indicates that the data is Text\n      //      a new DOMString containing data\n      try {\n        dataForEvent = utf8Decode(data)\n      } catch {\n        failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.')\n        return\n      }\n    } else if (type === opcodes.BINARY) {\n      if (this.#binaryType === 'blob') {\n        // -> type indicates that the data is Binary and binary type is \"blob\"\n        //      a new Blob object, created in the relevant Realm of the WebSocket\n        //      object, that represents data as its raw data\n        dataForEvent = new Blob([data])\n      } else {\n        // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n        //      a new ArrayBuffer object, created in the relevant Realm of the\n        //      WebSocket object, whose contents are data\n        dataForEvent = toArrayBuffer(data)\n      }\n    }\n\n    // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n    //    with the origin attribute initialized to the serialization of the WebSocket\n    //    object’s url's origin, and the data attribute initialized to dataForEvent.\n    fireEvent('message', this, createFastMessageEvent, {\n      origin: this.#url.origin,\n      data: dataForEvent\n    })\n  }\n\n  #onParserDrain () {\n    this.#handler.socket.resume()\n  }\n\n  /**\n   * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n   * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n   */\n  #onSocketClose () {\n    // If the TCP connection was closed after the\n    // WebSocket closing handshake was completed, the WebSocket connection\n    // is said to have been closed _cleanly_.\n    const wasClean =\n      this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n      this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n    let code = 1005\n    let reason = ''\n\n    const result = this.#parser?.closingInfo\n\n    if (result && !result.error) {\n      code = result.code ?? 1005\n      reason = result.reason\n    }\n\n    // 1. Change the ready state to CLOSED (3).\n    this.#handler.readyState = states.CLOSED\n\n    // 2. If the user agent was required to fail the WebSocket\n    //    connection, or if the WebSocket connection was closed\n    //    after being flagged as full, fire an event named error\n    //    at the WebSocket object.\n    if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n      // If _The WebSocket\n      // Connection is Closed_ and no Close control frame was received by the\n      // endpoint (such as could occur if the underlying transport connection\n      // is lost), _The WebSocket Connection Close Code_ is considered to be\n      // 1006.\n      code = 1006\n\n      fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {\n        error: new TypeError(reason)\n      })\n    }\n\n    // 3. Fire an event named close at the WebSocket object,\n    //    using CloseEvent, with the wasClean attribute\n    //    initialized to true if the connection closed cleanly\n    //    and false otherwise, the code attribute initialized to\n    //    the WebSocket connection close code, and the reason\n    //    attribute initialized to the result of applying UTF-8\n    //    decode without BOM to the WebSocket connection close\n    //    reason.\n    // TODO: process.nextTick\n    fireEvent('close', this, (type, init) => new CloseEvent(type, init), {\n      wasClean, code, reason\n    })\n\n    if (channels.close.hasSubscribers) {\n      channels.close.publish({\n        websocket: this,\n        code,\n        reason\n      })\n    }\n  }\n\n  /**\n   * @param {WebSocket} ws\n   * @param {Buffer|undefined} buffer\n   */\n  static ping (ws, buffer) {\n    if (Buffer.isBuffer(buffer)) {\n      if (buffer.length > 125) {\n        throw new TypeError('A PING frame cannot have a body larger than 125 bytes.')\n      }\n    } else if (buffer !== undefined) {\n      throw new TypeError('Expected buffer payload')\n    }\n\n    // An endpoint MAY send a Ping frame any time after the connection is\n    // established and before the connection is closed.\n    const readyState = ws.#handler.readyState\n\n    if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) {\n      const frame = new WebsocketFrameSend(buffer)\n      ws.#handler.socket.write(frame.createFrame(opcodes.PING))\n    }\n  }\n}\n\nconst { ping } = WebSocket\nReflect.deleteProperty(WebSocket, 'ping')\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n  CONNECTING: staticPropertyDescriptors,\n  OPEN: staticPropertyDescriptors,\n  CLOSING: staticPropertyDescriptors,\n  CLOSED: staticPropertyDescriptors,\n  url: kEnumerableProperty,\n  readyState: kEnumerableProperty,\n  bufferedAmount: kEnumerableProperty,\n  onopen: kEnumerableProperty,\n  onerror: kEnumerableProperty,\n  onclose: kEnumerableProperty,\n  close: kEnumerableProperty,\n  onmessage: kEnumerableProperty,\n  binaryType: kEnumerableProperty,\n  send: kEnumerableProperty,\n  extensions: kEnumerableProperty,\n  protocol: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'WebSocket',\n    writable: false,\n    enumerable: false,\n    configurable: true\n  }\n})\n\nObject.defineProperties(WebSocket, {\n  CONNECTING: staticPropertyDescriptors,\n  OPEN: staticPropertyDescriptors,\n  CLOSING: staticPropertyDescriptors,\n  CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence<DOMString>'] = webidl.sequenceConverter(\n  webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence<DOMString>'] = function (V, prefix, argument) {\n  if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) {\n    return webidl.converters['sequence<DOMString>'](V)\n  }\n\n  return webidl.converters.DOMString(V, prefix, argument)\n}\n\n// This implements the proposal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n  {\n    key: 'protocols',\n    converter: webidl.converters['DOMString or sequence<DOMString>'],\n    defaultValue: () => []\n  },\n  {\n    key: 'dispatcher',\n    converter: webidl.converters.any,\n    defaultValue: () => getGlobalDispatcher()\n  },\n  {\n    key: 'headers',\n    converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n  }\n])\n\nwebidl.converters['DOMString or sequence<DOMString> or WebSocketInit'] = function (V) {\n  if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) {\n    return webidl.converters.WebSocketInit(V)\n  }\n\n  return { protocols: webidl.converters['DOMString or sequence<DOMString>'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n  if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n    if (webidl.is.Blob(V)) {\n      return V\n    }\n\n    if (webidl.is.BufferSource(V)) {\n      return V\n    }\n  }\n\n  return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n  WebSocket,\n  ping\n}\n","'use strict'\n\nconst { webidl } = require('../../webidl')\nconst { validateCloseCodeAndReason } = require('../util')\nconst { kConstruct } = require('../../../core/symbols')\nconst { kEnumerableProperty } = require('../../../core/util')\n\nfunction createInheritableDOMException () {\n  // https://github.com/nodejs/node/issues/59677\n  class Test extends DOMException {\n    get reason () {\n      return ''\n    }\n  }\n\n  if (new Test().reason !== undefined) {\n    return DOMException\n  }\n\n  return new Proxy(DOMException, {\n    construct (target, args, newTarget) {\n      const instance = Reflect.construct(target, args, target)\n      Object.setPrototypeOf(instance, newTarget.prototype)\n      return instance\n    }\n  })\n}\n\nclass WebSocketError extends createInheritableDOMException() {\n  #closeCode\n  #reason\n\n  constructor (message = '', init = undefined) {\n    message = webidl.converters.DOMString(message, 'WebSocketError', 'message')\n\n    // 1. Set this 's name to \" WebSocketError \".\n    // 2. Set this 's message to message .\n    super(message, 'WebSocketError')\n\n    if (init === kConstruct) {\n      return\n    } else if (init !== null) {\n      init = webidl.converters.WebSocketCloseInfo(init)\n    }\n\n    // 3. Let code be init [\" closeCode \"] if it exists , or null otherwise.\n    let code = init.closeCode ?? null\n\n    // 4. Let reason be init [\" reason \"] if it exists , or the empty string otherwise.\n    const reason = init.reason ?? ''\n\n    // 5. Validate close code and reason with code and reason .\n    validateCloseCodeAndReason(code, reason)\n\n    // 6. If reason is non-empty, but code is not set, then set code to 1000 (\"Normal Closure\").\n    if (reason.length !== 0 && code === null) {\n      code = 1000\n    }\n\n    // 7. Set this 's closeCode to code .\n    this.#closeCode = code\n\n    // 8. Set this 's reason to reason .\n    this.#reason = reason\n  }\n\n  get closeCode () {\n    return this.#closeCode\n  }\n\n  get reason () {\n    return this.#reason\n  }\n\n  /**\n   * @param {string} message\n   * @param {number|null} code\n   * @param {string} reason\n   */\n  static createUnvalidatedWebSocketError (message, code, reason) {\n    const error = new WebSocketError(message, kConstruct)\n    error.#closeCode = code\n    error.#reason = reason\n    return error\n  }\n}\n\nconst { createUnvalidatedWebSocketError } = WebSocketError\ndelete WebSocketError.createUnvalidatedWebSocketError\n\nObject.defineProperties(WebSocketError.prototype, {\n  closeCode: kEnumerableProperty,\n  reason: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'WebSocketError',\n    writable: false,\n    enumerable: false,\n    configurable: true\n  }\n})\n\nwebidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError)\n\nmodule.exports = { WebSocketError, createUnvalidatedWebSocketError }\n","'use strict'\n\nconst { createDeferredPromise } = require('../../../util/promise')\nconst { environmentSettingsObject } = require('../../fetch/util')\nconst { states, opcodes, sentCloseFrameState } = require('../constants')\nconst { webidl } = require('../../webidl')\nconst { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require('../util')\nconst { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require('../connection')\nconst { channels } = require('../../../core/diagnostics')\nconst { WebsocketFrameSend } = require('../frame')\nconst { ByteParser } = require('../receiver')\nconst { WebSocketError, createUnvalidatedWebSocketError } = require('./websocketerror')\nconst { kEnumerableProperty } = require('../../../core/util')\nconst { utf8DecodeBytes } = require('../../../encoding')\n\nlet emittedExperimentalWarning = false\n\nclass WebSocketStream {\n  // Each WebSocketStream object has an associated url , which is a URL record .\n  /** @type {URL} */\n  #url\n\n  // Each WebSocketStream object has an associated opened promise , which is a promise.\n  /** @type {import('../../../util/promise').DeferredPromise} */\n  #openedPromise\n\n  // Each WebSocketStream object has an associated closed promise , which is a promise.\n  /** @type {import('../../../util/promise').DeferredPromise} */\n  #closedPromise\n\n  // Each WebSocketStream object has an associated readable stream , which is a ReadableStream .\n  /** @type {ReadableStream} */\n  #readableStream\n  /** @type {ReadableStreamDefaultController} */\n  #readableStreamController\n\n  // Each WebSocketStream object has an associated writable stream , which is a WritableStream .\n  /** @type {WritableStream} */\n  #writableStream\n\n  // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false.\n  #handshakeAborted = false\n\n  /** @type {import('../websocket').Handler} */\n  #handler = {\n    // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol\n    onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n    onMessage: (opcode, data) => this.#onMessage(opcode, data),\n    onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n    onParserDrain: () => this.#handler.socket.resume(),\n    onSocketData: (chunk) => {\n      if (!this.#parser.write(chunk)) {\n        this.#handler.socket.pause()\n      }\n    },\n    onSocketError: (err) => {\n      this.#handler.readyState = states.CLOSING\n\n      if (channels.socketError.hasSubscribers) {\n        channels.socketError.publish(err)\n      }\n\n      this.#handler.socket.destroy()\n    },\n    onSocketClose: () => this.#onSocketClose(),\n    onPing: () => {},\n    onPong: () => {},\n\n    readyState: states.CONNECTING,\n    socket: null,\n    closeState: new Set(),\n    controller: null,\n    wasEverConnected: false\n  }\n\n  /** @type {import('../receiver').ByteParser} */\n  #parser\n\n  constructor (url, options = undefined) {\n    if (!emittedExperimentalWarning) {\n      process.emitWarning('WebSocketStream is experimental! Expect it to change at any time.', {\n        code: 'UNDICI-WSS'\n      })\n      emittedExperimentalWarning = true\n    }\n\n    webidl.argumentLengthCheck(arguments, 1, 'WebSocket')\n\n    url = webidl.converters.USVString(url)\n    if (options !== null) {\n      options = webidl.converters.WebSocketStreamOptions(options)\n    }\n\n    // 1. Let baseURL be this 's relevant settings object 's API base URL .\n    const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n    // 2. Let urlRecord be the result of getting a URL record given url and baseURL .\n    const urlRecord = getURLRecord(url, baseURL)\n\n    // 3. Let protocols be options [\" protocols \"] if it exists , otherwise an empty sequence.\n    const protocols = options.protocols\n\n    // 4. If any of the values in protocols occur more than once or otherwise fail to match the requirements for elements that comprise the value of ` Sec-WebSocket-Protocol ` fields as defined by The WebSocket Protocol , then throw a \" SyntaxError \" DOMException . [WSP]\n    if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n    }\n\n    if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n    }\n\n    // 5. Set this 's url to urlRecord .\n    this.#url = urlRecord.toString()\n\n    // 6. Set this 's opened promise and closed promise to new promises.\n    this.#openedPromise = createDeferredPromise()\n    this.#closedPromise = createDeferredPromise()\n\n    // 7. Apply backpressure to the WebSocket.\n    // TODO\n\n    // 8.  If options [\" signal \"] exists ,\n    if (options.signal != null) {\n      // 8.1. Let signal be options [\" signal \"].\n      const signal = options.signal\n\n      // 8.2. If signal is aborted , then reject this 's opened promise and closed promise with signal ’s abort reason\n      //      and return.\n      if (signal.aborted) {\n        this.#openedPromise.reject(signal.reason)\n        this.#closedPromise.reject(signal.reason)\n        return\n      }\n\n      // 8.3. Add the following abort steps to signal :\n      signal.addEventListener('abort', () => {\n        // 8.3.1. If the WebSocket connection is not yet established : [WSP]\n        if (!isEstablished(this.#handler.readyState)) {\n          // 8.3.1.1. Fail the WebSocket connection .\n          failWebsocketConnection(this.#handler)\n\n          // Set this 's ready state to CLOSING .\n          this.#handler.readyState = states.CLOSING\n\n          // Reject this 's opened promise and closed promise with signal ’s abort reason .\n          this.#openedPromise.reject(signal.reason)\n          this.#closedPromise.reject(signal.reason)\n\n          // Set this 's handshake aborted to true.\n          this.#handshakeAborted = true\n        }\n      }, { once: true })\n    }\n\n    // 9.  Let client be this 's relevant settings object .\n    const client = environmentSettingsObject.settingsObject\n\n    // 10. Run this step in parallel :\n    // 10.1. Establish a WebSocket connection given urlRecord , protocols , and client . [FETCH]\n    this.#handler.controller = establishWebSocketConnection(\n      urlRecord,\n      protocols,\n      client,\n      this.#handler,\n      options\n    )\n  }\n\n  // The url getter steps are to return this 's url , serialized .\n  get url () {\n    return this.#url.toString()\n  }\n\n  // The opened getter steps are to return this 's opened promise .\n  get opened () {\n    return this.#openedPromise.promise\n  }\n\n  // The closed getter steps are to return this 's closed promise .\n  get closed () {\n    return this.#closedPromise.promise\n  }\n\n  // The close( closeInfo ) method steps are:\n  close (closeInfo = undefined) {\n    if (closeInfo !== null) {\n      closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo)\n    }\n\n    // 1. Let code be closeInfo [\" closeCode \"] if present, or null otherwise.\n    const code = closeInfo.closeCode ?? null\n\n    // 2. Let reason be closeInfo [\" reason \"].\n    const reason = closeInfo.reason\n\n    // 3. Close the WebSocket with this , code , and reason .\n    closeWebSocketConnection(this.#handler, code, reason, true)\n  }\n\n  #write (chunk) {\n    // See /websockets/stream/tentative/write.any.html\n    chunk = webidl.converters.WebSocketStreamWrite(chunk)\n\n    // 1. Let promise be a new promise created in stream ’s relevant realm .\n    const promise = createDeferredPromise()\n\n    // 2. Let data be null.\n    let data = null\n\n    // 3. Let opcode be null.\n    let opcode = null\n\n    // 4. If chunk is a BufferSource ,\n    if (webidl.is.BufferSource(chunk)) {\n      // 4.1. Set data to a copy of the bytes given chunk .\n      data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk.slice())\n\n      // 4.2. Set opcode to a binary frame opcode.\n      opcode = opcodes.BINARY\n    } else {\n      // 5. Otherwise,\n\n      // 5.1. Let string be the result of converting chunk to an IDL USVString .\n      //    If this throws an exception, return a promise rejected with the exception.\n      let string\n\n      try {\n        string = webidl.converters.DOMString(chunk)\n      } catch (e) {\n        promise.reject(e)\n        return promise.promise\n      }\n\n      // 5.2. Set data to the result of UTF-8 encoding string .\n      data = new TextEncoder().encode(string)\n\n      // 5.3. Set opcode to a text frame opcode.\n      opcode = opcodes.TEXT\n    }\n\n    // 6. In parallel,\n    // 6.1. Wait until there is sufficient buffer space in stream to send the message.\n\n    // 6.2. If the closing handshake has not yet started , Send a WebSocket Message to stream comprised of data using opcode .\n    if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n      const frame = new WebsocketFrameSend(data)\n\n      this.#handler.socket.write(frame.createFrame(opcode), () => {\n        promise.resolve(undefined)\n      })\n    }\n\n    // 6.3. Queue a global task on the WebSocket task source given stream ’s relevant global object to resolve promise with undefined.\n    return promise.promise\n  }\n\n  /** @type {import('../websocket').Handler['onConnectionEstablished']} */\n  #onConnectionEstablished (response, parsedExtensions) {\n    this.#handler.socket = response.socket\n\n    const parser = new ByteParser(this.#handler, parsedExtensions)\n    parser.on('drain', () => this.#handler.onParserDrain())\n    parser.on('error', (err) => this.#handler.onParserError(err))\n\n    this.#parser = parser\n\n    // 1. Change stream ’s ready state to OPEN (1).\n    this.#handler.readyState = states.OPEN\n\n    // 2. Set stream ’s was ever connected to true.\n    // This is done in the opening handshake.\n\n    // 3. Let extensions be the extensions in use .\n    const extensions = parsedExtensions ?? ''\n\n    // 4. Let protocol be the subprotocol in use .\n    const protocol = response.headersList.get('sec-websocket-protocol') ?? ''\n\n    // 5. Let pullAlgorithm be an action that pulls bytes from stream .\n    // 6. Let cancelAlgorithm be an action that cancels stream with reason , given reason .\n    // 7. Let readable be a new ReadableStream .\n    // 8. Set up readable with pullAlgorithm and cancelAlgorithm .\n    const readable = new ReadableStream({\n      start: (controller) => {\n        this.#readableStreamController = controller\n      },\n      pull (controller) {\n        let chunk\n        while (controller.desiredSize > 0 && (chunk = response.socket.read()) !== null) {\n          controller.enqueue(chunk)\n        }\n      },\n      cancel: (reason) => this.#cancel(reason)\n    })\n\n    // 9. Let writeAlgorithm be an action that writes chunk to stream , given chunk .\n    // 10. Let closeAlgorithm be an action that closes stream .\n    // 11. Let abortAlgorithm be an action that aborts stream with reason , given reason .\n    // 12. Let writable be a new WritableStream .\n    // 13. Set up writable with writeAlgorithm , closeAlgorithm , and abortAlgorithm .\n    const writable = new WritableStream({\n      write: (chunk) => this.#write(chunk),\n      close: () => closeWebSocketConnection(this.#handler, null, null),\n      abort: (reason) => this.#closeUsingReason(reason)\n    })\n\n    // Set stream ’s readable stream to readable .\n    this.#readableStream = readable\n\n    // Set stream ’s writable stream to writable .\n    this.#writableStream = writable\n\n    // Resolve stream ’s opened promise with WebSocketOpenInfo «[ \" extensions \" → extensions , \" protocol \" → protocol , \" readable \" → readable , \" writable \" → writable ]».\n    this.#openedPromise.resolve({\n      extensions,\n      protocol,\n      readable,\n      writable\n    })\n  }\n\n  /** @type {import('../websocket').Handler['onMessage']} */\n  #onMessage (type, data) {\n    // 1. If stream’s ready state is not OPEN (1), then return.\n    if (this.#handler.readyState !== states.OPEN) {\n      return\n    }\n\n    // 2. Let chunk be determined by switching on type:\n    //      - type indicates that the data is Text\n    //          a new DOMString containing data\n    //      - type indicates that the data is Binary\n    //          a new Uint8Array object, created in the relevant Realm of the\n    //          WebSocketStream object, whose contents are data\n    let chunk\n\n    if (type === opcodes.TEXT) {\n      try {\n        chunk = utf8Decode(data)\n      } catch {\n        failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.')\n        return\n      }\n    } else if (type === opcodes.BINARY) {\n      chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n    }\n\n    // 3. Enqueue chunk into stream’s readable stream.\n    this.#readableStreamController.enqueue(chunk)\n\n    // 4. Apply backpressure to the WebSocket.\n  }\n\n  /** @type {import('../websocket').Handler['onSocketClose']} */\n  #onSocketClose () {\n    const wasClean =\n      this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n      this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n    // 1. Change the ready state to CLOSED (3).\n    this.#handler.readyState = states.CLOSED\n\n    // 2. If stream ’s handshake aborted is true, then return.\n    if (this.#handshakeAborted) {\n      return\n    }\n\n    // 3. If stream ’s was ever connected is false, then reject stream ’s opened promise with a new WebSocketError.\n    if (!this.#handler.wasEverConnected) {\n      this.#openedPromise.reject(new WebSocketError('Socket never opened'))\n    }\n\n    const result = this.#parser?.closingInfo\n\n    // 4. Let code be the WebSocket connection close code .\n    // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n    // If this Close control frame contains no status code, _The WebSocket\n    // Connection Close Code_ is considered to be 1005. If _The WebSocket\n    // Connection is Closed_ and no Close control frame was received by the\n    // endpoint (such as could occur if the underlying transport connection\n    // is lost), _The WebSocket Connection Close Code_ is considered to be\n    // 1006.\n    let code = result?.code ?? 1005\n\n    if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n      code = 1006\n    }\n\n    // 5. Let reason be the result of applying UTF-8 decode without BOM to the WebSocket connection close reason .\n    const reason = result?.reason == null ? '' : utf8DecodeBytes(Buffer.from(result.reason))\n\n    // 6. If the connection was closed cleanly ,\n    if (wasClean) {\n      // 6.1. Close stream ’s readable stream .\n      this.#readableStreamController.close()\n\n      // 6.2. Error stream ’s writable stream with an \" InvalidStateError \" DOMException indicating that a closed WebSocketStream cannot be written to.\n      if (!this.#writableStream.locked) {\n        this.#writableStream.abort(new DOMException('A closed WebSocketStream cannot be written to', 'InvalidStateError'))\n      }\n\n      // 6.3. Resolve stream ’s closed promise with WebSocketCloseInfo «[ \" closeCode \" → code , \" reason \" → reason ]».\n      this.#closedPromise.resolve({\n        closeCode: code,\n        reason\n      })\n    } else {\n      // 7. Otherwise,\n\n      // 7.1. Let error be a new WebSocketError whose closeCode is code and reason is reason .\n      const error = createUnvalidatedWebSocketError('unclean close', code, reason)\n\n      // 7.2. Error stream ’s readable stream with error .\n      this.#readableStreamController?.error(error)\n\n      // 7.3. Error stream ’s writable stream with error .\n      this.#writableStream?.abort(error)\n\n      // 7.4. Reject stream ’s closed promise with error .\n      this.#closedPromise.reject(error)\n    }\n  }\n\n  #closeUsingReason (reason) {\n    // 1. Let code be null.\n    let code = null\n\n    // 2. Let reasonString be the empty string.\n    let reasonString = ''\n\n    // 3. If reason implements WebSocketError ,\n    if (webidl.is.WebSocketError(reason)) {\n      // 3.1. Set code to reason ’s closeCode .\n      code = reason.closeCode\n\n      // 3.2. Set reasonString to reason ’s reason .\n      reasonString = reason.reason\n    }\n\n    // 4. Close the WebSocket with stream , code , and reasonString . If this throws an exception,\n    //    discard code and reasonString and close the WebSocket with stream .\n    closeWebSocketConnection(this.#handler, code, reasonString)\n  }\n\n  //  To cancel a WebSocketStream stream given reason , close using reason giving stream and reason .\n  #cancel (reason) {\n    this.#closeUsingReason(reason)\n  }\n}\n\nObject.defineProperties(WebSocketStream.prototype, {\n  url: kEnumerableProperty,\n  opened: kEnumerableProperty,\n  closed: kEnumerableProperty,\n  close: kEnumerableProperty,\n  [Symbol.toStringTag]: {\n    value: 'WebSocketStream',\n    writable: false,\n    enumerable: false,\n    configurable: true\n  }\n})\n\nwebidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([\n  {\n    key: 'protocols',\n    converter: webidl.sequenceConverter(webidl.converters.USVString),\n    defaultValue: () => []\n  },\n  {\n    key: 'signal',\n    converter: webidl.nullableConverter(webidl.converters.AbortSignal),\n    defaultValue: () => null\n  }\n])\n\nwebidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([\n  {\n    key: 'closeCode',\n    converter: (V) => webidl.converters['unsigned short'](V, webidl.attributes.EnforceRange)\n  },\n  {\n    key: 'reason',\n    converter: webidl.converters.USVString,\n    defaultValue: () => ''\n  }\n])\n\nwebidl.converters.WebSocketStreamWrite = function (V) {\n  if (typeof V === 'string') {\n    return webidl.converters.USVString(V)\n  }\n\n  return webidl.converters.BufferSource(V)\n}\n\nmodule.exports = { WebSocketStream }\n","'use strict'\n\n/**\n * Checks if the given value is a valid LastEventId.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidLastEventId (value) {\n  // LastEventId should not contain U+0000 NULL\n  return value.indexOf('\\u0000') === -1\n}\n\n/**\n * Checks if the given value is a base 10 digit.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isASCIINumber (value) {\n  if (value.length === 0) return false\n  for (let i = 0; i < value.length; i++) {\n    if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false\n  }\n  return true\n}\n\nmodule.exports = {\n  isValidLastEventId,\n  isASCIINumber\n}\n","'use strict'\nconst { Transform } = require('node:stream')\nconst { isASCIINumber, isValidLastEventId } = require('./util')\n\n/**\n * @type {number[]} BOM\n */\nconst BOM = [0xEF, 0xBB, 0xBF]\n/**\n * @type {10} LF\n */\nconst LF = 0x0A\n/**\n * @type {13} CR\n */\nconst CR = 0x0D\n/**\n * @type {58} COLON\n */\nconst COLON = 0x3A\n/**\n * @type {32} SPACE\n */\nconst SPACE = 0x20\n\n/**\n * @typedef {object} EventSourceStreamEvent\n * @type {object}\n * @property {string} [event] The event type.\n * @property {string} [data] The data of the message.\n * @property {string} [id] A unique ID for the event.\n * @property {string} [retry] The reconnection time, in milliseconds.\n */\n\n/**\n * @typedef eventSourceSettings\n * @type {object}\n * @property {string} [lastEventId] The last event ID received from the server.\n * @property {string} [origin] The origin of the event source.\n * @property {number} [reconnectionTime] The reconnection time, in milliseconds.\n */\n\nclass EventSourceStream extends Transform {\n  /**\n   * @type {eventSourceSettings}\n   */\n  state\n\n  /**\n   * Leading byte-order-mark check.\n   * @type {boolean}\n   */\n  checkBOM = true\n\n  /**\n   * @type {boolean}\n   */\n  crlfCheck = false\n\n  /**\n   * @type {boolean}\n   */\n  eventEndCheck = false\n\n  /**\n   * @type {Buffer|null}\n   */\n  buffer = null\n\n  pos = 0\n\n  event = {\n    data: undefined,\n    event: undefined,\n    id: undefined,\n    retry: undefined\n  }\n\n  /**\n   * @param {object} options\n   * @param {boolean} [options.readableObjectMode]\n   * @param {eventSourceSettings} [options.eventSourceSettings]\n   * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]\n   */\n  constructor (options = {}) {\n    // Enable object mode as EventSourceStream emits objects of shape\n    // EventSourceStreamEvent\n    options.readableObjectMode = true\n\n    super(options)\n\n    this.state = options.eventSourceSettings || {}\n    if (options.push) {\n      this.push = options.push\n    }\n  }\n\n  /**\n   * @param {Buffer} chunk\n   * @param {string} _encoding\n   * @param {Function} callback\n   * @returns {void}\n   */\n  _transform (chunk, _encoding, callback) {\n    if (chunk.length === 0) {\n      callback()\n      return\n    }\n\n    // Cache the chunk in the buffer, as the data might not be complete while\n    // processing it\n    // TODO: Investigate if there is a more performant way to handle\n    // incoming chunks\n    // see: https://github.com/nodejs/undici/issues/2630\n    if (this.buffer) {\n      this.buffer = Buffer.concat([this.buffer, chunk])\n    } else {\n      this.buffer = chunk\n    }\n\n    // Strip leading byte-order-mark if we opened the stream and started\n    // the processing of the incoming data\n    if (this.checkBOM) {\n      switch (this.buffer.length) {\n        case 1:\n          // Check if the first byte is the same as the first byte of the BOM\n          if (this.buffer[0] === BOM[0]) {\n            // If it is, we need to wait for more data\n            callback()\n            return\n          }\n          // Set the checkBOM flag to false as we don't need to check for the\n          // BOM anymore\n          this.checkBOM = false\n\n          // The buffer only contains one byte so we need to wait for more data\n          callback()\n          return\n        case 2:\n          // Check if the first two bytes are the same as the first two bytes\n          // of the BOM\n          if (\n            this.buffer[0] === BOM[0] &&\n            this.buffer[1] === BOM[1]\n          ) {\n            // If it is, we need to wait for more data, because the third byte\n            // is needed to determine if it is the BOM or not\n            callback()\n            return\n          }\n\n          // Set the checkBOM flag to false as we don't need to check for the\n          // BOM anymore\n          this.checkBOM = false\n          break\n        case 3:\n          // Check if the first three bytes are the same as the first three\n          // bytes of the BOM\n          if (\n            this.buffer[0] === BOM[0] &&\n            this.buffer[1] === BOM[1] &&\n            this.buffer[2] === BOM[2]\n          ) {\n            // If it is, we can drop the buffered data, as it is only the BOM\n            this.buffer = Buffer.alloc(0)\n            // Set the checkBOM flag to false as we don't need to check for the\n            // BOM anymore\n            this.checkBOM = false\n\n            // Await more data\n            callback()\n            return\n          }\n          // If it is not the BOM, we can start processing the data\n          this.checkBOM = false\n          break\n        default:\n          // The buffer is longer than 3 bytes, so we can drop the BOM if it is\n          // present\n          if (\n            this.buffer[0] === BOM[0] &&\n            this.buffer[1] === BOM[1] &&\n            this.buffer[2] === BOM[2]\n          ) {\n            // Remove the BOM from the buffer\n            this.buffer = this.buffer.subarray(3)\n          }\n\n          // Set the checkBOM flag to false as we don't need to check for the\n          this.checkBOM = false\n          break\n      }\n    }\n\n    while (this.pos < this.buffer.length) {\n      // If the previous line ended with an end-of-line, we need to check\n      // if the next character is also an end-of-line.\n      if (this.eventEndCheck) {\n        // If the the current character is an end-of-line, then the event\n        // is finished and we can process it\n\n        // If the previous line ended with a carriage return, we need to\n        // check if the current character is a line feed and remove it\n        // from the buffer.\n        if (this.crlfCheck) {\n          // If the current character is a line feed, we can remove it\n          // from the buffer and reset the crlfCheck flag\n          if (this.buffer[this.pos] === LF) {\n            this.buffer = this.buffer.subarray(this.pos + 1)\n            this.pos = 0\n            this.crlfCheck = false\n\n            // It is possible that the line feed is not the end of the\n            // event. We need to check if the next character is an\n            // end-of-line character to determine if the event is\n            // finished. We simply continue the loop to check the next\n            // character.\n\n            // As we removed the line feed from the buffer and set the\n            // crlfCheck flag to false, we basically don't make any\n            // distinction between a line feed and a carriage return.\n            continue\n          }\n          this.crlfCheck = false\n        }\n\n        if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n          // If the current character is a carriage return, we need to\n          // set the crlfCheck flag to true, as we need to check if the\n          // next character is a line feed so we can remove it from the\n          // buffer\n          if (this.buffer[this.pos] === CR) {\n            this.crlfCheck = true\n          }\n\n          this.buffer = this.buffer.subarray(this.pos + 1)\n          this.pos = 0\n          if (\n            this.event.data !== undefined || this.event.event || this.event.id !== undefined || this.event.retry) {\n            this.processEvent(this.event)\n          }\n          this.clearEvent()\n          continue\n        }\n        // If the current character is not an end-of-line, then the event\n        // is not finished and we have to reset the eventEndCheck flag\n        this.eventEndCheck = false\n        continue\n      }\n\n      // If the current character is an end-of-line, we can process the\n      // line\n      if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n        // If the current character is a carriage return, we need to\n        // set the crlfCheck flag to true, as we need to check if the\n        // next character is a line feed\n        if (this.buffer[this.pos] === CR) {\n          this.crlfCheck = true\n        }\n\n        // In any case, we can process the line as we reached an\n        // end-of-line character\n        this.parseLine(this.buffer.subarray(0, this.pos), this.event)\n\n        // Remove the processed line from the buffer\n        this.buffer = this.buffer.subarray(this.pos + 1)\n        // Reset the position as we removed the processed line from the buffer\n        this.pos = 0\n        // A line was processed and this could be the end of the event. We need\n        // to check if the next line is empty to determine if the event is\n        // finished.\n        this.eventEndCheck = true\n        continue\n      }\n\n      this.pos++\n    }\n\n    callback()\n  }\n\n  /**\n   * @param {Buffer} line\n   * @param {EventSourceStreamEvent} event\n   */\n  parseLine (line, event) {\n    // If the line is empty (a blank line)\n    // Dispatch the event, as defined below.\n    // This will be handled in the _transform method\n    if (line.length === 0) {\n      return\n    }\n\n    // If the line starts with a U+003A COLON character (:)\n    // Ignore the line.\n    const colonPosition = line.indexOf(COLON)\n    if (colonPosition === 0) {\n      return\n    }\n\n    let field = ''\n    let value = ''\n\n    // If the line contains a U+003A COLON character (:)\n    if (colonPosition !== -1) {\n      // Collect the characters on the line before the first U+003A COLON\n      // character (:), and let field be that string.\n      // TODO: Investigate if there is a more performant way to extract the\n      // field\n      // see: https://github.com/nodejs/undici/issues/2630\n      field = line.subarray(0, colonPosition).toString('utf8')\n\n      // Collect the characters on the line after the first U+003A COLON\n      // character (:), and let value be that string.\n      // If value starts with a U+0020 SPACE character, remove it from value.\n      let valueStart = colonPosition + 1\n      if (line[valueStart] === SPACE) {\n        ++valueStart\n      }\n      // TODO: Investigate if there is a more performant way to extract the\n      // value\n      // see: https://github.com/nodejs/undici/issues/2630\n      value = line.subarray(valueStart).toString('utf8')\n\n      // Otherwise, the string is not empty but does not contain a U+003A COLON\n      // character (:)\n    } else {\n      // Process the field using the steps described below, using the whole\n      // line as the field name, and the empty string as the field value.\n      field = line.toString('utf8')\n      value = ''\n    }\n\n    // Modify the event with the field name and value. The value is also\n    // decoded as UTF-8\n    switch (field) {\n      case 'data':\n        if (event[field] === undefined) {\n          event[field] = value\n        } else {\n          event[field] += `\\n${value}`\n        }\n        break\n      case 'retry':\n        if (isASCIINumber(value)) {\n          event[field] = value\n        }\n        break\n      case 'id':\n        if (isValidLastEventId(value)) {\n          event[field] = value\n        }\n        break\n      case 'event':\n        if (value.length > 0) {\n          event[field] = value\n        }\n        break\n    }\n  }\n\n  /**\n   * @param {EventSourceStreamEvent} event\n   */\n  processEvent (event) {\n    if (event.retry && isASCIINumber(event.retry)) {\n      this.state.reconnectionTime = parseInt(event.retry, 10)\n    }\n\n    if (event.id !== undefined && isValidLastEventId(event.id)) {\n      this.state.lastEventId = event.id\n    }\n\n    // only dispatch event, when data is provided\n    if (event.data !== undefined) {\n      this.push({\n        type: event.event || 'message',\n        options: {\n          data: event.data,\n          lastEventId: this.state.lastEventId,\n          origin: this.state.origin\n        }\n      })\n    }\n  }\n\n  clearEvent () {\n    this.event = {\n      data: undefined,\n      event: undefined,\n      id: undefined,\n      retry: undefined\n    }\n  }\n}\n\nmodule.exports = {\n  EventSourceStream\n}\n","'use strict'\n\nconst { pipeline } = require('node:stream')\nconst { fetching } = require('../fetch')\nconst { makeRequest } = require('../fetch/request')\nconst { webidl } = require('../webidl')\nconst { EventSourceStream } = require('./eventsource-stream')\nconst { parseMIMEType } = require('../fetch/data-url')\nconst { createFastMessageEvent } = require('../websocket/events')\nconst { isNetworkError } = require('../fetch/response')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { environmentSettingsObject } = require('../fetch/util')\n\nlet experimentalWarned = false\n\n/**\n * A reconnection time, in milliseconds. This must initially be an implementation-defined value,\n * probably in the region of a few seconds.\n *\n * In Comparison:\n * - Chrome uses 3000ms.\n * - Deno uses 5000ms.\n *\n * @type {3000}\n */\nconst defaultReconnectionTime = 3000\n\n/**\n * The readyState attribute represents the state of the connection.\n * @typedef ReadyState\n * @type {0|1|2}\n * @readonly\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev\n */\n\n/**\n * The connection has not yet been established, or it was closed and the user\n * agent is reconnecting.\n * @type {0}\n */\nconst CONNECTING = 0\n\n/**\n * The user agent has an open connection and is dispatching events as it\n * receives them.\n * @type {1}\n */\nconst OPEN = 1\n\n/**\n * The connection is not open, and the user agent is not trying to reconnect.\n * @type {2}\n */\nconst CLOSED = 2\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"same-origin\".\n * @type {'anonymous'}\n */\nconst ANONYMOUS = 'anonymous'\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"include\".\n * @type {'use-credentials'}\n */\nconst USE_CREDENTIALS = 'use-credentials'\n\n/**\n * The EventSource interface is used to receive server-sent events. It\n * connects to a server over HTTP and receives events in text/event-stream\n * format without closing the connection.\n * @extends {EventTarget}\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n * @api public\n */\nclass EventSource extends EventTarget {\n  #events = {\n    open: null,\n    error: null,\n    message: null\n  }\n\n  #url\n  #withCredentials = false\n\n  /**\n   * @type {ReadyState}\n   */\n  #readyState = CONNECTING\n\n  #request = null\n  #controller = null\n\n  #dispatcher\n\n  /**\n   * @type {import('./eventsource-stream').eventSourceSettings}\n   */\n  #state\n\n  /**\n   * Creates a new EventSource object.\n   * @param {string} url\n   * @param {EventSourceInit} [eventSourceInitDict={}]\n   * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface\n   */\n  constructor (url, eventSourceInitDict = {}) {\n    // 1. Let ev be a new EventSource object.\n    super()\n\n    webidl.util.markAsUncloneable(this)\n\n    const prefix = 'EventSource constructor'\n    webidl.argumentLengthCheck(arguments, 1, prefix)\n\n    if (!experimentalWarned) {\n      experimentalWarned = true\n      process.emitWarning('EventSource is experimental, expect them to change at any time.', {\n        code: 'UNDICI-ES'\n      })\n    }\n\n    url = webidl.converters.USVString(url)\n    eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict')\n\n    this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher\n    this.#state = {\n      lastEventId: '',\n      reconnectionTime: eventSourceInitDict.node.reconnectionTime\n    }\n\n    // 2. Let settings be ev's relevant settings object.\n    // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object\n    const settings = environmentSettingsObject\n\n    let urlRecord\n\n    try {\n      // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.\n      urlRecord = new URL(url, settings.settingsObject.baseUrl)\n      this.#state.origin = urlRecord.origin\n    } catch (e) {\n      // 4. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n      throw new DOMException(e, 'SyntaxError')\n    }\n\n    // 5. Set ev's url to urlRecord.\n    this.#url = urlRecord.href\n\n    // 6. Let corsAttributeState be Anonymous.\n    let corsAttributeState = ANONYMOUS\n\n    // 7. If the value of eventSourceInitDict's withCredentials member is true,\n    // then set corsAttributeState to Use Credentials and set ev's\n    // withCredentials attribute to true.\n    if (eventSourceInitDict.withCredentials === true) {\n      corsAttributeState = USE_CREDENTIALS\n      this.#withCredentials = true\n    }\n\n    // 8. Let request be the result of creating a potential-CORS request given\n    // urlRecord, the empty string, and corsAttributeState.\n    const initRequest = {\n      redirect: 'follow',\n      keepalive: true,\n      // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes\n      mode: 'cors',\n      credentials: corsAttributeState === 'anonymous'\n        ? 'same-origin'\n        : 'omit',\n      referrer: 'no-referrer'\n    }\n\n    // 9. Set request's client to settings.\n    initRequest.client = environmentSettingsObject.settingsObject\n\n    // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list.\n    initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]\n\n    // 11. Set request's cache mode to \"no-store\".\n    initRequest.cache = 'no-store'\n\n    // 12. Set request's initiator type to \"other\".\n    initRequest.initiator = 'other'\n\n    initRequest.urlList = [new URL(this.#url)]\n\n    // 13. Set ev's request to request.\n    this.#request = makeRequest(initRequest)\n\n    this.#connect()\n  }\n\n  /**\n   * Returns the state of this EventSource object's connection. It can have the\n   * values described below.\n   * @returns {ReadyState}\n   * @readonly\n   */\n  get readyState () {\n    return this.#readyState\n  }\n\n  /**\n   * Returns the URL providing the event stream.\n   * @readonly\n   * @returns {string}\n   */\n  get url () {\n    return this.#url\n  }\n\n  /**\n   * Returns a boolean indicating whether the EventSource object was\n   * instantiated with CORS credentials set (true), or not (false, the default).\n   */\n  get withCredentials () {\n    return this.#withCredentials\n  }\n\n  #connect () {\n    if (this.#readyState === CLOSED) return\n\n    this.#readyState = CONNECTING\n\n    const fetchParams = {\n      request: this.#request,\n      dispatcher: this.#dispatcher\n    }\n\n    // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.\n    const processEventSourceEndOfBody = (response) => {\n      if (!isNetworkError(response)) {\n        return this.#reconnect()\n      }\n    }\n\n    // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...\n    fetchParams.processResponseEndOfBody = processEventSourceEndOfBody\n\n    // and processResponse set to the following steps given response res:\n    fetchParams.processResponse = (response) => {\n      // 1. If res is an aborted network error, then fail the connection.\n\n      if (isNetworkError(response)) {\n        // 1. When a user agent is to fail the connection, the user agent\n        // must queue a task which, if the readyState attribute is set to a\n        // value other than CLOSED, sets the readyState attribute to CLOSED\n        // and fires an event named error at the EventSource object. Once the\n        // user agent has failed the connection, it does not attempt to\n        // reconnect.\n        if (response.aborted) {\n          this.close()\n          this.dispatchEvent(new Event('error'))\n          return\n          // 2. Otherwise, if res is a network error, then reestablish the\n          // connection, unless the user agent knows that to be futile, in\n          // which case the user agent may fail the connection.\n        } else {\n          this.#reconnect()\n          return\n        }\n      }\n\n      // 3. Otherwise, if res's status is not 200, or if res's `Content-Type`\n      // is not `text/event-stream`, then fail the connection.\n      const contentType = response.headersList.get('content-type', true)\n      const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'\n      const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'\n      if (\n        response.status !== 200 ||\n        contentTypeValid === false\n      ) {\n        this.close()\n        this.dispatchEvent(new Event('error'))\n        return\n      }\n\n      // 4. Otherwise, announce the connection and interpret res's body\n      // line by line.\n\n      // When a user agent is to announce the connection, the user agent\n      // must queue a task which, if the readyState attribute is set to a\n      // value other than CLOSED, sets the readyState attribute to OPEN\n      // and fires an event named open at the EventSource object.\n      // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n      this.#readyState = OPEN\n      this.dispatchEvent(new Event('open'))\n\n      // If redirected to a different origin, set the origin to the new origin.\n      this.#state.origin = response.urlList[response.urlList.length - 1].origin\n\n      const eventSourceStream = new EventSourceStream({\n        eventSourceSettings: this.#state,\n        push: (event) => {\n          this.dispatchEvent(createFastMessageEvent(\n            event.type,\n            event.options\n          ))\n        }\n      })\n\n      pipeline(response.body.stream,\n        eventSourceStream,\n        (error) => {\n          if (\n            error?.aborted === false\n          ) {\n            this.close()\n            this.dispatchEvent(new Event('error'))\n          }\n        })\n    }\n\n    this.#controller = fetching(fetchParams)\n  }\n\n  /**\n   * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n   * @returns {void}\n   */\n  #reconnect () {\n    // When a user agent is to reestablish the connection, the user agent must\n    // run the following steps. These steps are run in parallel, not as part of\n    // a task. (The tasks that it queues, of course, are run like normal tasks\n    // and not themselves in parallel.)\n\n    // 1. Queue a task to run the following steps:\n\n    //   1. If the readyState attribute is set to CLOSED, abort the task.\n    if (this.#readyState === CLOSED) return\n\n    //   2. Set the readyState attribute to CONNECTING.\n    this.#readyState = CONNECTING\n\n    //   3. Fire an event named error at the EventSource object.\n    this.dispatchEvent(new Event('error'))\n\n    // 2. Wait a delay equal to the reconnection time of the event source.\n    setTimeout(() => {\n      // 5. Queue a task to run the following steps:\n\n      //   1. If the EventSource object's readyState attribute is not set to\n      //      CONNECTING, then return.\n      if (this.#readyState !== CONNECTING) return\n\n      //   2. Let request be the EventSource object's request.\n      //   3. If the EventSource object's last event ID string is not the empty\n      //      string, then:\n      //      1. Let lastEventIDValue be the EventSource object's last event ID\n      //         string, encoded as UTF-8.\n      //      2. Set (`Last-Event-ID`, lastEventIDValue) in request's header\n      //         list.\n      if (this.#state.lastEventId.length) {\n        this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)\n      }\n\n      //   4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.\n      this.#connect()\n    }, this.#state.reconnectionTime)?.unref()\n  }\n\n  /**\n   * Closes the connection, if any, and sets the readyState attribute to\n   * CLOSED.\n   */\n  close () {\n    webidl.brandCheck(this, EventSource)\n\n    if (this.#readyState === CLOSED) return\n    this.#readyState = CLOSED\n    this.#controller.abort()\n    this.#request = null\n  }\n\n  get onopen () {\n    return this.#events.open\n  }\n\n  set onopen (fn) {\n    if (this.#events.open) {\n      this.removeEventListener('open', this.#events.open)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('open', listener)\n      this.#events.open = fn\n    } else {\n      this.#events.open = null\n    }\n  }\n\n  get onmessage () {\n    return this.#events.message\n  }\n\n  set onmessage (fn) {\n    if (this.#events.message) {\n      this.removeEventListener('message', this.#events.message)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('message', listener)\n      this.#events.message = fn\n    } else {\n      this.#events.message = null\n    }\n  }\n\n  get onerror () {\n    return this.#events.error\n  }\n\n  set onerror (fn) {\n    if (this.#events.error) {\n      this.removeEventListener('error', this.#events.error)\n    }\n\n    const listener = webidl.converters.EventHandlerNonNull(fn)\n\n    if (listener !== null) {\n      this.addEventListener('error', listener)\n      this.#events.error = fn\n    } else {\n      this.#events.error = null\n    }\n  }\n}\n\nconst constantsPropertyDescriptors = {\n  CONNECTING: {\n    __proto__: null,\n    configurable: false,\n    enumerable: true,\n    value: CONNECTING,\n    writable: false\n  },\n  OPEN: {\n    __proto__: null,\n    configurable: false,\n    enumerable: true,\n    value: OPEN,\n    writable: false\n  },\n  CLOSED: {\n    __proto__: null,\n    configurable: false,\n    enumerable: true,\n    value: CLOSED,\n    writable: false\n  }\n}\n\nObject.defineProperties(EventSource, constantsPropertyDescriptors)\nObject.defineProperties(EventSource.prototype, constantsPropertyDescriptors)\n\nObject.defineProperties(EventSource.prototype, {\n  close: kEnumerableProperty,\n  onerror: kEnumerableProperty,\n  onmessage: kEnumerableProperty,\n  onopen: kEnumerableProperty,\n  readyState: kEnumerableProperty,\n  url: kEnumerableProperty,\n  withCredentials: kEnumerableProperty\n})\n\nwebidl.converters.EventSourceInitDict = webidl.dictionaryConverter([\n  {\n    key: 'withCredentials',\n    converter: webidl.converters.boolean,\n    defaultValue: () => false\n  },\n  {\n    key: 'dispatcher', // undici only\n    converter: webidl.converters.any\n  },\n  {\n    key: 'node', // undici only\n    converter: webidl.dictionaryConverter([\n      {\n        key: 'reconnectionTime',\n        converter: webidl.converters['unsigned long'],\n        defaultValue: () => defaultReconnectionTime\n      },\n      {\n        key: 'dispatcher',\n        converter: webidl.converters.any\n      }\n    ]),\n    defaultValue: () => ({})\n  }\n])\n\nmodule.exports = {\n  EventSource,\n  defaultReconnectionTime\n}\n","'use strict'\n\nconst Client = require('./lib/dispatcher/client')\nconst Dispatcher = require('./lib/dispatcher/dispatcher')\nconst Pool = require('./lib/dispatcher/pool')\nconst BalancedPool = require('./lib/dispatcher/balanced-pool')\nconst RoundRobinPool = require('./lib/dispatcher/round-robin-pool')\nconst Agent = require('./lib/dispatcher/agent')\nconst ProxyAgent = require('./lib/dispatcher/proxy-agent')\nconst Socks5ProxyAgent = require('./lib/dispatcher/socks5-proxy-agent')\nconst EnvHttpProxyAgent = require('./lib/dispatcher/env-http-proxy-agent')\nconst RetryAgent = require('./lib/dispatcher/retry-agent')\nconst H2CClient = require('./lib/dispatcher/h2c-client')\nconst errors = require('./lib/core/errors')\nconst util = require('./lib/core/util')\nconst { InvalidArgumentError } = errors\nconst api = require('./lib/api')\nconst buildConnector = require('./lib/core/connect')\nconst MockClient = require('./lib/mock/mock-client')\nconst { MockCallHistory, MockCallHistoryLog } = require('./lib/mock/mock-call-history')\nconst MockAgent = require('./lib/mock/mock-agent')\nconst MockPool = require('./lib/mock/mock-pool')\nconst SnapshotAgent = require('./lib/mock/snapshot-agent')\nconst mockErrors = require('./lib/mock/mock-errors')\nconst RetryHandler = require('./lib/handler/retry-handler')\nconst { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')\nconst DecoratorHandler = require('./lib/handler/decorator-handler')\nconst RedirectHandler = require('./lib/handler/redirect-handler')\n\nObject.assign(Dispatcher.prototype, api)\n\nmodule.exports.Dispatcher = Dispatcher\nmodule.exports.Client = Client\nmodule.exports.Pool = Pool\nmodule.exports.BalancedPool = BalancedPool\nmodule.exports.RoundRobinPool = RoundRobinPool\nmodule.exports.Agent = Agent\nmodule.exports.ProxyAgent = ProxyAgent\nmodule.exports.Socks5ProxyAgent = Socks5ProxyAgent\nmodule.exports.EnvHttpProxyAgent = EnvHttpProxyAgent\nmodule.exports.RetryAgent = RetryAgent\nmodule.exports.H2CClient = H2CClient\nmodule.exports.RetryHandler = RetryHandler\n\nmodule.exports.DecoratorHandler = DecoratorHandler\nmodule.exports.RedirectHandler = RedirectHandler\nmodule.exports.interceptors = {\n  redirect: require('./lib/interceptor/redirect'),\n  responseError: require('./lib/interceptor/response-error'),\n  retry: require('./lib/interceptor/retry'),\n  dump: require('./lib/interceptor/dump'),\n  dns: require('./lib/interceptor/dns'),\n  cache: require('./lib/interceptor/cache'),\n  decompress: require('./lib/interceptor/decompress'),\n  deduplicate: require('./lib/interceptor/deduplicate')\n}\n\nmodule.exports.cacheStores = {\n  MemoryCacheStore: require('./lib/cache/memory-cache-store')\n}\n\nconst SqliteCacheStore = require('./lib/cache/sqlite-cache-store')\nmodule.exports.cacheStores.SqliteCacheStore = SqliteCacheStore\n\nmodule.exports.buildConnector = buildConnector\nmodule.exports.errors = errors\nmodule.exports.util = {\n  parseHeaders: util.parseHeaders,\n  headerNameToString: util.headerNameToString\n}\n\nfunction makeDispatcher (fn) {\n  return (url, opts, handler) => {\n    if (typeof opts === 'function') {\n      handler = opts\n      opts = null\n    }\n\n    if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {\n      throw new InvalidArgumentError('invalid url')\n    }\n\n    if (opts != null && typeof opts !== 'object') {\n      throw new InvalidArgumentError('invalid opts')\n    }\n\n    if (opts && opts.path != null) {\n      if (typeof opts.path !== 'string') {\n        throw new InvalidArgumentError('invalid opts.path')\n      }\n\n      let path = opts.path\n      if (!opts.path.startsWith('/')) {\n        path = `/${path}`\n      }\n\n      url = new URL(util.parseOrigin(url).origin + path)\n    } else {\n      if (!opts) {\n        opts = typeof url === 'object' ? url : {}\n      }\n\n      url = util.parseURL(url)\n    }\n\n    const { agent, dispatcher = getGlobalDispatcher() } = opts\n\n    if (agent) {\n      throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')\n    }\n\n    return fn.call(dispatcher, {\n      ...opts,\n      origin: url.origin,\n      path: url.search ? `${url.pathname}${url.search}` : url.pathname,\n      method: opts.method || (opts.body ? 'PUT' : 'GET')\n    }, handler)\n  }\n}\n\nmodule.exports.setGlobalDispatcher = setGlobalDispatcher\nmodule.exports.getGlobalDispatcher = getGlobalDispatcher\n\nconst fetchImpl = require('./lib/web/fetch').fetch\n\n// Capture __filename at module load time for stack trace augmentation.\n// This may be undefined when bundled in environments like Node.js internals.\nconst currentFilename = typeof __filename !== 'undefined' ? __filename : undefined\n\nfunction appendFetchStackTrace (err, filename) {\n  if (!err || typeof err !== 'object') {\n    return\n  }\n\n  const stack = typeof err.stack === 'string' ? err.stack : ''\n  const normalizedFilename = filename.replace(/\\\\/g, '/')\n\n  if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) {\n    return\n  }\n\n  const capture = {}\n  Error.captureStackTrace(capture, appendFetchStackTrace)\n\n  if (!capture.stack) {\n    return\n  }\n\n  const captureLines = capture.stack.split('\\n').slice(1).join('\\n')\n\n  err.stack = stack ? `${stack}\\n${captureLines}` : capture.stack\n}\n\nmodule.exports.fetch = function fetch (init, options = undefined) {\n  return fetchImpl(init, options).catch(err => {\n    if (currentFilename) {\n      appendFetchStackTrace(err, currentFilename)\n    } else if (err && typeof err === 'object') {\n      Error.captureStackTrace(err, module.exports.fetch)\n    }\n    throw err\n  })\n}\nmodule.exports.Headers = require('./lib/web/fetch/headers').Headers\nmodule.exports.Response = require('./lib/web/fetch/response').Response\nmodule.exports.Request = require('./lib/web/fetch/request').Request\nmodule.exports.FormData = require('./lib/web/fetch/formdata').FormData\n\nconst { setGlobalOrigin, getGlobalOrigin } = require('./lib/web/fetch/global')\n\nmodule.exports.setGlobalOrigin = setGlobalOrigin\nmodule.exports.getGlobalOrigin = getGlobalOrigin\n\nconst { CacheStorage } = require('./lib/web/cache/cachestorage')\nconst { kConstruct } = require('./lib/core/symbols')\n\nmodule.exports.caches = new CacheStorage(kConstruct)\n\nconst { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require('./lib/web/cookies')\n\nmodule.exports.deleteCookie = deleteCookie\nmodule.exports.getCookies = getCookies\nmodule.exports.getSetCookies = getSetCookies\nmodule.exports.setCookie = setCookie\nmodule.exports.parseCookie = parseCookie\n\nconst { parseMIMEType, serializeAMimeType } = require('./lib/web/fetch/data-url')\n\nmodule.exports.parseMIMEType = parseMIMEType\nmodule.exports.serializeAMimeType = serializeAMimeType\n\nconst { CloseEvent, ErrorEvent, MessageEvent } = require('./lib/web/websocket/events')\nconst { WebSocket, ping } = require('./lib/web/websocket/websocket')\nmodule.exports.WebSocket = WebSocket\nmodule.exports.CloseEvent = CloseEvent\nmodule.exports.ErrorEvent = ErrorEvent\nmodule.exports.MessageEvent = MessageEvent\nmodule.exports.ping = ping\n\nmodule.exports.WebSocketStream = require('./lib/web/websocket/stream/websocketstream').WebSocketStream\nmodule.exports.WebSocketError = require('./lib/web/websocket/stream/websocketerror').WebSocketError\n\nmodule.exports.request = makeDispatcher(api.request)\nmodule.exports.stream = makeDispatcher(api.stream)\nmodule.exports.pipeline = makeDispatcher(api.pipeline)\nmodule.exports.connect = makeDispatcher(api.connect)\nmodule.exports.upgrade = makeDispatcher(api.upgrade)\n\nmodule.exports.MockClient = MockClient\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\nmodule.exports.MockPool = MockPool\nmodule.exports.MockAgent = MockAgent\nmodule.exports.SnapshotAgent = SnapshotAgent\nmodule.exports.mockErrors = mockErrors\n\nconst { EventSource } = require('./lib/web/eventsource/eventsource')\n\nmodule.exports.EventSource = EventSource\n\nfunction install () {\n  globalThis.fetch = module.exports.fetch\n  globalThis.Headers = module.exports.Headers\n  globalThis.Response = module.exports.Response\n  globalThis.Request = module.exports.Request\n  globalThis.FormData = module.exports.FormData\n  globalThis.WebSocket = module.exports.WebSocket\n  globalThis.CloseEvent = module.exports.CloseEvent\n  globalThis.ErrorEvent = module.exports.ErrorEvent\n  globalThis.MessageEvent = module.exports.MessageEvent\n  globalThis.EventSource = module.exports.EventSource\n}\n\nmodule.exports.install = install\n","{\n  \"name\": \"dotenv\",\n  \"version\": \"16.6.1\",\n  \"description\": \"Loads environment variables from .env file\",\n  \"main\": \"lib/main.js\",\n  \"types\": \"lib/main.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/main.d.ts\",\n      \"require\": \"./lib/main.js\",\n      \"default\": \"./lib/main.js\"\n    },\n    \"./config\": \"./config.js\",\n    \"./config.js\": \"./config.js\",\n    \"./lib/env-options\": \"./lib/env-options.js\",\n    \"./lib/env-options.js\": \"./lib/env-options.js\",\n    \"./lib/cli-options\": \"./lib/cli-options.js\",\n    \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"scripts\": {\n    \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n    \"lint\": \"standard\",\n    \"pretest\": \"npm run lint && npm run dts-check\",\n    \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n    \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov\",\n    \"prerelease\": \"npm test\",\n    \"release\": \"standard-version\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/motdotla/dotenv.git\"\n  },\n  \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n  \"funding\": \"https://dotenvx.com\",\n  \"keywords\": [\n    \"dotenv\",\n    \"env\",\n    \".env\",\n    \"environment\",\n    \"variables\",\n    \"config\",\n    \"settings\"\n  ],\n  \"readmeFilename\": \"README.md\",\n  \"license\": \"BSD-2-Clause\",\n  \"devDependencies\": {\n    \"@types/node\": \"^18.11.3\",\n    \"decache\": \"^4.6.2\",\n    \"sinon\": \"^14.0.1\",\n    \"standard\": \"^17.0.0\",\n    \"standard-version\": \"^9.5.0\",\n    \"tap\": \"^19.2.0\",\n    \"typescript\": \"^4.8.4\"\n  },\n  \"engines\": {\n    \"node\": \">=12\"\n  },\n  \"browser\": {\n    \"fs\": false\n  }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n  const obj = {}\n\n  // Convert buffer to string\n  let lines = src.toString()\n\n  // Convert line breaks to same format\n  lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n  let match\n  while ((match = LINE.exec(lines)) != null) {\n    const key = match[1]\n\n    // Default undefined or null to empty string\n    let value = (match[2] || '')\n\n    // Remove whitespace\n    value = value.trim()\n\n    // Check if double quoted\n    const maybeQuote = value[0]\n\n    // Remove surrounding quotes\n    value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n    // Expand newlines if double quoted\n    if (maybeQuote === '\"') {\n      value = value.replace(/\\\\n/g, '\\n')\n      value = value.replace(/\\\\r/g, '\\r')\n    }\n\n    // Add to object\n    obj[key] = value\n  }\n\n  return obj\n}\n\nfunction _parseVault (options) {\n  options = options || {}\n\n  const vaultPath = _vaultPath(options)\n  options.path = vaultPath // parse .env.vault\n  const result = DotenvModule.configDotenv(options)\n  if (!result.parsed) {\n    const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n    err.code = 'MISSING_DATA'\n    throw err\n  }\n\n  // handle scenario for comma separated keys - for use with key rotation\n  // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n  const keys = _dotenvKey(options).split(',')\n  const length = keys.length\n\n  let decrypted\n  for (let i = 0; i < length; i++) {\n    try {\n      // Get full key\n      const key = keys[i].trim()\n\n      // Get instructions for decrypt\n      const attrs = _instructions(result, key)\n\n      // Decrypt\n      decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n      break\n    } catch (error) {\n      // last key\n      if (i + 1 >= length) {\n        throw error\n      }\n      // try next key\n    }\n  }\n\n  // Parse decrypted .env string\n  return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n  console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n  console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n  console.log(`[dotenv@${version}] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n  // prioritize developer directly setting options.DOTENV_KEY\n  if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n    return options.DOTENV_KEY\n  }\n\n  // secondary infra already contains a DOTENV_KEY environment variable\n  if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n    return process.env.DOTENV_KEY\n  }\n\n  // fallback to empty string\n  return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n  // Parse DOTENV_KEY. Format is a URI\n  let uri\n  try {\n    uri = new URL(dotenvKey)\n  } catch (error) {\n    if (error.code === 'ERR_INVALID_URL') {\n      const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n      err.code = 'INVALID_DOTENV_KEY'\n      throw err\n    }\n\n    throw error\n  }\n\n  // Get decrypt key\n  const key = uri.password\n  if (!key) {\n    const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n    err.code = 'INVALID_DOTENV_KEY'\n    throw err\n  }\n\n  // Get environment\n  const environment = uri.searchParams.get('environment')\n  if (!environment) {\n    const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n    err.code = 'INVALID_DOTENV_KEY'\n    throw err\n  }\n\n  // Get ciphertext payload\n  const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n  const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n  if (!ciphertext) {\n    const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n    err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n    throw err\n  }\n\n  return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n  let possibleVaultPath = null\n\n  if (options && options.path && options.path.length > 0) {\n    if (Array.isArray(options.path)) {\n      for (const filepath of options.path) {\n        if (fs.existsSync(filepath)) {\n          possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n        }\n      }\n    } else {\n      possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n    }\n  } else {\n    possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n  }\n\n  if (fs.existsSync(possibleVaultPath)) {\n    return possibleVaultPath\n  }\n\n  return null\n}\n\nfunction _resolveHome (envPath) {\n  return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n  const debug = Boolean(options && options.debug)\n  const quiet = options && 'quiet' in options ? options.quiet : true\n\n  if (debug || !quiet) {\n    _log('Loading env from encrypted .env.vault')\n  }\n\n  const parsed = DotenvModule._parseVault(options)\n\n  let processEnv = process.env\n  if (options && options.processEnv != null) {\n    processEnv = options.processEnv\n  }\n\n  DotenvModule.populate(processEnv, parsed, options)\n\n  return { parsed }\n}\n\nfunction configDotenv (options) {\n  const dotenvPath = path.resolve(process.cwd(), '.env')\n  let encoding = 'utf8'\n  const debug = Boolean(options && options.debug)\n  const quiet = options && 'quiet' in options ? options.quiet : true\n\n  if (options && options.encoding) {\n    encoding = options.encoding\n  } else {\n    if (debug) {\n      _debug('No encoding is specified. UTF-8 is used by default')\n    }\n  }\n\n  let optionPaths = [dotenvPath] // default, look for .env\n  if (options && options.path) {\n    if (!Array.isArray(options.path)) {\n      optionPaths = [_resolveHome(options.path)]\n    } else {\n      optionPaths = [] // reset default\n      for (const filepath of options.path) {\n        optionPaths.push(_resolveHome(filepath))\n      }\n    }\n  }\n\n  // Build the parsed data in a temporary object (because we need to return it).  Once we have the final\n  // parsed data, we will combine it with process.env (or options.processEnv if provided).\n  let lastError\n  const parsedAll = {}\n  for (const path of optionPaths) {\n    try {\n      // Specifying an encoding returns a string instead of a buffer\n      const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n      DotenvModule.populate(parsedAll, parsed, options)\n    } catch (e) {\n      if (debug) {\n        _debug(`Failed to load ${path} ${e.message}`)\n      }\n      lastError = e\n    }\n  }\n\n  let processEnv = process.env\n  if (options && options.processEnv != null) {\n    processEnv = options.processEnv\n  }\n\n  DotenvModule.populate(processEnv, parsedAll, options)\n\n  if (debug || !quiet) {\n    const keysCount = Object.keys(parsedAll).length\n    const shortPaths = []\n    for (const filePath of optionPaths) {\n      try {\n        const relative = path.relative(process.cwd(), filePath)\n        shortPaths.push(relative)\n      } catch (e) {\n        if (debug) {\n          _debug(`Failed to load ${filePath} ${e.message}`)\n        }\n        lastError = e\n      }\n    }\n\n    _log(`injecting env (${keysCount}) from ${shortPaths.join(',')}`)\n  }\n\n  if (lastError) {\n    return { parsed: parsedAll, error: lastError }\n  } else {\n    return { parsed: parsedAll }\n  }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n  // fallback to original dotenv if DOTENV_KEY is not set\n  if (_dotenvKey(options).length === 0) {\n    return DotenvModule.configDotenv(options)\n  }\n\n  const vaultPath = _vaultPath(options)\n\n  // dotenvKey exists but .env.vault file does not exist\n  if (!vaultPath) {\n    _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n    return DotenvModule.configDotenv(options)\n  }\n\n  return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n  const key = Buffer.from(keyStr.slice(-64), 'hex')\n  let ciphertext = Buffer.from(encrypted, 'base64')\n\n  const nonce = ciphertext.subarray(0, 12)\n  const authTag = ciphertext.subarray(-16)\n  ciphertext = ciphertext.subarray(12, -16)\n\n  try {\n    const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n    aesgcm.setAuthTag(authTag)\n    return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n  } catch (error) {\n    const isRange = error instanceof RangeError\n    const invalidKeyLength = error.message === 'Invalid key length'\n    const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n    if (isRange || invalidKeyLength) {\n      const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n      err.code = 'INVALID_DOTENV_KEY'\n      throw err\n    } else if (decryptionFailed) {\n      const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n      err.code = 'DECRYPTION_FAILED'\n      throw err\n    } else {\n      throw error\n    }\n  }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n  const debug = Boolean(options && options.debug)\n  const override = Boolean(options && options.override)\n\n  if (typeof parsed !== 'object') {\n    const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n    err.code = 'OBJECT_REQUIRED'\n    throw err\n  }\n\n  // Set process.env\n  for (const key of Object.keys(parsed)) {\n    if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n      if (override === true) {\n        processEnv[key] = parsed[key]\n      }\n\n      if (debug) {\n        if (override === true) {\n          _debug(`\"${key}\" is already defined and WAS overwritten`)\n        } else {\n          _debug(`\"${key}\" is already defined and was NOT overwritten`)\n        }\n      }\n    } else {\n      processEnv[key] = parsed[key]\n    }\n  }\n}\n\nconst DotenvModule = {\n  configDotenv,\n  _configVault,\n  _parseVault,\n  config,\n  decrypt,\n  parse,\n  populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","/**\n * The daemon's single home directory — the one stable, deterministic place for\n * ALL daemon state on a machine: identity, runtime state (file cursors, …),\n * the singleton lockfile, downloaded models, logs, and the staged binary.\n *\n * Default: `~/.modelstat`. Override with `MODELSTAT_HOME` to relocate everything\n * at once — e.g. `MODELSTAT_HOME=/opt/modelstat` for a system-wide, exactly-one-\n * per-server install.\n *\n * This deliberately replaces the old per-subsystem `conf` store, whose path\n * varied by OS (`~/Library/Preferences/<name>-nodejs` on macOS vs `~/.config`\n * on Linux) AND by project name (a rename from `modelstat-agent` →\n * `modelstat-daemon`, or a `-dev` build, silently orphaned state into a second\n * directory). One function, one location, identical on every platform — so state\n * can never fork again.\n */\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** Absolute path to the daemon home. `MODELSTAT_HOME` wins; else `~/.modelstat`. */\nexport function modelstatHome(): string {\n  const override = process.env.MODELSTAT_HOME?.trim();\n  return override && override.length > 0 ? override : join(homedir(), \".modelstat\");\n}\n\n/** A path inside the daemon home, e.g. `homePath(\"state.json\")`. */\nexport function homePath(...segments: string[]): string {\n  return join(modelstatHome(), ...segments);\n}\n","/**\n * Device identity — stable across reinstalls.\n *\n * Lives at ~/.modelstat/identity.json. Contains the fields a fresh\n * install needs to resume a previous enrollment without triggering\n * a new self-register (which would create a ghost device row in the\n * user's account).\n *\n * Lives under the single daemon home (`modelstatHome()`, default `~/.modelstat`,\n * relocatable via MODELSTAT_HOME) alongside `state.json` — see ./paths.ts. The\n * identity file holds a long-lived bearer, so it gets explicit chmod 0600.\n * Runtime bookkeeping (cursors, API-URL override) lives in the sibling\n * `state.json` (./runtime-state.ts); both share one location so state can't fork.\n */\n\nimport {\n  chmodSync,\n  mkdirSync,\n  readFileSync,\n  renameSync,\n  writeFileSync,\n  existsSync,\n} from \"node:fs\";\nimport { hostname as osHostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { modelstatHome } from \"./paths.js\";\n\nexport interface DeviceIdentity {\n  /** Daemon-generated UUIDv7. Stable across reinstalls. */\n  deviceUuid: string;\n  /** Server UUID returned from the register door, POST /v1/tokens. */\n  deviceId: string;\n  /** Long-lived Bearer (ds_live_…). Rotate via /v1/devices/me/rotate-secret. */\n  bearerToken: string;\n  /** Claim code surfaced to the user. Once the device is claimed, this stays\n   * non-null but the server returns `status: \"claimed\"` on /devices/me. */\n  claimCode: string | null;\n  claimUrl: string | null;\n  /** Hostname at the moment of self-register. Shown in the \"reuse\n   * existing device?\" prompt so the user can spot if they're about to\n   * reuse an identity that belongs to a different machine. */\n  hostname: string;\n  /** ISO timestamp. For audit + UI. */\n  createdAt: string;\n  /** Optional — set once the daemon discovers from /devices/me that the\n   * device is claimed. Just a display convenience. */\n  userEmail?: string | null;\n  /** Default routing org snapshot. Display-only. */\n  defaultOrgId?: string | null;\n}\n\nconst IDENTITY_FILE = join(modelstatHome(), \"identity.json\");\n\nfunction ensureRoot(): void {\n  mkdirSync(modelstatHome(), { recursive: true, mode: 0o700 });\n}\n\n/** Atomic write + chmod 0600. Refuses to overwrite silently — caller\n * should call `backupIdentity()` first if an existing file is present\n * and represents a different identity. */\nfunction writeAtomic(meta: DeviceIdentity): void {\n  ensureRoot();\n  const tmp = `${IDENTITY_FILE}.${process.pid}.tmp`;\n  writeFileSync(tmp, JSON.stringify(meta, null, 2), { mode: 0o600 });\n  renameSync(tmp, IDENTITY_FILE);\n  // rename preserves tmp's mode; extra chmod ensures it in case\n  // umask altered it on some platforms.\n  try {\n    chmodSync(IDENTITY_FILE, 0o600);\n  } catch {\n    /* best effort */\n  }\n}\n\nexport function identityPath(): string {\n  return IDENTITY_FILE;\n}\n\nexport function hasIdentityFile(): boolean {\n  return existsSync(IDENTITY_FILE);\n}\n\nfunction parseFile(): DeviceIdentity | null {\n  try {\n    const raw = readFileSync(IDENTITY_FILE, \"utf8\");\n    const obj = JSON.parse(raw) as Partial<DeviceIdentity>;\n    if (!obj.deviceUuid || !obj.deviceId || !obj.bearerToken) {\n      return null;\n    }\n    return {\n      deviceUuid: obj.deviceUuid,\n      deviceId: obj.deviceId,\n      bearerToken: obj.bearerToken,\n      claimCode: obj.claimCode ?? null,\n      claimUrl: obj.claimUrl ?? null,\n      hostname: obj.hostname ?? osHostname(),\n      createdAt: obj.createdAt ?? new Date().toISOString(),\n      userEmail: obj.userEmail ?? null,\n      defaultOrgId: obj.defaultOrgId ?? null,\n    };\n  } catch {\n    return null;\n  }\n}\n\n/** Read the canonical identity from `identity.json`, or null if absent. */\nexport function loadIdentity(): DeviceIdentity | null {\n  return parseFile();\n}\n\n/** Persist the current identity. Writes atomically; caller is\n * responsible for deciding whether an existing file should be backed\n * up first (e.g., user chose `--fresh`). */\nexport function saveIdentity(meta: DeviceIdentity): void {\n  writeAtomic(meta);\n}\n\n/**\n * Rename the current identity file to\n * `~/.modelstat/identity.json.bak-<ISO timestamp>`. Returns the backup\n * path if one was made, or null if no file existed to back up.\n */\nexport function backupIdentity(): string | null {\n  if (!existsSync(IDENTITY_FILE)) return null;\n  const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n  const dest = `${IDENTITY_FILE}.bak-${stamp}`;\n  renameSync(IDENTITY_FILE, dest);\n  return dest;\n}\n\n/** Partial update — read + merge + write. Use for stamping\n * userEmail / defaultOrgId / claim state changes without touching\n * the device_uuid + bearer. */\nexport function updateIdentity(patch: Partial<DeviceIdentity>): DeviceIdentity | null {\n  const current = parseFile();\n  if (!current) return null;\n  const merged: DeviceIdentity = { ...current, ...patch };\n  writeAtomic(merged);\n  return merged;\n}\n","/**\n * Per-install runtime state — file cursors, the resolved API URL override, the\n * lifetime segments-sent counter, and the processing-pipeline version marker.\n *\n * Lives at `<modelstatHome()>/state.json` (default `~/.modelstat/state.json`),\n * right next to `identity.json`. This replaces the old `conf` store, which lived\n * at an OS- and project-name-specific path (`~/Library/Preferences/\n * modelstat-agent-dev-nodejs/…`) — so a rename or a dev build orphaned cursors\n * into a second file. Now there is exactly one location, identical on every\n * platform, relocatable as a unit via `MODELSTAT_HOME`.\n *\n * Identity stays in `identity.json` (long-lived bearer, chmod 0600). This file\n * is non-secret per-install bookkeeping; losing it just re-scans transcripts.\n */\n\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homePath, modelstatHome } from \"./paths.js\";\n\nexport interface FileCursor {\n  size: number;\n  mtime: number;\n  tailHash: string;\n}\n\n/**\n * Where each session gets summarised — chosen at install, changeable later via\n * `modelstat mode`. Redaction (secrets + on-device NER/PII + emails + paths)\n * runs client-side in EVERY mode; only the summarisation LOCATION differs.\n *\n * - `local`       — the bundled Qwen model summarises on THIS machine (the only\n *   mode that downloads/loads the ~2.7 GB model). Ships abstracts to /v1/ingest.\n * - `self-hosted` — an org-run OpenAI-compatible endpoint summarises the cleaned\n *   excerpts (see selfHostedUrl/selfHostedModel). Ships abstracts to /v1/ingest.\n * - `cloud`       — no local summariser; cleaned turns ship to /v1/ingest/raw\n *   and modelstat's cloud summarises server-side. The install default.\n */\nexport type SummarizerMode = \"local\" | \"self-hosted\" | \"cloud\";\n\n/** All valid modes, in menu order (Cloud first — it's the default). */\nexport const SUMMARIZER_MODES: readonly SummarizerMode[] = [\"cloud\", \"local\", \"self-hosted\"];\n\n/** The install default: cloud (no local model, server-side summarisation). */\nexport const DEFAULT_SUMMARIZER_MODE: SummarizerMode = \"cloud\";\n\n/** Narrow an arbitrary string to a {@link SummarizerMode}, else `null`. */\nexport function parseSummarizerMode(v: string | null | undefined): SummarizerMode | null {\n  const s = (v ?? \"\").trim().toLowerCase();\n  return (SUMMARIZER_MODES as readonly string[]).includes(s) ? (s as SummarizerMode) : null;\n}\n\nexport interface RuntimeState {\n  /** Operator-set API URL override (empty ⇒ env / production default). */\n  apiUrl: string;\n  /** Per-file scan cursors, keyed by absolute transcript path. */\n  cursor: Record<string, FileCursor>;\n  /** Lifetime count of segments uploaded from this machine (cosmetic). */\n  segmentsSent: number;\n  /** Pipeline version that last produced the cursors; bump ⇒ full re-scan. */\n  processingVersion: number | null;\n  /** Self-healing reconcile cache: per transcript file, its mtime and a\n   * (UTC-day → session → event-count) tally, so reconcile compares against the\n   * server WITHOUT re-parsing unchanged files (O(changed files)). Bounded by the\n   * CURRENT file set (GC'd as files vanish) — flat over months. */\n  reconcileCache: Record<\n    string,\n    { mtime: number; perDaySession: Record<string, Record<string, number>> }\n  >;\n  /** Did the last run ship extractive (LLM-unavailable) abstracts? When the\n   * bundled summariser is healthy again the daemon re-scans so those degraded\n   * abstracts upgrade to model quality. See apps/daemon/src/pipeline.ts. */\n  summariserDegraded: boolean;\n  /** ms-epoch of the last degradation-recovery re-scan — bounds re-scans on a\n   * flaky LLM to at most once per window so a preflight-passes/scan-fails loop\n   * can't re-scan the world every restart. */\n  summariserRecoveryAt: number;\n  /** Per-(day,session) self-heal re-ship bookkeeping, keyed `${day}\\0${sid}`.\n   * `attempts` is how many times we've re-shipped this session that the server\n   * still reports short; `lastAt` is the ms-epoch of the last re-ship. Together\n   * they drive an exponential backoff so a session the server DEDUPES (re-ship\n   * never reduces the reported deficit) stops re-shipping every pass instead of\n   * looping forever. GC'd to the current (day,session) set each pass. */\n  reshipState: Record<string, { attempts: number; lastAt: number }>;\n  /** Where sessions get summarised (chosen at install; see {@link SummarizerMode}).\n   * Defaults to `cloud`. */\n  summarizerMode: SummarizerMode;\n  /** Self-hosted only: the org's OpenAI-compatible summariser base URL (e.g.\n   * `https://llm.acme.internal/v1`). Empty in local/cloud mode. */\n  selfHostedUrl: string;\n  /** Self-hosted only: the model id to request from {@link selfHostedUrl}\n   * (e.g. `qwen2.5-7b-instruct`). Empty in local/cloud mode. */\n  selfHostedModel: string;\n}\n\nconst DEFAULTS: RuntimeState = {\n  apiUrl: \"\",\n  cursor: {},\n  segmentsSent: 0,\n  processingVersion: null,\n  reconcileCache: {},\n  summariserDegraded: false,\n  summariserRecoveryAt: 0,\n  reshipState: {},\n  summarizerMode: DEFAULT_SUMMARIZER_MODE,\n  selfHostedUrl: \"\",\n  selfHostedModel: \"\",\n};\n\nexport function statePath(): string {\n  return homePath(\"state.json\");\n}\n\n// In-memory cache so getters don't re-read the file each access; setters write\n// through to both the cache and disk.\nlet cache: RuntimeState | null = null;\n\nfunction load(): RuntimeState {\n  if (cache) return cache;\n  try {\n    const obj = JSON.parse(readFileSync(statePath(), \"utf8\")) as Partial<RuntimeState>;\n    cache = {\n      apiUrl: obj.apiUrl ?? DEFAULTS.apiUrl,\n      cursor: obj.cursor ?? {},\n      segmentsSent: obj.segmentsSent ?? 0,\n      processingVersion: obj.processingVersion ?? null,\n      reconcileCache: obj.reconcileCache ?? {},\n      summariserDegraded: obj.summariserDegraded ?? false,\n      summariserRecoveryAt: obj.summariserRecoveryAt ?? 0,\n      reshipState: obj.reshipState ?? {},\n      // Validate the persisted mode — a hand-edited/garbage value falls back to\n      // the default rather than driving the pipeline off a bogus branch.\n      summarizerMode: parseSummarizerMode(obj.summarizerMode) ?? DEFAULT_SUMMARIZER_MODE,\n      selfHostedUrl: obj.selfHostedUrl ?? \"\",\n      selfHostedModel: obj.selfHostedModel ?? \"\",\n    };\n  } catch {\n    // Missing/corrupt ⇒ fresh defaults (a new install, or post-`MODELSTAT_HOME`\n    // relocation). Cursors start empty, so processingVersion=null forces a\n    // re-scan on first run — exactly what we want.\n    cache = { ...DEFAULTS, cursor: {} };\n  }\n  return cache;\n}\n\nfunction persist(s: RuntimeState): void {\n  mkdirSync(modelstatHome(), { recursive: true, mode: 0o700 });\n  const tmp = `${statePath()}.${process.pid}.tmp`;\n  writeFileSync(tmp, JSON.stringify(s, null, 2), { mode: 0o600 });\n  renameSync(tmp, statePath());\n}\n\nexport const runtimeState = {\n  getApiUrl(): string {\n    return load().apiUrl;\n  },\n  setApiUrl(v: string): void {\n    const s = load();\n    s.apiUrl = v;\n    persist(s);\n  },\n\n  getCursor(path: string): FileCursor | undefined {\n    return load().cursor[path];\n  },\n  setCursor(path: string, v: FileCursor): void {\n    const s = load();\n    s.cursor[path] = v;\n    persist(s);\n  },\n  /** Drop every per-file cursor so the next scan re-reads each JSONL from byte 0\n   * (processing-version bump, or `modelstat reset`). */\n  wipeCursors(): void {\n    const s = load();\n    s.cursor = {};\n    persist(s);\n  },\n  /** Drop ONE file's cursor so the next scan re-reads it — the precise lever the\n   * self-healing reconcile pulls for the files of sessions the server is missing. */\n  clearCursor(path: string): void {\n    const s = load();\n    if (path in s.cursor) {\n      delete s.cursor[path];\n      persist(s);\n    }\n  },\n  /** Drop cursors for files no longer present so the map tracks the CURRENT file\n   * set, not every file ever seen. Returns how many were pruned. */\n  pruneCursors(present: Set<string>): number {\n    const s = load();\n    let removed = 0;\n    for (const p of Object.keys(s.cursor)) {\n      if (!present.has(p)) {\n        delete s.cursor[p];\n        removed += 1;\n      }\n    }\n    if (removed) persist(s);\n    return removed;\n  },\n\n  getSegmentsSent(): number {\n    return load().segmentsSent;\n  },\n  bumpSegmentsSent(n: number): number {\n    const s = load();\n    s.segmentsSent += n;\n    persist(s);\n    return s.segmentsSent;\n  },\n\n  getProcessingVersion(): number | null {\n    return load().processingVersion;\n  },\n  setProcessingVersion(v: number): void {\n    const s = load();\n    s.processingVersion = v;\n    persist(s);\n  },\n\n  /** Whether the last run shipped extractive (LLM-unavailable) abstracts. */\n  getSummariserDegraded(): boolean {\n    return load().summariserDegraded;\n  },\n  setSummariserDegraded(v: boolean): void {\n    const s = load();\n    if (s.summariserDegraded === v) return; // no-op write avoidance (hot path)\n    s.summariserDegraded = v;\n    persist(s);\n  },\n  /** ms-epoch of the last degradation-recovery re-scan (0 = never). */\n  getSummariserRecoveryAt(): number {\n    return load().summariserRecoveryAt;\n  },\n  setSummariserRecoveryAt(ms: number): void {\n    const s = load();\n    s.summariserRecoveryAt = ms;\n    persist(s);\n  },\n\n  /** Self-healing reconcile cache (see {@link RuntimeState.reconcileCache}). */\n  getReconcileCache(): RuntimeState[\"reconcileCache\"] {\n    return load().reconcileCache;\n  },\n  setReconcileCache(c: RuntimeState[\"reconcileCache\"]): void {\n    const s = load();\n    s.reconcileCache = c;\n    persist(s);\n  },\n\n  /** Per-(day,session) re-ship backoff bookkeeping (see\n   * {@link RuntimeState.reshipState}). */\n  getReshipState(): RuntimeState[\"reshipState\"] {\n    return load().reshipState;\n  },\n  setReshipState(r: RuntimeState[\"reshipState\"]): void {\n    const s = load();\n    s.reshipState = r;\n    persist(s);\n  },\n\n  /** The persisted summariser mode (see {@link SummarizerMode}). */\n  getSummarizerMode(): SummarizerMode {\n    return load().summarizerMode;\n  },\n  setSummarizerMode(v: SummarizerMode): void {\n    const s = load();\n    s.summarizerMode = v;\n    persist(s);\n  },\n  /** Self-hosted endpoint config (base URL + model id). Both empty unless the\n   * mode is `self-hosted`. */\n  getSelfHosted(): { url: string; model: string } {\n    const s = load();\n    return { url: s.selfHostedUrl, model: s.selfHostedModel };\n  },\n  setSelfHosted(url: string, model: string): void {\n    const s = load();\n    s.selfHostedUrl = url;\n    s.selfHostedModel = model;\n    persist(s);\n  },\n\n  /** Test-only: drop the in-memory cache so the next read hits disk. */\n  _resetCacheForTests(): void {\n    cache = null;\n  },\n};\n","import { existsSync } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { type DeviceIdentity, loadIdentity, saveIdentity, updateIdentity } from \"./identity.js\";\nimport {\n  type FileCursor,\n  parseSummarizerMode,\n  runtimeState,\n  type SummarizerMode,\n  statePath,\n} from \"./runtime-state.js\";\n\n// Walk up from this file to find .env (same pattern as api/worker).\nconst here = dirname(fileURLToPath(import.meta.url));\nfor (let d = here, i = 0; i < 8; i++, d = resolve(d, \"..\")) {\n  const candidate = resolve(d, \".env\");\n  if (existsSync(candidate)) {\n    loadDotenv({ path: candidate });\n    break;\n  }\n  if (d === \"/\") break;\n}\n\n/** Production API. Dev overrides via DAEMON_API_URL (set in .env). */\nconst DEFAULT_API_URL = \"https://modelstat.ai\";\n\n/** Legacy default that `@modelstat/daemon@0.0.7` persisted to disk on\n * first run. If we see this exact string in the stored state today\n * and no env override is set, treat it as unset and use the new\n * default. Prevents the \"upgraded but still points at localhost\" trap. */\nconst LEGACY_LOCALHOST_API = \"http://localhost:3010\";\n\n// Identity is backed by ~/.modelstat/identity.json (canonical since 0.0.23).\n// Runtime state (apiUrl / cursors / counters) is backed by\n// ~/.modelstat/state.json (see ./runtime-state.ts) — both under the single\n// `modelstatHome()` so there's exactly one daemon-state location per machine,\n// identical on every OS and relocatable via MODELSTAT_HOME. The old `conf`\n// store (and its OS/name-specific path) is gone; the pre-0.0.23 conf→identity\n// migration went with it (identity.json has long been the source of truth).\nlet cachedIdentity: DeviceIdentity | null = loadIdentity();\n\nfunction writeThrough(patch: Partial<DeviceIdentity>): void {\n  if (!cachedIdentity) {\n    // Can't update before the identity exists — setBearer/setDeviceId\n    // etc. are called in sequence right after selfRegister(). Don't\n    // allow partial writes; require saveFreshIdentity() to seed.\n    throw new Error(\"config: no identity yet — call state.saveFreshIdentity() first\");\n  }\n  cachedIdentity = { ...cachedIdentity, ...patch };\n  updateIdentity(patch);\n}\n\nexport const state = {\n  /** Resolution order: env var → stored value (if user ran `setApiUrl`\n   * or paired pre-0.0.8) → production default. The legacy localhost\n   * value is ignored so upgrades from 0.0.7 self-heal. */\n  get apiUrl(): string {\n    if (process.env.DAEMON_API_URL) return process.env.DAEMON_API_URL;\n    const stored = runtimeState.getApiUrl();\n    if (stored && stored !== LEGACY_LOCALHOST_API) return stored;\n    return DEFAULT_API_URL;\n  },\n  setApiUrl(v: string): void {\n    runtimeState.setApiUrl(v);\n  },\n  /** True when `apiUrl` resolves to the baked-in production default with no\n   * explicit override (no `DAEMON_API_URL`, no operator-set stored URL). Used\n   * to refuse silent prod self-register from CI/non-interactive environments\n   * so ephemeral runners don't pile up unclaimed device rows. */\n  get isProdDefaultApi(): boolean {\n    if (process.env.DAEMON_API_URL) return false;\n    const stored = runtimeState.getApiUrl();\n    if (stored && stored !== LEGACY_LOCALHOST_API) return false;\n    return true;\n  },\n\n  // ── Identity: backed by ~/.modelstat/identity.json ─────────────\n\n  /** Seed a fresh identity after a successful self-register. Writes\n   * the file atomically; use `state.backupAndReset()` first if\n   * overwriting an existing identity. */\n  saveFreshIdentity(meta: {\n    deviceUuid: string;\n    deviceId: string;\n    bearerToken: string;\n    claimCode: string | null;\n    claimUrl: string | null;\n  }): void {\n    const id: DeviceIdentity = {\n      deviceUuid: meta.deviceUuid,\n      deviceId: meta.deviceId,\n      bearerToken: meta.bearerToken,\n      claimCode: meta.claimCode,\n      claimUrl: meta.claimUrl,\n      hostname: hostname(),\n      createdAt: new Date().toISOString(),\n      userEmail: null,\n      defaultOrgId: null,\n    };\n    saveIdentity(id);\n    cachedIdentity = id;\n  },\n\n  get identity(): DeviceIdentity | null {\n    return cachedIdentity;\n  },\n\n  get bearer(): string | null {\n    return cachedIdentity?.bearerToken ?? null;\n  },\n  setBearer(v: string | null): void {\n    if (v === null) {\n      // Explicit wipe — used by disconnect flows. Caller is\n      // responsible for any backup.\n      cachedIdentity = null;\n      return;\n    }\n    writeThrough({ bearerToken: v });\n  },\n\n  get deviceId(): string | null {\n    return cachedIdentity?.deviceId ?? null;\n  },\n\n  get deviceUuid(): string | null {\n    return cachedIdentity?.deviceUuid ?? null;\n  },\n\n  get claimCode(): string | null {\n    return cachedIdentity?.claimCode ?? null;\n  },\n  setClaimCode(v: string | null): void {\n    if (!cachedIdentity) return;\n    writeThrough({ claimCode: v });\n  },\n\n  get claimUrl(): string | null {\n    return cachedIdentity?.claimUrl ?? null;\n  },\n  setClaimUrl(v: string | null): void {\n    if (!cachedIdentity) return;\n    writeThrough({ claimUrl: v });\n  },\n\n  get userEmail(): string | null {\n    return cachedIdentity?.userEmail ?? null;\n  },\n  setUserEmail(v: string): void {\n    if (!cachedIdentity) return;\n    writeThrough({ userEmail: v });\n  },\n\n  // ── Runtime state: backed by ~/.modelstat/state.json ───────────\n\n  getCursor(path: string): FileCursor | undefined {\n    return runtimeState.getCursor(path);\n  },\n  setCursor(path: string, v: FileCursor): void {\n    runtimeState.setCursor(path, v);\n  },\n  /** Drop every per-file cursor so the next scan re-reads every\n   * JSONL from byte 0. Called when the local processing-pipeline\n   * version bumps (see processing-version.ts) or via the\n   * `modelstat reset` CLI command. */\n  wipeCursors(): void {\n    runtimeState.wipeCursors();\n  },\n\n  /** Lifetime tally of segments uploaded from this machine. Survives\n   * daemon restarts so \"total sent\" keeps climbing across reboots. */\n  get segmentsSent(): number {\n    return runtimeState.getSegmentsSent();\n  },\n  /** Add to the lifetime tally and return the new total. */\n  bumpSegmentsSent(n: number): number {\n    return runtimeState.bumpSegmentsSent(n);\n  },\n\n  get processingVersion(): number | null {\n    return runtimeState.getProcessingVersion();\n  },\n  setProcessingVersion(v: number): void {\n    runtimeState.setProcessingVersion(v);\n  },\n\n  // ── Summariser mode: where each session gets summarised ────────\n  // Resolution mirrors `apiUrl`: an explicit env override wins (handy for\n  // CI / scripted installs), else the value chosen at install and persisted\n  // to state.json, else the baked-in default (cloud). Redaction stays\n  // client-side in every mode — only the summarisation LOCATION changes.\n\n  /** The effective summariser mode. `MODELSTAT_SUMMARIZER_MODE` overrides the\n   * persisted choice; an unset/garbage env value falls through to it. */\n  get summarizerMode(): SummarizerMode {\n    const override = parseSummarizerMode(process.env.MODELSTAT_SUMMARIZER_MODE);\n    if (override) return override;\n    return runtimeState.getSummarizerMode();\n  },\n  setSummarizerMode(v: SummarizerMode): void {\n    runtimeState.setSummarizerMode(v);\n  },\n\n  /** The self-hosted endpoint (base URL + model). `MODELSTAT_LLM_BASE_URL` /\n   * `MODELSTAT_LLM_MODEL` override the persisted values when both are present\n   * (so a self-hosted install can be driven entirely from the environment). */\n  get selfHosted(): { url: string; model: string } {\n    const envUrl = process.env.MODELSTAT_LLM_BASE_URL?.trim();\n    const envModel = process.env.MODELSTAT_LLM_MODEL?.trim();\n    if (envUrl && envModel) return { url: envUrl, model: envModel };\n    return runtimeState.getSelfHosted();\n  },\n  setSelfHosted(url: string, model: string): void {\n    runtimeState.setSelfHosted(url, model);\n  },\n\n  /** True when the persisted (or default) mode isn't overridden by\n   * `MODELSTAT_SUMMARIZER_MODE`. Lets `modelstat mode` warn that an env var is\n   * masking the stored choice. */\n  get summarizerModeIsEnvOverridden(): boolean {\n    return parseSummarizerMode(process.env.MODELSTAT_SUMMARIZER_MODE) !== null;\n  },\n\n  get storePath(): string {\n    return statePath();\n  },\n};\n\nexport function machineId(): string {\n  // Good enough for dev. A production build will use a stable platform id.\n  return `dev-${hostname()}`;\n}\n\nexport function defaultUserEmail(): string {\n  // Dev-only fallback used by the `register` (email-shortcut) command\n  // when running against a local API. Override with AGENT_USER_EMAIL\n  // or `state.userEmail` for a real email.\n  return process.env.AGENT_USER_EMAIL ?? state.userEmail ?? \"user@localhost\";\n}\n","/**\n * Stable per-machine key — the permanent anchor for device identity.\n *\n * The whole point: the SAME physical machine must derive the SAME\n * device identity no matter how the daemon got installed (npm / pnpm /\n * bun / manual binary copy), across daemon-version bumps, across OS\n * upgrades, and EVEN after `~/.modelstat/` is deleted. Before this,\n * `deviceUuid` was a random UUIDv7 stored only in identity.json — so\n * any loss or reset of that file minted a brand-new UUID and the\n * server (which dedupes on device_uuid) created a duplicate device row.\n * That's how one Mac became three dashboard entries.\n *\n * The anchor is an OS/hardware identifier that lives OUTSIDE anything\n * we install:\n *   - macOS:   IOPlatformUUID (ioreg) — per-logic-board, survives OS\n *              reinstall and home-dir wipes.\n *   - Linux:   /etc/machine-id (systemd) or /var/lib/dbus/machine-id.\n *   - Windows: HKLM\\SOFTWARE\\Microsoft\\Cryptography MachineGuid.\n *   - Fallback: a random key persisted at ~/.modelstat/machine-key\n *              (chmod 600) — at least stable per home dir when no\n *              hardware id is readable (containers, locked-down envs).\n *\n * We never send the raw hardware id off the machine: `machineKey()`\n * returns a salted SHA-256 of it. That hash is what we put in\n * `fingerprint.machine_id` (server dedupe key) and what we feed into\n * the deterministic device UUID, so the raw OS id can't be reversed\n * out of anything that leaves the device.\n */\nimport { spawnSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { arch as cpuArch, homedir, hostname, platform, release } from \"node:os\";\nimport { join } from \"node:path\";\n\n// Substituted by tsup's `define` at build time (see tsup.config.ts). A string\n// literal like \"daemon-0.0.33\" in the bundle; \"daemon-dev\" when run unbundled\n// (tsx / tests). Mirrors the macro cli.ts / daemon.ts / scan.ts use — declared\n// here so buildFingerprint can stamp the version without importing from cli.ts.\nconst DAEMON_VERSION: string =\n  typeof __MODELSTAT_VERSION__ === \"string\" ? __MODELSTAT_VERSION__ : \"daemon-dev\";\n\n/** Domain-separation salt so our hash can't be cross-referenced with\n * any other product that hashes the same OS machine id. Baked-in, not\n * secret — it just namespaces the digest. */\nconst MACHINE_KEY_SALT = \"modelstat.device.machine-key.v1\";\n\n/** Fixed namespace for UUIDv5 device-id derivation (a random,\n * permanently-frozen UUID; changing it would re-key every device). */\nconst DEVICE_UUID_NAMESPACE = \"6f1d2c9a-8b3e-4a7f-9c2d-0e5a1b6c7d8e\";\n\nconst ROOT = join(homedir(), \".modelstat\");\nconst FALLBACK_KEY_FILE = join(ROOT, \"machine-key\");\n\nlet cachedKey: string | null = null;\nlet cachedSource: MachineKeySource | null = null;\n\nexport type MachineKeySource =\n  | \"macos-ioplatform\"\n  | \"linux-machine-id\"\n  | \"windows-guid\"\n  | \"fallback-file\";\n\n/** macOS: pull IOPlatformUUID out of ioreg. Returns null if ioreg is\n * unavailable or the field is missing. */\nfunction macosPlatformUuid(): string | null {\n  try {\n    const r = spawnSync(\"ioreg\", [\"-rd1\", \"-c\", \"IOPlatformExpertDevice\"], {\n      encoding: \"utf8\",\n      timeout: 4000,\n    });\n    if (r.status !== 0 || !r.stdout) return null;\n    const m = /\"IOPlatformUUID\"\\s*=\\s*\"([^\"]+)\"/.exec(r.stdout);\n    return m?.[1]?.trim() || null;\n  } catch {\n    return null;\n  }\n}\n\n/** Linux: systemd machine-id, then the dbus fallback path. */\nfunction linuxMachineId(): string | null {\n  for (const p of [\"/etc/machine-id\", \"/var/lib/dbus/machine-id\"]) {\n    try {\n      const v = readFileSync(p, \"utf8\").trim();\n      if (v) return v;\n    } catch {\n      /* try next */\n    }\n  }\n  return null;\n}\n\n/** Windows: MachineGuid from the registry. */\nfunction windowsMachineGuid(): string | null {\n  try {\n    const r = spawnSync(\n      \"reg\",\n      [\"query\", \"HKLM\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\", \"/v\", \"MachineGuid\"],\n      { encoding: \"utf8\", timeout: 4000 },\n    );\n    if (r.status !== 0 || !r.stdout) return null;\n    const m = /MachineGuid\\s+REG_SZ\\s+([0-9a-fA-F-]+)/.exec(r.stdout);\n    return m?.[1]?.trim() || null;\n  } catch {\n    return null;\n  }\n}\n\n/** Read (or lazily create) the persisted random fallback key. This is\n * the last resort when no hardware id is readable; it survives reinstalls\n * but NOT a `~/.modelstat` wipe, so it's strictly worse than a hardware\n * id — hence only used when the platform probes come up empty. */\nfunction fallbackKey(): string {\n  try {\n    if (existsSync(FALLBACK_KEY_FILE)) {\n      const v = readFileSync(FALLBACK_KEY_FILE, \"utf8\").trim();\n      if (v) return v;\n    }\n  } catch {\n    /* fall through to (re)create */\n  }\n  const fresh = createHash(\"sha256\")\n    .update(`${MACHINE_KEY_SALT}:fallback:${Date.now()}:${Math.random()}`)\n    .digest(\"hex\");\n  try {\n    mkdirSync(ROOT, { recursive: true, mode: 0o700 });\n    writeFileSync(FALLBACK_KEY_FILE, fresh, { mode: 0o600 });\n    chmodSync(FALLBACK_KEY_FILE, 0o600);\n  } catch {\n    /* best effort — even an unpersisted key is stable for this process */\n  }\n  return fresh;\n}\n\n/** Resolve the raw machine id + which source produced it. */\nfunction resolveRaw(): { raw: string; source: MachineKeySource } {\n  const p = platform();\n  if (p === \"darwin\") {\n    const v = macosPlatformUuid();\n    if (v) return { raw: v, source: \"macos-ioplatform\" };\n  } else if (p === \"win32\") {\n    const v = windowsMachineGuid();\n    if (v) return { raw: v, source: \"windows-guid\" };\n  } else {\n    const v = linuxMachineId();\n    if (v) return { raw: v, source: \"linux-machine-id\" };\n  }\n  return { raw: fallbackKey(), source: \"fallback-file\" };\n}\n\n/**\n * The stable machine key: a salted SHA-256 (64-char hex) of the raw\n * hardware/OS machine id. Memoised for the process. Safe to send to the\n * server (the raw id is never exposed). Used as `fingerprint.machine_id`.\n */\nexport function machineKey(): string {\n  if (cachedKey) return cachedKey;\n  const { raw, source } = resolveRaw();\n  cachedSource = source;\n  cachedKey = createHash(\"sha256\").update(`${MACHINE_KEY_SALT}:${raw}`).digest(\"hex\");\n  return cachedKey;\n}\n\n/** Which source the cached key came from (computes the key if needed).\n * Exposed for `paths`/diagnostics so a user can see whether they're on a\n * hardware anchor or the weaker file fallback. */\nexport function machineKeySource(): MachineKeySource {\n  if (!cachedSource) machineKey();\n  return cachedSource!;\n}\n\n/**\n * Deterministic device UUID (RFC 9562 v5) derived from a machine key.\n * Same key → same UUID, always — so a machine that lost its\n * identity.json re-derives the exact UUID it had, and the server maps\n * it back to the existing device row instead of minting a duplicate.\n *\n * Standard UUIDv5: SHA-1(namespace_bytes ++ name) → first 16 bytes,\n * with the version (5) and variant (10xx) bits forced.\n */\nexport function deviceUuidFromMachineKey(key: string = machineKey()): string {\n  const nsHex = DEVICE_UUID_NAMESPACE.replace(/-/g, \"\");\n  const nsBytes = Buffer.from(nsHex, \"hex\");\n  const hash = createHash(\"sha1\").update(nsBytes).update(key).digest();\n  const b = Buffer.from(hash.subarray(0, 16));\n  b[6] = (b[6]! & 0x0f) | 0x50; // version 5\n  b[8] = (b[8]! & 0x3f) | 0x80; // variant 10\n  const h = b.toString(\"hex\");\n  return [h.slice(0, 8), h.slice(8, 12), h.slice(12, 16), h.slice(16, 20), h.slice(20, 32)].join(\n    \"-\",\n  );\n}\n\n/**\n * The device UUID this machine SHOULD use, derived deterministically from\n * its stable hardware/OS machine key. Same machine → same UUID forever, so a\n * machine that lost `~/.modelstat` re-derives the exact UUID it had and the\n * server maps it back to the existing device row instead of minting a\n * duplicate.\n *\n * Escape hatch: set MODELSTAT_DEVICE_SALT to run a SECOND logical device on\n * one machine (CI matrices, multi-tenant boxes). It's a deterministic salt,\n * not randomness — so even that stays idempotent across reinstalls. Absent it,\n * one machine is exactly one device.\n *\n * Lives here (not in cli.ts) alongside `machineKey()` so the machine_id /\n * device-UUID derivation can never drift between the register path, the\n * heartbeat path, and the machine-stable recovery path — they all read the\n * same source.\n */\nexport function intendedDeviceUuid(): string {\n  const salt = process.env.MODELSTAT_DEVICE_SALT?.trim();\n  const key = salt ? `${machineKey()}:${salt}` : machineKey();\n  return deviceUuidFromMachineKey(key);\n}\n\nfunction osFamily(): \"macos\" | \"linux\" | \"other\" {\n  const p = platform();\n  if (p === \"darwin\") return \"macos\";\n  if (p === \"linux\") return \"linux\";\n  return \"other\";\n}\n\nfunction osArch(): \"x86_64\" | \"arm64\" | \"other\" {\n  const a = cpuArch();\n  if (a === \"x64\") return \"x86_64\";\n  if (a === \"arm64\") return \"arm64\";\n  return \"other\";\n}\n\n/**\n * The single device fingerprint, shared by BOTH register (`POST /v1/tokens`)\n * and heartbeat. `fingerprint.machine_id` is the server's dedupe anchor — the\n * one field that maps this physical machine back to its existing device row —\n * so it MUST be byte-identical everywhere it's sent. Factoring it here means\n * register and heartbeat can't disagree on it (the bug that turned one Mac\n * into three dashboard rows).\n */\nexport function buildFingerprint(): Record<string, string | number | boolean> {\n  return {\n    hostname: hostname(),\n    os_family: osFamily(),\n    os_version: release(),\n    arch: osArch(),\n    daemon: \"modelstat-daemon\",\n    daemon_version: DAEMON_VERSION,\n    // Stable, install-method-independent machine key — see machineKey(). The\n    // server dedupes on this so the same physical machine can never become two\n    // device rows, even if the UUID somehow differs (legacy random UUID →\n    // deterministic UUID transition).\n    machine_id: machineKey(),\n  };\n}\n","import type { IngestBatch } from \"@modelstat/core\";\nimport { expBackoff } from \"@modelstat/daemon-core/config\";\nimport { IngestClient } from \"@modelstat/daemon-core/http\";\nimport { createLogger } from \"@modelstat/daemon-core/logger\";\nimport { request } from \"undici\";\nimport { state } from \"./config.js\";\nimport { buildFingerprint, intendedDeviceUuid } from \"./machine-key.js\";\n\n/* ─── Server envelope ──────────────────────────────────────────────────\n * Every JSON API response wraps its payload in `{ data: … }`. The daemon\n * unwraps `.data` for the device endpoints (tokens / heartbeat / devices-me /\n * rotate). Ingest keeps its own bare shape (see daemon-core/http). */\nfunction unwrapData<T>(body: unknown): T {\n  if (body && typeof body === \"object\" && \"data\" in (body as Record<string, unknown>)) {\n    return (body as { data: T }).data;\n  }\n  // No envelope — accept the raw body so a server that returns the payload\n  // un-wrapped (or a test stub) still parses rather than crashing.\n  return body as T;\n}\n\n/* ─── Register (the ONLY register door): POST /v1/tokens ────────────────── */\n\nexport type SelfRegisterResponse = {\n  device_id: string;\n  device_uuid: string;\n  /** Opaque device secret — `ds_live_<64-hex>`. The daemon STORES it verbatim\n   * and sends it as `Authorization: Bearer <secret>`; it makes no client-side\n   * assumptions about the format. */\n  device_secret: string;\n  secret_prefix: string;\n  /** null once the device is already claimed (the server returns no fresh\n   * claim handle for a claimed row). */\n  claim_code: string | null;\n  claim_url: string | null;\n  status: \"unclaimed\" | \"claimed\";\n  user_id: string | null;\n  /** Set when the server reused an existing row (same machine_id) and minted a\n   * fresh secret instead of creating a new device. */\n  re_registered?: boolean;\n};\n\nexport type DeviceMeResponse = {\n  device_id: string;\n  device_uuid: string | null;\n  self_registered: boolean;\n  status: \"unclaimed\" | \"claimed\";\n  claimed_at: string | null;\n  claim_code: string | null;\n  claim_url: string | null;\n  claim_expires_at: string | null;\n  user_id: string | null;\n  secret_prefix: string | null;\n  hostname: string | null;\n  daemon_status: string | null;\n  /** Last time the server saw this device (heartbeat / ingest). */\n  last_active_at: string | null;\n  fingerprint: Record<string, unknown> | null;\n};\n\n/**\n * Register this device against the server's ONE register door,\n * `POST /v1/tokens`. The `fingerprint.machine_id` is the dedupe anchor: the\n * server reuses the existing row for a machine it has already seen and returns\n * a fresh `ds_live_` secret (with `re_registered: true`), so re-registering is\n * convergent — it never orphans a claimed device into a duplicate.\n */\nexport async function selfRegister(input: {\n  device_uuid: string;\n  public_key?: string;\n  fingerprint: Record<string, string | number | boolean>;\n}): Promise<SelfRegisterResponse> {\n  const res = await request(`${state.apiUrl}/v1/tokens`, {\n    method: \"POST\",\n    headers: { \"content-type\": \"application/json\" },\n    body: JSON.stringify(input),\n  });\n  if (res.statusCode >= 300) {\n    throw new Error(`register failed: ${res.statusCode} ${await res.body.text()}`);\n  }\n  return unwrapData<SelfRegisterResponse>(await res.body.json());\n}\n\nexport class DeviceMeUnauthorized extends Error {\n  constructor() {\n    super(\"devices/me returned 401: device_secret not recognised\");\n    this.name = \"DeviceMeUnauthorized\";\n  }\n}\n\nexport async function fetchDeviceMe(secret: string): Promise<DeviceMeResponse> {\n  const res = await request(`${state.apiUrl}/v1/devices/me`, {\n    method: \"GET\",\n    headers: { authorization: `Bearer ${secret}` },\n  });\n  if (res.statusCode === 401) {\n    // Discard body — callers only need the sentinel. Bearer either\n    // expired, was rotated, or belongs to a device row that got\n    // deleted server-side. Either way the only recovery is a fresh\n    // register (machine-stable — see recoverIdentity).\n    await res.body.dump();\n    throw new DeviceMeUnauthorized();\n  }\n  if (res.statusCode >= 300) {\n    throw new Error(`devices/me failed: ${res.statusCode} ${await res.body.text()}`);\n  }\n  return unwrapData<DeviceMeResponse>(await res.body.json());\n}\n\nexport async function rotateDeviceSecret(currentSecret: string): Promise<{\n  device_id: string;\n  device_secret: string;\n  secret_prefix: string;\n  rotated_at: string;\n}> {\n  const res = await request(`${state.apiUrl}/v1/devices/me/rotate-secret`, {\n    method: \"POST\",\n    headers: { authorization: `Bearer ${currentSecret}` },\n  });\n  if (res.statusCode >= 300) {\n    throw new Error(`rotate-secret failed: ${res.statusCode} ${await res.body.text()}`);\n  }\n  return unwrapData<{\n    device_id: string;\n    device_secret: string;\n    secret_prefix: string;\n    rotated_at: string;\n  }>(await res.body.json());\n}\n\n/* ─── Machine-stable identity recovery ─────────────────────────────────────\n * The single recovery routine for \"the server no longer accepts our bearer\"\n * (401/403). Rotate-secret CANNOT recover here: a revoked/deleted row has no\n * valid current secret to authenticate the rotate with. The only door that\n * works is re-register — and because we re-register with the SAME\n * deterministic device_uuid + the SAME `fingerprint.machine_id`, the server\n * reuses the existing row and hands back a fresh `ds_live_` secret. So\n * recovery lands on the same device, never a duplicate.\n *\n * Exponential backoff (module-level so it persists across the per-second\n * call sites) protects a TRULY-deleted row — one the server refuses to\n * re-create — from hot-looping register calls.\n */\nlet recoverBackoffUntil = 0;\nlet recoverAttempt = 0;\nconst RECOVER_BACKOFF_MS = [0, 2_000, 5_000, 15_000, 30_000, 60_000] as const;\n\nexport async function recoverIdentity(): Promise<boolean> {\n  const now = Date.now();\n  if (now < recoverBackoffUntil) return false; // still cooling down from a recent failure\n  try {\n    // Drop the in-memory bearer first. This also resets `state.deviceUuid` to\n    // null, so selfRegister re-derives the machine-stable UUID rather than\n    // reusing whatever stale value was cached.\n    state.setBearer(null);\n    const res = await selfRegister({\n      device_uuid: intendedDeviceUuid(),\n      fingerprint: buildFingerprint(),\n    });\n    // selfRegister only returns the payload; persist it the same way\n    // cmdSelfRegister does so the fresh secret + device_id are durable.\n    state.saveFreshIdentity({\n      deviceUuid: res.device_uuid,\n      deviceId: res.device_id,\n      bearerToken: res.device_secret,\n      claimCode: res.claim_code,\n      claimUrl: res.claim_url,\n    });\n    // Success — reset the backoff so the next genuine 401 recovers immediately.\n    recoverAttempt = 0;\n    recoverBackoffUntil = 0;\n    return !!state.bearer;\n  } catch {\n    const delay = RECOVER_BACKOFF_MS[Math.min(recoverAttempt, RECOVER_BACKOFF_MS.length - 1)]!;\n    recoverAttempt++;\n    recoverBackoffUntil = Date.now() + delay;\n    return false;\n  }\n}\n\n/* ─── Shared authenticated device-API client ──────────────────────────────\n * ONE client for the daemon's authenticated device calls (heartbeat /\n * devices/me / rotate / backfill) so the auth + 401-recovery + 5xx-backoff\n * matrix is identical everywhere — the same matrix the IngestClient uses for\n * /v1/ingest:\n *   2xx       → return parsed body\n *   400/422   → drop (return null; permanent client error)\n *   401/403   → recoverIdentity() once, retry with the fresh bearer\n *   408/426/429/5xx → exponential backoff + retry (HOLD, never drop)\n *   text/html (SPA fallback for a removed route) → null (degrade, don't crash)\n * GETs degrade to `null`; POSTs return the parsed body or `null` (caller\n * decides whether `null` is fatal). Mirrors daemon-core/http so no daemon\n * device call eats every non-2xx the way the old hand-rolled heartbeat did.\n */\n\nconst deviceLogger = createLogger(\"daemon.device\");\n\n/** The SPA fallback returns 200 + text/html for a route the server no longer\n * exposes — detect it BEFORE parsing so a route removal degrades to null\n * instead of throwing \"Unexpected token <\". */\nfunction isSpaFallback(res: Awaited<ReturnType<typeof request>>): boolean {\n  const ctype = (res.headers[\"content-type\"] ?? \"\").toString().toLowerCase();\n  return ctype.includes(\"text/html\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n\ntype DeviceRequest = {\n  method: \"GET\" | \"POST\";\n  url: string;\n  /** JSON body for POSTs. */\n  body?: unknown;\n  /** Max attempts (covers reauth + backoff retries). Default 3. */\n  maxAttempts?: number;\n};\n\n/**\n * Single authed request driver. Returns the parsed JSON body (envelope\n * unwrapped via the caller, NOT here) on 2xx, or `null` for any non-recoverable\n * outcome (no bearer, 4xx-permanent, SPA fallback, parse failure, or\n * attempts-exhausted on 5xx/network). 401/403 triggers exactly one\n * recoverIdentity() per attempt cycle, then retries with the new bearer.\n */\nasync function deviceRequest(req: DeviceRequest): Promise<unknown | null> {\n  const maxAttempts = req.maxAttempts ?? 3;\n  for (let attempt = 0; attempt < maxAttempts; attempt++) {\n    const bearer = state.bearer;\n    if (!bearer) {\n      // No token at all — try a one-shot recovery, then retry. If recovery is\n      // backing off (or fails), give up for this call.\n      const recovered = await recoverIdentity();\n      if (!recovered) return null;\n      continue;\n    }\n    let res: Awaited<ReturnType<typeof request>>;\n    try {\n      res = await request(req.url, {\n        method: req.method,\n        headers: {\n          authorization: `Bearer ${bearer}`,\n          ...(req.body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n        },\n        ...(req.body !== undefined ? { body: JSON.stringify(req.body) } : {}),\n      });\n    } catch (err) {\n      // Network blip — back off and retry; never drop on a transient failure.\n      deviceLogger.warn(\"device request failed\", {\n        url: req.url,\n        attempt,\n        err: (err as Error).message,\n      });\n      await sleep(expBackoff(attempt));\n      continue;\n    }\n    if (res.statusCode >= 200 && res.statusCode < 300) {\n      if (isSpaFallback(res)) {\n        // 200 + HTML = the route is gone (SPA fallback). Degrade to null.\n        await res.body.dump();\n        return null;\n      }\n      try {\n        return await res.body.json();\n      } catch {\n        await res.body.dump().catch(() => undefined);\n        return null;\n      }\n    }\n    if (res.statusCode === 401 || res.statusCode === 403) {\n      await res.body.dump();\n      // The bearer was revoked/rotated/deleted server-side. Rotate-secret can't\n      // help post-revocation — recover by machine-stable re-register.\n      const recovered = await recoverIdentity();\n      if (!recovered) return null;\n      continue; // retry with the fresh bearer\n    }\n    if (res.statusCode === 400 || res.statusCode === 422) {\n      // Permanent client error — the request will never succeed as-is.\n      const text = await res.body.text().catch(() => \"\");\n      deviceLogger.error(\"device request rejected\", {\n        url: req.url,\n        status: res.statusCode,\n        body: text.slice(0, 300),\n      });\n      return null;\n    }\n    if (\n      res.statusCode === 408 ||\n      res.statusCode === 426 ||\n      res.statusCode === 429 ||\n      res.statusCode >= 500\n    ) {\n      await res.body.dump();\n      await sleep(expBackoff(attempt));\n      continue; // transient — HOLD + retry\n    }\n    // Any other 4xx — treat as permanent.\n    await res.body.dump();\n    return null;\n  }\n  return null; // attempts exhausted\n}\n\n/**\n * Defensive authenticated JSON GET — bearer-authed read that DEGRADES to null\n * (no-bearer / non-2xx / SPA fallback / parse failure / attempts-exhausted)\n * rather than crashing a caller, and recovers identity on 401. Used by the\n * backfill/reconcile reads. `T` is the raw JSON shape (no envelope unwrap —\n * backfill responses are top-level).\n */\nasync function authedJsonGet<T>(url: string): Promise<T | null> {\n  return (await deviceRequest({ method: \"GET\", url })) as T | null;\n}\n\n// Shared IngestClient wired once and reused for the process lifetime.\n// Retry matrix (400=drop, 401=reauth, 429/5xx=backoff) lives in\n// @modelstat/daemon-core/http — CLI just passes its AuthProvider.\nlet _ingest: IngestClient | null = null;\n\nfunction ingestClient(): IngestClient {\n  if (_ingest) return _ingest;\n  const logger = createLogger(\"daemon.ingest\");\n  _ingest = new IngestClient({\n    apiUrl: state.apiUrl,\n    auth: {\n      getToken: async () => state.bearer,\n      // On 401/403, recover the identity by machine-stable re-register. Rotating\n      // the secret CANNOT recover here — a revoked/deleted row has no valid\n      // current secret to rotate with — which is why ingest reauth no longer\n      // routes through rotateDeviceSecret. recoverIdentity persists the fresh\n      // bearer so getToken() picks it up on the retry.\n      onInvalidToken: async () => recoverIdentity(),\n    },\n    logger,\n  });\n  return _ingest;\n}\n\n/* ─── Authenticated heartbeat POST ────────────────────────────────────────\n * Liveness (folds discovery). Routed through the shared device client so the\n * heartbeat gets the SAME 401→recover + 5xx-backoff handling as every other\n * device call — replacing the old hand-rolled POST that swallowed every\n * non-2xx. Returns the unwrapped `.data` on success, or null on failure. */\nexport type HeartbeatResponse = {\n  commands?: unknown;\n  server_time?: string;\n  daemon_release?: { verdict?: string; min?: string | null; latest?: string | null };\n  installations_upserted?: number;\n  identities_upserted?: number;\n};\n\nexport async function postHeartbeat(\n  deviceId: string,\n  body: Record<string, unknown>,\n): Promise<HeartbeatResponse | null> {\n  const raw = await deviceRequest({\n    method: \"POST\",\n    url: `${state.apiUrl}/v1/devices/${encodeURIComponent(deviceId)}/heartbeat`,\n    body,\n  });\n  if (raw == null) return null;\n  return unwrapData<HeartbeatResponse>(raw);\n}\n\nexport type UploadOutcome =\n  | {\n      committed: true;\n      accepted: number;\n      new_sessions: number;\n      updated_sessions: number;\n      batch_id: string;\n    }\n  // The server PERMANENTLY rejected this batch (400/422 — malformed). The caller\n  // must QUARANTINE it (skip past + alert), not retry — see scan.ts.\n  | { committed: false; reason: string };\n\nexport async function uploadBatch(\n  batch: IngestBatch,\n  opts: { raw?: boolean } = {},\n): Promise<UploadOutcome> {\n  const result = await ingestClient().upload(batch, opts);\n  if (result.kind === \"commit\") {\n    return {\n      committed: true,\n      accepted: result.response.accepted,\n      new_sessions: result.response.new_sessions,\n      updated_sessions: result.response.updated_sessions,\n      batch_id: result.response.batch_id,\n    };\n  }\n  // A PERMANENT reject is returned (not thrown) so the scan loop can advance past\n  // this one poison batch and keep newer data flowing. A TRANSIENT failure (no\n  // token / reauth / 5xx-exhausted / network) still throws → the batch is held\n  // and retried next cycle, never dropped on a server/network blip.\n  if (result.permanent) {\n    return { committed: false, reason: result.reason };\n  }\n  throw new Error(`upload failed: ${result.reason}`);\n}\n\n/* ─── Self-healing reconcile (anti-entropy) ───────────────────────────\n * The server is authoritative for what's ingested. The daemon fetches the\n * server's per-session event digest for its scope and re-ships any session the\n * server is short on (see reconcile.ts). Read-only; device-secret auth. */\n\n/** Top level: scope-wide total (the O(1) \"anything to do?\" check) + per-day rollup. */\nexport interface BackfillDays {\n  total_events: number;\n  days: Array<{ day: string; events: number }>;\n}\n/** Drill level: one day's per-session counts (fetched only for divergent days). */\nexport interface BackfillDaySessions {\n  day: string;\n  sessions: Array<{ session_id: string; events: number }>;\n}\n\nfunction backfillGet<T>(query: string): Promise<T | null> {\n  // Routed through the defensive GET so a future removal of /v1/backfill/digests\n  // degrades reconcile to a no-op (null ⇒ \"skip this pass\") instead of crashing\n  // on the SPA-fallback HTML.\n  return authedJsonGet<T>(`${state.apiUrl}/v1/backfill/digests${query}`);\n}\n\n/** Per-day digest for this device's scope (top of the reconcile tree). */\nexport function fetchBackfillDays(): Promise<BackfillDays | null> {\n  return backfillGet<BackfillDays>(\"\");\n}\n\n/** One day's per-session counts — fetched only for days whose total diverged. */\nexport function fetchBackfillDaySessions(day: string): Promise<BackfillDaySessions | null> {\n  return backfillGet<BackfillDaySessions>(`?day=${encodeURIComponent(day)}`);\n}\n\n/* ─── Loopback control plane ──────────────────────────────────────────\n * `modelstat sync --session` first asks a RUNNING daemon (warm summariser) to\n * force-scan, via the loopback control endpoint the receiver serves. Only when\n * no daemon is listening (ECONNREFUSED) does the CLI fall back to a cold\n * in-process scan. */\n\n/** Loopback control-plane port — the same 127.0.0.1 server the SDK ingest\n * uses (resolution mirrors receiver.ts: env override, else 4319). Resolved\n * here to avoid an api↔receiver import cycle. */\nfunction controlPort(): number {\n  return Number(process.env.MODELSTAT_LOCAL_INGEST_PORT) || 4319;\n}\n\nexport type ControlScanOutcome =\n  /** A running daemon accepted (and, with `wait`, finished) the scan. */\n  | { kind: \"ok\"; started: boolean; scanned: boolean }\n  /** Nothing is listening on the loopback control port — no daemon running. */\n  | { kind: \"no_daemon\" }\n  /** The daemon responded with an error (bad target, scan failure, …). */\n  | { kind: \"error\"; status: number; message: string };\n\n/**\n * POST the loopback control endpoint to force-scan a session on a running\n * daemon. Resolves `no_daemon` on connection-refused so the caller can fall\n * back to a standalone scan; surfaces other failures as `error`.\n */\nexport async function postControlScan(\n  body: { session_ids?: string[]; file?: string; wait?: boolean },\n  opts: { port?: number } = {},\n): Promise<ControlScanOutcome> {\n  const port = opts.port ?? controlPort();\n  try {\n    const res = await request(`http://127.0.0.1:${port}/v1/control/scan`, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\" },\n      body: JSON.stringify(body),\n      // A `wait:true` scan can take a while (cold-ish summariser, big session);\n      // give it room but don't hang forever. undici's headersTimeout/bodyTimeout\n      // default to 30s — lift them for the waiting case.\n      headersTimeout: body.wait ? 600_000 : 5_000,\n      bodyTimeout: body.wait ? 600_000 : 5_000,\n    });\n    if (res.statusCode >= 300) {\n      const message = await res.body.text().catch(() => \"\");\n      return { kind: \"error\", status: res.statusCode, message };\n    }\n    const data = (await res.body.json().catch(() => ({}))) as {\n      started?: boolean;\n      scanned?: boolean;\n    };\n    return { kind: \"ok\", started: data.started === true, scanned: data.scanned === true };\n  } catch (e) {\n    const code = (e as NodeJS.ErrnoException).code;\n    if (code === \"ECONNREFUSED\" || code === \"ECONNRESET\") return { kind: \"no_daemon\" };\n    return { kind: \"error\", status: 0, message: (e as Error).message };\n  }\n}\n","/**\n * Daemon singleton lock.\n *\n * Prevents a second `modelstat start` (or a tray-launched second\n * instance) from running in parallel with the first. A second daemon\n * would cause:\n *   - duplicate /v1/ingest POSTs (server is idempotent, but wasteful)\n *   - competing scan passes that clobber the local file cursor\n *   - scrambled Live Activity (heartbeats from two PIDs interleave)\n *\n * Mechanism: a lockfile at ~/.modelstat/daemon.lock containing\n *   { pid, startedAt, daemonVersion, apiUrl }.\n *\n * On start:\n *   1. Read the existing lock if any.\n *   2. `kill(pid, 0)` probes whether the owner is alive. If yes, the\n *      caller is told to stop that one first (or the new invocation\n *      becomes a no-op).\n *   3. If the lock exists but the owner is gone, it's stale — we take\n *      it over.\n *   4. Write our own lock via atomic `open(O_CREAT|O_EXCL) → rename`.\n *   5. Register SIGINT / SIGTERM / beforeExit / uncaughtException\n *      handlers that remove the lockfile on exit.\n *\n * This is NOT a bulletproof distributed lock — two daemons started\n * within the same millisecond could both win the rename race. For the\n * one-user-one-machine case it's more than enough.\n */\nimport {\n  closeSync,\n  existsSync,\n  mkdirSync,\n  openSync,\n  readFileSync,\n  renameSync,\n  unlinkSync,\n  writeFileSync,\n  writeSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { modelstatHome } from \"./paths.js\";\n\nexport interface LockMeta {\n  pid: number;\n  startedAt: string;\n  daemonVersion: string;\n  apiUrl: string;\n}\n\nconst LOCK_DIR = modelstatHome();\nconst LOCK_FILE = join(LOCK_DIR, \"daemon.lock\");\n\nexport function isProcessAlive(pid: number): boolean {\n  if (!pid || pid <= 0) return false;\n  try {\n    // Signal 0 doesn't actually send anything — it just returns normally\n    // if the PID exists and we have permission to signal it, or throws\n    // ESRCH / EPERM otherwise.\n    process.kill(pid, 0);\n    return true;\n  } catch (e) {\n    const code = (e as NodeJS.ErrnoException).code;\n    // EPERM means the process exists but is owned by a different user\n    // — treat as alive so we don't steal their lock.\n    if (code === \"EPERM\") return true;\n    return false;\n  }\n}\n\n/** Read + validate the lockfile. Exported (with an injectable path)\n * for the supervision health probe and its tests — see supervise.ts. */\nexport function readDaemonLock(lockFile: string = LOCK_FILE): LockMeta | null {\n  try {\n    const raw = readFileSync(lockFile, \"utf8\");\n    const obj = JSON.parse(raw) as Partial<LockMeta>;\n    if (typeof obj.pid !== \"number\") return null;\n    return {\n      pid: obj.pid,\n      startedAt: obj.startedAt ?? \"unknown\",\n      daemonVersion: obj.daemonVersion ?? \"unknown\",\n      apiUrl: obj.apiUrl ?? \"unknown\",\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Atomically write the lockfile. `open(O_CREAT|O_EXCL)` on a tmp\n * path + rename guarantees that only one process wins if two are\n * racing, provided they pick different tmp paths (we randomise on PID).\n */\nfunction writeLockAtomic(meta: LockMeta): void {\n  mkdirSync(LOCK_DIR, { recursive: true });\n  const tmp = `${LOCK_FILE}.${meta.pid}.${Date.now()}.tmp`;\n  const fd = openSync(tmp, \"wx\"); // fails if tmp somehow exists\n  try {\n    writeSync(fd, JSON.stringify(meta, null, 2));\n  } finally {\n    closeSync(fd);\n  }\n  renameSync(tmp, LOCK_FILE);\n}\n\nfunction removeLockIfOwned(ownerPid: number): void {\n  const lock = readDaemonLock();\n  if (!lock) return;\n  if (lock.pid !== ownerPid) return; // someone else took over; leave alone\n  try {\n    unlinkSync(LOCK_FILE);\n  } catch {\n    /* already gone */\n  }\n}\n\nexport type AcquireResult =\n  | { kind: \"acquired\" }\n  | { kind: \"already_running\"; owner: LockMeta; ageSec: number };\n\nexport interface AcquireOpts {\n  daemonVersion: string;\n  apiUrl: string;\n  /** If true, kill any existing owner (if alive) and take the lock.\n   * Used by `modelstat start --force` to recover from a stuck daemon.\n   * Supervisors (the tray) should NOT pass this blindly: a healthy\n   * live owner must be adopted, not killed — see supervise.ts for the\n   * adopt/spawn/replace decision. Blind --force is how two tray\n   * instances made their daemons SIGTERM each other in a loop on\n   * 2026-06-12, ending with zero daemons running. */\n  force?: boolean;\n  /** Called if, shortly after we \"won\" the lock, the lockfile turns\n   * out to be owned by someone else. writeLockAtomic is last-write-\n   * wins, not mutual exclusion — two unforced daemons that read\n   * \"no lock\" in the same instant both think they acquired it. The\n   * recheck makes the rename loser stand down instead of running as\n   * a silent duplicate (double scans, clobbered cursors, interleaved\n   * heartbeats). Default: log + exit 0 (a supervisor will adopt the\n   * winner). */\n  onLockLost?: (winner: LockMeta) => void;\n}\n\n/** How long after acquiring to re-read the lock and confirm we still\n * own it. Long enough that a racing daemon's write has landed, short\n * enough that a duplicate daemon does no meaningful double-work. */\nexport const LOCK_RECHECK_MS = 5_000;\n\n/**\n * Try to acquire the singleton lock. Returns:\n *   - `{ kind: \"acquired\" }` — caller can proceed to run the daemon.\n *   - `{ kind: \"already_running\" }` — another live daemon owns the lock;\n *     caller should print a message and exit 0.\n *\n * On \"acquired\", the lock is owned by this process and will be removed\n * automatically on SIGINT/SIGTERM/exit.\n */\nexport function acquireDaemonLock(opts: AcquireOpts): AcquireResult {\n  const existing = readDaemonLock();\n  if (existing && isProcessAlive(existing.pid)) {\n    if (!opts.force) {\n      const ageSec = ageInSeconds(existing.startedAt);\n      return { kind: \"already_running\", owner: existing, ageSec };\n    }\n    // --force: try to stop the live owner first.\n    try {\n      process.kill(existing.pid, \"SIGTERM\");\n    } catch {\n      /* process already gone or no permission — we'll try the rename anyway */\n    }\n  }\n  // Either no lock, stale lock, or we just killed the owner.\n  const meta: LockMeta = {\n    pid: process.pid,\n    startedAt: new Date().toISOString(),\n    daemonVersion: opts.daemonVersion,\n    apiUrl: opts.apiUrl,\n  };\n  writeLockAtomic(meta);\n\n  // Confirm ownership after the dust settles. Two unforced daemons can\n  // both pass the no-live-owner check above and both rename their lock\n  // into place; whoever renamed LAST owns the file. The loser finds a\n  // different pid here and stands down via onLockLost.\n  const recheck = setTimeout(() => {\n    const current = readDaemonLock();\n    if (checkLockOwnership(process.pid, current) !== \"lost\") return;\n    const winner = current as LockMeta;\n    if (opts.onLockLost) {\n      opts.onLockLost(winner);\n      return;\n    }\n    // biome-ignore lint/suspicious/noConsole: one-line, user-visible explanation of why we exit\n    console.log(\n      `[modelstat] another daemon (pid ${winner.pid}, started ${winner.startedAt}) won the lock race — this instance is standing down.`,\n    );\n    process.exit(0);\n  }, LOCK_RECHECK_MS);\n  recheck.unref();\n\n  // Clean up on exit. Multiple signal paths all route to the same\n  // unlink — it's idempotent via removeLockIfOwned.\n  const cleanup = (): void => removeLockIfOwned(process.pid);\n  process.once(\"beforeExit\", cleanup);\n  process.once(\"SIGINT\", () => {\n    cleanup();\n    // Re-raise default behaviour: exit with 130 (the conventional\n    // SIGINT code) so shell chains see we were interrupted.\n    process.exit(130);\n  });\n  process.once(\"SIGTERM\", () => {\n    cleanup();\n    process.exit(143);\n  });\n  process.once(\"uncaughtException\", (err) => {\n    cleanup();\n    // biome-ignore lint/suspicious/noConsole: intentional crash log\n    console.error(\"modelstat daemon crashed:\", err);\n    process.exit(1);\n  });\n\n  return { kind: \"acquired\" };\n}\n\n/** What the post-acquire recheck concluded about the lockfile.\n *   - \"owned\":       lock is ours (or vanished) — keep running.\n *   - \"winner_dead\": someone overwrote it but they're already gone —\n *                    keep running; our cleanup-on-exit still applies.\n *   - \"lost\":        a LIVE rival owns the lock — stand down.\n * Pure decision (pid probe injectable) so the duplicate-daemon\n * convergence rule is unit-testable without touching ~/.modelstat. */\nexport type OwnershipCheck = \"owned\" | \"lost\" | \"winner_dead\";\nexport function checkLockOwnership(\n  myPid: number,\n  current: LockMeta | null,\n  pidAlive: (pid: number) => boolean = isProcessAlive,\n): OwnershipCheck {\n  if (!current || current.pid === myPid) return \"owned\";\n  if (!pidAlive(current.pid)) return \"winner_dead\";\n  return \"lost\";\n}\n\nfunction ageInSeconds(iso: string): number {\n  const t = Date.parse(iso);\n  if (Number.isNaN(t)) return -1;\n  return Math.max(0, Math.floor((Date.now() - t) / 1000));\n}\n\n/** Human-friendly age like \"3m 12s\" for log lines. */\nexport function formatAge(seconds: number): string {\n  if (seconds < 0) return \"?\";\n  if (seconds < 60) return `${seconds}s`;\n  const m = Math.floor(seconds / 60);\n  const s = seconds % 60;\n  if (m < 60) return `${m}m ${s}s`;\n  const h = Math.floor(m / 60);\n  return `${h}h ${m % 60}m`;\n}\n\n/** Expose the lock path so `modelstat stop` + diagnostics can locate it. */\nexport function daemonLockPath(): string {\n  return LOCK_FILE;\n}\n\n// Keep the filesystem import used regardless of tsup treeshake behavior.\nvoid writeFileSync;\nvoid existsSync;\n","/**\n * Daemon self-update.\n *\n * The server tells us our release standing in the heartbeat response (see\n * `handleRelease` in daemon.ts): `ok` / `update_available` / `upgrade_required`.\n * When we're behind and auto-update is on, we upgrade in place by spawning\n * `npm install -g modelstat@latest` detached — the package's postinstall then\n * stops, re-stages, and restarts the service (see scripts/postinstall.mjs), so\n * this very process may be killed mid-flight. That's expected.\n *\n * The auto-update preference lives in its OWN tiny file\n * (`<modelstatHome()>/auto-update.json`), NOT in state.json: the long-running\n * daemon caches state.json in memory and rewrites it on every cursor advance,\n * which would clobber a toggle written by a separate `modelstat autoupdate`\n * process (the tray). A dedicated file the daemon only ever reads (fresh, each\n * heartbeat) and the CLI only ever writes has no such race.\n */\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport { homePath, modelstatHome } from \"./paths.js\";\n\nconst NPM = platform() === \"win32\" ? \"npm.cmd\" : \"npm\";\nconst PACKAGE = \"modelstat\";\n\nfunction prefPath(): string {\n  return homePath(\"auto-update.json\");\n}\n\n/** Short-lived marker dropped the moment we spawn `npm i -g` so a daemon the\n * supervisor (launchd KeepAlive / systemd Restart) respawns ON THE SAME VERSION\n * while the install is mid-flight doesn't ALSO kick off its own `npm i -g`. The\n * postinstall stops + replaces the binary, so a respawn during that window is\n * expected; without this guard the respawn sees `upgrade_required` again and\n * stacks a second concurrent global install. */\nfunction upgradeMarkerPath(): string {\n  return homePath(\"upgrade-in-progress.json\");\n}\n\n/** How long the upgrade marker is honoured. A normal stop→reinstall→restart\n * cycle finishes well inside this; after it lapses we assume the upgrade died\n * and allow a fresh attempt rather than wedging on a stale marker. */\nconst UPGRADE_MARKER_TTL_MS = 5 * 60_000;\n\n/** True when a recent upgrade marker exists — i.e. THIS process is very likely a\n * supervisor respawn during an in-flight `npm i -g`. The caller should skip\n * spawning another install and let the postinstall finish swapping the binary.\n * A marker older than the TTL is treated as stale (cleared) so a genuinely stuck\n * upgrade can be retried. */\nexport function upgradeInProgress(): boolean {\n  try {\n    const raw = readFileSync(upgradeMarkerPath(), \"utf8\");\n    const o = JSON.parse(raw) as { at?: number };\n    const at = Number(o?.at ?? 0);\n    if (at > 0 && Date.now() - at < UPGRADE_MARKER_TTL_MS) return true;\n    // Stale — clear it so it can't wedge future upgrades.\n    clearUpgradeMarker();\n    return false;\n  } catch {\n    return false;\n  }\n}\n\nfunction writeUpgradeMarker(target: string | null): void {\n  try {\n    mkdirSync(modelstatHome(), { recursive: true, mode: 0o700 });\n    const tmp = `${upgradeMarkerPath()}.${process.pid}.tmp`;\n    writeFileSync(\n      tmp,\n      JSON.stringify({ pid: process.pid, at: Date.now(), target: target ?? null }),\n      { mode: 0o600 },\n    );\n    renameSync(tmp, upgradeMarkerPath());\n  } catch {\n    /* best-effort — the worst case without the marker is a duplicate install */\n  }\n}\n\n/** Remove the upgrade marker. Called when an upgrade fails to start (so it\n * isn't blocked forever) and when a stale marker is detected. */\nexport function clearUpgradeMarker(): void {\n  try {\n    rmSync(upgradeMarkerPath(), { force: true });\n  } catch {\n    /* best-effort */\n  }\n}\n\n/** The stored auto-update preference (default: on). Read fresh from disk so a\n * `modelstat autoupdate` toggle from another process is seen by the running\n * daemon without a restart. */\nexport function storedAutoUpdate(): boolean {\n  try {\n    const o = JSON.parse(readFileSync(prefPath(), \"utf8\")) as { autoUpdate?: boolean };\n    return o.autoUpdate ?? true;\n  } catch {\n    return true; // no file yet ⇒ on by default\n  }\n}\n\n/** Persist the auto-update preference atomically. */\nexport function setStoredAutoUpdate(enabled: boolean): void {\n  mkdirSync(modelstatHome(), { recursive: true, mode: 0o700 });\n  const tmp = `${prefPath()}.${process.pid}.tmp`;\n  writeFileSync(tmp, JSON.stringify({ autoUpdate: enabled }), { mode: 0o600 });\n  renameSync(tmp, prefPath());\n}\n\n/** Parse an env truthiness flag → true/false, or null when unset/unrecognised. */\nfunction parseFlag(v: string | undefined): boolean | null {\n  if (v == null) return null;\n  const s = v.trim().toLowerCase();\n  if ([\"0\", \"off\", \"false\", \"no\", \"disable\", \"disabled\"].includes(s)) return false;\n  if ([\"1\", \"on\", \"true\", \"yes\", \"enable\", \"enabled\"].includes(s)) return true;\n  return null;\n}\n\n/** Effective auto-update setting: the `MODELSTAT_AUTO_UPDATE` env override wins\n * (for managed fleets), else the stored preference. */\nexport function autoUpdateEnabled(): boolean {\n  const env = parseFlag(process.env.MODELSTAT_AUTO_UPDATE);\n  return env ?? storedAutoUpdate();\n}\n\n/** True when the setting is pinned by env (so the CLI/tray toggle is\n * informational only). */\nexport function autoUpdatePinnedByEnv(): boolean {\n  return parseFlag(process.env.MODELSTAT_AUTO_UPDATE) !== null;\n}\n\n/** Can we self-update here? We need npm on PATH — the same assumption the\n * install + postinstall already make. */\nexport function canSelfUpdate(): boolean {\n  try {\n    return spawnSync(NPM, [\"--version\"], { stdio: \"ignore\", timeout: 10_000 }).status === 0;\n  } catch {\n    return false;\n  }\n}\n\nexport type UpgradeResult = { started: true } | { started: false; reason: string };\n\n/**\n * Spawn `npm install -g modelstat@latest` detached and return immediately. The\n * postinstall hook does the stop → re-stage → restart, so the caller may be\n * killed mid-flight. Used by both `modelstat upgrade` (manual) and the\n * auto-updater. Best-effort: never throws.\n */\nexport function runUpgrade(target: string | null = null): UpgradeResult {\n  if (!canSelfUpdate()) {\n    return { started: false, reason: \"npm not found on PATH\" };\n  }\n  // Drop the in-progress marker BEFORE spawning so a supervisor respawn that\n  // races the install (postinstall stops + replaces us mid-flight) sees it and\n  // doesn't stack a second `npm i -g`.\n  writeUpgradeMarker(target);\n  try {\n    // Scrub leaking npm_config_* (e.g. when invoked from inside an npm run) so\n    // the global install resolves the real global prefix, not a nested one.\n    const env = { ...process.env };\n    delete env.npm_config_global;\n    delete env.npm_config_prefix;\n    const child = spawn(NPM, [\"install\", \"-g\", `${PACKAGE}@latest`], {\n      detached: true,\n      stdio: \"ignore\",\n      env,\n    });\n    child.unref();\n    return { started: true };\n  } catch (e) {\n    // The install never launched — clear the marker so the next verdict can\n    // retry rather than being suppressed for the whole TTL.\n    clearUpgradeMarker();\n    return { started: false, reason: (e as Error).message };\n  }\n}\n\n// Per-launch guard: act/log at most once per (verdict, target). A successful\n// upgrade replaces this process anyway; this stops the 10s heartbeat from\n// re-spawning npm (or re-logging the \"off\" nudge) while one is in flight.\nconst handled = new Set<string>();\n\n/**\n * React to a release verdict from the server. If auto-update is on, kick off the\n * upgrade; if off, return a one-time \"upgrade manually\" nudge. Returns a short\n * human-readable note to log the first time we see a given (verdict, target),\n * or null when there's nothing new to do. Never throws.\n *\n * `quiesce` (optional) runs RIGHT BEFORE the `npm i -g` spawn, only on the path\n * that actually upgrades. The daemon passes a callback that stops accepting new\n * scans, drains the in-flight scan, and frees the bundled summariser's Metal\n * device — so the to-be-killed process is already off the device when the\n * postinstall SIGTERMs it and the new daemon initialises Metal. Async, so this\n * function is async too.\n */\nexport async function maybeAutoUpdate(\n  verdict: string,\n  target: string | null,\n  quiesce?: () => Promise<void>,\n): Promise<string | null> {\n  if (verdict !== \"update_available\" && verdict !== \"upgrade_required\") return null;\n  // A supervisor respawn during an in-flight install must NOT stack a second\n  // `npm i -g`. The marker is short-lived (TTL) so a genuinely stuck upgrade\n  // still retries later.\n  if (upgradeInProgress()) return null;\n  const key = `${verdict}:${target ?? \"\"}`;\n  if (handled.has(key)) return null;\n  handled.add(key);\n\n  const required = verdict === \"upgrade_required\";\n  if (!autoUpdateEnabled()) {\n    return `${required ? \"upgrade required\" : \"update available\"} (latest ${target ?? \"?\"}); auto-update is off — run \\`modelstat upgrade\\` or \\`npm i -g modelstat@latest\\``;\n  }\n  // Quiesce BEFORE spawning the install: free the Metal device so the\n  // postinstall can SIGTERM us cleanly and the replacement daemon doesn't race\n  // two processes onto the device. Best-effort — never block the upgrade on it.\n  if (quiesce) {\n    try {\n      await quiesce();\n    } catch {\n      /* a failed drain shouldn't stop the upgrade — proceed */\n    }\n  }\n  const r = runUpgrade(target);\n  return r.started\n    ? `auto-updating to ${target ?? \"latest\"} — \\`npm i -g modelstat@latest\\`; the service will restart on the new version`\n    : `auto-update could not start (${r.reason}); upgrade manually: \\`npm i -g modelstat@latest\\``;\n}\n","/**\n * FileQueueStore — zero-dependency QueueStore for the CLI daemon.\n *\n * Persists queue state as a single JSON document next to the agent's\n * Conf state file. Every mutation writes atomically via a temp-file +\n * rename so a crash mid-write can't corrupt the snapshot.\n *\n * Scale assumption: the agent holds at most a few thousand unsynced\n * events at any time (the upload loop drains them every few seconds).\n * At that size an in-memory Map + atomic JSON rewrite is simpler, more\n * portable, and crash-safer than embedding a native SQLite binding\n * (see the deprecation trail on prebuild-install → better-sqlite3).\n *\n * Format on disk (v2):\n *   {\n *     \"version\": 2,\n *     \"items\": { [sourceEventId]: QueueItem }\n *   }\n *\n * On load we drop any items with synced=true older than a day — once a\n * batch is accepted, keeping its provenance past the idempotency\n * window doesn't help; older agents treated queue_items as an append-\n * only log and it grew unbounded.\n *\n * Snapshot version history:\n *   v1 → v2: QueueItem.tool renamed to QueueItem.agent (AGENTS rename).\n *            v1 snapshots carry the old `tool` key, so they're dropped\n *            wholesale on load (nothing is in production; re-scanning\n *            re-enqueues). Migration is intentionally lossy.\n */\nimport { promises as fs } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { QueueItem, QueueStore } from \"../queue/index.js\";\n\ninterface Snapshot {\n  version: 2;\n  items: Record<string, QueueItem>;\n}\n\nconst SENT_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport class FileQueueStore implements QueueStore {\n  private readonly filePath: string;\n  private items = new Map<string, QueueItem>();\n  private loaded = false;\n  private writing: Promise<void> | null = null;\n\n  constructor(filePath: string) {\n    this.filePath = filePath;\n  }\n\n  /** Lazily load the snapshot on first access so construction stays\n   * synchronous (matches the old SqliteQueueStore contract). */\n  private async ensureLoaded(): Promise<void> {\n    if (this.loaded) return;\n    try {\n      const raw = await fs.readFile(this.filePath, \"utf8\");\n      const parsed = JSON.parse(raw) as Snapshot;\n      if (parsed.version === 2 && parsed.items) {\n        const now = Date.now();\n        for (const [k, v] of Object.entries(parsed.items)) {\n          if (v.synced && now - v.last_event_ts_ms > SENT_TTL_MS) continue;\n          this.items.set(k, v);\n        }\n      }\n      // Older-versioned snapshots (v1: pre-AGENTS-rename `tool` key) are\n      // dropped wholesale — the map stays empty and the next mutation\n      // overwrites the file atomically.\n    } catch (err) {\n      // Missing file on first boot is expected. Any other error: leave\n      // the in-memory map empty — next mutation will overwrite the bad\n      // file atomically.\n      if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n        // Corrupt snapshot — try once with the .bak if present.\n        try {\n          const bak = await fs.readFile(`${this.filePath}.bak`, \"utf8\");\n          const parsed = JSON.parse(bak) as Snapshot;\n          if (parsed.version === 2 && parsed.items) {\n            for (const [k, v] of Object.entries(parsed.items)) {\n              this.items.set(k, v);\n            }\n          }\n        } catch {\n          /* fall through with an empty map */\n        }\n      }\n    }\n    this.loaded = true;\n  }\n\n  /** Serialize writes so overlapping mutations don't race on the\n   * temp-file / rename swap. writing is a single-slot promise; each\n   * caller awaits the previous write and then enqueues its own. */\n  private async persist(): Promise<void> {\n    const prior = this.writing;\n    const run = async () => {\n      await prior?.catch(() => undefined);\n      const snap: Snapshot = {\n        version: 2,\n        items: Object.fromEntries(this.items.entries()),\n      };\n      const tmp = `${this.filePath}.tmp`;\n      await fs.mkdir(dirname(this.filePath), { recursive: true });\n      await fs.writeFile(tmp, JSON.stringify(snap), \"utf8\");\n      // Keep a single-generation .bak so a corrupt .tmp promote doesn't\n      // orphan us. Best-effort: ignore ENOENT when there's no prior.\n      try {\n        await fs.rename(this.filePath, `${this.filePath}.bak`);\n      } catch (err) {\n        if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n      }\n      await fs.rename(tmp, this.filePath);\n    };\n    this.writing = run();\n    try {\n      await this.writing;\n    } finally {\n      this.writing = null;\n    }\n  }\n\n  async put(item: QueueItem): Promise<void> {\n    await this.ensureLoaded();\n    if (this.items.has(item.source_event_id)) return;\n    this.items.set(item.source_event_id, item);\n    await this.persist();\n  }\n\n  async has(sourceEventId: string): Promise<boolean> {\n    await this.ensureLoaded();\n    return this.items.has(sourceEventId);\n  }\n\n  async listUnsentBySession(): Promise<Map<string, QueueItem[]>> {\n    await this.ensureLoaded();\n    const out = new Map<string, QueueItem[]>();\n    const sorted = [...this.items.values()]\n      .filter((i) => !i.synced)\n      .sort((a, b) => {\n        if (a.session_id !== b.session_id)\n          return a.session_id < b.session_id ? -1 : 1;\n        return a.last_event_ts_ms - b.last_event_ts_ms;\n      });\n    for (const it of sorted) {\n      const arr = out.get(it.session_id) ?? [];\n      arr.push(it);\n      out.set(it.session_id, arr);\n    }\n    return out;\n  }\n\n  async markSent(sourceEventIds: string[], batchId: string | null): Promise<void> {\n    if (sourceEventIds.length === 0) return;\n    await this.ensureLoaded();\n    for (const id of sourceEventIds) {\n      const it = this.items.get(id);\n      if (!it) continue;\n      it.synced = true;\n      it.sent_batch_id = batchId;\n    }\n    await this.persist();\n  }\n\n  async countUnsent(): Promise<number> {\n    await this.ensureLoaded();\n    let n = 0;\n    for (const it of this.items.values()) if (!it.synced) n++;\n    return n;\n  }\n\n  /** Compat stub — Sqlite store exposed close(); nothing to release here. */\n  close(): void {\n    /* no-op */\n  }\n}\n","/**\n * Emotion + meta-cognition pass — a small client-side LLM call that\n * runs alongside the summariser and tags each segment with the user's\n * mood and cognitive mode.\n *\n *   emotions  →  short lowercase mood tags (\"frustrated\", \"curious\",\n *                \"excited\", \"focused\", \"confused\", \"satisfied\", …).\n *   meta      →  short lowercase meta-cognitive mode tags (\"debugging\",\n *                \"exploring\", \"planning\", \"designing\", \"refactoring\",\n *                \"learning\", \"deciding\", \"reviewing\", …).\n *\n * The list is intentionally NOT an enum. The point of the feature is\n * to let whatever vocabulary actually shows up in the work surface\n * organically rather than forcing it into a fixed set.\n *\n * Output shape (from the LLM):\n *\n *   { \"emotions\": [\"frustrated\", \"curious\"], \"meta\": [\"debugging\"] }\n *\n * The daemon ALSO appends a human-readable suffix to the abstract\n * sent to the server — `[Mood: frustrated, curious] [Mind: debugging]`\n * — so the cognition vocabulary travels inside the abstract text. The\n * structured field on the wire exists for cheap dashboard filtering /\n * aggregation.\n *\n * Failure mode is GRACEFUL — this is a fun / auxiliary pass, not part\n * of the core pipeline contract. If every runtime is unavailable, the\n * segment ships with `cognition` undefined and no suffix. The core\n * \"summariser/classifier failures must throw\" rule (see CLAUDE.md\n * memory) does not extend here; cognition is best-effort.\n */\n\n/**\n * Canonical system prompt — the SAME for every runtime (Prompt API,\n * WebLLM, Ollama, future ones). Centralised here so changing the\n * vocabulary is one edit.\n */\nexport const COGNITION_SYSTEM_PROMPT =\n  \"You read a one-sentence summary of an AI-coding work session and identify the user's emotional state, mental mode, and working stance. \" +\n  \"Output JSON only — first character of reply is `{`. Schema: \" +\n  '{\"emotions\":[],\"meta\":[],\"posture\":[]}. ' +\n  \"emotions: ≤ 3 short lowercase MOOD tags — how the user FEELS — such as \" +\n  \"frustrated, curious, excited, calm, confused, anxious, satisfied, proud, happy, worried, disappointed, overwhelmed, confident. \" +\n  \"meta: ≤ 3 short lowercase MENTAL-MODE tags — HOW the user is THINKING, never what they are doing. Valid examples: \" +\n  \"focused, scattered, in-flow, deliberate, hurried, stuck, open, exploratory, methodical, distracted. \" +\n  \"DO NOT emit ACTIVITY verbs (debugging, refactoring, designing, reviewing, deploying, planning, documenting, implementing) under meta — those describe the WORK, not the MIND. \" +\n  \"If the only candidate tag would be an activity verb, return [] for meta instead. \" +\n  \"posture: ≤ 2 short lowercase WORKING-STANCE tags — the user's risk appetite and how they treat the work, \" +\n  \"inferred from how boldly or carefully they move — such as \" +\n  \"ship-it, yolo, direct-to-prod, cautious, careful, methodical, questioning, skeptical, demanding, easygoing, trusting. \" +\n  \"Each tag ≤ 24 chars, single word or hyphenated, no punctuation. \" +\n  \"Only emit a tag if the summary gives clear evidence — return [] for any field when unsure. \" +\n  \"Do not invent emotions, mental modes, or stances the user did not display. No prose, no markdown.\";\n\n/** Hard caps applied client-side regardless of what the LLM emits. */\nexport const MAX_COGNITION_TAGS_PER_FIELD = 3;\nexport const MAX_COGNITION_TAG_CHARS = 24;\nexport const COGNITION_MAX_TOKENS = 80;\nexport const COGNITION_TEMPERATURE = 0.2;\n\nexport interface CognitionTags {\n  emotions: string[];\n  meta: string[];\n  /** Working-stance tags — the user's risk appetite / how they treat the work\n   * (ship-it, cautious, questioning, easygoing). Surfaced as the `Posture`\n   * taxonomy dimension. */\n  posture: string[];\n}\n\nexport const EMPTY_COGNITION: CognitionTags = { emotions: [], meta: [], posture: [] };\n\n/**\n * The one input every Cognizer adapter accepts. Kept tiny on purpose:\n * the cognition pass operates on the already-summarised abstract, NOT\n * the raw turn excerpts — that work is the summariser's job. Reusing\n * the abstract keeps each call cheap and makes the cognition signal\n * downstream-of-redaction by construction.\n */\nexport interface CognitionInput {\n  /** The pre-redacted segment abstract — same string the server will\n   * eventually see. ≤ 512 chars. */\n  abstract: string;\n}\n\n/**\n * Adapter contract. Returns sanitised tags or null when the runtime\n * couldn't produce anything (e.g. JSON parse error, model not loaded).\n * Callers should treat null as \"no signal\" — same as undefined.\n */\nexport type Cognizer = (input: CognitionInput) => Promise<CognitionTags | null>;\n\n// ── User-prompt builder + reply parser ───────────────────────────────\n\n/** Build the user message for the cognition LLM call. Pure / cheap so\n * tests can assert on the exact prompt without spinning up a runtime. */\nexport function buildCognitionUserPrompt(abstract: string): string {\n  return `Summary: \"${abstract.replace(/\\s+/g, \" \").trim().slice(0, 480)}\"\n\nOutput JSON only.`;\n}\n\n/**\n * Parse + sanitise an LLM reply. Tolerates the model wrapping the JSON\n * in ```json fences``` or leading prose — finds the first `{ … }`\n * block via a balanced-brace scan. Returns null when nothing parses\n * cleanly.\n */\nexport function parseCognitionReply(text: string): CognitionTags | null {\n  const json = extractFirstJsonObject(text);\n  if (!json) return null;\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(json);\n  } catch {\n    return null;\n  }\n  if (!parsed || typeof parsed !== \"object\") return null;\n  const obj = parsed as { emotions?: unknown; meta?: unknown; posture?: unknown };\n  return {\n    emotions: sanitiseTags(obj.emotions),\n    meta: sanitiseTags(obj.meta),\n    posture: sanitiseTags(obj.posture),\n  };\n}\n\n/**\n * Lowercase, trim, drop punctuation/numerics, dedupe, cap length and\n * count. Applied client-side to whatever the LLM emits so a confused\n * runtime can't ship \"VERY ANGRY!!!\" or 47 tags.\n */\nexport function sanitiseTags(raw: unknown): string[] {\n  if (!Array.isArray(raw)) return [];\n  const seen = new Set<string>();\n  const out: string[] = [];\n  for (const t of raw) {\n    if (typeof t !== \"string\") continue;\n    const cleaned = t\n      .toLowerCase()\n      .normalize(\"NFKD\")\n      // Keep letters + digits + hyphens. Drop everything else.\n      .replace(/[^a-z0-9-]/g, \"\")\n      .replace(/-+/g, \"-\")\n      .replace(/^-+|-+$/g, \"\")\n      .slice(0, MAX_COGNITION_TAG_CHARS);\n    if (!cleaned) continue;\n    if (seen.has(cleaned)) continue;\n    seen.add(cleaned);\n    out.push(cleaned);\n    if (out.length >= MAX_COGNITION_TAGS_PER_FIELD) break;\n  }\n  return out;\n}\n\n/** Format the human-readable suffix appended to the abstract.\n *\n *   formatCognitionSuffix({ emotions: [\"frustrated\",\"curious\"], meta: [\"debugging\"] })\n *   → \"[Mood: frustrated, curious] [Mind: debugging]\"\n *\n * Returns \"\" when both arrays are empty so callers can append\n * unconditionally without injecting trailing whitespace.\n */\nexport function formatCognitionSuffix(c: CognitionTags | null | undefined): string {\n  if (!c) return \"\";\n  const parts: string[] = [];\n  if (c.emotions.length > 0) parts.push(`[Mood: ${c.emotions.join(\", \")}]`);\n  if (c.meta.length > 0) parts.push(`[Mind: ${c.meta.join(\", \")}]`);\n  if (c.posture.length > 0) parts.push(`[Stance: ${c.posture.join(\", \")}]`);\n  return parts.join(\" \");\n}\n\n/**\n * Structured `mood` + `mind` + `posture` hints for the segment's `tags` array.\n * Emits the PRIMARY (first) tag of each so the server's Mood/Mind/Posture drivers\n * create ONE leaf per session — mirroring the one-node-per-segment temporal/cadence\n * drivers. The full set still travels in the human-readable suffix. Capitalised for\n * display (\"frustrated\" → \"Frustrated\"). Returns [] when there's nothing to emit, so\n * the caller can `tags.push(...cognitionHints(c))` unconditionally.\n */\nexport function cognitionHints(\n  c: CognitionTags | null | undefined,\n): Array<{ root_key: string; name: string; confidence: number }> {\n  if (!c) return [];\n  const cap = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s);\n  const out: Array<{ root_key: string; name: string; confidence: number }> = [];\n  if (c.emotions[0]) out.push({ root_key: \"mood\", name: cap(c.emotions[0]), confidence: 0.7 });\n  if (c.meta[0]) out.push({ root_key: \"mind\", name: cap(c.meta[0]), confidence: 0.7 });\n  if (c.posture[0]) out.push({ root_key: \"posture\", name: cap(c.posture[0]), confidence: 0.7 });\n  return out;\n}\n\n/**\n * Extract the FIRST balanced `{…}` block from a string. Robust to the\n * common LLM mistakes: leading \"```json\" fences, trailing prose,\n * unescaped quotes inside string literals (which we don't try to\n * tolerate — JSON.parse handles those).\n */\nfunction extractFirstJsonObject(s: string): string | null {\n  const start = s.indexOf(\"{\");\n  if (start < 0) return null;\n  let depth = 0;\n  let inStr = false;\n  let escape = false;\n  for (let i = start; i < s.length; i++) {\n    const ch = s[i];\n    if (inStr) {\n      if (escape) escape = false;\n      else if (ch === \"\\\\\") escape = true;\n      else if (ch === '\"') inStr = false;\n      continue;\n    }\n    if (ch === '\"') {\n      inStr = true;\n      continue;\n    }\n    if (ch === \"{\") depth++;\n    else if (ch === \"}\") {\n      depth--;\n      if (depth === 0) return s.slice(start, i + 1);\n    }\n  }\n  return null;\n}\n","/**\n * Shared prompt + model contracts for the pipeline's summariser.\n *\n * Every daemon runtime (Ollama on Node, WebLLM / Chrome Prompt API\n * in the browser extension) reuses these constants so the abstract\n * you get from qwen3:4b running in Ollama is almost identical to\n * what you get from Qwen3-4B-Instruct-q4f16_1-MLC in the extension\n * — same model family, same system prompt, same output cap.\n *\n * If you change the wording here, EVERY runtime's behaviour shifts at\n * once. That's the point.\n */\n\n/**\n * Canonical summariser model identifier. Concrete runtimes map this\n * to their own identifier scheme:\n *\n *   Ollama (CLI/tray) → \"qwen3:4b\"                     — 4B params, ~2.5 GB q4\n *   WebLLM (browser)  → \"Qwen3-4B-Instruct-q4f16_1-MLC\" — same family, browser-quantised\n *   Bundled llama.cpp → Qwen3.5-4B-Q4_K_M.gguf          — daemon-dev fallback when Ollama absent\n *   Prompt API        → n/a (Chrome picks its built-in Gemini Nano when available)\n *\n * Why the bump from Qwen3.5-0.8B → Qwen3-4B (May 2026):\n *   • The 0.8B model was hitting quality ceilings on multi-paragraph\n *     summarisation. Empirically the abstracts coming out of 0.8B\n *     truncated key context and routinely missed the SUBJECT of a\n *     session (the very thing downstream consumers need).\n *   • Qwen3-4B-Instruct lands near Qwen2.5-32B-Instruct on summarisation\n *     benchmarks while still running on consumer hardware (8 GB RAM,\n *     CPU-only is fine for the segment cadence — one call per session).\n *   • Browser memory is the binding constraint for WebLLM. 4B q4f16\n *     loads in ~2.4 GB of WebGPU heap; tested OK on M-series Macs and\n *     mid-range PCs. Users with extreme constraints can fall back to\n *     Chrome's built-in Prompt API path.\n *   • Only the summariser producing the abstract gets the upgrade.\n *     Higher-quality input → higher-quality concept extraction.\n *\n * Bumping this is a breaking change for daemons — pull the new\n * Ollama tag on first start; ship a new extension build before\n * flipping the default in the registry.\n */\nexport const SUMMARISER_MODEL_FAMILY = \"qwen3-4b\" as const;\n\nexport const OLLAMA_CHAT_MODEL = \"qwen3:4b\" as const;\nexport const WEBLLM_CHAT_MODEL = \"Qwen3-4B-Instruct-q4f16_1-MLC\" as const;\n\n/** Canonical embedding model — 384-dim (BAAI/bge-small-en-v1.5 family).\n * Ollama ships it as `bge-small-en-v1.5`; the browser side loads the\n * same model weights via transformers.js (`Xenova/bge-small-en-v1.5`).\n * Both halves produce the SAME 384-dim vector space so a segment\n * embedded by the CLI is directly comparable to one embedded by the\n * extension — cosine similarity on cross-source segments is meaningful.\n * The wire embedding is 384-dim (BGE-small). Any future swap must keep\n * this dim invariant across both daemon runtimes (CLI, browser).\n *\n * Why BGE-small over MiniLM (the earlier default): MTEB ~62 vs ~56 on\n * sentence-similarity tasks — a ~6 point gain with negligible CPU\n * penalty (33M vs 23M params). MiniLM was chosen historically because\n * Ollama's library didn't publish a bge-small tag, but it does now. */\nexport const OLLAMA_EMBED_MODEL = \"bge-small-en-v1.5\" as const;\nexport const BROWSER_EMBED_MODEL = \"Xenova/bge-small-en-v1.5\" as const;\n\n/**\n * System prompt used by BOTH Ollama and WebLLM summarisers. Kept\n * short and strict so the local 4B model reliably returns a single\n * sentence under the 240-char output cap the pipeline enforces.\n *\n * The user message may include sampled conversation excerpts (already\n * PII-redacted by the parser + the daemon's regex pass) when the\n * tool's parser supports content_excerpt. With excerpts the\n * summariser can describe what was actually being built; without\n * them it falls back to the metadata-only paraphrase.\n */\nexport const SUMMARISER_SYSTEM_PROMPT =\n  \"You summarise an AI coding session in 1-2 sentences, ≤ 400 characters. \" +\n  \"Name the CONCRETE work: the action taken, WHAT it acted on, and the \" +\n  \"specific target — the repository (e.g. acme/web), branch, service, or \" +\n  \"component — whenever the session facts or excerpts identify it. \" +\n  'Good: \"Triggered a GitHub Actions release for acme/web\"; \"Fixed a null ' +\n  'dereference in the auth middleware of api-gateway\". Lead with an outcome ' +\n  \"verb and pack in concrete domain keywords (frameworks, features, \" +\n  \"decisions). Base the substance on the excerpts when present, else the \" +\n  \"metadata. Never quote excerpts verbatim. No PII, no secrets, no API keys, \" +\n  \"no absolute file paths. Reply with only the summary.\";\n\n/** Hard cap on the tokens the summariser may emit. Keep well above\n * 400 chars worth (~120 tokens at 3.3 chars/token) so the model doesn't\n * cut mid-word; the pipeline slices to 400 chars after. */\nexport const SUMMARISER_MAX_TOKENS = 180;\n\n/** Low temperature — same turns should yield the same abstract on\n * replay so our idempotency assertions in tests hold. */\nexport const SUMMARISER_TEMPERATURE = 0.2;\n\n/** Low top-k — keep sampling tight so the abstract is stable across\n * runtimes (Ollama / WebLLM / Chrome Prompt API) and across replays.\n * Shared so no runtime drifts to a looser value. */\nexport const SUMMARISER_TOP_K = 3;\n\n/** Approximate chars-per-token ratio for Qwen-family tokenizers.\n * Used as the cheap tokenizer fallback on both runtimes so spend\n * attribution stays directionally correct even without tiktoken. */\nexport const QWEN_CHARS_PER_TOKEN = 3.3;\n\n/** Hard cap the pipeline enforces on the abstract returned by the\n * summariser. Matches the \"≤400 chars\" instruction baked into\n * SUMMARISER_SYSTEM_PROMPT so the model and the post-processor\n * agree on the same limit (raised 240→400 so abstracts can name the\n * concrete action + target — the Insights feature reads these). Stays\n * under the 512 storage cap. Re-exported from pipeline/index.ts. */\nexport const ABSTRACT_OUTPUT_MAX_CHARS = 400;\n","/**\n * Prompt + contract for the on-device per-SCRIPT content summariser — the\n * fourth local-model pass.\n *\n * A tool command often runs script/bash FILES (`./deploy.sh`,\n * `scripts/migrate.py`, …). The redacted command alone tells the server the\n * file was run but not what it DOES. This pass reads each referenced file\n * locally and compacts it into one factual sentence, so the server understands\n * the command's real effect without ever seeing the file's contents.\n *\n * Browser-safe: prompt strings + a builder + the adapter type only — no `fs`, no\n * model. The Node binding (daemon-core/node/llama.ts) supplies inference; the\n * agent's enrichment pass (apps/daemon) supplies file reading + redaction.\n *\n * Generic by construction: nothing about specific tools, languages, or\n * categories is baked in — the model describes whatever the file actually does.\n */\n\n/** Hard cap on one script abstract — mirrors the wire field\n * `ToolAction.scripts[].summary` (`z.string().max(200)`). */\nexport const SCRIPT_SUMMARY_OUTPUT_MAX_CHARS = 200;\n\n/** Low temperature: this is faithful description, not creative writing. */\nexport const SCRIPT_SUMMARY_TEMPERATURE = 0.2;\n\n/** The answer is one short sentence; the Node binding adds a thinking budget on\n * top of this (same pattern as the cognition/title passes). */\nexport const SCRIPT_SUMMARY_MAX_TOKENS = 120;\n\n/** How much of a script file we feed the model. Scripts are usually small; a few\n * KB is plenty to characterise intent and keeps the prompt inside the local\n * context window. The read side also caps bytes before calling. */\nexport const SCRIPT_SUMMARY_INPUT_MAX_CHARS = 6000;\n\nexport const SCRIPT_SUMMARY_SYSTEM_PROMPT = `You summarise what a script file does, for an engineer scanning a dashboard.\n\nRules:\n- Output ONE plain sentence (at most 200 characters) stating what the script DOES when it runs.\n- Be concrete and factual: the actions it performs and the systems it touches.\n- No preamble (\"This script…\"), no markdown, no quotes, no line breaks.\n- Do not invent behaviour that is not in the file. If the file is trivial or unreadable, say so briefly.\n- Never include secrets, tokens, passwords, or personal data, even if they appear in the file.`;\n\n/** Build the user turn: the script's reference (for context) + its capped\n * contents. Truncation here is a backstop — the agent already caps the bytes it\n * reads, but a single over-long line could still blow the context window. */\nexport function buildScriptSummaryUserPrompt(input: { ref: string; content: string }): string {\n  const body = input.content.slice(0, SCRIPT_SUMMARY_INPUT_MAX_CHARS);\n  return [\n    `Script reference: ${input.ref}`,\n    \"Contents:\",\n    \"```\",\n    body,\n    \"```\",\n    \"\",\n    \"One sentence (≤200 chars): what does running this script do?\",\n  ].join(\"\\n\");\n}\n\n/**\n * Adapter the agent supplies to turn a script's `{ ref, content }` into a\n * one-sentence abstract. Best-effort by contract: returns `null` on any failure\n * (model not loaded, empty answer) so a script that can't be summarised simply\n * ships without an abstract — the call still ships its redacted command.\n */\nexport type ScriptSummarizer = (input: { ref: string; content: string }) => Promise<string | null>;\n","export var util;\n(function (util) {\n    util.assertEqual = (_) => { };\n    function assertIs(_arg) { }\n    util.assertIs = assertIs;\n    function assertNever(_x) {\n        throw new Error();\n    }\n    util.assertNever = assertNever;\n    util.arrayToEnum = (items) => {\n        const obj = {};\n        for (const item of items) {\n            obj[item] = item;\n        }\n        return obj;\n    };\n    util.getValidEnumValues = (obj) => {\n        const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n        const filtered = {};\n        for (const k of validKeys) {\n            filtered[k] = obj[k];\n        }\n        return util.objectValues(filtered);\n    };\n    util.objectValues = (obj) => {\n        return util.objectKeys(obj).map(function (e) {\n            return obj[e];\n        });\n    };\n    util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n        ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n        : (object) => {\n            const keys = [];\n            for (const key in object) {\n                if (Object.prototype.hasOwnProperty.call(object, key)) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n    util.find = (arr, checker) => {\n        for (const item of arr) {\n            if (checker(item))\n                return item;\n        }\n        return undefined;\n    };\n    util.isInteger = typeof Number.isInteger === \"function\"\n        ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n        : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n    function joinValues(array, separator = \" | \") {\n        return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n    }\n    util.joinValues = joinValues;\n    util.jsonStringifyReplacer = (_, value) => {\n        if (typeof value === \"bigint\") {\n            return value.toString();\n        }\n        return value;\n    };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n    objectUtil.mergeShapes = (first, second) => {\n        return {\n            ...first,\n            ...second, // second overwrites first\n        };\n    };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n    \"string\",\n    \"nan\",\n    \"number\",\n    \"integer\",\n    \"float\",\n    \"boolean\",\n    \"date\",\n    \"bigint\",\n    \"symbol\",\n    \"function\",\n    \"undefined\",\n    \"null\",\n    \"array\",\n    \"object\",\n    \"unknown\",\n    \"promise\",\n    \"void\",\n    \"never\",\n    \"map\",\n    \"set\",\n]);\nexport const getParsedType = (data) => {\n    const t = typeof data;\n    switch (t) {\n        case \"undefined\":\n            return ZodParsedType.undefined;\n        case \"string\":\n            return ZodParsedType.string;\n        case \"number\":\n            return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n        case \"boolean\":\n            return ZodParsedType.boolean;\n        case \"function\":\n            return ZodParsedType.function;\n        case \"bigint\":\n            return ZodParsedType.bigint;\n        case \"symbol\":\n            return ZodParsedType.symbol;\n        case \"object\":\n            if (Array.isArray(data)) {\n                return ZodParsedType.array;\n            }\n            if (data === null) {\n                return ZodParsedType.null;\n            }\n            if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n                return ZodParsedType.promise;\n            }\n            if (typeof Map !== \"undefined\" && data instanceof Map) {\n                return ZodParsedType.map;\n            }\n            if (typeof Set !== \"undefined\" && data instanceof Set) {\n                return ZodParsedType.set;\n            }\n            if (typeof Date !== \"undefined\" && data instanceof Date) {\n                return ZodParsedType.date;\n            }\n            return ZodParsedType.object;\n        default:\n            return ZodParsedType.unknown;\n    }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n    \"invalid_type\",\n    \"invalid_literal\",\n    \"custom\",\n    \"invalid_union\",\n    \"invalid_union_discriminator\",\n    \"invalid_enum_value\",\n    \"unrecognized_keys\",\n    \"invalid_arguments\",\n    \"invalid_return_type\",\n    \"invalid_date\",\n    \"invalid_string\",\n    \"too_small\",\n    \"too_big\",\n    \"invalid_intersection_types\",\n    \"not_multiple_of\",\n    \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n    const json = JSON.stringify(obj, null, 2);\n    return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n    get errors() {\n        return this.issues;\n    }\n    constructor(issues) {\n        super();\n        this.issues = [];\n        this.addIssue = (sub) => {\n            this.issues = [...this.issues, sub];\n        };\n        this.addIssues = (subs = []) => {\n            this.issues = [...this.issues, ...subs];\n        };\n        const actualProto = new.target.prototype;\n        if (Object.setPrototypeOf) {\n            // eslint-disable-next-line ban/ban\n            Object.setPrototypeOf(this, actualProto);\n        }\n        else {\n            this.__proto__ = actualProto;\n        }\n        this.name = \"ZodError\";\n        this.issues = issues;\n    }\n    format(_mapper) {\n        const mapper = _mapper ||\n            function (issue) {\n                return issue.message;\n            };\n        const fieldErrors = { _errors: [] };\n        const processError = (error) => {\n            for (const issue of error.issues) {\n                if (issue.code === \"invalid_union\") {\n                    issue.unionErrors.map(processError);\n                }\n                else if (issue.code === \"invalid_return_type\") {\n                    processError(issue.returnTypeError);\n                }\n                else if (issue.code === \"invalid_arguments\") {\n                    processError(issue.argumentsError);\n                }\n                else if (issue.path.length === 0) {\n                    fieldErrors._errors.push(mapper(issue));\n                }\n                else {\n                    let curr = fieldErrors;\n                    let i = 0;\n                    while (i < issue.path.length) {\n                        const el = issue.path[i];\n                        const terminal = i === issue.path.length - 1;\n                        if (!terminal) {\n                            curr[el] = curr[el] || { _errors: [] };\n                            // if (typeof el === \"string\") {\n                            //   curr[el] = curr[el] || { _errors: [] };\n                            // } else if (typeof el === \"number\") {\n                            //   const errorArray: any = [];\n                            //   errorArray._errors = [];\n                            //   curr[el] = curr[el] || errorArray;\n                            // }\n                        }\n                        else {\n                            curr[el] = curr[el] || { _errors: [] };\n                            curr[el]._errors.push(mapper(issue));\n                        }\n                        curr = curr[el];\n                        i++;\n                    }\n                }\n            }\n        };\n        processError(this);\n        return fieldErrors;\n    }\n    static assert(value) {\n        if (!(value instanceof ZodError)) {\n            throw new Error(`Not a ZodError: ${value}`);\n        }\n    }\n    toString() {\n        return this.message;\n    }\n    get message() {\n        return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n    }\n    get isEmpty() {\n        return this.issues.length === 0;\n    }\n    flatten(mapper = (issue) => issue.message) {\n        const fieldErrors = {};\n        const formErrors = [];\n        for (const sub of this.issues) {\n            if (sub.path.length > 0) {\n                const firstEl = sub.path[0];\n                fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n                fieldErrors[firstEl].push(mapper(sub));\n            }\n            else {\n                formErrors.push(mapper(sub));\n            }\n        }\n        return { formErrors, fieldErrors };\n    }\n    get formErrors() {\n        return this.flatten();\n    }\n}\nZodError.create = (issues) => {\n    const error = new ZodError(issues);\n    return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n    let message;\n    switch (issue.code) {\n        case ZodIssueCode.invalid_type:\n            if (issue.received === ZodParsedType.undefined) {\n                message = \"Required\";\n            }\n            else {\n                message = `Expected ${issue.expected}, received ${issue.received}`;\n            }\n            break;\n        case ZodIssueCode.invalid_literal:\n            message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n            break;\n        case ZodIssueCode.unrecognized_keys:\n            message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n            break;\n        case ZodIssueCode.invalid_union:\n            message = `Invalid input`;\n            break;\n        case ZodIssueCode.invalid_union_discriminator:\n            message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n            break;\n        case ZodIssueCode.invalid_enum_value:\n            message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n            break;\n        case ZodIssueCode.invalid_arguments:\n            message = `Invalid function arguments`;\n            break;\n        case ZodIssueCode.invalid_return_type:\n            message = `Invalid function return type`;\n            break;\n        case ZodIssueCode.invalid_date:\n            message = `Invalid date`;\n            break;\n        case ZodIssueCode.invalid_string:\n            if (typeof issue.validation === \"object\") {\n                if (\"includes\" in issue.validation) {\n                    message = `Invalid input: must include \"${issue.validation.includes}\"`;\n                    if (typeof issue.validation.position === \"number\") {\n                        message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n                    }\n                }\n                else if (\"startsWith\" in issue.validation) {\n                    message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n                }\n                else if (\"endsWith\" in issue.validation) {\n                    message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n                }\n                else {\n                    util.assertNever(issue.validation);\n                }\n            }\n            else if (issue.validation !== \"regex\") {\n                message = `Invalid ${issue.validation}`;\n            }\n            else {\n                message = \"Invalid\";\n            }\n            break;\n        case ZodIssueCode.too_small:\n            if (issue.type === \"array\")\n                message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n            else if (issue.type === \"string\")\n                message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n            else if (issue.type === \"number\")\n                message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n            else if (issue.type === \"bigint\")\n                message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n            else if (issue.type === \"date\")\n                message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n            else\n                message = \"Invalid input\";\n            break;\n        case ZodIssueCode.too_big:\n            if (issue.type === \"array\")\n                message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n            else if (issue.type === \"string\")\n                message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n            else if (issue.type === \"number\")\n                message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n            else if (issue.type === \"bigint\")\n                message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n            else if (issue.type === \"date\")\n                message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n            else\n                message = \"Invalid input\";\n            break;\n        case ZodIssueCode.custom:\n            message = `Invalid input`;\n            break;\n        case ZodIssueCode.invalid_intersection_types:\n            message = `Intersection results could not be merged`;\n            break;\n        case ZodIssueCode.not_multiple_of:\n            message = `Number must be a multiple of ${issue.multipleOf}`;\n            break;\n        case ZodIssueCode.not_finite:\n            message = \"Number must be finite\";\n            break;\n        default:\n            message = _ctx.defaultError;\n            util.assertNever(issue);\n    }\n    return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n    overrideErrorMap = map;\n}\nexport function getErrorMap() {\n    return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n    const { data, path, errorMaps, issueData } = params;\n    const fullPath = [...path, ...(issueData.path || [])];\n    const fullIssue = {\n        ...issueData,\n        path: fullPath,\n    };\n    if (issueData.message !== undefined) {\n        return {\n            ...issueData,\n            path: fullPath,\n            message: issueData.message,\n        };\n    }\n    let errorMessage = \"\";\n    const maps = errorMaps\n        .filter((m) => !!m)\n        .slice()\n        .reverse();\n    for (const map of maps) {\n        errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n    }\n    return {\n        ...issueData,\n        path: fullPath,\n        message: errorMessage,\n    };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n    const overrideMap = getErrorMap();\n    const issue = makeIssue({\n        issueData: issueData,\n        data: ctx.data,\n        path: ctx.path,\n        errorMaps: [\n            ctx.common.contextualErrorMap, // contextual error map is first priority\n            ctx.schemaErrorMap, // then schema-bound map if available\n            overrideMap, // then global override map\n            overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n        ].filter((x) => !!x),\n    });\n    ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n    constructor() {\n        this.value = \"valid\";\n    }\n    dirty() {\n        if (this.value === \"valid\")\n            this.value = \"dirty\";\n    }\n    abort() {\n        if (this.value !== \"aborted\")\n            this.value = \"aborted\";\n    }\n    static mergeArray(status, results) {\n        const arrayValue = [];\n        for (const s of results) {\n            if (s.status === \"aborted\")\n                return INVALID;\n            if (s.status === \"dirty\")\n                status.dirty();\n            arrayValue.push(s.value);\n        }\n        return { status: status.value, value: arrayValue };\n    }\n    static async mergeObjectAsync(status, pairs) {\n        const syncPairs = [];\n        for (const pair of pairs) {\n            const key = await pair.key;\n            const value = await pair.value;\n            syncPairs.push({\n                key,\n                value,\n            });\n        }\n        return ParseStatus.mergeObjectSync(status, syncPairs);\n    }\n    static mergeObjectSync(status, pairs) {\n        const finalObject = {};\n        for (const pair of pairs) {\n            const { key, value } = pair;\n            if (key.status === \"aborted\")\n                return INVALID;\n            if (value.status === \"aborted\")\n                return INVALID;\n            if (key.status === \"dirty\")\n                status.dirty();\n            if (value.status === \"dirty\")\n                status.dirty();\n            if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n                finalObject[key.value] = value.value;\n            }\n        }\n        return { status: status.value, value: finalObject };\n    }\n}\nexport const INVALID = Object.freeze({\n    status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export {};\n","export var errorUtil;\n(function (errorUtil) {\n    errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n    // biome-ignore lint:\n    errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n    constructor(parent, value, path, key) {\n        this._cachedPath = [];\n        this.parent = parent;\n        this.data = value;\n        this._path = path;\n        this._key = key;\n    }\n    get path() {\n        if (!this._cachedPath.length) {\n            if (Array.isArray(this._key)) {\n                this._cachedPath.push(...this._path, ...this._key);\n            }\n            else {\n                this._cachedPath.push(...this._path, this._key);\n            }\n        }\n        return this._cachedPath;\n    }\n}\nconst handleResult = (ctx, result) => {\n    if (isValid(result)) {\n        return { success: true, data: result.value };\n    }\n    else {\n        if (!ctx.common.issues.length) {\n            throw new Error(\"Validation failed but no issues detected.\");\n        }\n        return {\n            success: false,\n            get error() {\n                if (this._error)\n                    return this._error;\n                const error = new ZodError(ctx.common.issues);\n                this._error = error;\n                return this._error;\n            },\n        };\n    }\n};\nfunction processCreateParams(params) {\n    if (!params)\n        return {};\n    const { errorMap, invalid_type_error, required_error, description } = params;\n    if (errorMap && (invalid_type_error || required_error)) {\n        throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n    }\n    if (errorMap)\n        return { errorMap: errorMap, description };\n    const customMap = (iss, ctx) => {\n        const { message } = params;\n        if (iss.code === \"invalid_enum_value\") {\n            return { message: message ?? ctx.defaultError };\n        }\n        if (typeof ctx.data === \"undefined\") {\n            return { message: message ?? required_error ?? ctx.defaultError };\n        }\n        if (iss.code !== \"invalid_type\")\n            return { message: ctx.defaultError };\n        return { message: message ?? invalid_type_error ?? ctx.defaultError };\n    };\n    return { errorMap: customMap, description };\n}\nexport class ZodType {\n    get description() {\n        return this._def.description;\n    }\n    _getType(input) {\n        return getParsedType(input.data);\n    }\n    _getOrReturnCtx(input, ctx) {\n        return (ctx || {\n            common: input.parent.common,\n            data: input.data,\n            parsedType: getParsedType(input.data),\n            schemaErrorMap: this._def.errorMap,\n            path: input.path,\n            parent: input.parent,\n        });\n    }\n    _processInputParams(input) {\n        return {\n            status: new ParseStatus(),\n            ctx: {\n                common: input.parent.common,\n                data: input.data,\n                parsedType: getParsedType(input.data),\n                schemaErrorMap: this._def.errorMap,\n                path: input.path,\n                parent: input.parent,\n            },\n        };\n    }\n    _parseSync(input) {\n        const result = this._parse(input);\n        if (isAsync(result)) {\n            throw new Error(\"Synchronous parse encountered promise.\");\n        }\n        return result;\n    }\n    _parseAsync(input) {\n        const result = this._parse(input);\n        return Promise.resolve(result);\n    }\n    parse(data, params) {\n        const result = this.safeParse(data, params);\n        if (result.success)\n            return result.data;\n        throw result.error;\n    }\n    safeParse(data, params) {\n        const ctx = {\n            common: {\n                issues: [],\n                async: params?.async ?? false,\n                contextualErrorMap: params?.errorMap,\n            },\n            path: params?.path || [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: getParsedType(data),\n        };\n        const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n        return handleResult(ctx, result);\n    }\n    \"~validate\"(data) {\n        const ctx = {\n            common: {\n                issues: [],\n                async: !!this[\"~standard\"].async,\n            },\n            path: [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: getParsedType(data),\n        };\n        if (!this[\"~standard\"].async) {\n            try {\n                const result = this._parseSync({ data, path: [], parent: ctx });\n                return isValid(result)\n                    ? {\n                        value: result.value,\n                    }\n                    : {\n                        issues: ctx.common.issues,\n                    };\n            }\n            catch (err) {\n                if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n                    this[\"~standard\"].async = true;\n                }\n                ctx.common = {\n                    issues: [],\n                    async: true,\n                };\n            }\n        }\n        return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n            ? {\n                value: result.value,\n            }\n            : {\n                issues: ctx.common.issues,\n            });\n    }\n    async parseAsync(data, params) {\n        const result = await this.safeParseAsync(data, params);\n        if (result.success)\n            return result.data;\n        throw result.error;\n    }\n    async safeParseAsync(data, params) {\n        const ctx = {\n            common: {\n                issues: [],\n                contextualErrorMap: params?.errorMap,\n                async: true,\n            },\n            path: params?.path || [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: getParsedType(data),\n        };\n        const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n        const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n        return handleResult(ctx, result);\n    }\n    refine(check, message) {\n        const getIssueProperties = (val) => {\n            if (typeof message === \"string\" || typeof message === \"undefined\") {\n                return { message };\n            }\n            else if (typeof message === \"function\") {\n                return message(val);\n            }\n            else {\n                return message;\n            }\n        };\n        return this._refinement((val, ctx) => {\n            const result = check(val);\n            const setError = () => ctx.addIssue({\n                code: ZodIssueCode.custom,\n                ...getIssueProperties(val),\n            });\n            if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n                return result.then((data) => {\n                    if (!data) {\n                        setError();\n                        return false;\n                    }\n                    else {\n                        return true;\n                    }\n                });\n            }\n            if (!result) {\n                setError();\n                return false;\n            }\n            else {\n                return true;\n            }\n        });\n    }\n    refinement(check, refinementData) {\n        return this._refinement((val, ctx) => {\n            if (!check(val)) {\n                ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n                return false;\n            }\n            else {\n                return true;\n            }\n        });\n    }\n    _refinement(refinement) {\n        return new ZodEffects({\n            schema: this,\n            typeName: ZodFirstPartyTypeKind.ZodEffects,\n            effect: { type: \"refinement\", refinement },\n        });\n    }\n    superRefine(refinement) {\n        return this._refinement(refinement);\n    }\n    constructor(def) {\n        /** Alias of safeParseAsync */\n        this.spa = this.safeParseAsync;\n        this._def = def;\n        this.parse = this.parse.bind(this);\n        this.safeParse = this.safeParse.bind(this);\n        this.parseAsync = this.parseAsync.bind(this);\n        this.safeParseAsync = this.safeParseAsync.bind(this);\n        this.spa = this.spa.bind(this);\n        this.refine = this.refine.bind(this);\n        this.refinement = this.refinement.bind(this);\n        this.superRefine = this.superRefine.bind(this);\n        this.optional = this.optional.bind(this);\n        this.nullable = this.nullable.bind(this);\n        this.nullish = this.nullish.bind(this);\n        this.array = this.array.bind(this);\n        this.promise = this.promise.bind(this);\n        this.or = this.or.bind(this);\n        this.and = this.and.bind(this);\n        this.transform = this.transform.bind(this);\n        this.brand = this.brand.bind(this);\n        this.default = this.default.bind(this);\n        this.catch = this.catch.bind(this);\n        this.describe = this.describe.bind(this);\n        this.pipe = this.pipe.bind(this);\n        this.readonly = this.readonly.bind(this);\n        this.isNullable = this.isNullable.bind(this);\n        this.isOptional = this.isOptional.bind(this);\n        this[\"~standard\"] = {\n            version: 1,\n            vendor: \"zod\",\n            validate: (data) => this[\"~validate\"](data),\n        };\n    }\n    optional() {\n        return ZodOptional.create(this, this._def);\n    }\n    nullable() {\n        return ZodNullable.create(this, this._def);\n    }\n    nullish() {\n        return this.nullable().optional();\n    }\n    array() {\n        return ZodArray.create(this);\n    }\n    promise() {\n        return ZodPromise.create(this, this._def);\n    }\n    or(option) {\n        return ZodUnion.create([this, option], this._def);\n    }\n    and(incoming) {\n        return ZodIntersection.create(this, incoming, this._def);\n    }\n    transform(transform) {\n        return new ZodEffects({\n            ...processCreateParams(this._def),\n            schema: this,\n            typeName: ZodFirstPartyTypeKind.ZodEffects,\n            effect: { type: \"transform\", transform },\n        });\n    }\n    default(def) {\n        const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n        return new ZodDefault({\n            ...processCreateParams(this._def),\n            innerType: this,\n            defaultValue: defaultValueFunc,\n            typeName: ZodFirstPartyTypeKind.ZodDefault,\n        });\n    }\n    brand() {\n        return new ZodBranded({\n            typeName: ZodFirstPartyTypeKind.ZodBranded,\n            type: this,\n            ...processCreateParams(this._def),\n        });\n    }\n    catch(def) {\n        const catchValueFunc = typeof def === \"function\" ? def : () => def;\n        return new ZodCatch({\n            ...processCreateParams(this._def),\n            innerType: this,\n            catchValue: catchValueFunc,\n            typeName: ZodFirstPartyTypeKind.ZodCatch,\n        });\n    }\n    describe(description) {\n        const This = this.constructor;\n        return new This({\n            ...this._def,\n            description,\n        });\n    }\n    pipe(target) {\n        return ZodPipeline.create(this, target);\n    }\n    readonly() {\n        return ZodReadonly.create(this);\n    }\n    isOptional() {\n        return this.safeParse(undefined).success;\n    }\n    isNullable() {\n        return this.safeParse(null).success;\n    }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n//   /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n//   /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n//   /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n//   /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n//   /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n    let secondsRegexSource = `[0-5]\\\\d`;\n    if (args.precision) {\n        secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n    }\n    else if (args.precision == null) {\n        secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n    }\n    const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n    return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n    return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n    let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n    const opts = [];\n    opts.push(args.local ? `Z?` : `Z`);\n    if (args.offset)\n        opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n    regex = `${regex}(${opts.join(\"|\")})`;\n    return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n    if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n        return true;\n    }\n    if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n        return true;\n    }\n    return false;\n}\nfunction isValidJWT(jwt, alg) {\n    if (!jwtRegex.test(jwt))\n        return false;\n    try {\n        const [header] = jwt.split(\".\");\n        if (!header)\n            return false;\n        // Convert base64url to base64\n        const base64 = header\n            .replace(/-/g, \"+\")\n            .replace(/_/g, \"/\")\n            .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n        const decoded = JSON.parse(atob(base64));\n        if (typeof decoded !== \"object\" || decoded === null)\n            return false;\n        if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n            return false;\n        if (!decoded.alg)\n            return false;\n        if (alg && decoded.alg !== alg)\n            return false;\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\nfunction isValidCidr(ip, version) {\n    if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n        return true;\n    }\n    if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n        return true;\n    }\n    return false;\n}\nexport class ZodString extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = String(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.string) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.string,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const status = new ParseStatus();\n        let ctx = undefined;\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                if (input.data.length < check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_small,\n                        minimum: check.value,\n                        type: \"string\",\n                        inclusive: true,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                if (input.data.length > check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_big,\n                        maximum: check.value,\n                        type: \"string\",\n                        inclusive: true,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"length\") {\n                const tooBig = input.data.length > check.value;\n                const tooSmall = input.data.length < check.value;\n                if (tooBig || tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    if (tooBig) {\n                        addIssueToContext(ctx, {\n                            code: ZodIssueCode.too_big,\n                            maximum: check.value,\n                            type: \"string\",\n                            inclusive: true,\n                            exact: true,\n                            message: check.message,\n                        });\n                    }\n                    else if (tooSmall) {\n                        addIssueToContext(ctx, {\n                            code: ZodIssueCode.too_small,\n                            minimum: check.value,\n                            type: \"string\",\n                            inclusive: true,\n                            exact: true,\n                            message: check.message,\n                        });\n                    }\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"email\") {\n                if (!emailRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"email\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"emoji\") {\n                if (!emojiRegex) {\n                    emojiRegex = new RegExp(_emojiRegex, \"u\");\n                }\n                if (!emojiRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"emoji\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"uuid\") {\n                if (!uuidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"uuid\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"nanoid\") {\n                if (!nanoidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"nanoid\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cuid\") {\n                if (!cuidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"cuid\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cuid2\") {\n                if (!cuid2Regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"cuid2\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"ulid\") {\n                if (!ulidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"ulid\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"url\") {\n                try {\n                    new URL(input.data);\n                }\n                catch {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"url\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"regex\") {\n                check.regex.lastIndex = 0;\n                const testResult = check.regex.test(input.data);\n                if (!testResult) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"regex\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"trim\") {\n                input.data = input.data.trim();\n            }\n            else if (check.kind === \"includes\") {\n                if (!input.data.includes(check.value, check.position)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: { includes: check.value, position: check.position },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"toLowerCase\") {\n                input.data = input.data.toLowerCase();\n            }\n            else if (check.kind === \"toUpperCase\") {\n                input.data = input.data.toUpperCase();\n            }\n            else if (check.kind === \"startsWith\") {\n                if (!input.data.startsWith(check.value)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: { startsWith: check.value },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"endsWith\") {\n                if (!input.data.endsWith(check.value)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: { endsWith: check.value },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"datetime\") {\n                const regex = datetimeRegex(check);\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: \"datetime\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"date\") {\n                const regex = dateRegex;\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: \"date\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"time\") {\n                const regex = timeRegex(check);\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_string,\n                        validation: \"time\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"duration\") {\n                if (!durationRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"duration\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"ip\") {\n                if (!isValidIP(input.data, check.version)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"ip\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"jwt\") {\n                if (!isValidJWT(input.data, check.alg)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"jwt\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cidr\") {\n                if (!isValidCidr(input.data, check.version)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"cidr\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"base64\") {\n                if (!base64Regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"base64\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"base64url\") {\n                if (!base64urlRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        validation: \"base64url\",\n                        code: ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    _regex(regex, validation, message) {\n        return this.refinement((data) => regex.test(data), {\n            validation,\n            code: ZodIssueCode.invalid_string,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    _addCheck(check) {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    email(message) {\n        return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n    }\n    url(message) {\n        return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n    }\n    emoji(message) {\n        return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n    }\n    uuid(message) {\n        return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n    }\n    nanoid(message) {\n        return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n    }\n    cuid(message) {\n        return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n    }\n    cuid2(message) {\n        return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n    }\n    ulid(message) {\n        return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n    }\n    base64(message) {\n        return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n    }\n    base64url(message) {\n        // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n        return this._addCheck({\n            kind: \"base64url\",\n            ...errorUtil.errToObj(message),\n        });\n    }\n    jwt(options) {\n        return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n    }\n    ip(options) {\n        return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n    }\n    cidr(options) {\n        return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n    }\n    datetime(options) {\n        if (typeof options === \"string\") {\n            return this._addCheck({\n                kind: \"datetime\",\n                precision: null,\n                offset: false,\n                local: false,\n                message: options,\n            });\n        }\n        return this._addCheck({\n            kind: \"datetime\",\n            precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n            offset: options?.offset ?? false,\n            local: options?.local ?? false,\n            ...errorUtil.errToObj(options?.message),\n        });\n    }\n    date(message) {\n        return this._addCheck({ kind: \"date\", message });\n    }\n    time(options) {\n        if (typeof options === \"string\") {\n            return this._addCheck({\n                kind: \"time\",\n                precision: null,\n                message: options,\n            });\n        }\n        return this._addCheck({\n            kind: \"time\",\n            precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n            ...errorUtil.errToObj(options?.message),\n        });\n    }\n    duration(message) {\n        return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n    }\n    regex(regex, message) {\n        return this._addCheck({\n            kind: \"regex\",\n            regex: regex,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    includes(value, options) {\n        return this._addCheck({\n            kind: \"includes\",\n            value: value,\n            position: options?.position,\n            ...errorUtil.errToObj(options?.message),\n        });\n    }\n    startsWith(value, message) {\n        return this._addCheck({\n            kind: \"startsWith\",\n            value: value,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    endsWith(value, message) {\n        return this._addCheck({\n            kind: \"endsWith\",\n            value: value,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    min(minLength, message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: minLength,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    max(maxLength, message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: maxLength,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    length(len, message) {\n        return this._addCheck({\n            kind: \"length\",\n            value: len,\n            ...errorUtil.errToObj(message),\n        });\n    }\n    /**\n     * Equivalent to `.min(1)`\n     */\n    nonempty(message) {\n        return this.min(1, errorUtil.errToObj(message));\n    }\n    trim() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"trim\" }],\n        });\n    }\n    toLowerCase() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n        });\n    }\n    toUpperCase() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n        });\n    }\n    get isDatetime() {\n        return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n    }\n    get isDate() {\n        return !!this._def.checks.find((ch) => ch.kind === \"date\");\n    }\n    get isTime() {\n        return !!this._def.checks.find((ch) => ch.kind === \"time\");\n    }\n    get isDuration() {\n        return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n    }\n    get isEmail() {\n        return !!this._def.checks.find((ch) => ch.kind === \"email\");\n    }\n    get isURL() {\n        return !!this._def.checks.find((ch) => ch.kind === \"url\");\n    }\n    get isEmoji() {\n        return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n    }\n    get isUUID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n    }\n    get isNANOID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n    }\n    get isCUID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n    }\n    get isCUID2() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n    }\n    get isULID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n    }\n    get isIP() {\n        return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n    }\n    get isCIDR() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n    }\n    get isBase64() {\n        return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n    }\n    get isBase64url() {\n        // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n        return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n    }\n    get minLength() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxLength() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n}\nZodString.create = (params) => {\n    return new ZodString({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodString,\n        coerce: params?.coerce ?? false,\n        ...processCreateParams(params),\n    });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n    const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n    const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n    const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n    const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n    const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n    return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.min = this.gte;\n        this.max = this.lte;\n        this.step = this.multipleOf;\n    }\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = Number(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.number) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.number,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        let ctx = undefined;\n        const status = new ParseStatus();\n        for (const check of this._def.checks) {\n            if (check.kind === \"int\") {\n                if (!util.isInteger(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.invalid_type,\n                        expected: \"integer\",\n                        received: \"float\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"min\") {\n                const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n                if (tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_small,\n                        minimum: check.value,\n                        type: \"number\",\n                        inclusive: check.inclusive,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n                if (tooBig) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_big,\n                        maximum: check.value,\n                        type: \"number\",\n                        inclusive: check.inclusive,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"multipleOf\") {\n                if (floatSafeRemainder(input.data, check.value) !== 0) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.not_multiple_of,\n                        multipleOf: check.value,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"finite\") {\n                if (!Number.isFinite(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.not_finite,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    gte(value, message) {\n        return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n    }\n    gt(value, message) {\n        return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n    }\n    lte(value, message) {\n        return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n    }\n    lt(value, message) {\n        return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n    }\n    setLimit(kind, value, inclusive, message) {\n        return new ZodNumber({\n            ...this._def,\n            checks: [\n                ...this._def.checks,\n                {\n                    kind,\n                    value,\n                    inclusive,\n                    message: errorUtil.toString(message),\n                },\n            ],\n        });\n    }\n    _addCheck(check) {\n        return new ZodNumber({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    int(message) {\n        return this._addCheck({\n            kind: \"int\",\n            message: errorUtil.toString(message),\n        });\n    }\n    positive(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: 0,\n            inclusive: false,\n            message: errorUtil.toString(message),\n        });\n    }\n    negative(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: 0,\n            inclusive: false,\n            message: errorUtil.toString(message),\n        });\n    }\n    nonpositive(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: 0,\n            inclusive: true,\n            message: errorUtil.toString(message),\n        });\n    }\n    nonnegative(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: 0,\n            inclusive: true,\n            message: errorUtil.toString(message),\n        });\n    }\n    multipleOf(value, message) {\n        return this._addCheck({\n            kind: \"multipleOf\",\n            value: value,\n            message: errorUtil.toString(message),\n        });\n    }\n    finite(message) {\n        return this._addCheck({\n            kind: \"finite\",\n            message: errorUtil.toString(message),\n        });\n    }\n    safe(message) {\n        return this._addCheck({\n            kind: \"min\",\n            inclusive: true,\n            value: Number.MIN_SAFE_INTEGER,\n            message: errorUtil.toString(message),\n        })._addCheck({\n            kind: \"max\",\n            inclusive: true,\n            value: Number.MAX_SAFE_INTEGER,\n            message: errorUtil.toString(message),\n        });\n    }\n    get minValue() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxValue() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n    get isInt() {\n        return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n    }\n    get isFinite() {\n        let max = null;\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n                return true;\n            }\n            else if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n            else if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return Number.isFinite(min) && Number.isFinite(max);\n    }\n}\nZodNumber.create = (params) => {\n    return new ZodNumber({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodNumber,\n        coerce: params?.coerce || false,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodBigInt extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.min = this.gte;\n        this.max = this.lte;\n    }\n    _parse(input) {\n        if (this._def.coerce) {\n            try {\n                input.data = BigInt(input.data);\n            }\n            catch {\n                return this._getInvalidInput(input);\n            }\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.bigint) {\n            return this._getInvalidInput(input);\n        }\n        let ctx = undefined;\n        const status = new ParseStatus();\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n                if (tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_small,\n                        type: \"bigint\",\n                        minimum: check.value,\n                        inclusive: check.inclusive,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n                if (tooBig) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_big,\n                        type: \"bigint\",\n                        maximum: check.value,\n                        inclusive: check.inclusive,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"multipleOf\") {\n                if (input.data % check.value !== BigInt(0)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.not_multiple_of,\n                        multipleOf: check.value,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    _getInvalidInput(input) {\n        const ctx = this._getOrReturnCtx(input);\n        addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_type,\n            expected: ZodParsedType.bigint,\n            received: ctx.parsedType,\n        });\n        return INVALID;\n    }\n    gte(value, message) {\n        return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n    }\n    gt(value, message) {\n        return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n    }\n    lte(value, message) {\n        return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n    }\n    lt(value, message) {\n        return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n    }\n    setLimit(kind, value, inclusive, message) {\n        return new ZodBigInt({\n            ...this._def,\n            checks: [\n                ...this._def.checks,\n                {\n                    kind,\n                    value,\n                    inclusive,\n                    message: errorUtil.toString(message),\n                },\n            ],\n        });\n    }\n    _addCheck(check) {\n        return new ZodBigInt({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    positive(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: BigInt(0),\n            inclusive: false,\n            message: errorUtil.toString(message),\n        });\n    }\n    negative(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: BigInt(0),\n            inclusive: false,\n            message: errorUtil.toString(message),\n        });\n    }\n    nonpositive(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: BigInt(0),\n            inclusive: true,\n            message: errorUtil.toString(message),\n        });\n    }\n    nonnegative(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: BigInt(0),\n            inclusive: true,\n            message: errorUtil.toString(message),\n        });\n    }\n    multipleOf(value, message) {\n        return this._addCheck({\n            kind: \"multipleOf\",\n            value,\n            message: errorUtil.toString(message),\n        });\n    }\n    get minValue() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxValue() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n}\nZodBigInt.create = (params) => {\n    return new ZodBigInt({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodBigInt,\n        coerce: params?.coerce ?? false,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodBoolean extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = Boolean(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.boolean) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.boolean,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n}\nZodBoolean.create = (params) => {\n    return new ZodBoolean({\n        typeName: ZodFirstPartyTypeKind.ZodBoolean,\n        coerce: params?.coerce || false,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodDate extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = new Date(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.date) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.date,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        if (Number.isNaN(input.data.getTime())) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_date,\n            });\n            return INVALID;\n        }\n        const status = new ParseStatus();\n        let ctx = undefined;\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                if (input.data.getTime() < check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_small,\n                        message: check.message,\n                        inclusive: true,\n                        exact: false,\n                        minimum: check.value,\n                        type: \"date\",\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                if (input.data.getTime() > check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.too_big,\n                        message: check.message,\n                        inclusive: true,\n                        exact: false,\n                        maximum: check.value,\n                        type: \"date\",\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                util.assertNever(check);\n            }\n        }\n        return {\n            status: status.value,\n            value: new Date(input.data.getTime()),\n        };\n    }\n    _addCheck(check) {\n        return new ZodDate({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    min(minDate, message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: minDate.getTime(),\n            message: errorUtil.toString(message),\n        });\n    }\n    max(maxDate, message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: maxDate.getTime(),\n            message: errorUtil.toString(message),\n        });\n    }\n    get minDate() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min != null ? new Date(min) : null;\n    }\n    get maxDate() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max != null ? new Date(max) : null;\n    }\n}\nZodDate.create = (params) => {\n    return new ZodDate({\n        checks: [],\n        coerce: params?.coerce || false,\n        typeName: ZodFirstPartyTypeKind.ZodDate,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodSymbol extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.symbol) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.symbol,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n}\nZodSymbol.create = (params) => {\n    return new ZodSymbol({\n        typeName: ZodFirstPartyTypeKind.ZodSymbol,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodUndefined extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.undefined) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.undefined,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n}\nZodUndefined.create = (params) => {\n    return new ZodUndefined({\n        typeName: ZodFirstPartyTypeKind.ZodUndefined,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodNull extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.null) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.null,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n}\nZodNull.create = (params) => {\n    return new ZodNull({\n        typeName: ZodFirstPartyTypeKind.ZodNull,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodAny extends ZodType {\n    constructor() {\n        super(...arguments);\n        // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n        this._any = true;\n    }\n    _parse(input) {\n        return OK(input.data);\n    }\n}\nZodAny.create = (params) => {\n    return new ZodAny({\n        typeName: ZodFirstPartyTypeKind.ZodAny,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodUnknown extends ZodType {\n    constructor() {\n        super(...arguments);\n        // required\n        this._unknown = true;\n    }\n    _parse(input) {\n        return OK(input.data);\n    }\n}\nZodUnknown.create = (params) => {\n    return new ZodUnknown({\n        typeName: ZodFirstPartyTypeKind.ZodUnknown,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodNever extends ZodType {\n    _parse(input) {\n        const ctx = this._getOrReturnCtx(input);\n        addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_type,\n            expected: ZodParsedType.never,\n            received: ctx.parsedType,\n        });\n        return INVALID;\n    }\n}\nZodNever.create = (params) => {\n    return new ZodNever({\n        typeName: ZodFirstPartyTypeKind.ZodNever,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodVoid extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.undefined) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.void,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n}\nZodVoid.create = (params) => {\n    return new ZodVoid({\n        typeName: ZodFirstPartyTypeKind.ZodVoid,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodArray extends ZodType {\n    _parse(input) {\n        const { ctx, status } = this._processInputParams(input);\n        const def = this._def;\n        if (ctx.parsedType !== ZodParsedType.array) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.array,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        if (def.exactLength !== null) {\n            const tooBig = ctx.data.length > def.exactLength.value;\n            const tooSmall = ctx.data.length < def.exactLength.value;\n            if (tooBig || tooSmall) {\n                addIssueToContext(ctx, {\n                    code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n                    minimum: (tooSmall ? def.exactLength.value : undefined),\n                    maximum: (tooBig ? def.exactLength.value : undefined),\n                    type: \"array\",\n                    inclusive: true,\n                    exact: true,\n                    message: def.exactLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.minLength !== null) {\n            if (ctx.data.length < def.minLength.value) {\n                addIssueToContext(ctx, {\n                    code: ZodIssueCode.too_small,\n                    minimum: def.minLength.value,\n                    type: \"array\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.minLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.maxLength !== null) {\n            if (ctx.data.length > def.maxLength.value) {\n                addIssueToContext(ctx, {\n                    code: ZodIssueCode.too_big,\n                    maximum: def.maxLength.value,\n                    type: \"array\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.maxLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (ctx.common.async) {\n            return Promise.all([...ctx.data].map((item, i) => {\n                return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n            })).then((result) => {\n                return ParseStatus.mergeArray(status, result);\n            });\n        }\n        const result = [...ctx.data].map((item, i) => {\n            return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n        });\n        return ParseStatus.mergeArray(status, result);\n    }\n    get element() {\n        return this._def.type;\n    }\n    min(minLength, message) {\n        return new ZodArray({\n            ...this._def,\n            minLength: { value: minLength, message: errorUtil.toString(message) },\n        });\n    }\n    max(maxLength, message) {\n        return new ZodArray({\n            ...this._def,\n            maxLength: { value: maxLength, message: errorUtil.toString(message) },\n        });\n    }\n    length(len, message) {\n        return new ZodArray({\n            ...this._def,\n            exactLength: { value: len, message: errorUtil.toString(message) },\n        });\n    }\n    nonempty(message) {\n        return this.min(1, message);\n    }\n}\nZodArray.create = (schema, params) => {\n    return new ZodArray({\n        type: schema,\n        minLength: null,\n        maxLength: null,\n        exactLength: null,\n        typeName: ZodFirstPartyTypeKind.ZodArray,\n        ...processCreateParams(params),\n    });\n};\nfunction deepPartialify(schema) {\n    if (schema instanceof ZodObject) {\n        const newShape = {};\n        for (const key in schema.shape) {\n            const fieldSchema = schema.shape[key];\n            newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n        }\n        return new ZodObject({\n            ...schema._def,\n            shape: () => newShape,\n        });\n    }\n    else if (schema instanceof ZodArray) {\n        return new ZodArray({\n            ...schema._def,\n            type: deepPartialify(schema.element),\n        });\n    }\n    else if (schema instanceof ZodOptional) {\n        return ZodOptional.create(deepPartialify(schema.unwrap()));\n    }\n    else if (schema instanceof ZodNullable) {\n        return ZodNullable.create(deepPartialify(schema.unwrap()));\n    }\n    else if (schema instanceof ZodTuple) {\n        return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n    }\n    else {\n        return schema;\n    }\n}\nexport class ZodObject extends ZodType {\n    constructor() {\n        super(...arguments);\n        this._cached = null;\n        /**\n         * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n         * If you want to pass through unknown properties, use `.passthrough()` instead.\n         */\n        this.nonstrict = this.passthrough;\n        // extend<\n        //   Augmentation extends ZodRawShape,\n        //   NewOutput extends util.flatten<{\n        //     [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n        //       ? Augmentation[k][\"_output\"]\n        //       : k extends keyof Output\n        //       ? Output[k]\n        //       : never;\n        //   }>,\n        //   NewInput extends util.flatten<{\n        //     [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n        //       ? Augmentation[k][\"_input\"]\n        //       : k extends keyof Input\n        //       ? Input[k]\n        //       : never;\n        //   }>\n        // >(\n        //   augmentation: Augmentation\n        // ): ZodObject<\n        //   extendShape<T, Augmentation>,\n        //   UnknownKeys,\n        //   Catchall,\n        //   NewOutput,\n        //   NewInput\n        // > {\n        //   return new ZodObject({\n        //     ...this._def,\n        //     shape: () => ({\n        //       ...this._def.shape(),\n        //       ...augmentation,\n        //     }),\n        //   }) as any;\n        // }\n        /**\n         * @deprecated Use `.extend` instead\n         *  */\n        this.augment = this.extend;\n    }\n    _getCached() {\n        if (this._cached !== null)\n            return this._cached;\n        const shape = this._def.shape();\n        const keys = util.objectKeys(shape);\n        this._cached = { shape, keys };\n        return this._cached;\n    }\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.object) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const { status, ctx } = this._processInputParams(input);\n        const { shape, keys: shapeKeys } = this._getCached();\n        const extraKeys = [];\n        if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n            for (const key in ctx.data) {\n                if (!shapeKeys.includes(key)) {\n                    extraKeys.push(key);\n                }\n            }\n        }\n        const pairs = [];\n        for (const key of shapeKeys) {\n            const keyValidator = shape[key];\n            const value = ctx.data[key];\n            pairs.push({\n                key: { status: \"valid\", value: key },\n                value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n                alwaysSet: key in ctx.data,\n            });\n        }\n        if (this._def.catchall instanceof ZodNever) {\n            const unknownKeys = this._def.unknownKeys;\n            if (unknownKeys === \"passthrough\") {\n                for (const key of extraKeys) {\n                    pairs.push({\n                        key: { status: \"valid\", value: key },\n                        value: { status: \"valid\", value: ctx.data[key] },\n                    });\n                }\n            }\n            else if (unknownKeys === \"strict\") {\n                if (extraKeys.length > 0) {\n                    addIssueToContext(ctx, {\n                        code: ZodIssueCode.unrecognized_keys,\n                        keys: extraKeys,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (unknownKeys === \"strip\") {\n            }\n            else {\n                throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n            }\n        }\n        else {\n            // run catchall validation\n            const catchall = this._def.catchall;\n            for (const key of extraKeys) {\n                const value = ctx.data[key];\n                pairs.push({\n                    key: { status: \"valid\", value: key },\n                    value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n                    ),\n                    alwaysSet: key in ctx.data,\n                });\n            }\n        }\n        if (ctx.common.async) {\n            return Promise.resolve()\n                .then(async () => {\n                const syncPairs = [];\n                for (const pair of pairs) {\n                    const key = await pair.key;\n                    const value = await pair.value;\n                    syncPairs.push({\n                        key,\n                        value,\n                        alwaysSet: pair.alwaysSet,\n                    });\n                }\n                return syncPairs;\n            })\n                .then((syncPairs) => {\n                return ParseStatus.mergeObjectSync(status, syncPairs);\n            });\n        }\n        else {\n            return ParseStatus.mergeObjectSync(status, pairs);\n        }\n    }\n    get shape() {\n        return this._def.shape();\n    }\n    strict(message) {\n        errorUtil.errToObj;\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"strict\",\n            ...(message !== undefined\n                ? {\n                    errorMap: (issue, ctx) => {\n                        const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n                        if (issue.code === \"unrecognized_keys\")\n                            return {\n                                message: errorUtil.errToObj(message).message ?? defaultError,\n                            };\n                        return {\n                            message: defaultError,\n                        };\n                    },\n                }\n                : {}),\n        });\n    }\n    strip() {\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"strip\",\n        });\n    }\n    passthrough() {\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"passthrough\",\n        });\n    }\n    // const AugmentFactory =\n    //   <Def extends ZodObjectDef>(def: Def) =>\n    //   <Augmentation extends ZodRawShape>(\n    //     augmentation: Augmentation\n    //   ): ZodObject<\n    //     extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n    //     Def[\"unknownKeys\"],\n    //     Def[\"catchall\"]\n    //   > => {\n    //     return new ZodObject({\n    //       ...def,\n    //       shape: () => ({\n    //         ...def.shape(),\n    //         ...augmentation,\n    //       }),\n    //     }) as any;\n    //   };\n    extend(augmentation) {\n        return new ZodObject({\n            ...this._def,\n            shape: () => ({\n                ...this._def.shape(),\n                ...augmentation,\n            }),\n        });\n    }\n    /**\n     * Prior to zod@1.0.12 there was a bug in the\n     * inferred type of merged objects. Please\n     * upgrade if you are experiencing issues.\n     */\n    merge(merging) {\n        const merged = new ZodObject({\n            unknownKeys: merging._def.unknownKeys,\n            catchall: merging._def.catchall,\n            shape: () => ({\n                ...this._def.shape(),\n                ...merging._def.shape(),\n            }),\n            typeName: ZodFirstPartyTypeKind.ZodObject,\n        });\n        return merged;\n    }\n    // merge<\n    //   Incoming extends AnyZodObject,\n    //   Augmentation extends Incoming[\"shape\"],\n    //   NewOutput extends {\n    //     [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n    //       ? Augmentation[k][\"_output\"]\n    //       : k extends keyof Output\n    //       ? Output[k]\n    //       : never;\n    //   },\n    //   NewInput extends {\n    //     [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n    //       ? Augmentation[k][\"_input\"]\n    //       : k extends keyof Input\n    //       ? Input[k]\n    //       : never;\n    //   }\n    // >(\n    //   merging: Incoming\n    // ): ZodObject<\n    //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n    //   Incoming[\"_def\"][\"unknownKeys\"],\n    //   Incoming[\"_def\"][\"catchall\"],\n    //   NewOutput,\n    //   NewInput\n    // > {\n    //   const merged: any = new ZodObject({\n    //     unknownKeys: merging._def.unknownKeys,\n    //     catchall: merging._def.catchall,\n    //     shape: () =>\n    //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n    //     typeName: ZodFirstPartyTypeKind.ZodObject,\n    //   }) as any;\n    //   return merged;\n    // }\n    setKey(key, schema) {\n        return this.augment({ [key]: schema });\n    }\n    // merge<Incoming extends AnyZodObject>(\n    //   merging: Incoming\n    // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n    // ZodObject<\n    //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n    //   Incoming[\"_def\"][\"unknownKeys\"],\n    //   Incoming[\"_def\"][\"catchall\"]\n    // > {\n    //   // const mergedShape = objectUtil.mergeShapes(\n    //   //   this._def.shape(),\n    //   //   merging._def.shape()\n    //   // );\n    //   const merged: any = new ZodObject({\n    //     unknownKeys: merging._def.unknownKeys,\n    //     catchall: merging._def.catchall,\n    //     shape: () =>\n    //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n    //     typeName: ZodFirstPartyTypeKind.ZodObject,\n    //   }) as any;\n    //   return merged;\n    // }\n    catchall(index) {\n        return new ZodObject({\n            ...this._def,\n            catchall: index,\n        });\n    }\n    pick(mask) {\n        const shape = {};\n        for (const key of util.objectKeys(mask)) {\n            if (mask[key] && this.shape[key]) {\n                shape[key] = this.shape[key];\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => shape,\n        });\n    }\n    omit(mask) {\n        const shape = {};\n        for (const key of util.objectKeys(this.shape)) {\n            if (!mask[key]) {\n                shape[key] = this.shape[key];\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => shape,\n        });\n    }\n    /**\n     * @deprecated\n     */\n    deepPartial() {\n        return deepPartialify(this);\n    }\n    partial(mask) {\n        const newShape = {};\n        for (const key of util.objectKeys(this.shape)) {\n            const fieldSchema = this.shape[key];\n            if (mask && !mask[key]) {\n                newShape[key] = fieldSchema;\n            }\n            else {\n                newShape[key] = fieldSchema.optional();\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => newShape,\n        });\n    }\n    required(mask) {\n        const newShape = {};\n        for (const key of util.objectKeys(this.shape)) {\n            if (mask && !mask[key]) {\n                newShape[key] = this.shape[key];\n            }\n            else {\n                const fieldSchema = this.shape[key];\n                let newField = fieldSchema;\n                while (newField instanceof ZodOptional) {\n                    newField = newField._def.innerType;\n                }\n                newShape[key] = newField;\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => newShape,\n        });\n    }\n    keyof() {\n        return createZodEnum(util.objectKeys(this.shape));\n    }\n}\nZodObject.create = (shape, params) => {\n    return new ZodObject({\n        shape: () => shape,\n        unknownKeys: \"strip\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nZodObject.strictCreate = (shape, params) => {\n    return new ZodObject({\n        shape: () => shape,\n        unknownKeys: \"strict\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nZodObject.lazycreate = (shape, params) => {\n    return new ZodObject({\n        shape,\n        unknownKeys: \"strip\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodUnion extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const options = this._def.options;\n        function handleResults(results) {\n            // return first issue-free validation if it exists\n            for (const result of results) {\n                if (result.result.status === \"valid\") {\n                    return result.result;\n                }\n            }\n            for (const result of results) {\n                if (result.result.status === \"dirty\") {\n                    // add issues from dirty option\n                    ctx.common.issues.push(...result.ctx.common.issues);\n                    return result.result;\n                }\n            }\n            // return invalid\n            const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_union,\n                unionErrors,\n            });\n            return INVALID;\n        }\n        if (ctx.common.async) {\n            return Promise.all(options.map(async (option) => {\n                const childCtx = {\n                    ...ctx,\n                    common: {\n                        ...ctx.common,\n                        issues: [],\n                    },\n                    parent: null,\n                };\n                return {\n                    result: await option._parseAsync({\n                        data: ctx.data,\n                        path: ctx.path,\n                        parent: childCtx,\n                    }),\n                    ctx: childCtx,\n                };\n            })).then(handleResults);\n        }\n        else {\n            let dirty = undefined;\n            const issues = [];\n            for (const option of options) {\n                const childCtx = {\n                    ...ctx,\n                    common: {\n                        ...ctx.common,\n                        issues: [],\n                    },\n                    parent: null,\n                };\n                const result = option._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: childCtx,\n                });\n                if (result.status === \"valid\") {\n                    return result;\n                }\n                else if (result.status === \"dirty\" && !dirty) {\n                    dirty = { result, ctx: childCtx };\n                }\n                if (childCtx.common.issues.length) {\n                    issues.push(childCtx.common.issues);\n                }\n            }\n            if (dirty) {\n                ctx.common.issues.push(...dirty.ctx.common.issues);\n                return dirty.result;\n            }\n            const unionErrors = issues.map((issues) => new ZodError(issues));\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_union,\n                unionErrors,\n            });\n            return INVALID;\n        }\n    }\n    get options() {\n        return this._def.options;\n    }\n}\nZodUnion.create = (types, params) => {\n    return new ZodUnion({\n        options: types,\n        typeName: ZodFirstPartyTypeKind.ZodUnion,\n        ...processCreateParams(params),\n    });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n//////////                                 //////////\n//////////      ZodDiscriminatedUnion      //////////\n//////////                                 //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n    if (type instanceof ZodLazy) {\n        return getDiscriminator(type.schema);\n    }\n    else if (type instanceof ZodEffects) {\n        return getDiscriminator(type.innerType());\n    }\n    else if (type instanceof ZodLiteral) {\n        return [type.value];\n    }\n    else if (type instanceof ZodEnum) {\n        return type.options;\n    }\n    else if (type instanceof ZodNativeEnum) {\n        // eslint-disable-next-line ban/ban\n        return util.objectValues(type.enum);\n    }\n    else if (type instanceof ZodDefault) {\n        return getDiscriminator(type._def.innerType);\n    }\n    else if (type instanceof ZodUndefined) {\n        return [undefined];\n    }\n    else if (type instanceof ZodNull) {\n        return [null];\n    }\n    else if (type instanceof ZodOptional) {\n        return [undefined, ...getDiscriminator(type.unwrap())];\n    }\n    else if (type instanceof ZodNullable) {\n        return [null, ...getDiscriminator(type.unwrap())];\n    }\n    else if (type instanceof ZodBranded) {\n        return getDiscriminator(type.unwrap());\n    }\n    else if (type instanceof ZodReadonly) {\n        return getDiscriminator(type.unwrap());\n    }\n    else if (type instanceof ZodCatch) {\n        return getDiscriminator(type._def.innerType);\n    }\n    else {\n        return [];\n    }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.object) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const discriminator = this.discriminator;\n        const discriminatorValue = ctx.data[discriminator];\n        const option = this.optionsMap.get(discriminatorValue);\n        if (!option) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_union_discriminator,\n                options: Array.from(this.optionsMap.keys()),\n                path: [discriminator],\n            });\n            return INVALID;\n        }\n        if (ctx.common.async) {\n            return option._parseAsync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n        }\n        else {\n            return option._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n        }\n    }\n    get discriminator() {\n        return this._def.discriminator;\n    }\n    get options() {\n        return this._def.options;\n    }\n    get optionsMap() {\n        return this._def.optionsMap;\n    }\n    /**\n     * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n     * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n     * have a different value for each object in the union.\n     * @param discriminator the name of the discriminator property\n     * @param types an array of object schemas\n     * @param params\n     */\n    static create(discriminator, options, params) {\n        // Get all the valid discriminator values\n        const optionsMap = new Map();\n        // try {\n        for (const type of options) {\n            const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n            if (!discriminatorValues.length) {\n                throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n            }\n            for (const value of discriminatorValues) {\n                if (optionsMap.has(value)) {\n                    throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n                }\n                optionsMap.set(value, type);\n            }\n        }\n        return new ZodDiscriminatedUnion({\n            typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n            discriminator,\n            options,\n            optionsMap,\n            ...processCreateParams(params),\n        });\n    }\n}\nfunction mergeValues(a, b) {\n    const aType = getParsedType(a);\n    const bType = getParsedType(b);\n    if (a === b) {\n        return { valid: true, data: a };\n    }\n    else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n        const bKeys = util.objectKeys(b);\n        const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n        const newObj = { ...a, ...b };\n        for (const key of sharedKeys) {\n            const sharedValue = mergeValues(a[key], b[key]);\n            if (!sharedValue.valid) {\n                return { valid: false };\n            }\n            newObj[key] = sharedValue.data;\n        }\n        return { valid: true, data: newObj };\n    }\n    else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n        if (a.length !== b.length) {\n            return { valid: false };\n        }\n        const newArray = [];\n        for (let index = 0; index < a.length; index++) {\n            const itemA = a[index];\n            const itemB = b[index];\n            const sharedValue = mergeValues(itemA, itemB);\n            if (!sharedValue.valid) {\n                return { valid: false };\n            }\n            newArray.push(sharedValue.data);\n        }\n        return { valid: true, data: newArray };\n    }\n    else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n        return { valid: true, data: a };\n    }\n    else {\n        return { valid: false };\n    }\n}\nexport class ZodIntersection extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        const handleParsed = (parsedLeft, parsedRight) => {\n            if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n                return INVALID;\n            }\n            const merged = mergeValues(parsedLeft.value, parsedRight.value);\n            if (!merged.valid) {\n                addIssueToContext(ctx, {\n                    code: ZodIssueCode.invalid_intersection_types,\n                });\n                return INVALID;\n            }\n            if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n                status.dirty();\n            }\n            return { status: status.value, value: merged.data };\n        };\n        if (ctx.common.async) {\n            return Promise.all([\n                this._def.left._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                }),\n                this._def.right._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                }),\n            ]).then(([left, right]) => handleParsed(left, right));\n        }\n        else {\n            return handleParsed(this._def.left._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            }), this._def.right._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            }));\n        }\n    }\n}\nZodIntersection.create = (left, right, params) => {\n    return new ZodIntersection({\n        left: left,\n        right: right,\n        typeName: ZodFirstPartyTypeKind.ZodIntersection,\n        ...processCreateParams(params),\n    });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.array) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.array,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        if (ctx.data.length < this._def.items.length) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.too_small,\n                minimum: this._def.items.length,\n                inclusive: true,\n                exact: false,\n                type: \"array\",\n            });\n            return INVALID;\n        }\n        const rest = this._def.rest;\n        if (!rest && ctx.data.length > this._def.items.length) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.too_big,\n                maximum: this._def.items.length,\n                inclusive: true,\n                exact: false,\n                type: \"array\",\n            });\n            status.dirty();\n        }\n        const items = [...ctx.data]\n            .map((item, itemIndex) => {\n            const schema = this._def.items[itemIndex] || this._def.rest;\n            if (!schema)\n                return null;\n            return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n        })\n            .filter((x) => !!x); // filter nulls\n        if (ctx.common.async) {\n            return Promise.all(items).then((results) => {\n                return ParseStatus.mergeArray(status, results);\n            });\n        }\n        else {\n            return ParseStatus.mergeArray(status, items);\n        }\n    }\n    get items() {\n        return this._def.items;\n    }\n    rest(rest) {\n        return new ZodTuple({\n            ...this._def,\n            rest,\n        });\n    }\n}\nZodTuple.create = (schemas, params) => {\n    if (!Array.isArray(schemas)) {\n        throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n    }\n    return new ZodTuple({\n        items: schemas,\n        typeName: ZodFirstPartyTypeKind.ZodTuple,\n        rest: null,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodRecord extends ZodType {\n    get keySchema() {\n        return this._def.keyType;\n    }\n    get valueSchema() {\n        return this._def.valueType;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.object) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const pairs = [];\n        const keyType = this._def.keyType;\n        const valueType = this._def.valueType;\n        for (const key in ctx.data) {\n            pairs.push({\n                key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n                value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n                alwaysSet: key in ctx.data,\n            });\n        }\n        if (ctx.common.async) {\n            return ParseStatus.mergeObjectAsync(status, pairs);\n        }\n        else {\n            return ParseStatus.mergeObjectSync(status, pairs);\n        }\n    }\n    get element() {\n        return this._def.valueType;\n    }\n    static create(first, second, third) {\n        if (second instanceof ZodType) {\n            return new ZodRecord({\n                keyType: first,\n                valueType: second,\n                typeName: ZodFirstPartyTypeKind.ZodRecord,\n                ...processCreateParams(third),\n            });\n        }\n        return new ZodRecord({\n            keyType: ZodString.create(),\n            valueType: first,\n            typeName: ZodFirstPartyTypeKind.ZodRecord,\n            ...processCreateParams(second),\n        });\n    }\n}\nexport class ZodMap extends ZodType {\n    get keySchema() {\n        return this._def.keyType;\n    }\n    get valueSchema() {\n        return this._def.valueType;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.map) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.map,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const keyType = this._def.keyType;\n        const valueType = this._def.valueType;\n        const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n            return {\n                key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n                value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n            };\n        });\n        if (ctx.common.async) {\n            const finalMap = new Map();\n            return Promise.resolve().then(async () => {\n                for (const pair of pairs) {\n                    const key = await pair.key;\n                    const value = await pair.value;\n                    if (key.status === \"aborted\" || value.status === \"aborted\") {\n                        return INVALID;\n                    }\n                    if (key.status === \"dirty\" || value.status === \"dirty\") {\n                        status.dirty();\n                    }\n                    finalMap.set(key.value, value.value);\n                }\n                return { status: status.value, value: finalMap };\n            });\n        }\n        else {\n            const finalMap = new Map();\n            for (const pair of pairs) {\n                const key = pair.key;\n                const value = pair.value;\n                if (key.status === \"aborted\" || value.status === \"aborted\") {\n                    return INVALID;\n                }\n                if (key.status === \"dirty\" || value.status === \"dirty\") {\n                    status.dirty();\n                }\n                finalMap.set(key.value, value.value);\n            }\n            return { status: status.value, value: finalMap };\n        }\n    }\n}\nZodMap.create = (keyType, valueType, params) => {\n    return new ZodMap({\n        valueType,\n        keyType,\n        typeName: ZodFirstPartyTypeKind.ZodMap,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodSet extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.set) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.set,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const def = this._def;\n        if (def.minSize !== null) {\n            if (ctx.data.size < def.minSize.value) {\n                addIssueToContext(ctx, {\n                    code: ZodIssueCode.too_small,\n                    minimum: def.minSize.value,\n                    type: \"set\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.minSize.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.maxSize !== null) {\n            if (ctx.data.size > def.maxSize.value) {\n                addIssueToContext(ctx, {\n                    code: ZodIssueCode.too_big,\n                    maximum: def.maxSize.value,\n                    type: \"set\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.maxSize.message,\n                });\n                status.dirty();\n            }\n        }\n        const valueType = this._def.valueType;\n        function finalizeSet(elements) {\n            const parsedSet = new Set();\n            for (const element of elements) {\n                if (element.status === \"aborted\")\n                    return INVALID;\n                if (element.status === \"dirty\")\n                    status.dirty();\n                parsedSet.add(element.value);\n            }\n            return { status: status.value, value: parsedSet };\n        }\n        const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n        if (ctx.common.async) {\n            return Promise.all(elements).then((elements) => finalizeSet(elements));\n        }\n        else {\n            return finalizeSet(elements);\n        }\n    }\n    min(minSize, message) {\n        return new ZodSet({\n            ...this._def,\n            minSize: { value: minSize, message: errorUtil.toString(message) },\n        });\n    }\n    max(maxSize, message) {\n        return new ZodSet({\n            ...this._def,\n            maxSize: { value: maxSize, message: errorUtil.toString(message) },\n        });\n    }\n    size(size, message) {\n        return this.min(size, message).max(size, message);\n    }\n    nonempty(message) {\n        return this.min(1, message);\n    }\n}\nZodSet.create = (valueType, params) => {\n    return new ZodSet({\n        valueType,\n        minSize: null,\n        maxSize: null,\n        typeName: ZodFirstPartyTypeKind.ZodSet,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodFunction extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.validate = this.implement;\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.function) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.function,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        function makeArgsIssue(args, error) {\n            return makeIssue({\n                data: args,\n                path: ctx.path,\n                errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n                issueData: {\n                    code: ZodIssueCode.invalid_arguments,\n                    argumentsError: error,\n                },\n            });\n        }\n        function makeReturnsIssue(returns, error) {\n            return makeIssue({\n                data: returns,\n                path: ctx.path,\n                errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n                issueData: {\n                    code: ZodIssueCode.invalid_return_type,\n                    returnTypeError: error,\n                },\n            });\n        }\n        const params = { errorMap: ctx.common.contextualErrorMap };\n        const fn = ctx.data;\n        if (this._def.returns instanceof ZodPromise) {\n            // Would love a way to avoid disabling this rule, but we need\n            // an alias (using an arrow function was what caused 2651).\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const me = this;\n            return OK(async function (...args) {\n                const error = new ZodError([]);\n                const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n                    error.addIssue(makeArgsIssue(args, e));\n                    throw error;\n                });\n                const result = await Reflect.apply(fn, this, parsedArgs);\n                const parsedReturns = await me._def.returns._def.type\n                    .parseAsync(result, params)\n                    .catch((e) => {\n                    error.addIssue(makeReturnsIssue(result, e));\n                    throw error;\n                });\n                return parsedReturns;\n            });\n        }\n        else {\n            // Would love a way to avoid disabling this rule, but we need\n            // an alias (using an arrow function was what caused 2651).\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const me = this;\n            return OK(function (...args) {\n                const parsedArgs = me._def.args.safeParse(args, params);\n                if (!parsedArgs.success) {\n                    throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n                }\n                const result = Reflect.apply(fn, this, parsedArgs.data);\n                const parsedReturns = me._def.returns.safeParse(result, params);\n                if (!parsedReturns.success) {\n                    throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n                }\n                return parsedReturns.data;\n            });\n        }\n    }\n    parameters() {\n        return this._def.args;\n    }\n    returnType() {\n        return this._def.returns;\n    }\n    args(...items) {\n        return new ZodFunction({\n            ...this._def,\n            args: ZodTuple.create(items).rest(ZodUnknown.create()),\n        });\n    }\n    returns(returnType) {\n        return new ZodFunction({\n            ...this._def,\n            returns: returnType,\n        });\n    }\n    implement(func) {\n        const validatedFunc = this.parse(func);\n        return validatedFunc;\n    }\n    strictImplement(func) {\n        const validatedFunc = this.parse(func);\n        return validatedFunc;\n    }\n    static create(args, returns, params) {\n        return new ZodFunction({\n            args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n            returns: returns || ZodUnknown.create(),\n            typeName: ZodFirstPartyTypeKind.ZodFunction,\n            ...processCreateParams(params),\n        });\n    }\n}\nexport class ZodLazy extends ZodType {\n    get schema() {\n        return this._def.getter();\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const lazySchema = this._def.getter();\n        return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n    }\n}\nZodLazy.create = (getter, params) => {\n    return new ZodLazy({\n        getter: getter,\n        typeName: ZodFirstPartyTypeKind.ZodLazy,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodLiteral extends ZodType {\n    _parse(input) {\n        if (input.data !== this._def.value) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                received: ctx.data,\n                code: ZodIssueCode.invalid_literal,\n                expected: this._def.value,\n            });\n            return INVALID;\n        }\n        return { status: \"valid\", value: input.data };\n    }\n    get value() {\n        return this._def.value;\n    }\n}\nZodLiteral.create = (value, params) => {\n    return new ZodLiteral({\n        value: value,\n        typeName: ZodFirstPartyTypeKind.ZodLiteral,\n        ...processCreateParams(params),\n    });\n};\nfunction createZodEnum(values, params) {\n    return new ZodEnum({\n        values,\n        typeName: ZodFirstPartyTypeKind.ZodEnum,\n        ...processCreateParams(params),\n    });\n}\nexport class ZodEnum extends ZodType {\n    _parse(input) {\n        if (typeof input.data !== \"string\") {\n            const ctx = this._getOrReturnCtx(input);\n            const expectedValues = this._def.values;\n            addIssueToContext(ctx, {\n                expected: util.joinValues(expectedValues),\n                received: ctx.parsedType,\n                code: ZodIssueCode.invalid_type,\n            });\n            return INVALID;\n        }\n        if (!this._cache) {\n            this._cache = new Set(this._def.values);\n        }\n        if (!this._cache.has(input.data)) {\n            const ctx = this._getOrReturnCtx(input);\n            const expectedValues = this._def.values;\n            addIssueToContext(ctx, {\n                received: ctx.data,\n                code: ZodIssueCode.invalid_enum_value,\n                options: expectedValues,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n    get options() {\n        return this._def.values;\n    }\n    get enum() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    get Values() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    get Enum() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    extract(values, newDef = this._def) {\n        return ZodEnum.create(values, {\n            ...this._def,\n            ...newDef,\n        });\n    }\n    exclude(values, newDef = this._def) {\n        return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n            ...this._def,\n            ...newDef,\n        });\n    }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n    _parse(input) {\n        const nativeEnumValues = util.getValidEnumValues(this._def.values);\n        const ctx = this._getOrReturnCtx(input);\n        if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n            const expectedValues = util.objectValues(nativeEnumValues);\n            addIssueToContext(ctx, {\n                expected: util.joinValues(expectedValues),\n                received: ctx.parsedType,\n                code: ZodIssueCode.invalid_type,\n            });\n            return INVALID;\n        }\n        if (!this._cache) {\n            this._cache = new Set(util.getValidEnumValues(this._def.values));\n        }\n        if (!this._cache.has(input.data)) {\n            const expectedValues = util.objectValues(nativeEnumValues);\n            addIssueToContext(ctx, {\n                received: ctx.data,\n                code: ZodIssueCode.invalid_enum_value,\n                options: expectedValues,\n            });\n            return INVALID;\n        }\n        return OK(input.data);\n    }\n    get enum() {\n        return this._def.values;\n    }\n}\nZodNativeEnum.create = (values, params) => {\n    return new ZodNativeEnum({\n        values: values,\n        typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodPromise extends ZodType {\n    unwrap() {\n        return this._def.type;\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.promise,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n        return OK(promisified.then((data) => {\n            return this._def.type.parseAsync(data, {\n                path: ctx.path,\n                errorMap: ctx.common.contextualErrorMap,\n            });\n        }));\n    }\n}\nZodPromise.create = (schema, params) => {\n    return new ZodPromise({\n        type: schema,\n        typeName: ZodFirstPartyTypeKind.ZodPromise,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodEffects extends ZodType {\n    innerType() {\n        return this._def.schema;\n    }\n    sourceType() {\n        return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n            ? this._def.schema.sourceType()\n            : this._def.schema;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        const effect = this._def.effect || null;\n        const checkCtx = {\n            addIssue: (arg) => {\n                addIssueToContext(ctx, arg);\n                if (arg.fatal) {\n                    status.abort();\n                }\n                else {\n                    status.dirty();\n                }\n            },\n            get path() {\n                return ctx.path;\n            },\n        };\n        checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n        if (effect.type === \"preprocess\") {\n            const processed = effect.transform(ctx.data, checkCtx);\n            if (ctx.common.async) {\n                return Promise.resolve(processed).then(async (processed) => {\n                    if (status.value === \"aborted\")\n                        return INVALID;\n                    const result = await this._def.schema._parseAsync({\n                        data: processed,\n                        path: ctx.path,\n                        parent: ctx,\n                    });\n                    if (result.status === \"aborted\")\n                        return INVALID;\n                    if (result.status === \"dirty\")\n                        return DIRTY(result.value);\n                    if (status.value === \"dirty\")\n                        return DIRTY(result.value);\n                    return result;\n                });\n            }\n            else {\n                if (status.value === \"aborted\")\n                    return INVALID;\n                const result = this._def.schema._parseSync({\n                    data: processed,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (result.status === \"aborted\")\n                    return INVALID;\n                if (result.status === \"dirty\")\n                    return DIRTY(result.value);\n                if (status.value === \"dirty\")\n                    return DIRTY(result.value);\n                return result;\n            }\n        }\n        if (effect.type === \"refinement\") {\n            const executeRefinement = (acc) => {\n                const result = effect.refinement(acc, checkCtx);\n                if (ctx.common.async) {\n                    return Promise.resolve(result);\n                }\n                if (result instanceof Promise) {\n                    throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n                }\n                return acc;\n            };\n            if (ctx.common.async === false) {\n                const inner = this._def.schema._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (inner.status === \"aborted\")\n                    return INVALID;\n                if (inner.status === \"dirty\")\n                    status.dirty();\n                // return value is ignored\n                executeRefinement(inner.value);\n                return { status: status.value, value: inner.value };\n            }\n            else {\n                return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n                    if (inner.status === \"aborted\")\n                        return INVALID;\n                    if (inner.status === \"dirty\")\n                        status.dirty();\n                    return executeRefinement(inner.value).then(() => {\n                        return { status: status.value, value: inner.value };\n                    });\n                });\n            }\n        }\n        if (effect.type === \"transform\") {\n            if (ctx.common.async === false) {\n                const base = this._def.schema._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (!isValid(base))\n                    return INVALID;\n                const result = effect.transform(base.value, checkCtx);\n                if (result instanceof Promise) {\n                    throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n                }\n                return { status: status.value, value: result };\n            }\n            else {\n                return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n                    if (!isValid(base))\n                        return INVALID;\n                    return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n                        status: status.value,\n                        value: result,\n                    }));\n                });\n            }\n        }\n        util.assertNever(effect);\n    }\n}\nZodEffects.create = (schema, effect, params) => {\n    return new ZodEffects({\n        schema,\n        typeName: ZodFirstPartyTypeKind.ZodEffects,\n        effect,\n        ...processCreateParams(params),\n    });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n    return new ZodEffects({\n        schema,\n        effect: { type: \"preprocess\", transform: preprocess },\n        typeName: ZodFirstPartyTypeKind.ZodEffects,\n        ...processCreateParams(params),\n    });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType === ZodParsedType.undefined) {\n            return OK(undefined);\n        }\n        return this._def.innerType._parse(input);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodOptional.create = (type, params) => {\n    return new ZodOptional({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodOptional,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodNullable extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType === ZodParsedType.null) {\n            return OK(null);\n        }\n        return this._def.innerType._parse(input);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodNullable.create = (type, params) => {\n    return new ZodNullable({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodNullable,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodDefault extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        let data = ctx.data;\n        if (ctx.parsedType === ZodParsedType.undefined) {\n            data = this._def.defaultValue();\n        }\n        return this._def.innerType._parse({\n            data,\n            path: ctx.path,\n            parent: ctx,\n        });\n    }\n    removeDefault() {\n        return this._def.innerType;\n    }\n}\nZodDefault.create = (type, params) => {\n    return new ZodDefault({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodDefault,\n        defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodCatch extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        // newCtx is used to not collect issues from inner types in ctx\n        const newCtx = {\n            ...ctx,\n            common: {\n                ...ctx.common,\n                issues: [],\n            },\n        };\n        const result = this._def.innerType._parse({\n            data: newCtx.data,\n            path: newCtx.path,\n            parent: {\n                ...newCtx,\n            },\n        });\n        if (isAsync(result)) {\n            return result.then((result) => {\n                return {\n                    status: \"valid\",\n                    value: result.status === \"valid\"\n                        ? result.value\n                        : this._def.catchValue({\n                            get error() {\n                                return new ZodError(newCtx.common.issues);\n                            },\n                            input: newCtx.data,\n                        }),\n                };\n            });\n        }\n        else {\n            return {\n                status: \"valid\",\n                value: result.status === \"valid\"\n                    ? result.value\n                    : this._def.catchValue({\n                        get error() {\n                            return new ZodError(newCtx.common.issues);\n                        },\n                        input: newCtx.data,\n                    }),\n            };\n        }\n    }\n    removeCatch() {\n        return this._def.innerType;\n    }\n}\nZodCatch.create = (type, params) => {\n    return new ZodCatch({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodCatch,\n        catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n        ...processCreateParams(params),\n    });\n};\nexport class ZodNaN extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== ZodParsedType.nan) {\n            const ctx = this._getOrReturnCtx(input);\n            addIssueToContext(ctx, {\n                code: ZodIssueCode.invalid_type,\n                expected: ZodParsedType.nan,\n                received: ctx.parsedType,\n            });\n            return INVALID;\n        }\n        return { status: \"valid\", value: input.data };\n    }\n}\nZodNaN.create = (params) => {\n    return new ZodNaN({\n        typeName: ZodFirstPartyTypeKind.ZodNaN,\n        ...processCreateParams(params),\n    });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const data = ctx.data;\n        return this._def.type._parse({\n            data,\n            path: ctx.path,\n            parent: ctx,\n        });\n    }\n    unwrap() {\n        return this._def.type;\n    }\n}\nexport class ZodPipeline extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.common.async) {\n            const handleAsync = async () => {\n                const inResult = await this._def.in._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (inResult.status === \"aborted\")\n                    return INVALID;\n                if (inResult.status === \"dirty\") {\n                    status.dirty();\n                    return DIRTY(inResult.value);\n                }\n                else {\n                    return this._def.out._parseAsync({\n                        data: inResult.value,\n                        path: ctx.path,\n                        parent: ctx,\n                    });\n                }\n            };\n            return handleAsync();\n        }\n        else {\n            const inResult = this._def.in._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n            if (inResult.status === \"aborted\")\n                return INVALID;\n            if (inResult.status === \"dirty\") {\n                status.dirty();\n                return {\n                    status: \"dirty\",\n                    value: inResult.value,\n                };\n            }\n            else {\n                return this._def.out._parseSync({\n                    data: inResult.value,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n            }\n        }\n    }\n    static create(a, b) {\n        return new ZodPipeline({\n            in: a,\n            out: b,\n            typeName: ZodFirstPartyTypeKind.ZodPipeline,\n        });\n    }\n}\nexport class ZodReadonly extends ZodType {\n    _parse(input) {\n        const result = this._def.innerType._parse(input);\n        const freeze = (data) => {\n            if (isValid(data)) {\n                data.value = Object.freeze(data.value);\n            }\n            return data;\n        };\n        return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodReadonly.create = (type, params) => {\n    return new ZodReadonly({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodReadonly,\n        ...processCreateParams(params),\n    });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n//////////                    //////////\n//////////      z.custom      //////////\n//////////                    //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n    const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n    const p2 = typeof p === \"string\" ? { message: p } : p;\n    return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n    if (check)\n        return ZodAny.create().superRefine((data, ctx) => {\n            const r = check(data);\n            if (r instanceof Promise) {\n                return r.then((r) => {\n                    if (!r) {\n                        const params = cleanParams(_params, data);\n                        const _fatal = params.fatal ?? fatal ?? true;\n                        ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n                    }\n                });\n            }\n            if (!r) {\n                const params = cleanParams(_params, data);\n                const _fatal = params.fatal ?? fatal ?? true;\n                ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n            }\n            return;\n        });\n    return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n    object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n    ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n    ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n    ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n    ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n    ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n    ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n    ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n    ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n    ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n    ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n    ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n    ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n    ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n    ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n    ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n    ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n    ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n    ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n    ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n    ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n    ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n    ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n    ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n    ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n    ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n    ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n    ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n    ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n    ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n    ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n    ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n    ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n    ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n    ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n    ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n    ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n    constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n    message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n    string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n    number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n    boolean: ((arg) => ZodBoolean.create({\n        ...arg,\n        coerce: true,\n    })),\n    bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n    date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","import * as z from \"./v3/external.js\";\nexport * from \"./v3/external.js\";\nexport { z };\nexport default z;\n","/**\n * Per-session deterministic metadata — the repos, pull requests, commits,\n * and issues a single AI-coding session touched.\n *\n * This is the join layer between AI *spend* (events/segments/tokens) and\n * development *outcomes* (PRs merged, commits landed, tickets closed). The\n * daemon attaches one {@link SessionMetadata} per session to the ingest\n * batch; the server can later join it to GitHub/GitLab/Linear/Jira to answer\n * \"what did this spend actually ship?\".\n *\n * Everything in this module is **pure and dependency-free** (zod only) so it\n * can run in any daemon runtime (Node CLI, browser extension) and be\n * exhaustively unit-tested without a model, a network, or a filesystem.\n *\n * Three detection channels feed it, each stamped on every reference as a\n * `source` for trust + precedence:\n *   - `git`     — resolved from the repo on disk / the event's git context\n *                 (highest trust: deterministic, not user content).\n *   - `tool`    — extracted from a tool call (e.g. a `gh pr create` result).\n *   - `content` — pattern-matched from a redacted excerpt / segment abstract.\n *   - `model`   — surfaced by the on-device LLM from session content, then\n *                 re-parsed deterministically here (works for ANY provider,\n *                 even ones whose logs carry no structured git data).\n *\n * Privacy: only public reference shapes ride this — `org/repo`, PR/issue\n * numbers, commit SHAs, ticket keys, and the URLs that contain them. Raw\n * prompts, code, and home paths never reach here (the text handed in has\n * already been through redaction).\n */\nimport { z } from \"zod\";\n\n/** How a reference was detected. Drives dedupe precedence (see\n * {@link dedupeSessionMetadata}): a deterministic `git` hit beats a\n * `content`/`model` guess for the same entity. */\nexport const REF_SOURCES = [\"git\", \"tool\", \"content\", \"model\"] as const;\nexport const RefSource = z.enum(REF_SOURCES);\nexport type RefSource = z.infer<typeof RefSource>;\n\n/** Trust ranking — higher wins when the same entity is seen twice. */\nconst SOURCE_RANK: Record<RefSource, number> = { git: 3, tool: 2, content: 1, model: 0 };\n\n/** A git host + `org/repo` the session worked in, with every branch seen.\n * Plural by design: one session can span several repos and branches. */\nexport const RepoRef = z.object({\n  /** `github.com`, `gitlab.com`, … — null when only the slug is known. */\n  host: z.string().max(80).nullable().default(null),\n  /** `org/repo`. The stable identity of the repo. */\n  slug: z.string().max(200),\n  /** Every branch observed for this repo this session. */\n  branches: z.array(z.string().max(200)).max(50).default([]),\n  source: RefSource.default(\"content\"),\n});\nexport type RepoRef = z.infer<typeof RepoRef>;\n\n/** A pull/merge request the session referenced. */\nexport const PullRequestRef = z.object({\n  host: z.string().max(80).nullable().default(null),\n  slug: z.string().max(200).nullable().default(null),\n  number: z.number().int().positive(),\n  url: z.string().max(400).nullable().default(null),\n  source: RefSource.default(\"content\"),\n  confidence: z.number().min(0).max(1).default(0.9),\n  // On-device verified-outcome signals — filled by the parsers' local git-check\n  // (`checkPullRequestOutcome`) when the PR's repo is on disk. `null` = unknown;\n  // the server's CPVO engine classifies verified/failed from these. Mirrors\n  // core's `PullRequestRef` field-for-field.\n  merged: z.boolean().nullable().optional(),\n  merged_at: z.string().max(40).nullable().optional(),\n  reverted: z.boolean().nullable().optional(),\n  hotfixed: z.boolean().nullable().optional(),\n  reopened: z.boolean().nullable().optional(),\n});\nexport type PullRequestRef = z.infer<typeof PullRequestRef>;\n\nexport const ISSUE_PROVIDERS = [\n  \"github\",\n  \"gitlab\",\n  \"bitbucket\",\n  \"linear\",\n  \"jira\",\n  \"other\",\n] as const;\n\n/** An issue / ticket the session referenced. `key` is the provider-native\n * id: a number string for GitHub/GitLab issues, `TEAM-123` for Linear/Jira. */\nexport const IssueRef = z.object({\n  provider: z.enum(ISSUE_PROVIDERS).default(\"other\"),\n  key: z.string().max(80),\n  slug: z.string().max(200).nullable().default(null),\n  url: z.string().max(400).nullable().default(null),\n  source: RefSource.default(\"content\"),\n  confidence: z.number().min(0).max(1).default(0.8),\n});\nexport type IssueRef = z.infer<typeof IssueRef>;\n\n/** A file a session changed, with the lines added/deleted across the session's\n * window (git `--numstat`). The raw signal behind the per-file *token re-spend*\n * heatmap: a path that keeps reappearing across sessions is re-spend — a likely\n * redesign candidate. Always `git`-sourced + repo-relative, the same public-shape\n * safety class as a slug (no file contents, no home paths). */\nexport const FileRef = z.object({\n  /** `org/repo` this file belongs to — ties the path to a repo for the per-repo\n   * rollup (one session can span several repos). Null when the slug is unknown. */\n  slug: z.string().max(200).nullable().default(null),\n  /** Repo-relative path. Never absolute / home — git emits repo-relative. */\n  path: z.string().max(400),\n  lines_added: z.number().int().nonnegative().default(0),\n  lines_deleted: z.number().int().nonnegative().default(0),\n  source: RefSource.default(\"git\"),\n});\nexport type FileRef = z.infer<typeof FileRef>;\n\n/**\n * The deterministic metadata for one session. Attached to the ingest batch\n * under `session_metadata[session_id]`. Every collection is plural and\n * capped; an empty {@link SessionMetadata} should simply not be shipped.\n */\nexport const SessionMetadata = z.object({\n  repos: z.array(RepoRef).max(50).default([]),\n  pull_requests: z.array(PullRequestRef).max(100).default([]),\n  issues: z.array(IssueRef).max(100).default([]),\n  files: z.array(FileRef).max(500).default([]),\n});\nexport type SessionMetadata = z.infer<typeof SessionMetadata>;\n\n/** The per-event form of {@link SessionMetadata}: the references found in a\n * single turn's text. Smaller caps — one turn references few things — and it\n * rides each {@link RawEvent} (`references`) so the server can attribute a ref\n * to the exact turn/segment that touched it, not just the session. */\nexport const EventReferences = z.object({\n  repos: z.array(RepoRef).max(24).default([]),\n  pull_requests: z.array(PullRequestRef).max(24).default([]),\n  issues: z.array(IssueRef).max(24).default([]),\n});\nexport type EventReferences = z.infer<typeof EventReferences>;\n\n/** The mutable accumulation shape the detectors emit. Same fields as\n * {@link SessionMetadata}; {@link dedupeSessionMetadata} folds many of these\n * into one validated, deduped, capped {@link SessionMetadata}. */\nexport interface DetectedRefs {\n  repos: RepoRef[];\n  pull_requests: PullRequestRef[];\n  issues: IssueRef[];\n}\n\nexport function emptyDetectedRefs(): DetectedRefs {\n  return { repos: [], pull_requests: [], issues: [] };\n}\n\n// ── Detection patterns ───────────────────────────────────────────────\n//\n// All global + case-insensitive on the host so `matchAll` iterates every\n// occurrence. Slugs allow dots/dashes; GitLab paths allow nested subgroups\n// (`group/subgroup/repo`) which is why the GitLab patterns capture up to the\n// `/-/` separator. Ticket keys are intentionally uppercase-anchored.\n\nconst GITHUB_PR = /https?:\\/\\/github\\.com\\/([\\w.-]+)\\/([\\w.-]+)\\/pull\\/(\\d+)/gi;\nconst GITLAB_MR = /https?:\\/\\/gitlab\\.com\\/([\\w./-]+?)\\/-\\/merge_requests\\/(\\d+)/gi;\nconst BITBUCKET_PR = /https?:\\/\\/bitbucket\\.org\\/([\\w.-]+)\\/([\\w.-]+)\\/pull-requests\\/(\\d+)/gi;\nconst GITHUB_ISSUE = /https?:\\/\\/github\\.com\\/([\\w.-]+)\\/([\\w.-]+)\\/issues\\/(\\d+)/gi;\nconst GITLAB_ISSUE = /https?:\\/\\/gitlab\\.com\\/([\\w./-]+?)\\/-\\/issues\\/(\\d+)/gi;\nconst LINEAR_ISSUE = /https?:\\/\\/linear\\.app\\/[\\w.-]+\\/issue\\/([A-Z][A-Z0-9]*-\\d+)/gi;\nconst JIRA_ISSUE = /https?:\\/\\/[\\w.-]+\\/browse\\/([A-Z][A-Z0-9]+-\\d+)/gi;\n/** `org/repo#123` — the GitHub shorthand. Safe enough to scan in any text:\n * it requires a slash, a hash, and digits. Anchored on a boundary so it\n * doesn't fire mid-word. */\nconst SLUG_HASH = /(?:^|[\\s([{<])([\\w.-]+\\/[\\w.-]+)#(\\d+)\\b/g;\n/** A bare `TEAM-123` ticket key. High false-positive risk in free text\n * (`UTF-8`, `COVID-19`), so this is gated to the `model` + branch channels\n * where the surrounding instruction makes it intentional. */\nconst BARE_TICKET = /\\b([A-Z][A-Z0-9]{1,9}-\\d{1,6})\\b/g;\n\nfunction repoFrom(host: string | null, slug: string, source: RefSource): RepoRef {\n  return { host, slug, branches: [], source };\n}\n\n/**\n * Extract every repo / PR / commit / issue reference from a blob of text.\n *\n * The `source` tags every reference and also gates the noisier patterns:\n * bare `TEAM-123` ticket keys are only mined when `source === \"model\"` (the\n * on-device model is explicitly asked for them), never from raw `content`\n * excerpts where they'd collide with `UTF-8`-style strings. Full URLs and the\n * `org/repo#123` shorthand are always safe and always scanned.\n *\n * Every URL-bearing reference also contributes its `(host, slug)` to `repos`,\n * so a single PR link yields both the PR and the repo it belongs to.\n */\nexport function detectReferences(text: string, source: RefSource = \"content\"): DetectedRefs {\n  const out = emptyDetectedRefs();\n  if (!text) return out;\n\n  for (const m of text.matchAll(GITHUB_PR)) {\n    const slug = `${m[1]}/${m[2]}`;\n    out.pull_requests.push({\n      host: \"github.com\",\n      slug,\n      number: Number(m[3]),\n      url: m[0],\n      source,\n      confidence: 0.95,\n    });\n    out.repos.push(repoFrom(\"github.com\", slug, source));\n  }\n  for (const m of text.matchAll(GITLAB_MR)) {\n    out.pull_requests.push({\n      host: \"gitlab.com\",\n      slug: m[1] ?? null,\n      number: Number(m[2]),\n      url: m[0],\n      source,\n      confidence: 0.95,\n    });\n    if (m[1]) out.repos.push(repoFrom(\"gitlab.com\", m[1], source));\n  }\n  for (const m of text.matchAll(BITBUCKET_PR)) {\n    const slug = `${m[1]}/${m[2]}`;\n    out.pull_requests.push({\n      host: \"bitbucket.org\",\n      slug,\n      number: Number(m[3]),\n      url: m[0],\n      source,\n      confidence: 0.95,\n    });\n    out.repos.push(repoFrom(\"bitbucket.org\", slug, source));\n  }\n\n  for (const m of text.matchAll(GITHUB_ISSUE)) {\n    const slug = `${m[1]}/${m[2]}`;\n    out.issues.push({\n      provider: \"github\",\n      key: m[3] ?? \"\",\n      slug,\n      url: m[0],\n      source,\n      confidence: 0.95,\n    });\n    out.repos.push(repoFrom(\"github.com\", slug, source));\n  }\n  for (const m of text.matchAll(GITLAB_ISSUE)) {\n    out.issues.push({\n      provider: \"gitlab\",\n      key: m[2] ?? \"\",\n      slug: m[1] ?? null,\n      url: m[0],\n      source,\n      confidence: 0.95,\n    });\n    if (m[1]) out.repos.push(repoFrom(\"gitlab.com\", m[1], source));\n  }\n  for (const m of text.matchAll(LINEAR_ISSUE)) {\n    out.issues.push({\n      provider: \"linear\",\n      key: m[1] ?? \"\",\n      slug: null,\n      url: m[0],\n      source,\n      confidence: 0.9,\n    });\n  }\n  for (const m of text.matchAll(JIRA_ISSUE)) {\n    out.issues.push({\n      provider: \"jira\",\n      key: m[1] ?? \"\",\n      slug: null,\n      url: m[0],\n      source,\n      confidence: 0.9,\n    });\n  }\n\n  for (const m of text.matchAll(SLUG_HASH)) {\n    // `org/repo#123` is ambiguous between issue and PR on GitHub. Default to an\n    // issue (the superset; a real PR URL elsewhere wins on dedupe) — but an\n    // explicit PR cue right before it (\"PR org/repo#123\", \"merged org/repo#123\")\n    // disambiguates toward a PR, so a shorthand-only PR still reaches the\n    // first-class PR entity instead of being misfiled as an issue. The cue must\n    // be adjacent, so issue cues (\"fixes\", \"closes\") never trip it.\n    const slug = m[1] ?? \"\";\n    const lead = text.slice(Math.max(0, (m.index ?? 0) - 20), m.index ?? 0).toLowerCase();\n    if (/\\b(pr|pull[ -]?request|merge[ -]?request|mr|merged)\\s*$/.test(lead)) {\n      out.pull_requests.push({\n        host: \"github.com\",\n        slug,\n        number: Number(m[2] ?? \"\"),\n        url: null,\n        source,\n        confidence: 0.6,\n      });\n      out.repos.push(repoFrom(\"github.com\", slug, source));\n    } else {\n      out.issues.push({\n        provider: \"github\",\n        key: m[2] ?? \"\",\n        slug,\n        url: null,\n        source,\n        confidence: 0.55,\n      });\n    }\n  }\n\n  if (source === \"model\") {\n    for (const m of text.matchAll(BARE_TICKET)) {\n      out.issues.push({\n        provider: \"other\",\n        key: m[1] ?? \"\",\n        slug: null,\n        url: null,\n        source,\n        confidence: 0.4,\n      });\n    }\n  }\n\n  return out;\n}\n\n/** Mine ticket keys (`TEAM-123`) out of a branch name — a high-signal,\n * low-noise place to find them (`feature/ENG-742-retry-logic`). Returns\n * `git`-sourced issue refs since a branch is deterministic, not content. */\nexport function detectBranchTickets(branch: string | null | undefined): IssueRef[] {\n  if (!branch) return [];\n  const out: IssueRef[] = [];\n  for (const m of branch.matchAll(BARE_TICKET)) {\n    out.push({\n      provider: \"other\",\n      key: m[1] ?? \"\",\n      slug: null,\n      url: null,\n      source: \"git\",\n      confidence: 0.7,\n    });\n  }\n  return out;\n}\n\n/** Build a {@link RepoRef} from a git context (the event's `git` field or a\n * `resolveGitContext` result). Null when there's no slug to anchor on. */\nexport function repoRefFromGit(\n  git: { remote_host?: string | null; remote_slug?: string | null; branch?: string | null },\n  source: RefSource = \"git\",\n): RepoRef | null {\n  if (!git.remote_slug) return null;\n  return {\n    host: git.remote_host ?? null,\n    slug: git.remote_slug,\n    branches: git.branch ? [git.branch] : [],\n    source,\n  };\n}\n\n// ── Dedupe / merge ───────────────────────────────────────────────────\n\nfunction stronger(a: RefSource, b: RefSource): RefSource {\n  return SOURCE_RANK[a] >= SOURCE_RANK[b] ? a : b;\n}\n\n/** Generic keyed dedupe that keeps the highest-precedence/confidence copy. */\nfunction dedupe<T extends { source: RefSource; confidence?: number }>(\n  items: T[],\n  keyOf: (item: T) => string,\n  merge: (existing: T, next: T) => T,\n): T[] {\n  const byKey = new Map<string, T>();\n  for (const item of items) {\n    const key = keyOf(item);\n    const existing = byKey.get(key);\n    byKey.set(key, existing ? merge(existing, item) : item);\n  }\n  return [...byKey.values()];\n}\n\n/**\n * Fold any number of {@link DetectedRefs} (from every channel + every event/\n * segment of a session) into one validated, deduped, capped\n * {@link SessionMetadata}.\n *\n * Repos dedupe by slug (case-insensitive), unioning branches and keeping the\n * strongest host + source. PRs/issues dedupe by their natural key,\n * keeping the highest-confidence, strongest-source copy — so a deterministic\n * `git` PR URL always beats a low-confidence `model` mention of the same PR.\n */\nexport function dedupeSessionMetadata(parts: DetectedRefs[]): SessionMetadata {\n  const all = emptyDetectedRefs();\n  for (const p of parts) {\n    all.repos.push(...p.repos);\n    all.pull_requests.push(...p.pull_requests);\n    all.issues.push(...p.issues);\n  }\n\n  const repos = dedupe(\n    all.repos,\n    (r) => r.slug.toLowerCase(),\n    (a, b) => ({\n      host: a.host ?? b.host,\n      slug: a.slug,\n      branches: [...new Set([...a.branches, ...b.branches])].slice(0, 50),\n      source: stronger(a.source, b.source),\n    }),\n  );\n\n  // Higher score wins a tie-break: source trust dominates, confidence breaks\n  // ties within a source. The loser still backfills a missing url/slug.\n  const score = (r: { source: RefSource; confidence?: number }): number =>\n    SOURCE_RANK[r.source] * 2 + (r.confidence ?? 0);\n\n  const pull_requests = dedupe(\n    all.pull_requests,\n    (p) => `${(p.slug ?? \"\").toLowerCase()}#${p.number}`,\n    (a, b) => {\n      const [win, lose] = score(a) >= score(b) ? [a, b] : [b, a];\n      return {\n        host: win.host ?? lose.host,\n        slug: win.slug ?? lose.slug,\n        number: win.number,\n        url: win.url ?? lose.url,\n        source: win.source,\n        confidence: Math.max(win.confidence, lose.confidence),\n      };\n    },\n  );\n  const issues = dedupe(\n    all.issues,\n    (i) => `${i.provider}:${(i.slug ?? \"\").toLowerCase()}#${i.key.toLowerCase()}`,\n    (a, b) => {\n      const [win, lose] = score(a) >= score(b) ? [a, b] : [b, a];\n      return {\n        provider: win.provider,\n        key: win.key,\n        slug: win.slug ?? lose.slug,\n        url: win.url ?? lose.url,\n        source: win.source,\n        confidence: Math.max(win.confidence, lose.confidence),\n      };\n    },\n  );\n\n  // GitHub shares one number space across issues and PRs, so the ambiguous\n  // `org/repo#N` shorthand (recorded as a low-confidence issue) is really the\n  // PR when a `/pull/N` for the same (slug, number) was also found — drop the\n  // phantom issue rather than report both.\n  const prKeys = new Set(pull_requests.map((p) => `${(p.slug ?? \"\").toLowerCase()}#${p.number}`));\n  const reconciledIssues = issues.filter(\n    (i) => !(i.provider === \"github\" && prKeys.has(`${(i.slug ?? \"\").toLowerCase()}#${i.key}`)),\n  );\n\n  // Drop any single reference that violates the per-field wire caps (an\n  // adversarial or malformed capture — e.g. a 300-char slug from a hostile\n  // excerpt) rather than letting one bad ref throw out of here and wipe\n  // metadata for the whole session/batch. The schema stays the single source\n  // of truth for the caps; the blast radius is just the one bad reference.\n  const keepValid = <T>(\n    schema: { safeParse: (value: unknown) => { success: boolean } },\n    items: T[],\n  ): T[] => items.filter((item) => schema.safeParse(item).success);\n\n  return {\n    repos: keepValid(RepoRef, repos).slice(0, 50),\n    pull_requests: keepValid(PullRequestRef, pull_requests).slice(0, 100),\n    issues: keepValid(IssueRef, reconciledIssues).slice(0, 100),\n    // Files are git-collected per repo *after* dedupe (like the PR-outcome\n    // enrichment), so the fold leaves them empty; the daemon fills them via\n    // dedupeFiles.\n    files: [],\n  };\n}\n\n/** Fold a session's {@link FileRef}s (collected per repo from git) into one\n * deduped, capped list: the same `(slug, path)` sums its line counts and keeps\n * the strongest source. Separate from {@link dedupeSessionMetadata} because\n * files aren't mined from the detected `parts` — they're collected after dedupe. */\nexport function dedupeFiles(files: FileRef[]): FileRef[] {\n  const merged = dedupe(\n    files,\n    (f) => `${(f.slug ?? \"\").toLowerCase()}:${f.path}`,\n    (a, b) => ({\n      slug: a.slug ?? b.slug,\n      path: a.path,\n      lines_added: a.lines_added + b.lines_added,\n      lines_deleted: a.lines_deleted + b.lines_deleted,\n      source: stronger(a.source, b.source),\n    }),\n  );\n  return merged.filter((f) => FileRef.safeParse(f).success).slice(0, 500);\n}\n\n/** True when a {@link SessionMetadata} carries no references — callers use\n * this to avoid shipping (and overwriting server state with) an empty map. */\nexport function isEmptySessionMetadata(m: SessionMetadata): boolean {\n  return (\n    m.repos.length === 0 &&\n    m.pull_requests.length === 0 &&\n    m.issues.length === 0 &&\n    m.files.length === 0\n  );\n}\n\n/**\n * Extract + dedupe the public references in ONE event's full text — PR/MR,\n * issue URLs plus the `org/repo#N` shorthand. Returns null when\n * none are found so the caller can leave the optional `RawEvent.references`\n * field off. This is the high-recall counterpart to scanning the ≤320-char\n * excerpt: the parser runs it over the whole turn.\n *\n * PRIVACY: it pulls ONLY public reference shapes (forge URLs, slugs, numbers,\n * ticket keys) — never arbitrary substrings — so it is safe to run over the\n * un-redacted turn text, the same safety class as a repo slug. Bare `TEAM-123`\n * keys are deliberately NOT mined here (that path is gated to the model\n * channel) to avoid `UTF-8`/`SHA-256`-style false positives in prose; ticket\n * keys still arrive via forge URLs and branch names.\n */\nexport function detectEventReferences(text: string): EventReferences | null {\n  if (!text) return null;\n  const m = dedupeSessionMetadata([detectReferences(text, \"content\")]);\n  if (isEmptySessionMetadata(m)) return null;\n  return {\n    repos: m.repos.slice(0, 24),\n    pull_requests: m.pull_requests.slice(0, 24),\n    issues: m.issues.slice(0, 24),\n  };\n}\n","/**\n * The privacy floor's secret catalogue — the single, irreducible source of\n * truth for which credential formats get redacted before bytes leave the\n * device.\n *\n * This is the baseline a compromised server can never weaken. It was\n * previously duplicated and *drifting* across `packages/core/src/redact`\n * (the wire floor) and the SDK's standalone redactor — one\n * had `discord_token`/`db_url`, the other didn't. They now both source this\n * catalogue, so a newly-leaked credential format is added in exactly one place.\n *\n * Kept deliberately dependency-free (no zod, no imports) so the published,\n * a self-contained build can bundle it without pulling anything\n * else in. The remote `policies` augment (additive-only) layers on top of this\n * floor; it can never replace or disable it.\n *\n * Coverage rule: this catalogue is the UNION of what both redactors caught,\n * with the broader regex chosen wherever they overlapped — so consolidating\n * onto it only ever *strengthens* either redactor, never weakens it.\n */\n\nexport interface FloorSecret {\n  /** Stable label that appears in the `<REDACTED:name>` placeholder. */\n  name: string;\n  /** Detection regex. MUST carry the `g` flag — consumers use `String.replace`. */\n  pattern: RegExp;\n  /**\n   * Replacement template (may use `$1`..`$n` backrefs) for consumers that\n   * preserve benign context — e.g. keeping the env-var name in\n   * `MY_TOKEN=<REDACTED:env_secret>`. The wire floor\n   * (`@modelstat/core/redact`) ignores this and replaces the whole match\n   * with `[REDACTED:name]`; both are equally safe (the secret is gone).\n   */\n  replacement: string;\n}\n\n/**\n * Ordered specific → generic. Order matters: specific provider keys run before\n * the generic `env_secret` / 40-char-blob catchers so a known key is labelled\n * precisely rather than as a generic blob.\n */\nexport const SECRET_FLOOR: readonly FloorSecret[] = [\n  {\n    name: \"anthropic_key\",\n    pattern: /sk-ant-[A-Za-z0-9_-]{20,}/g,\n    replacement: \"<REDACTED:anthropic_key>\",\n  },\n  {\n    name: \"openai_key\",\n    pattern: /sk-(?:proj-)?[A-Za-z0-9_-]{20,}/g,\n    replacement: \"<REDACTED:openai_key>\",\n  },\n  {\n    name: \"google_api_key\",\n    pattern: /AIza[0-9A-Za-z_-]{35}/g,\n    replacement: \"<REDACTED:google_api_key>\",\n  },\n  {\n    name: \"aws_access_key\",\n    pattern: /\\b(?:AKIA|ASIA)[0-9A-Z]{16}\\b/g,\n    replacement: \"<REDACTED:aws_access_key>\",\n  },\n  { name: \"github_pat\", pattern: /ghp_[A-Za-z0-9]{36,}/g, replacement: \"<REDACTED:github_pat>\" },\n  {\n    name: \"github_oauth\",\n    pattern: /gho_[A-Za-z0-9]{36,}/g,\n    replacement: \"<REDACTED:github_oauth>\",\n  },\n  {\n    name: \"github_app\",\n    pattern: /gh[sur]_[A-Za-z0-9]{36,}/g,\n    replacement: \"<REDACTED:github_app>\",\n  },\n  {\n    name: \"slack_token\",\n    pattern: /xox[aboprs]-[A-Za-z0-9-]{10,}/g,\n    replacement: \"<REDACTED:slack_token>\",\n  },\n  {\n    name: \"stripe_live_key\",\n    pattern: /(?:sk|pk|rk)_live_[A-Za-z0-9]{24,}/g,\n    replacement: \"<REDACTED:stripe_live_key>\",\n  },\n  {\n    name: \"stripe_test_key\",\n    pattern: /(?:sk|pk|rk)_test_[A-Za-z0-9]{24,}/g,\n    replacement: \"<REDACTED:stripe_test_key>\",\n  },\n  // Discord bot token (was caught by only one redactor — the canonical drift example).\n  {\n    name: \"discord_token\",\n    pattern: /[MN][A-Za-z\\d]{23}\\.[\\w-]{6}\\.[\\w-]{27}/g,\n    replacement: \"<REDACTED:discord_token>\",\n  },\n  {\n    name: \"jwt\",\n    pattern: /eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n    replacement: \"<REDACTED:jwt>\",\n  },\n  // Full PEM block (was header-only in the wire floor — this redacts the body too).\n  {\n    name: \"private_key_header\",\n    pattern:\n      /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g,\n    replacement: \"<REDACTED:private_key>\",\n  },\n  // modelstat's own device bearer — agents must never ship their credential.\n  {\n    name: \"modelstat_device_secret\",\n    pattern: /ds_live_[A-Za-z0-9_-]{32,}/g,\n    replacement: \"<REDACTED:modelstat_device_secret>\",\n  },\n  // Generic env-style KEY=VALUE where KEY names a secret. Keeps the var name.\n  // The keyword may be the WHOLE name (`SECRET=`, `TOKEN=`) or part of it\n  // (`AWS_SECRET_ACCESS_KEY=`), so the prefix is `[A-Z0-9_]*` (zero-or-more) —\n  // a mandatory leading `[A-Z]` here used to eat the first letter and miss every\n  // bare-keyword name, leaking `SECRET=\"…\"` / `TOKEN=\"…\"` straight to the wire.\n  {\n    name: \"env_secret\",\n    pattern:\n      /\\b([A-Z0-9_]*(?:TOKEN|KEY|SECRET|PASSWORD|PASSWD|PASSPHRASE|CREDENTIAL|API)[A-Z0-9_]*)\\s*[:=]\\s*['\"]?([^\\s'\"]{12,})['\"]?/g,\n    replacement: \"$1=<REDACTED:env_secret>\",\n  },\n  {\n    name: \"bearer_header\",\n    pattern: /Bearer\\s+[A-Za-z0-9._~+/-]{20,}=*/g,\n    replacement: \"Bearer <REDACTED:bearer>\",\n  },\n  {\n    name: \"db_url_with_password\",\n    pattern: /\\b(postgres|mysql|mongodb|redis|amqp)(?:\\+[a-z]+)?:\\/\\/[^:\\s]+:([^@\\s]+)@/gi,\n    replacement: \"$1://<user>:<REDACTED:db_password>@\",\n  },\n  // Generic 40-char base64-ish blob (e.g. an AWS secret access key on its own).\n  // Most generic ⇒ last, so specific patterns claim their matches first.\n  {\n    name: \"aws_secret_key\",\n    pattern: /(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])/g,\n    replacement: \"<REDACTED:aws_secret_key>\",\n  },\n];\n","/**\n * Redaction helpers — the wire privacy floor. The daemon runs this BEFORE any\n * content hits the wire. The server may apply its own defence-in-depth checks\n * independently.\n *\n * Goal: high recall on secrets + PII; minimal false positives on code.\n *\n * The secret catalogue lives in `./redact-floor` (the single source of truth,\n * shared with the SDK redactor so the two can't drift). A signed,\n * additive `policies` bundle may *union in* extra patterns via\n * {@link setRemoteRedactionPatterns}; that augment runs AFTER the baseline and\n * can only ADD redactions. The baseline floor here is unconditional and can\n * never be removed or disabled by remote config.\n */\n\nimport { SECRET_FLOOR } from \"./redact-floor.js\";\n\nexport interface RedactionResult {\n  text: string;\n  counts: {\n    secrets_found: number;\n    emails_redacted: number;\n    paths_redacted_absolute: number;\n  };\n}\n\n/** A compiled, additive secret pattern delivered by the signed `policies`\n * augment. Same shape as a floor entry, minus the replacement template (the\n * wire floor always redacts the whole match). */\nexport interface RemoteRedactionPattern {\n  name: string;\n  pattern: RegExp;\n}\n\n// Process-wide additive augment. Empty until a verified `policies` bundle is\n// applied; set by the long-lived daemon after it loads + verifies one. Reading\n// it here (rather than threading a param through every call site) is what lets\n// \"the server adds a pattern fleet-wide\" take effect with zero changes at the\n// dozens of `redact()` calls.\nlet remotePatterns: ReadonlyArray<RemoteRedactionPattern> = [];\n\n/** Apply a verified, additive set of remote secret patterns over the baseline\n * floor. Additive-only: this cannot remove or weaken the baseline below. */\nexport function setRemoteRedactionPatterns(patterns: ReadonlyArray<RemoteRedactionPattern>): void {\n  remotePatterns = patterns;\n}\n\n/** Drop the remote augment back to nothing (the baseline floor still applies). */\nexport function clearRemoteRedactionPatterns(): void {\n  remotePatterns = [];\n}\n\nconst EMAIL_PATTERN = /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi;\nconst ABSOLUTE_PATH_MACOS = /\\/Users\\/[^\\s\"'`)]+/g;\nconst ABSOLUTE_PATH_LINUX = /\\/home\\/[^\\s\"'`)]+/g;\n\n/** Entropy-based catcher for generic high-entropy tokens (API keys we don't\n * have explicit patterns for) plus large random blobs — digests / git SHAs /\n * other hashes and base64 payloads. These carry no analytic value, can leak\n * secrets, and bloat the wire, so they are collapsed to a marker. Operates on\n * unbroken word tokens of ≥32 chars; see {@link redact} for the rules. */\nfunction entropy(s: string): number {\n  const freq = new Map<string, number>();\n  for (const c of s) freq.set(c, (freq.get(c) ?? 0) + 1);\n  let h = 0;\n  for (const n of freq.values()) {\n    const p = n / s.length;\n    h -= p * Math.log2(p);\n  }\n  return h;\n}\n\nconst TOKEN_CANDIDATE = /[A-Za-z0-9/+=_-]{32,}/g;\n\nexport function redact(text: string, repoRootAbs?: string): RedactionResult {\n  let out = text;\n  const counts = {\n    secrets_found: 0,\n    emails_redacted: 0,\n    paths_redacted_absolute: 0,\n  };\n\n  // 1. Baseline floor — always applied first, never server-weakenable.\n  for (const { name, pattern } of SECRET_FLOOR) {\n    out = out.replace(pattern, () => {\n      counts.secrets_found += 1;\n      return `[REDACTED:${name}]`;\n    });\n  }\n\n  // 2. Additive signed augment — runs after the floor, can only ADD.\n  for (const { name, pattern } of remotePatterns) {\n    out = out.replace(pattern, () => {\n      counts.secrets_found += 1;\n      return `[REDACTED:${name}]`;\n    });\n  }\n\n  // Entropy pass — after named patterns, so it won't double-count.\n  out = out.replace(TOKEN_CANDIDATE, (match) => {\n    // Long pure-hex = a digest / git SHA / content hash — collapse it (privacy\n    // + payload size). Hex shorter than 32 chars never reaches here.\n    if (/^[a-fA-F0-9]{32,}$/.test(match)) {\n      counts.secrets_found += 1;\n      return \"[REDACTED:hash]\";\n    }\n    // SCREAMING_SNAKE / all-caps-or-digit constant names — not secrets.\n    if (/^[A-Z0-9_]+$/.test(match)) return match;\n    // Base64 / base64url blobs: trailing `=` padding or an embedded `+` are\n    // strong binary-payload signals that code and paths almost never carry.\n    // (`/` alone is a path separator, so it is deliberately NOT a signal —\n    // redacting paths would break command readability + script-token zipping.)\n    if (/=$|\\+/.test(match) && entropy(match) >= 3.5) {\n      counts.secrets_found += 1;\n      return \"[REDACTED:base64]\";\n    }\n    // Generic high-entropy token — an API key we have no explicit pattern for.\n    const hasDigit = /\\d/.test(match);\n    const hasUpper = /[A-Z]/.test(match);\n    const hasLower = /[a-z]/.test(match);\n    if (!(hasDigit && hasUpper && hasLower)) return match;\n    if (entropy(match) < 3.6) return match;\n    counts.secrets_found += 1;\n    return \"[REDACTED:hi-entropy]\";\n  });\n\n  out = out.replace(EMAIL_PATTERN, () => {\n    counts.emails_redacted += 1;\n    return \"[REDACTED:email]\";\n  });\n\n  // Absolute paths: keep them IFF they are under the session's repo root\n  // (in which case they're safe to map to a relative path). Otherwise redact.\n  const pathReplacer = (match: string): string => {\n    if (repoRootAbs && match.startsWith(repoRootAbs)) {\n      return match.slice(repoRootAbs.length).replace(/^\\/+/, \"./\");\n    }\n    counts.paths_redacted_absolute += 1;\n    return \"[REDACTED:abs-path]\";\n  };\n  out = out.replace(ABSOLUTE_PATH_MACOS, pathReplacer);\n  out = out.replace(ABSOLUTE_PATH_LINUX, pathReplacer);\n\n  return { text: out, counts };\n}\n","/**\n * Session-title pass — one tiny client-side LLM call per session that\n * turns the session's segment abstracts into a short, scannable title\n * for the dashboard's sessions list (\"what was this session about?\").\n *\n *   input   →  the session's per-segment abstracts (already produced\n *              by the summariser, already redacted) + cheap metadata.\n *   output  →  ≤ TITLE_MAX_CHARS title naming the dominant theme; when\n *              a session clearly spans several themes the model names\n *              the top areas (max 3) separated by \" · \".\n *\n * Zero marginal dollar cost by construction: it reuses the SAME local\n * model that already summarised the segments (bundled Qwen via\n * node-llama-cpp on the CLI), adding one short generation per session\n * per upload. The server never runs an LLM for this.\n *\n * Failure mode is GRACEFUL — like cognition, this is auxiliary to the\n * core pipeline contract. If the entitler is unavailable or returns\n * garbage, `buildSessionTitles` falls back to a deterministic title\n * derived from the first segment's abstract, so the batch always ships\n * and the dashboard always has something honest to show.\n */\nimport { redact } from \"@modelstat/core/redact\";\nimport type { Segment } from \"@modelstat/core/schemas\";\n\n/**\n * Canonical system prompt — the SAME for every runtime, centralised\n * here like COGNITION_SYSTEM_PROMPT so the wording is one edit.\n */\nexport const TITLER_SYSTEM_PROMPT =\n  \"You write a short TITLE for an AI coding session, given one-sentence \" +\n  \"summaries of its parts in chronological order. The title names what the \" +\n  \"session was about at a high level, in 3-8 words. If the session clearly \" +\n  \"spans more than one theme, name the top themes (at most 3) separated by \" +\n  \"' · '. Use concrete domain keywords (features, components, subsystems). \" +\n  \"No narration, no filler words like 'session' or 'work on', no quotes, \" +\n  \"no trailing period, no PII, no code literals, no file paths. \" +\n  \"Reply with only the title.\";\n\n/** Hard cap applied client-side to whatever the LLM emits. Also the\n * cap the dashboard's sessions list renders without truncation. */\nexport const TITLE_MAX_CHARS = 80;\n\n/** Wire-format ceiling (IngestBatch.session_titles values). Above the\n * display cap so a future longer-title prompt fits without a schema\n * change — mirrors the ABSTRACT_MAX_CHARS / OUTPUT_MAX_CHARS split. */\nexport const TITLE_WIRE_MAX_CHARS = 120;\n\nexport const TITLER_MAX_TOKENS = 60;\nexport const TITLER_TEMPERATURE = 0.2;\n\n/** At most this many abstracts are sampled into the title prompt.\n * First + last are always included (intent + latest state); the rest\n * are evenly spaced. Keeps the prompt ≤ ~2.5 KB — the same attention\n * sweet spot the segment summariser is tuned for. */\nexport const TITLER_MAX_ABSTRACTS = 10;\n\n/** Per-abstract slice inside the title prompt. Abstracts are ≤ 240\n * chars already; this guards against the 512-char storage ceiling. */\nexport const TITLER_ABSTRACT_SLICE_CHARS = 240;\n\n/**\n * The one input every Entitler adapter accepts. Operates on the\n * already-summarised, already-redacted abstracts — never raw turns —\n * so the title is downstream-of-redaction by construction.\n */\nexport interface TitleInput {\n  /** Per-segment abstracts in chronological order, cognition suffix\n   * already stripped. Non-empty. */\n  abstracts: string[];\n  /** Optional one-line metadata facts (\"repo org/repo; 12 segments on\n   * claude_code\") to ground the title. */\n  facts?: string | null;\n}\n\n/**\n * Adapter contract. Returns the raw model reply (pre-sanitise) or null\n * when the runtime couldn't produce anything. Callers treat null as\n * \"no signal\" and fall back deterministically.\n */\nexport type Entitler = (input: TitleInput) => Promise<string | null>;\n\n// ── User-prompt builder + reply sanitiser ────────────────────────────\n\n/** Build the user message for the title LLM call. Pure / cheap so\n * tests can assert on the exact prompt without spinning up a runtime. */\nexport function buildTitleUserPrompt(input: TitleInput): string {\n  const lines = input.abstracts\n    .map(\n      (a, i) =>\n        `  [part ${i + 1}] ${a.replace(/\\s+/g, \" \").trim().slice(0, TITLER_ABSTRACT_SLICE_CHARS)}`,\n    )\n    .join(\"\\n\");\n  const facts = input.facts?.trim();\n  return `${facts ? `Session context: ${facts}.\\n\\n` : \"\"}Summaries of the session's parts (chronological):\n${lines}\n\nWrite the title.`;\n}\n\n/** Strip the `[Mood: …] [Mind: …] [Stance: …]` cognition suffix the pipeline\n * appends to abstracts — these describe the user, not the work, and would\n * otherwise leak into titles (\"Frustrated debugging…\"). */\nexport function stripCognitionSuffix(abstract: string): string {\n  return abstract.replace(/\\s*\\[(?:Mood|Mind|Stance):[^\\]]*\\]/g, \"\").trim();\n}\n\n/**\n * Lowercase-noise cleanup applied to whatever the LLM emits: drop\n * surrounding quotes/backticks/fences, collapse whitespace, drop a\n * trailing period, re-redact as defence-in-depth, cap length. Returns\n * \"\" when nothing usable remains — callers then fall back.\n */\nexport function sanitiseTitle(raw: string | null | undefined): string {\n  if (!raw) return \"\";\n  // A \"title\" that turned into a paragraph is a failed generation —\n  // keep only the first non-empty line, BEFORE whitespace collapsing\n  // folds the newlines away.\n  const firstLine =\n    raw\n      .replace(/```[a-z]*\\n?/gi, \"\")\n      .split(/[\\n\\r]/)\n      .map((l) => l.trim())\n      .find((l) => l.length > 0) ?? \"\";\n  let t = firstLine\n    .replace(/\\s+/g, \" \")\n    // Models love wrapping titles in quotes despite instructions.\n    .replace(/^[\"'`“”]+/, \"\")\n    .replace(/[\"'`“”]+$/, \"\")\n    .replace(/[.!]+$/, \"\")\n    .trim();\n  if (!t) return \"\";\n  t = redact(t).text;\n  return t.slice(0, TITLE_MAX_CHARS).trim();\n}\n\n/** Deterministic fallback — first segment's abstract (the session's\n * intent), cognition-stripped, cut at the first sentence boundary.\n * Honest and always available; never an LLM call. */\nexport function fallbackTitle(abstracts: string[]): string {\n  const first = abstracts.find((a) => a.trim().length > 0);\n  if (!first) return \"\";\n  const sentence = first.split(/(?<=[.!?])\\s/, 1)[0] ?? first;\n  return sanitiseTitle(sentence);\n}\n\n/** Evenly sample up to `max` abstracts keeping first + last. */\nexport function sampleAbstracts(abstracts: string[], max = TITLER_MAX_ABSTRACTS): string[] {\n  if (abstracts.length <= max) return abstracts;\n  const picks = new Set<number>([0, abstracts.length - 1]);\n  for (let i = 1; picks.size < max; i++) {\n    picks.add(Math.round((i * (abstracts.length - 1)) / (max - 1)));\n  }\n  return [...picks].sort((a, b) => a - b).map((i) => abstracts[i]!);\n}\n\n/**\n * Build one title per session from a batch's segments.\n *\n * Groups `segments` by session_id (chronological within each), asks\n * the entitler once per session, sanitises, and falls back to the\n * deterministic title when the entitler is missing / fails / returns\n * noise. Sessions whose segments carry no usable abstract are omitted\n * — shipping an empty title would only overwrite a better one\n * server-side.\n *\n * Returns a map suitable for `IngestBatch.session_titles`.\n */\nexport async function buildSessionTitles(\n  segments: Segment[],\n  entitle?: Entitler,\n): Promise<Record<string, string>> {\n  const bySession = new Map<string, Segment[]>();\n  for (const s of segments) {\n    const arr = bySession.get(s.session_id) ?? [];\n    arr.push(s);\n    bySession.set(s.session_id, arr);\n  }\n\n  const out: Record<string, string> = {};\n  for (const [sessionId, segs] of bySession) {\n    const sorted = [...segs].sort((a, b) => a.started_at.localeCompare(b.started_at));\n    const abstracts = sorted\n      .map((s) => stripCognitionSuffix(s.abstract))\n      .filter((a) => a.length > 0);\n    if (abstracts.length === 0) continue;\n\n    let title = \"\";\n    if (entitle) {\n      const first = sorted[0]!;\n      const project = first.tags.find((t) => t.root_key === \"projects\")?.name;\n      const facts = [\n        project ? `repo ${project}` : null,\n        `${sorted.length} part${sorted.length === 1 ? \"\" : \"s\"} on ${first.agent}`,\n      ]\n        .filter(Boolean)\n        .join(\"; \");\n      try {\n        title = sanitiseTitle(await entitle({ abstracts: sampleAbstracts(abstracts), facts }));\n      } catch {\n        title = \"\";\n      }\n    }\n    if (!title) title = fallbackTitle(abstracts);\n    if (title) out[sessionId] = title;\n  }\n  return out;\n}\n","/**\n * Per-session metadata pass — assembles the repos, pull requests, commits,\n * and issues a session touched, then ships one {@link SessionMetadata} per\n * session on the ingest batch (under `session_metadata[session_id]`).\n *\n * This is the on-device half of the spend→outcome join. It fuses four\n * channels, in descending order of trust (see {@link RefSource}):\n *\n *   1. git context already on each event (`event.git`) — repo slug, host,\n *      branch (the historical branch, captured at session time).\n *   2. `resolveGit` — an injected, best-effort read of the repo on disk for\n *      the session's cwds (authoritative remote slug/host; wires up the\n *      otherwise-dormant `git.ts`). Cwd-cached by the caller.\n *   3. redacted content — PR/issue/commit URLs surviving in the segment\n *      abstracts + event excerpts (deterministic regex, never raw text).\n *   4. the on-device model — a single best-effort call per session over the\n *      redacted abstracts, whose free-text reply is re-parsed deterministically\n *      here. This is what makes detection work for ANY provider, even clients\n *      whose logs carry no structured git data (web chat, Cursor).\n *\n * The detection + dedupe logic itself is pure and lives in\n * `@modelstat/core/session-metadata`; this module only orchestrates the\n * channels and the (optional, best-effort) git + model I/O. Mirrors\n * `buildSessionTitles` in shape: group by session, enrich, fall back\n * gracefully — a model or git hiccup never blocks the batch.\n */\nimport type { GitContext, RawEvent, Segment } from \"@modelstat/core/schemas\";\nimport {\n  type DetectedRefs,\n  dedupeFiles,\n  dedupeSessionMetadata,\n  detectBranchTickets,\n  detectReferences,\n  emptyDetectedRefs,\n  type FileRef,\n  isEmptySessionMetadata,\n  type SessionMetadata,\n} from \"@modelstat/core/session-metadata\";\nimport { sampleAbstracts, stripCognitionSuffix } from \"./title.js\";\n\n/** The input every {@link LinkExtractor} adapter accepts — the session's\n * already-summarised, already-redacted abstracts (never raw turns), so the\n * model only ever sees post-redaction text. */\nexport interface LinkExtractInput {\n  abstracts: string[];\n}\n\n/**\n * Adapter contract for the on-device link-extraction model. Returns a raw\n * free-text reply (one reference per line, or \"none\") which the caller feeds\n * back through the deterministic parser — so we never trust model-structured\n * output, only model-surfaced *text*. Returns null when the runtime can't\n * produce anything; callers treat null as \"no signal\".\n */\nexport type LinkExtractor = (input: LinkExtractInput) => Promise<string | null>;\n\n/** Canonical system prompt — the SAME for every runtime, centralised here\n * like COGNITION_SYSTEM_PROMPT / TITLER_SYSTEM_PROMPT. */\nexport const LINK_EXTRACT_SYSTEM_PROMPT =\n  \"You extract code-collaboration references from one-sentence summaries of an \" +\n  \"AI-coding session. Report ONLY references that explicitly appear in the text: \" +\n  \"pull/merge request URLs, issue URLs, commit URLs, the `org/repo#123` shorthand, \" +\n  \"and ticket keys like ENG-123 or PROJ-4567. Output one reference per line, \" +\n  \"verbatim, nothing else — no prose, no numbering, no markdown. If the summaries \" +\n  \"contain no such reference, reply with exactly `none`. Never invent a reference, \" +\n  \"a repo, a number, or a URL that is not present in the text.\";\n\nexport const LINK_EXTRACT_MAX_TOKENS = 120;\nexport const LINK_EXTRACT_TEMPERATURE = 0.1;\n\n/** At most this many abstracts are sampled into one extraction call — the\n * same envelope the titler uses, keeping the prompt small + cheap. */\nexport const LINK_EXTRACT_MAX_ABSTRACTS = 12;\n\n/** Build the user message for the link-extraction call. Pure / cheap so tests\n * can assert on the exact prompt without a runtime. */\nexport function buildLinkExtractUserPrompt(abstracts: string[]): string {\n  const lines = abstracts\n    .map((a, i) => `  [part ${i + 1}] ${a.replace(/\\s+/g, \" \").trim().slice(0, 240)}`)\n    .join(\"\\n\");\n  return `Summaries of the session's parts:\\n${lines}\\n\\nList the references, one per line, or \"none\".`;\n}\n\n/** Options for {@link buildSessionMetadata}. Both are optional + best-effort:\n * absent or failing, the relevant channel simply contributes nothing. */\nexport interface SessionMetadataOptions {\n  /** Resolve a cwd to its git context on disk (e.g. parsers' resolveGitContext).\n   * Best-effort; cwd-cached by the implementation. */\n  resolveGit?: (cwd: string | null) => Promise<GitContext | null>;\n  /** On-device model that surfaces references from redacted abstracts. */\n  extractLinks?: LinkExtractor;\n  /** Local git verified-outcome check for a PR in `cwd` (parsers'\n   * `checkPullRequestOutcome`) — fills a referenced PR's merged/merged_at/\n   * reverted signals for the server's CPVO engine. Best-effort. */\n  checkPrOutcome?: (\n    cwd: string,\n    prNumber: number,\n  ) => Promise<{ merged: boolean; merged_at: string | null; reverted: boolean } | null>;\n  /** Aggregate the files a repo changed in [`since`, `until`] (parsers'\n   * `collectFilesChanged`) — the per-file token re-spend signal. Best-effort. */\n  collectFilesChanged?: (\n    cwd: string,\n    since: string,\n    until: string,\n  ) => Promise<Array<{ path: string; lines_added: number; lines_deleted: number }> | null>;\n}\n\nfunction groupBy<T>(items: T[], keyOf: (item: T) => string): Map<string, T[]> {\n  const out = new Map<string, T[]>();\n  for (const item of items) {\n    const key = keyOf(item);\n    const arr = out.get(key) ?? [];\n    arr.push(item);\n    out.set(key, arr);\n  }\n  return out;\n}\n\n/** Commits usually land when a session wraps up — a little AFTER its active\n * window closes — so the per-file capture extends `until` by this grace period\n * (capped at the next session's start; see step 6). 4h covers \"commit when\n * you're done\" without claiming unrelated later work when there's no next\n * session. The active window itself (`sessionWindow`) stays the lower bound. */\nconst COMMIT_GRACE_MS = 4 * 60 * 60 * 1000;\n\n/** The session's [since, until] as ISO-8601 instants — the span of its segments\n * and events. Null when nothing is timestamped. ISO-8601 sorts lexically =\n * chronologically, so a string min/max bounds the active window (step 6 extends\n * `until` past it by {@link COMMIT_GRACE_MS} to catch the commit-on-wrap). */\nfunction sessionWindow(\n  evs: RawEvent[],\n  segs: Segment[],\n): { since: string; until: string } | null {\n  const starts: string[] = [];\n  const ends: string[] = [];\n  for (const s of segs) {\n    if (s.started_at) starts.push(s.started_at);\n    if (s.ended_at) ends.push(s.ended_at);\n  }\n  for (const e of evs) {\n    if (e.ts) {\n      starts.push(e.ts);\n      ends.push(e.ts);\n    }\n  }\n  starts.sort();\n  ends.sort();\n  const since = starts[0];\n  const until = ends[ends.length - 1];\n  return since && until ? { since, until } : null;\n}\n\n/**\n * Build one {@link SessionMetadata} per session from a batch's segments +\n * events. Sessions whose channels surface no reference are omitted from the\n * result — shipping an empty map would only overwrite better server state.\n *\n * Returns a map suitable for `IngestBatch.session_metadata`.\n */\nexport async function buildSessionMetadata(\n  segments: Segment[],\n  events: RawEvent[],\n  opts: SessionMetadataOptions = {},\n): Promise<Record<string, SessionMetadata>> {\n  const eventsBySession = groupBy(events, (e) => e.session_id);\n  const segsBySession = groupBy(segments, (s) => s.session_id);\n  const sessionIds = new Set<string>([...eventsBySession.keys(), ...segsBySession.keys()]);\n\n  const out: Record<string, SessionMetadata> = {};\n  // All sessions' start instants (ms), sorted — used to cap each session's\n  // commit-capture grace window (step 6) at the NEXT session's start, so a later\n  // session never double-claims a commit made after this one wrapped up.\n  const allStartsMs = [...sessionIds]\n    .map((sid) => {\n      const w = sessionWindow(eventsBySession.get(sid) ?? [], segsBySession.get(sid) ?? []);\n      return w ? Date.parse(w.since) : Number.NaN;\n    })\n    .filter((m) => !Number.isNaN(m))\n    .sort((a, b) => a - b);\n  for (const sessionId of sessionIds) {\n    try {\n      const evs = eventsBySession.get(sessionId) ?? [];\n      const segs = segsBySession.get(sessionId) ?? [];\n      const parts: DetectedRefs[] = [];\n      // repo slug → a cwd on disk for it (built in step 2), used to run the\n      // verified-outcome git-check against the right local repo.\n      const slugToCwd = new Map<string, string>();\n\n      // 1. git context already on the events.\n      const cwds = new Set<string>();\n      for (const e of evs) {\n        if (e.cwd) cwds.add(e.cwd);\n        if (!e.git) continue;\n        const refs = emptyDetectedRefs();\n        if (e.git.remote_slug) {\n          refs.repos.push({\n            host: e.git.remote_host ?? null,\n            slug: e.git.remote_slug,\n            branches: e.git.branch ? [e.git.branch] : [],\n            source: \"git\",\n          });\n        }\n        if (e.git.branch) refs.issues.push(...detectBranchTickets(e.git.branch));\n        parts.push(refs);\n      }\n\n      // 2. resolve git on disk for the session's cwds (best-effort, cwd-cached).\n      if (opts.resolveGit) {\n        for (const cwd of cwds) {\n          let g: GitContext | null = null;\n          try {\n            g = await opts.resolveGit(cwd);\n          } catch {\n            g = null;\n          }\n          if (!g?.remote_slug) continue;\n          slugToCwd.set(g.remote_slug.toLowerCase(), cwd);\n          const refs = emptyDetectedRefs();\n          refs.repos.push({\n            host: g.remote_host ?? null,\n            slug: g.remote_slug,\n            branches: g.branch ? [g.branch] : [],\n            source: \"git\",\n          });\n          if (g.branch) refs.issues.push(...detectBranchTickets(g.branch));\n          parts.push(refs);\n        }\n      }\n\n      // 3a. references the parser already pulled from each event's FULL text\n      //     (high recall — whole turn, not just the ≤320-char excerpt).\n      for (const e of evs) {\n        if (e.references) parts.push(e.references);\n      }\n      // 3b. fallback scan of the redacted excerpts (covers older daemons /\n      //     replayed events that predate the `references` field).\n      for (const e of evs) {\n        if (e.content_excerpt) parts.push(detectReferences(e.content_excerpt, \"content\"));\n      }\n      const abstracts = [...segs]\n        .sort((a, b) => a.started_at.localeCompare(b.started_at))\n        .map((s) => stripCognitionSuffix(s.abstract))\n        .filter((a) => a.length > 0);\n      for (const a of abstracts) parts.push(detectReferences(a, \"content\"));\n\n      // 4. provider-agnostic model pass — one call per session over the sample.\n      if (opts.extractLinks && abstracts.length > 0) {\n        try {\n          const reply = await opts.extractLinks({\n            abstracts: sampleAbstracts(abstracts, LINK_EXTRACT_MAX_ABSTRACTS),\n          });\n          if (reply) parts.push(detectReferences(reply, \"model\"));\n        } catch {\n          // Best-effort — the deterministic channels stand on their own.\n        }\n      }\n\n      const meta = dedupeSessionMetadata(parts);\n\n      // 5. enrich PRs with on-device verified-outcome signals (CPVO), where the\n      //    PR's repo is on disk. Best-effort + per-PR isolated.\n      if (opts.checkPrOutcome && meta.pull_requests.length > 0) {\n        for (const pr of meta.pull_requests) {\n          const cwd = pr.slug ? slugToCwd.get(pr.slug.toLowerCase()) : undefined;\n          if (!cwd) continue;\n          try {\n            const o = await opts.checkPrOutcome(cwd, pr.number);\n            if (o) {\n              pr.merged = o.merged;\n              pr.merged_at = o.merged_at;\n              pr.reverted = o.reverted;\n            }\n          } catch {\n            // best-effort — a failed git-check just leaves the PR unenriched.\n          }\n        }\n      }\n\n      // 6. enrich with the files each resolved repo changed in the session — the\n      //    per-file token re-spend signal. Commits usually land when wrapping up,\n      //    just AFTER the active window, so extend `until` by a grace period\n      //    (capped at the next session's start so a later session can't claim it).\n      //    One git pass per repo, best-effort + isolated; slug-stamped for rollup.\n      if (opts.collectFilesChanged && slugToCwd.size > 0) {\n        const range = sessionWindow(evs, segs);\n        if (range) {\n          const endMs = Date.parse(range.until);\n          const nextStartMs = allStartsMs.find((m) => m > endMs);\n          const untilMs =\n            nextStartMs !== undefined\n              ? Math.min(endMs + COMMIT_GRACE_MS, nextStartMs)\n              : endMs + COMMIT_GRACE_MS;\n          const until = new Date(untilMs).toISOString();\n          const fileRefs: FileRef[] = [];\n          for (const [slug, cwd] of slugToCwd) {\n            try {\n              const changes = await opts.collectFilesChanged(cwd, range.since, until);\n              if (!changes) continue;\n              for (const c of changes) {\n                fileRefs.push({\n                  slug,\n                  path: c.path,\n                  lines_added: c.lines_added,\n                  lines_deleted: c.lines_deleted,\n                  source: \"git\",\n                });\n              }\n            } catch {\n              // best-effort — a failed git pass just leaves that repo's files out.\n            }\n          }\n          if (fileRefs.length > 0) meta.files = dedupeFiles([...meta.files, ...fileRefs]);\n        }\n      }\n\n      if (!isEmptySessionMetadata(meta)) out[sessionId] = meta;\n    } catch {\n      // Defence-in-depth: a single session's failure never drops metadata for\n      // the rest of the batch. (dedupe is total, so this should not fire — it\n      // guards against an unforeseen throw in the git/model channels.)\n    }\n  }\n  return out;\n}\n","/**\n * Reasoning-model output handling, shared by every Node LLM runtime\n * (the bundled `node-llama-cpp` path in ../node/llama.ts and the remote\n * OpenAI-compatible path in ../node/openai-compat.ts).\n *\n * Qwen3.5 / deepseek-r1 / o-series style models emit a `<think>…</think>`\n * scratchpad before the answer. Both runtimes ask the same model family\n * the same prompts, so they must strip that block identically — keeping\n * this in one place means a fix to the tag handling lands on every\n * runtime at once.\n */\n\n/**\n * Token headroom added on top of an auxiliary pass's answer budget so a\n * reasoning model has room to emit its `<think>` block before the\n * answer (which {@link stripThinking} removes). The visible answers are\n * tiny (~30-40 tokens) but the reasoning pass routinely runs 200-400.\n */\nexport const THINKING_HEADROOM_TOKENS = 400;\n\n/**\n * Strip `<think>…</think>` reasoning blocks (and a trailing unclosed\n * one) from a chat reply, returning only the answer. Tolerates\n * malformed/unclosed tags by also removing a dangling open tag.\n */\nexport function stripThinking(text: string): string {\n  return text\n    .replace(/<think>[\\s\\S]*?<\\/think>/gi, \"\")\n    .replace(/<think>[\\s\\S]*$/i, \"\")\n    .trim();\n}\n","/**\n * Runtime-agnostic LLM passes — the ONE place each pipeline pass\n * (summarise, cognition, title, link-extract, script-summary) is\n * implemented, parameterised over a {@link ChatComplete} transport.\n *\n * Every Node runtime (the bundled `node-llama-cpp` path in\n * ../node/llama.ts, the remote OpenAI-compatible path in\n * ../node/openai-compat.ts) speaks the same prompt contracts (see the\n * sibling ./cognition.ts, ./title.ts, … modules) and differs ONLY in how\n * it runs a single chat completion. So instead of each runtime\n * re-deriving \"guard the input → build the user prompt → run one\n * completion → strip/parse → null-or-throw\", it provides a `ChatComplete`\n * and the factories below own the rest. A prompt-contract or output-cap\n * change then lands on every runtime at once, by construction.\n *\n * The seam: a `ChatComplete` takes a system/user pair plus the answer\n * budget and returns the assistant's answer text with any `<think>`\n * reasoning block ALREADY stripped (the runtime owns stripping because\n * it owns the transport — llama strips the raw session output, the remote\n * port strips the parsed HTTP reply). The headroom a reasoning model\n * needs for that `<think>` block is a per-pass budget concern and lives\n * here (`THINKING_HEADROOM_TOKENS`).\n */\n\nimport {\n  buildCognitionUserPrompt,\n  COGNITION_MAX_TOKENS,\n  COGNITION_SYSTEM_PROMPT,\n  COGNITION_TEMPERATURE,\n  type Cognizer,\n  parseCognitionReply,\n} from \"./cognition.js\";\nimport type { Summarizer } from \"./index.js\";\nimport { SUMMARISER_SYSTEM_PROMPT, SUMMARISER_TEMPERATURE } from \"./prompts.js\";\nimport {\n  buildScriptSummaryUserPrompt,\n  SCRIPT_SUMMARY_MAX_TOKENS,\n  SCRIPT_SUMMARY_OUTPUT_MAX_CHARS,\n  SCRIPT_SUMMARY_SYSTEM_PROMPT,\n  SCRIPT_SUMMARY_TEMPERATURE,\n  type ScriptSummarizer,\n} from \"./script-summary.js\";\nimport {\n  buildLinkExtractUserPrompt,\n  LINK_EXTRACT_MAX_TOKENS,\n  LINK_EXTRACT_SYSTEM_PROMPT,\n  LINK_EXTRACT_TEMPERATURE,\n  type LinkExtractor,\n} from \"./session-metadata.js\";\nimport { THINKING_HEADROOM_TOKENS } from \"./thinking.js\";\nimport {\n  buildTitleUserPrompt,\n  type Entitler,\n  TITLER_MAX_TOKENS,\n  TITLER_SYSTEM_PROMPT,\n  TITLER_TEMPERATURE,\n} from \"./title.js\";\n\n/** One chat completion. `system`/`user` are the two turns; `temperature`\n * and `maxTokens` bound the answer. Returns the assistant answer with any\n * `<think>` block ALREADY stripped by the runtime. Throws on transport\n * failure (the summariser pass propagates it; best-effort passes catch). */\nexport interface ChatRequest {\n  readonly system: string;\n  readonly user: string;\n  readonly temperature: number;\n  readonly maxTokens: number;\n}\nexport type ChatComplete = (req: ChatRequest) => Promise<string>;\n\n/** Token budget for one summarise call. Reasoning models routinely burn\n * 400-800 tokens on the `<think>` pass before the answer; ceil generous\n * so they don't starve. The output is sliced to {@link SUMMARY_OUTPUT_MAX_CHARS}\n * AFTER stripping, not bounded by this budget. Non-thinking models stop\n * at EOS well before it. The pipeline's caller passes a much smaller\n * `maxTokens` estimate which the summariser pass deliberately IGNORES. */\nexport const SUMMARY_MAX_TOKENS = 1024;\n/** Hard char cap on the returned abstract — leaves room under the\n * 512-char Segment cap for caller-added context (e.g. \"work on ${repo}\"). */\nexport const SUMMARY_OUTPUT_MAX_CHARS = 240;\n\n/**\n * Summariser pass — REQUIRED output. Runs one completion over the\n * pre-built prompt and returns a ≤240-char abstract. Throws when the\n * model yields nothing (e.g. it spent the whole budget on `<think>`, or\n * the chat template is wrong) so the resilient wrapper in apps/daemon can\n * degrade to the extractive fallback. The caller's `maxTokens` estimate\n * is ignored in favour of {@link SUMMARY_MAX_TOKENS}.\n */\nexport function makeSummarizer(chat: ChatComplete): Summarizer {\n  return async ({ prompt }) => {\n    const out = await chat({\n      system: SUMMARISER_SYSTEM_PROMPT,\n      user: prompt,\n      temperature: SUMMARISER_TEMPERATURE,\n      maxTokens: SUMMARY_MAX_TOKENS,\n    });\n    if (out.length === 0) {\n      throw new Error(\n        \"summariser returned no answer text after stripping <think> blocks — the thinking \" +\n          \"budget may be too low or the model template is misconfigured.\",\n      );\n    }\n    return out.slice(0, SUMMARY_OUTPUT_MAX_CHARS);\n  };\n}\n\n/** Cognition pass — best-effort mood/mind/posture tags from the\n * already-redacted abstract. Sub-threshold input or any failure ⇒ null\n * (segment ships without the suffix). The guard short-circuits BEFORE the\n * port so no completion is run for a trivial abstract. */\nexport function makeCognizer(chat: ChatComplete): Cognizer {\n  return async ({ abstract }) => {\n    if (!abstract || abstract.trim().length < 12) return null;\n    try {\n      const out = await chat({\n        system: COGNITION_SYSTEM_PROMPT,\n        user: buildCognitionUserPrompt(abstract),\n        temperature: COGNITION_TEMPERATURE,\n        maxTokens: COGNITION_MAX_TOKENS + THINKING_HEADROOM_TOKENS,\n      });\n      return parseCognitionReply(out);\n    } catch {\n      return null;\n    }\n  };\n}\n\n/** Session-title pass — best-effort, one short completion over the\n * redacted abstracts. Empty input or any failure ⇒ null and the caller\n * falls back to a deterministic title. */\nexport function makeEntitler(chat: ChatComplete): Entitler {\n  return async (input) => {\n    if (input.abstracts.length === 0) return null;\n    try {\n      const out = await chat({\n        system: TITLER_SYSTEM_PROMPT,\n        user: buildTitleUserPrompt(input),\n        temperature: TITLER_TEMPERATURE,\n        maxTokens: TITLER_MAX_TOKENS + THINKING_HEADROOM_TOKENS,\n      });\n      return out || null;\n    } catch {\n      return null;\n    }\n  };\n}\n\n/** Link-extraction pass — best-effort, surfaces PR/issue/commit refs from\n * the redacted abstracts as free text the caller re-parses\n * deterministically. Empty input or any failure ⇒ null. */\nexport function makeLinkExtractor(chat: ChatComplete): LinkExtractor {\n  return async ({ abstracts }) => {\n    if (abstracts.length === 0) return null;\n    try {\n      const out = await chat({\n        system: LINK_EXTRACT_SYSTEM_PROMPT,\n        user: buildLinkExtractUserPrompt(abstracts),\n        temperature: LINK_EXTRACT_TEMPERATURE,\n        maxTokens: LINK_EXTRACT_MAX_TOKENS + THINKING_HEADROOM_TOKENS,\n      });\n      return out || null;\n    } catch {\n      return null;\n    }\n  };\n}\n\n/** Per-script content-summary pass — best-effort one-sentence abstract of\n * what running a script FILE does. Empty content or any failure ⇒ null\n * and the call ships without a script abstract. */\nexport function makeScriptSummarizer(chat: ChatComplete): ScriptSummarizer {\n  return async ({ ref, content }) => {\n    if (!content || content.trim().length === 0) return null;\n    try {\n      const out = await chat({\n        system: SCRIPT_SUMMARY_SYSTEM_PROMPT,\n        user: buildScriptSummaryUserPrompt({ ref, content }),\n        temperature: SCRIPT_SUMMARY_TEMPERATURE,\n        maxTokens: SCRIPT_SUMMARY_MAX_TOKENS + THINKING_HEADROOM_TOKENS,\n      });\n      const oneLine = out.replace(/\\s+/g, \" \").trim();\n      return oneLine ? oneLine.slice(0, SCRIPT_SUMMARY_OUTPUT_MAX_CHARS) : null;\n    } catch {\n      return null;\n    }\n  };\n}\n","/**\n * Local-LLM redaction backstop (defense-in-depth, layer 3).\n *\n * Layer 1 (`@modelstat/core/redact`, deterministic regex + entropy) and layer 2\n * (the on-device Privacy Filter NER model) run first. This third pass asks the\n * bundled local model to spot any *remaining* secret/PII it recognises that the\n * earlier layers' fixed patterns missed (novel key formats, contextual PII).\n *\n * SAFETY — the model never rewrites the text. It only *names* candidate\n * substrings; we then replace each **verbatim occurrence** deterministically\n * (see {@link applyLlmRedactions}). So the model can only ever ADD a redaction of\n * a string that genuinely appears — it cannot reword a command, invent a\n * redaction, or leak more. On any error/empty reply the text is returned\n * unchanged (the earlier layers already redacted it) — fail-safe, never\n * fail-open. Everything runs on-device; no text leaves the machine.\n */\n\nimport type { Redactor } from \"./index.js\";\n\n/**\n * Chain redactors into one: each runs on the previous one's output, and their\n * `counts` merge. Each sub-redactor is independently fail-safe (returns its\n * input on error), and a thrown redactor is skipped — so the chain can only ever\n * redact MORE, never less, and never throws. Used to stack the Privacy Filter\n * (layer 2) and the local-LLM backstop (layer 3) behind one `redact` adapter.\n */\nexport function composeRedactors(...redactors: Redactor[]): Redactor {\n  return async (text: string) => {\n    let out = text;\n    const counts: Record<string, number> = {};\n    for (const r of redactors) {\n      try {\n        const res = await r(out);\n        out = res.text;\n        for (const [k, v] of Object.entries(res.counts)) counts[k] = (counts[k] ?? 0) + v;\n      } catch {\n        // fail-safe: keep the prior layer's output and continue\n      }\n    }\n    return { text: out, counts };\n  };\n}\n\n/** Placeholder for an LLM-flagged secret/PII span. */\nexport const LLM_REDACTION_MARKER = \"[REDACTED:llm]\";\n\n/** Minimum length of an LLM-flagged substring we'll act on. Secrets/keys are\n * long; this avoids nuking short, common, high-value-for-analytics tokens (a\n * model that flags `prod` or `api` shouldn't blank them everywhere). Short PII\n * (names) is the Privacy Filter's job (layer 2). */\nconst MIN_CANDIDATE_CHARS = 8;\n\n/** Infra/code words a model sometimes over-flags as \"sensitive\" — never redact\n * these even if returned (they carry real analytic signal and aren't secrets). */\nconst SAFE_WORDS = new Set([\n  \"production\",\n  \"staging\",\n  \"localhost\",\n  \"endpoint\",\n  \"database\",\n  \"password\", // the literal word (e.g. a flag name), not a value\n  \"secret\",\n  \"token\",\n  \"credential\",\n  \"[redacted\",\n]);\n\nexport const REDACT_SYSTEM_PROMPT =\n  \"You are a security redaction reviewer. You are given a single shell command \" +\n  \"that has already been partly redacted. Find any remaining SECRETS or sensitive \" +\n  \"credentials still present in plaintext: API keys, access tokens, bearer tokens, \" +\n  \"passwords, private keys, connection strings with credentials, or other \" +\n  \"high-entropy secret values. Do NOT flag: program names, flags, file paths, \" +\n  \"hostnames, service/environment names (prod, dev), or existing [REDACTED:...] \" +\n  \"markers. Output ONLY the exact secret substrings, one per line, copied \" +\n  \"verbatim character-for-character as they appear in the command. If there are \" +\n  \"no remaining secrets, output exactly NONE. Output nothing else — no prose, no \" +\n  \"explanation, no numbering.\";\n\n/** Token budget — the model reasons (`<think>`) then lists a few short lines. */\nexport const REDACT_MAX_TOKENS = 512;\nexport const REDACT_TEMPERATURE = 0;\n\n/** Cheap pre-filter: only spend a model call on commands that *could* still\n * carry a secret the earlier layers missed. Skips the overwhelming majority\n * (`git status`, `ls`, `cd …`) so the LLM pass is affordable per-call and in a\n * full reprocess. */\nexport function shouldDeepRedact(text: string): boolean {\n  if (!text) return false;\n  if (/[=]|--|:\\/\\/|@|\\bbearer\\b|token|secret|password|passwd|credential|api[_-]?key|private[_-]?key/i.test(text)) {\n    return true;\n  }\n  // A long unbroken token is a generic key/blob signal.\n  return /[A-Za-z0-9/+_-]{20,}/.test(text);\n}\n\n/** Parse the model's reply into candidate secret substrings. */\nexport function parseRedactReply(raw: string): string[] {\n  const out: string[] = [];\n  const seen = new Set<string>();\n  for (const line of raw.split(\"\\n\")) {\n    const s = line.trim().replace(/^[\"'`]+|[\"'`]+$/g, \"\");\n    if (!s || s.toUpperCase() === \"NONE\") continue;\n    if (s.length < MIN_CANDIDATE_CHARS) continue;\n    if (SAFE_WORDS.has(s.toLowerCase())) continue;\n    if (s.startsWith(\"[REDACTED\")) continue;\n    if (seen.has(s)) continue;\n    seen.add(s);\n    out.push(s);\n  }\n  return out;\n}\n\n/** Escape a literal string for use in a RegExp. */\nfunction escapeRe(s: string): string {\n  return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace every verbatim occurrence of each model-flagged candidate with\n * {@link LLM_REDACTION_MARKER}. Only candidates that actually appear in `text`\n * (and clear the length/safe-word guards in {@link parseRedactReply}) are\n * applied, so this can only ever ADD a redaction of a real substring.\n */\nexport function applyLlmRedactions(\n  text: string,\n  candidates: readonly string[],\n): { text: string; count: number } {\n  let out = text;\n  let count = 0;\n  // Longest-first so a candidate that contains another doesn't get partially\n  // pre-redacted out from under the longer one.\n  for (const cand of [...candidates].sort((a, b) => b.length - a.length)) {\n    if (!out.includes(cand)) continue;\n    const before = out;\n    out = out.replace(new RegExp(escapeRe(cand), \"g\"), LLM_REDACTION_MARKER);\n    if (out !== before) count += 1;\n  }\n  return { text: out, count };\n}\n","/**\n * Bundled local-LLM summariser for the Node CLI — runs a local Qwen3\n * GGUF via `node-llama-cpp` so the agent produces real content\n * abstracts even when the user has no Ollama installed.\n *\n *   model       : Qwen3.5-4B-Q4_K_M.gguf (~2.7 GB, 4-bit quantised) — the\n *                 most capable Qwen that ships to a laptop (~2 GB class);\n *                 lands near Qwen2.5-32B on summarisation.\n *   download    : lazy on first call → cached at ~/.modelstat/models/\n *   inference   : ~0.5–3 s / segment (Metal/CPU-dependent; 4B is heavier\n *                 than the old 0.6B but far higher quality)\n *   contract    : same Summarizer signature as ollamaSummarize\n *\n * `node-llama-cpp` ships prebuilt native binaries per platform via npm,\n * so we declare it as an optional peerDependency here and a real\n * dependency in the agent CLI. Imports are dynamic so a daemon that\n * doesn't have the package installed (e.g. the bundled service when\n * node_modules isn't beside the bundle) silently falls through to the\n * next adapter in the chain — see apps/daemon/src/pipeline.ts.\n */\n\nimport { existsSync, rmSync, writeFileSync } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { COGNITION_SYSTEM_PROMPT, type Cognizer } from \"../pipeline/cognition.js\";\nimport type { Redactor, Summarizer } from \"../pipeline/index.js\";\nimport {\n  type ChatComplete,\n  makeCognizer,\n  makeEntitler,\n  makeLinkExtractor,\n  makeScriptSummarizer,\n  makeSummarizer,\n} from \"../pipeline/passes.js\";\nimport { SUMMARISER_SYSTEM_PROMPT } from \"../pipeline/prompts.js\";\nimport {\n  applyLlmRedactions,\n  parseRedactReply,\n  REDACT_MAX_TOKENS,\n  REDACT_SYSTEM_PROMPT,\n  REDACT_TEMPERATURE,\n  shouldDeepRedact,\n} from \"../pipeline/redaction.js\";\nimport { SCRIPT_SUMMARY_SYSTEM_PROMPT, type ScriptSummarizer } from \"../pipeline/script-summary.js\";\nimport { LINK_EXTRACT_SYSTEM_PROMPT, type LinkExtractor } from \"../pipeline/session-metadata.js\";\nimport { stripThinking, THINKING_HEADROOM_TOKENS } from \"../pipeline/thinking.js\";\nimport { type Entitler, TITLER_SYSTEM_PROMPT } from \"../pipeline/title.js\";\n\nexport interface LlamaConfig {\n  /** Filesystem path to a GGUF model. If absent, we download `modelUrl`\n   * to `<modelsDir>/<basename(modelUrl)>` on first use. */\n  modelPath?: string;\n  /** Remote URL to download the GGUF from when `modelPath` isn't set\n   * or doesn't exist on disk. */\n  modelUrl?: string;\n  /** Where to cache downloaded models. Default: `~/.modelstat/models`. */\n  modelsDir?: string;\n  /** Llama context window — kept small since prompts are bounded. */\n  contextSize?: number;\n}\n\n/**\n * Default bundled-summariser model — Qwen3.5-4B Q4_K_M GGUF (~2.7 GB).\n *\n * Selection rationale (April 2026):\n *   - Latest dense Qwen at the size we can ship to a laptop. Qwen3.6\n *     only exists at 27B+ which is too large.\n *   - Hybrid-thinking: the model writes `<think>…</think>` reasoning\n *     before the answer, which materially improves \"describe what the\n *     human was building\" outputs over non-thinking small models. The\n *     adapter strips the thinking block before returning.\n *   - Q4_K_M strikes the right quality/size balance for a one-shot\n *     ~240-char summary task; smaller quants (Q3) start fumbling\n *     instruction-following at this size.\n *   - lmstudio-community is the trusted re-quantiser used by LM Studio\n *     itself, so the URL is stable and the templates baked into the\n *     GGUF metadata are correct (node-llama-cpp auto-detects them).\n *\n * The first scan on a fresh machine downloads ~2.7 GB; subsequent\n * scans are instant. Override with `MODELSTAT_LLAMA_MODEL_URL` (and\n * `MODELSTAT_LLAMA_MODEL_PATH`) to point at a different GGUF — useful\n * for testing or for users who already have a quant on disk.\n */\nexport const DEFAULT_LLAMA_MODEL_URL =\n  \"https://huggingface.co/lmstudio-community/Qwen3.5-4B-GGUF/resolve/main/Qwen3.5-4B-Q4_K_M.gguf\";\n\nexport function defaultLlamaConfig(): Required<LlamaConfig> {\n  const env =\n    (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env ?? {};\n  const modelsDir = env.MODELSTAT_MODELS_DIR ?? join(homedir(), \".modelstat\", \"models\");\n  const modelUrl = env.MODELSTAT_LLAMA_MODEL_URL ?? DEFAULT_LLAMA_MODEL_URL;\n  const modelPath = env.MODELSTAT_LLAMA_MODEL_PATH ?? join(modelsDir, basenameFromUrl(modelUrl));\n  return {\n    modelPath,\n    modelUrl,\n    modelsDir,\n    // Qwen3.5-4B has a 128K native context; we only need enough to\n    // fit our prompt (~2 KB) plus thinking budget plus answer.\n    // 4096 is plenty and keeps memory footprint reasonable on\n    // older machines.\n    contextSize: Number(env.MODELSTAT_LLAMA_CONTEXT ?? 4096),\n  };\n}\n\nfunction basenameFromUrl(url: string): string {\n  // Strip query/fragment and grab the trailing filename.\n  const clean = url.split(\"?\")[0]!.split(\"#\")[0]!;\n  const parts = clean.split(\"/\");\n  return parts[parts.length - 1] || \"model.gguf\";\n}\n\n/* ─── Singleton model + serialised inference ─────────────────────── */\n\n// Loading is expensive (model file mmap + warm-up): hold onto the\n// sessions for the life of the process. Inference is single-threaded\n// per llama context, so callers are queued through `inflight`.\n//\n// Four LlamaChatSessions share the same loaded model but each has its\n// own context sequence with a different system prompt:\n//   - summarizer:      SUMMARISER_SYSTEM_PROMPT     — primary scan-time work\n//   - cognizer:        COGNITION_SYSTEM_PROMPT      — best-effort mood/mode pass\n//   - entitler:        TITLER_SYSTEM_PROMPT         — best-effort per-session title\n//   - scriptSummarizer: SCRIPT_SUMMARY_SYSTEM_PROMPT — best-effort per-script content abstract\n//   - linkExtractor:    LINK_EXTRACT_SYSTEM_PROMPT   — best-effort per-session PR/issue/commit refs\n// Each context's KV-cache is small (≤4K tokens) compared to the model\n// weights (~2.7GB), so the extra contexts are cheap. We still serialise\n// all calls through one `inflight` queue — llama.cpp can technically\n// run several contexts in parallel but it competes for the same CPU/GPU\n// and the auxiliary passes are fast enough that interleaving isn't\n// worth the complexity.\ntype Session = {\n  // Kept loosely typed — actual class shapes come from a dynamic import\n  // so we don't drag node-llama-cpp's types into this file.\n  prompt: (p: string, o: unknown) => Promise<string>;\n  resetChatHistory: () => void;\n};\ntype Loaded = {\n  summarizer: Session;\n  cognizer: Session;\n  entitler: Session;\n  scriptSummarizer: Session;\n  linkExtractor: Session;\n  redactor: Session;\n};\nlet loaded: Loaded | null = null;\nlet loadPromise: Promise<Loaded> | null = null;\nlet inflight: Promise<unknown> = Promise.resolve();\n// The underlying node-llama-cpp instance, kept so we can dispose it (and\n// every model/context spun off it) before the process exits — see\n// disposeLlama() for why that matters on macOS/Metal.\nlet llamaInstance: { dispose: () => Promise<void> } | null = null;\n// Set once disposeLlama() begins teardown. Once armed, loadOnce() and the\n// per-pass adapters REFUSE to admit new inference so we don't keep a context\n// busy while we're trying to free the Metal device underneath it — the exact\n// race that fired `libc++abi: terminating … mutex lock failed` on auto-update\n// (the updater calls disposeLlama() while a scan segment was still in-flight).\nlet disposing = false;\n// Hard cap on how long disposeLlama() waits for in-flight inference to drain\n// before it frees the device anyway. A wedged prompt must not block process\n// exit forever; 8s comfortably exceeds a single ≤4K-token completion.\nconst DISPOSE_DRAIN_TIMEOUT_MS = 8_000;\n\n/**\n * Tear the bundled summariser down cleanly before the process exits.\n *\n * node-llama-cpp's llama.cpp Metal backend aborts with\n * `GGML_ASSERT([rsets->data count] == 0)` when its device is freed by C++\n * static destructors at `exit()` while contexts are still alive (macOS).\n * The agent hit this on every launchd stop/restart: the daemon's `exit(0)`\n * crashed instead of exiting clean, so launchd saw a failed exit. Disposing\n * the Llama instance here frees its contexts + model + device in order, so\n * the static-destructor path has nothing left to free.\n *\n * No-op when the bundled summariser was never loaded (e.g. the Ollama\n * path, or a process that never summarised), so it is always safe to call\n * from a shutdown handler / before a one-shot command returns.\n *\n * Drains BEFORE freeing: `inst.dispose()` tears down the contexts + model +\n * Metal device, and llama.cpp aborts (`libc++abi … mutex lock failed`, or the\n * Metal `GGML_ASSERT`) if a context is mid-prompt when its device is freed.\n * The updater/shutdown path calls us while a scan segment can still be running,\n * so we (1) arm `disposing` to stop NEW work being admitted, then (2) await the\n * current `inflight` chain to settle — capped at {@link DISPOSE_DRAIN_TIMEOUT_MS}\n * so a wedged prompt can't block process exit forever — and only then dispose.\n */\nexport async function disposeLlama(): Promise<void> {\n  disposing = true;\n  const inst = llamaInstance;\n  llamaInstance = null;\n  loaded = null;\n  loadPromise = null;\n  if (!inst) return;\n  // Drain whatever inference is in flight so no context is mid-prompt when we\n  // free the device. `inflight` is the serialiser tail every adapter chains\n  // onto; awaiting it (errors swallowed) means the last queued prompt has\n  // returned. Race it against a hard timeout so a stuck prompt still exits.\n  try {\n    let drainTimer: ReturnType<typeof setTimeout> | undefined;\n    const drainCap = new Promise<void>((resolve) => {\n      drainTimer = setTimeout(resolve, DISPOSE_DRAIN_TIMEOUT_MS);\n      drainTimer.unref?.();\n    });\n    await Promise.race([inflight.catch(() => undefined), drainCap]);\n    if (drainTimer) clearTimeout(drainTimer);\n  } catch {\n    /* best-effort drain — fall through to dispose regardless */\n  }\n  try {\n    await inst.dispose();\n  } catch {\n    // Best-effort: if dispose itself throws we still want a clean process\n    // exit; the OS reclaims the resources regardless.\n  }\n}\n\n/**\n * Download the summariser GGUF to disk if it isn't already there.\n * Exported so the agent CLI can call it in two places:\n *   1. npm `postinstall` — pull the model right after `npm install`\n *      so the user sees the long download attached to the install\n *      they just kicked off, not as a surprise mid-`scan`.\n *   2. `npx modelstat@latest` step 2.5 — guarantee the model is on\n *      disk BEFORE installing the background service, so the\n *      service's first preflight succeeds and real abstracts start\n *      streaming immediately rather than after a silent 2.7 GB pull.\n *\n * Idempotent: returns the path immediately if the file exists.\n *\n * Progress is rendered as either a single redrawing TTY line (when\n * stdout is a TTY) or as periodic newline-separated lines (in pipes\n * / log files) so postinstall output reads cleanly in both contexts.\n */\nexport async function ensureLlamaModel(\n  cfg: Required<LlamaConfig> = defaultLlamaConfig(),\n): Promise<string> {\n  if (existsSync(cfg.modelPath)) return cfg.modelPath;\n  await mkdir(dirname(cfg.modelPath), { recursive: true });\n\n  const res = await fetch(cfg.modelUrl);\n  if (!res.ok || !res.body) {\n    throw new Error(`model download failed: ${res.status} ${res.statusText} (${cfg.modelUrl})`);\n  }\n  const total = Number(res.headers.get(\"content-length\") ?? 0);\n  const totalMb = total > 0 ? (total / (1024 * 1024)).toFixed(0) : \"?\";\n  // biome-ignore lint/suspicious/noConsole: long download — surface it\n  console.log(`[modelstat] downloading summariser model (~${totalMb} MB) → ${cfg.modelPath}`);\n  const tmp = `${cfg.modelPath}.partial`;\n  const { createWriteStream } = await import(\"node:fs\");\n  const { Readable } = await import(\"node:stream\");\n  const { rename } = await import(\"node:fs/promises\");\n  const out = createWriteStream(tmp);\n  const isTty = Boolean((process.stdout as unknown as { isTTY?: boolean }).isTTY);\n  let received = 0;\n  let lastLog = 0;\n  let lastBytes = 0;\n  let lastTimeForRate = Date.now();\n  const startTime = Date.now();\n  const renderProgress = (final = false) => {\n    const now = Date.now();\n    const dt = (now - lastTimeForRate) / 1000;\n    const dBytes = received - lastBytes;\n    const rateMbps = dt > 0 ? dBytes / 1024 / 1024 / dt : 0;\n    lastBytes = received;\n    lastTimeForRate = now;\n    const mb = (received / (1024 * 1024)).toFixed(1);\n    const pct = total > 0 ? ((received / total) * 100).toFixed(1) : \"?\";\n    const eta =\n      total > 0 && rateMbps > 0\n        ? Math.max(0, Math.round((total - received) / 1024 / 1024 / rateMbps))\n        : null;\n    const etaStr = eta != null ? ` · ETA ${eta}s` : \"\";\n    const elapsed = ((now - startTime) / 1000).toFixed(0);\n    const line = `[modelstat]   ${mb} / ${totalMb} MB (${pct}%) · ${rateMbps.toFixed(1)} MB/s${etaStr} · ${elapsed}s`;\n    if (isTty && !final) {\n      process.stdout.write(`\\r${line}\\x1b[K`);\n    } else {\n      // biome-ignore lint/suspicious/noConsole: progress\n      console.log(line);\n    }\n  };\n\n  const nodeStream = Readable.fromWeb(\n    res.body as unknown as Parameters<typeof Readable.fromWeb>[0],\n  );\n  nodeStream.on(\"data\", (chunk: Buffer) => {\n    received += chunk.length;\n    const now = Date.now();\n    if (now - lastLog > (isTty ? 200 : 2000)) {\n      renderProgress();\n      lastLog = now;\n    }\n  });\n  await new Promise<void>((resolve, reject) => {\n    nodeStream.pipe(out);\n    out.on(\"finish\", () => resolve());\n    out.on(\"error\", reject);\n    nodeStream.on(\"error\", reject);\n  });\n  renderProgress(true);\n  if (isTty) process.stdout.write(\"\\n\");\n  await rename(tmp, cfg.modelPath);\n  // biome-ignore lint/suspicious/noConsole: completion\n  console.log(`[modelstat] summariser model ready (${cfg.modelPath})`);\n  return cfg.modelPath;\n}\n\nasync function loadOnce(cfg: Required<LlamaConfig>): Promise<Loaded> {\n  // Teardown has started — refuse to (re)load. Admitting a fresh model/context\n  // here would race disposeLlama() freeing the device. Throwing matches the\n  // existing contract: best-effort passes catch → null, the summariser surfaces\n  // → extractive fallback. Either way nothing touches a half-freed device.\n  if (disposing) throw new Error(\"llama summariser is shutting down\");\n  if (loaded) return loaded;\n  if (loadPromise) return loadPromise;\n  loadPromise = (async () => {\n    // Dynamic import so the rest of daemon-core stays usable when\n    // `node-llama-cpp` isn't installed (browser, server, slimmed\n    // bundles). Failure here is the caller's signal to fall through.\n    // Optional peerDependency — typed as `unknown` from this side so\n    // daemon-core typechecks even when the consumer hasn't pulled\n    // the package in. Agent CLI declares `node-llama-cpp` as a real\n    // dep so the import resolves at runtime there.\n    // @ts-expect-error — optional peer; resolved at runtime\n    const llamaMod = (await import(\"node-llama-cpp\")) as {\n      getLlama: (opts?: { gpu?: false }) => Promise<unknown>;\n      LlamaChatSession: new (opts: unknown) => Session;\n    };\n    const modelPath = await ensureLlamaModel(cfg);\n    // Metal-abort guard. On some Macs node-llama-cpp's llama.cpp Metal backend\n    // ABORTS the whole process during init/load with `GGML_ASSERT([rsets->data\n    // count] == 0)` (\"the tensor API is not supported in this environment\") — an\n    // uncatchable C++ abort, so try/catch can't save us. Instead we arm a guard\n    // file before touching Metal and disarm it once the model has loaded: a file\n    // left behind means the last start aborted on Metal, so this start runs on\n    // CPU. Working-Metal Macs keep Metal (fast); a broken-Metal Mac summarises on\n    // CPU instead of crash-looping. Delete the guard to re-probe Metal (e.g.\n    // after a node-llama-cpp upgrade).\n    const guardPath = `${dirname(modelPath)}/.metal-load-guard`;\n    const metalAborted = existsSync(guardPath);\n    if (!metalAborted) {\n      try {\n        writeFileSync(guardPath, \"probing metal\\n\");\n      } catch {\n        /* best-effort guard; proceed regardless */\n      }\n    }\n    const llama = (await llamaMod.getLlama(metalAborted ? { gpu: false } : undefined)) as {\n      loadModel: (o: { modelPath: string }) => Promise<{\n        createContext: (o: { contextSize: number }) => Promise<{\n          getSequence: () => unknown;\n        }>;\n      }>;\n      dispose: () => Promise<void>;\n    };\n    // Hold the instance so disposeLlama() can free it before the process\n    // exits (clean Metal teardown).\n    llamaInstance = llama;\n    const model = await llama.loadModel({ modelPath });\n    // Disarm the guard ONLY when we just proved METAL works (we probed it this\n    // start — i.e. the guard wasn't already set). A successful CPU load must NOT\n    // remove the \"Metal is broken on this machine\" marker: otherwise the next\n    // clean start re-probes Metal and aborts again, OSCILLATING crash↔CPU on\n    // every restart (a broken-Metal Mac never settles on CPU — exactly the\n    // crash-loop we hit). The guard now STICKS until a node-llama-cpp upgrade\n    // (or a manual delete) re-probes Metal.\n    if (!metalAborted) {\n      try {\n        rmSync(guardPath, { force: true });\n      } catch {\n        /* best-effort */\n      }\n    }\n    // Two contexts off the same model — one per chat session. The\n    // cognition context can be smaller since its prompt + answer are\n    // both short, but llama.cpp rounds context sizes up to its block\n    // size internally so going below ~1024 saves nothing meaningful.\n    const summariserContext = await model.createContext({\n      contextSize: cfg.contextSize,\n    });\n    const cognizerContext = await model.createContext({\n      contextSize: Math.min(cfg.contextSize, 2048),\n    });\n    // Title prompts carry up to ~10 sampled abstracts (~2.5 KB) plus\n    // the thinking budget — the same envelope as the summariser, so\n    // reuse the full configured context size rather than the small one.\n    const entitlerContext = await model.createContext({\n      contextSize: cfg.contextSize,\n    });\n    // Script-summary prompts carry a (capped) script file body plus the\n    // thinking budget — same envelope as the summariser.\n    const scriptContext = await model.createContext({\n      contextSize: cfg.contextSize,\n    });\n    const summarizer = new llamaMod.LlamaChatSession({\n      contextSequence: summariserContext.getSequence(),\n      systemPrompt: SUMMARISER_SYSTEM_PROMPT,\n    });\n    const cognizer = new llamaMod.LlamaChatSession({\n      contextSequence: cognizerContext.getSequence(),\n      systemPrompt: COGNITION_SYSTEM_PROMPT,\n    });\n    const entitler = new llamaMod.LlamaChatSession({\n      contextSequence: entitlerContext.getSequence(),\n      systemPrompt: TITLER_SYSTEM_PROMPT,\n    });\n    const scriptSummarizer = new llamaMod.LlamaChatSession({\n      contextSequence: scriptContext.getSequence(),\n      systemPrompt: SCRIPT_SUMMARY_SYSTEM_PROMPT,\n    });\n    // Link-extraction prompts carry up to ~12 sampled abstracts — same\n    // envelope as the titler, so reuse the full configured context size.\n    const linkExtractContext = await model.createContext({\n      contextSize: cfg.contextSize,\n    });\n    const linkExtractor = new llamaMod.LlamaChatSession({\n      contextSequence: linkExtractContext.getSequence(),\n      systemPrompt: LINK_EXTRACT_SYSTEM_PROMPT,\n    });\n    // Redaction backstop — one short command in, a few candidate substrings out.\n    const redactorContext = await model.createContext({\n      contextSize: Math.min(cfg.contextSize, 2048),\n    });\n    const redactor = new llamaMod.LlamaChatSession({\n      contextSequence: redactorContext.getSequence(),\n      systemPrompt: REDACT_SYSTEM_PROMPT,\n    });\n    loaded = { summarizer, cognizer, entitler, scriptSummarizer, linkExtractor, redactor };\n    return loaded;\n  })();\n  try {\n    return await loadPromise;\n  } catch (err) {\n    loadPromise = null;\n    throw err;\n  }\n}\n\n/**\n * A {@link ChatComplete} backed by one preloaded chat session — the\n * bundled runtime's single point of variation; the per-pass logic lives\n * in `../pipeline/passes.ts`. `pick` selects which session runs the\n * completion (each was created in `loadOnce` with its pass's system\n * prompt baked in, so the port ignores `req.system`).\n *\n * Serialisation invariant (do not change lightly): the chat session has\n * ONE context sequence, so concurrent prompts would interleave. We chain\n * every call through the module `inflight` queue — `resetChatHistory()`\n * runs INSIDE the `.then` callback (never before queuing, or a later\n * caller could reset a call mid-flight), and `inflight` is reassigned to\n * THIS call's promise so the next caller awaits us. `loadOnce` throws\n * propagate: the summariser pass surfaces them (→ degrade), best-effort\n * passes catch them (→ null), exactly as before.\n */\nfunction llamaChat(cfg: Required<LlamaConfig>, pick: (l: Loaded) => Session): ChatComplete {\n  return async (req) => {\n    const session = pick(await loadOnce(cfg));\n    const run = inflight.then(async () => {\n      // Re-check at the head of the queue: disposeLlama() may have armed\n      // teardown while we were waiting our turn, and starting a prompt now\n      // would race the device being freed.\n      if (disposing) throw new Error(\"llama summariser is shutting down\");\n      session.resetChatHistory();\n      const raw = await session.prompt(req.user, {\n        temperature: req.temperature,\n        maxTokens: req.maxTokens,\n      });\n      return stripThinking(raw ?? \"\");\n    });\n    inflight = run.catch(() => undefined);\n    return run;\n  };\n}\n\n/**\n * Summariser adapter — REQUIRED output, drop-in for `ollamaSummarize`.\n * Same prompt contract, same ≤240-char cap (both owned by\n * `makeSummarizer`). On first call, pulls the GGUF to disk and warms the\n * llama context; subsequent calls queue through the `inflight` serialiser.\n */\nexport function llamaSummarize(cfg: Required<LlamaConfig> = defaultLlamaConfig()): Summarizer {\n  return makeSummarizer(llamaChat(cfg, (l) => l.summarizer));\n}\n\n/** Cognition adapter — best-effort `{ emotions, meta }` tags from the\n * post-redaction abstract, on the `COGNITION_SYSTEM_PROMPT` session.\n * Failure ⇒ null and the segment ships without the suffix. */\nexport function llamaCognize(cfg: Required<LlamaConfig> = defaultLlamaConfig()): Cognizer {\n  return makeCognizer(llamaChat(cfg, (l) => l.cognizer));\n}\n\n/** Session-title adapter — best-effort, on the `TITLER_SYSTEM_PROMPT`\n * session. Failure ⇒ null and `buildSessionTitles` uses its\n * deterministic fallback. */\nexport function llamaEntitle(cfg: Required<LlamaConfig> = defaultLlamaConfig()): Entitler {\n  return makeEntitler(llamaChat(cfg, (l) => l.entitler));\n}\n\n/** Per-script content-summary adapter — best-effort, on the\n * `SCRIPT_SUMMARY_SYSTEM_PROMPT` session. One factual sentence per script\n * FILE; failure ⇒ null and the call ships without a script abstract. The\n * file contents never leave the device on this local path. */\nexport function llamaScriptSummarize(\n  cfg: Required<LlamaConfig> = defaultLlamaConfig(),\n): ScriptSummarizer {\n  return makeScriptSummarizer(llamaChat(cfg, (l) => l.scriptSummarizer));\n}\n\n/** Link-extraction adapter — best-effort, on the\n * `LINK_EXTRACT_SYSTEM_PROMPT` session. Surfaces PR/issue/commit/repo\n * refs from the redacted abstracts for clients whose logs carry no git\n * data; failure ⇒ null and detection falls back to the deterministic\n * git + content channels. */\nexport function llamaExtractLinks(\n  cfg: Required<LlamaConfig> = defaultLlamaConfig(),\n): LinkExtractor {\n  return makeLinkExtractor(llamaChat(cfg, (l) => l.linkExtractor));\n}\n\n/**\n * Local-LLM redaction backstop (layer 3) — see `../pipeline/redaction.ts`. Asks\n * the bundled model to name any secret substrings still present after the regex +\n * Privacy-Filter passes, then deletes those exact substrings deterministically.\n * Cheap pre-filter (`shouldDeepRedact`) skips the common no-secret command, so\n * most calls cost nothing. Fail-safe: model unavailable / error / empty reply →\n * the input is returned unchanged (the earlier layers already redacted it).\n */\nexport function llamaRedact(cfg: Required<LlamaConfig> = defaultLlamaConfig()): Redactor {\n  return async (text: string) => {\n    const unchanged = { text, counts: {} as Record<string, number> };\n    if (!shouldDeepRedact(text)) return unchanged;\n    let loadedSessions: Loaded;\n    try {\n      loadedSessions = await loadOnce(cfg);\n    } catch {\n      return unchanged;\n    }\n    const { redactor } = loadedSessions;\n    const run = inflight.then(async () => {\n      if (disposing) throw new Error(\"llama summariser is shutting down\");\n      redactor.resetChatHistory();\n      const raw = await redactor.prompt(text, {\n        temperature: REDACT_TEMPERATURE,\n        // Thinking budget on top of the short list of substrings.\n        maxTokens: REDACT_MAX_TOKENS + THINKING_HEADROOM_TOKENS,\n      });\n      return stripThinking(raw ?? \"\");\n    });\n    inflight = run.catch(() => undefined);\n    let reply: string;\n    try {\n      reply = await run;\n    } catch {\n      return unchanged;\n    }\n    const candidates = parseRedactReply(reply);\n    if (candidates.length === 0) return unchanged;\n    const { text: redacted, count } = applyLlmRedactions(text, candidates);\n    return { text: redacted, counts: count > 0 ? { llm_secrets: count } : {} };\n  };\n}\n","/**\n * Ollama adapters for the daemon pipeline on Node (CLI + worker).\n *\n * Binds redact → segment → summarise → tag to a local Ollama daemon.\n * Models are the same Qwen family used across runtimes — see\n * packages/daemon-core/src/pipeline/prompts.ts for the canonical\n * contract. The CLI/Ollama path runs the full 4B; the browser\n * extension runs a smaller in-browser variant under WebGPU limits.\n *\n *   embeddings     : bge-small-en-v1.5        (384 dims, ~33 MB on disk)\n *   summarisation  : qwen3:4b                  (~2.5 GB on disk)\n *\n * The Ollama daemon is expected to be reachable at env.OLLAMA_URL\n * (default http://localhost:11434) with both models pulled.\n */\n\nimport {\n  OLLAMA_CHAT_MODEL,\n  OLLAMA_EMBED_MODEL,\n  QWEN_CHARS_PER_TOKEN,\n  SUMMARISER_MAX_TOKENS,\n  SUMMARISER_SYSTEM_PROMPT,\n  SUMMARISER_TEMPERATURE,\n} from \"../pipeline/prompts.js\";\nimport {\n  buildCognitionUserPrompt,\n  COGNITION_MAX_TOKENS,\n  COGNITION_SYSTEM_PROMPT,\n  COGNITION_TEMPERATURE,\n  parseCognitionReply,\n  type Cognizer,\n} from \"../pipeline/cognition.js\";\n\nexport interface OllamaConfig {\n  baseUrl: string;\n  embedModel: string;\n  chatModel: string;\n}\n\nexport function defaultOllamaConfig(): OllamaConfig {\n  const base = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n    .process?.env ?? {};\n  return {\n    baseUrl: base.OLLAMA_URL ?? \"http://localhost:11434\",\n    embedModel: base.OLLAMA_EMBED_MODEL ?? OLLAMA_EMBED_MODEL,\n    chatModel: base.OLLAMA_CHAT_MODEL ?? OLLAMA_CHAT_MODEL,\n  };\n}\n\n/** Embedding adapter — returns a unit-norm 384-dim vector for `text`. */\nexport function ollamaEmbed(cfg: OllamaConfig = defaultOllamaConfig()): (text: string) => Promise<number[]> {\n  return async (text: string): Promise<number[]> => {\n    const res = await fetch(`${cfg.baseUrl.replace(/\\/+$/, \"\")}/api/embeddings`, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\" },\n      body: JSON.stringify({ model: cfg.embedModel, prompt: text }),\n    });\n    if (!res.ok) {\n      throw new Error(`ollama embed failed: ${res.status} ${await res.text().catch(() => \"\")}`);\n    }\n    const body = (await res.json()) as { embedding: number[] };\n    const v = body.embedding ?? [];\n    // Normalise to unit length so cosine reduces to dot product downstream.\n    let norm = 0;\n    for (const x of v) norm += x * x;\n    norm = Math.sqrt(norm) || 1;\n    return v.map((x) => x / norm);\n  };\n}\n\n/** Tokenizer — cheap approximation tuned for Qwen-family tokenizers.\n * Shared ratio with the browser fallback so token counts are\n * directionally comparable across runtimes. */\nexport function ollamaTokenize(): (text: string) => number {\n  return (text: string): number => Math.max(1, Math.ceil(text.length / QWEN_CHARS_PER_TOKEN));\n}\n\n/** Summariser — short one-line abstract from pre-redacted content.\n * Returns ≤ 240 chars so the 512-char Segment cap has room for caller-added\n * context (e.g. \"work on ${repo}\").\n *\n * Uses Ollama /api/chat in non-streaming mode. Temperature kept low so\n * the same turns yield the same abstract on replay (helps idempotency\n * assertions in tests). */\nexport function ollamaSummarize(\n  cfg: OllamaConfig = defaultOllamaConfig(),\n): (input: { prompt: string; maxTokens: number }) => Promise<string> {\n  return async ({ prompt, maxTokens }) => {\n    const res = await fetch(`${cfg.baseUrl.replace(/\\/+$/, \"\")}/api/chat`, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\" },\n      body: JSON.stringify({\n        model: cfg.chatModel,\n        stream: false,\n        // Disable reasoning. qwen3 (the default summariser family) is a\n        // thinking model: with `think` on it spends the entire\n        // `num_predict` budget on a <think> block and returns EMPTY\n        // content, so the summariser saw \"\" and the whole pipeline\n        // crash-looped at preflight. We only want the final terse\n        // abstract, never the chain-of-thought. Ollama ignores this\n        // field for non-thinking models, so it's safe across families.\n        think: false,\n        options: {\n          temperature: SUMMARISER_TEMPERATURE,\n          num_predict: Math.min(maxTokens, SUMMARISER_MAX_TOKENS),\n        },\n        messages: [\n          { role: \"system\", content: SUMMARISER_SYSTEM_PROMPT },\n          { role: \"user\", content: prompt },\n        ],\n      }),\n    });\n    if (!res.ok) {\n      throw new Error(`ollama summarize failed: ${res.status} ${await res.text().catch(() => \"\")}`);\n    }\n    const body = (await res.json()) as { message?: { content?: string } };\n    return (body.message?.content ?? \"\").trim().slice(0, 240);\n  };\n}\n\n/**\n * Cognition adapter — small \"what mood + mode is the user in?\" pass\n * that runs after the summariser. Same Qwen3.5 model, different\n * system prompt, JSON output. Best-effort: any failure returns null\n * and the segment ships without a cognition suffix. See\n * pipeline/cognition.ts for the contract.\n */\nexport function ollamaCognize(\n  cfg: OllamaConfig = defaultOllamaConfig(),\n): Cognizer {\n  return async ({ abstract }) => {\n    if (!abstract || abstract.trim().length < 12) return null;\n    let res: Response;\n    try {\n      res = await fetch(`${cfg.baseUrl.replace(/\\/+$/, \"\")}/api/chat`, {\n        method: \"POST\",\n        headers: { \"content-type\": \"application/json\" },\n        body: JSON.stringify({\n          model: cfg.chatModel,\n          stream: false,\n          format: \"json\",\n          // Same reason as the summariser: no thinking budget, just the\n          // JSON cognition tags. Thinking models otherwise emit a long\n          // <think> block and return empty content.\n          think: false,\n          options: {\n            temperature: COGNITION_TEMPERATURE,\n            num_predict: COGNITION_MAX_TOKENS,\n          },\n          messages: [\n            { role: \"system\", content: COGNITION_SYSTEM_PROMPT },\n            { role: \"user\", content: buildCognitionUserPrompt(abstract) },\n          ],\n        }),\n      });\n    } catch {\n      return null;\n    }\n    if (!res.ok) return null;\n    let body: { message?: { content?: string } };\n    try {\n      body = (await res.json()) as { message?: { content?: string } };\n    } catch {\n      return null;\n    }\n    return parseCognitionReply(body.message?.content ?? \"\");\n  };\n}\n","/**\n * Remote OpenAI-compatible LLM adapters for the daemon pipeline on Node.\n *\n * A drop-in alternative to the bundled `node-llama-cpp` summariser\n * (see ./llama.ts) for machines where a local 2.7 GB model isn't an\n * option — sandboxes, CI, thin laptops. Instead of running inference\n * locally it POSTs to any `/v1/chat/completions` endpoint: OpenAI,\n * a remote Ollama (`/v1`), vLLM, LiteLLM, OpenRouter, Together, …\n *\n * Same prompt contracts as every other runtime (see ../pipeline/*),\n * so the abstract you get from a remote `gpt-4o-mini` reads like the\n * one the bundled Qwen produces. The factories mirror the llama ones:\n *   - summarize     : REQUIRED, throws on failure (the resilient wrapper\n *                     in apps/daemon degrades to the extractive fallback)\n *   - cognize/entitle/extractLinks/scriptSummarize : best-effort → null\n *\n * PRIVACY — this is an explicit egress. Unlike the local path, the\n * summariser prompt (sampled, regex-floor-redacted conversation\n * excerpts) and script bodies are sent to the configured endpoint.\n * The daemon logs a loud one-time warning when this provider is\n * selected; embeddings + the Privacy-Filter redactor stay local.\n */\n\nimport { z } from \"zod\";\nimport type { Cognizer } from \"../pipeline/cognition.js\";\nimport type { Summarizer } from \"../pipeline/index.js\";\nimport {\n  type ChatComplete,\n  type ChatRequest,\n  makeCognizer,\n  makeEntitler,\n  makeLinkExtractor,\n  makeScriptSummarizer,\n  makeSummarizer,\n} from \"../pipeline/passes.js\";\nimport type { ScriptSummarizer } from \"../pipeline/script-summary.js\";\nimport type { LinkExtractor } from \"../pipeline/session-metadata.js\";\nimport { stripThinking } from \"../pipeline/thinking.js\";\nimport type { Entitler } from \"../pipeline/title.js\";\n\n/**\n * Scrubs a string of PII/secrets BEFORE it is POSTed to the remote\n * endpoint. The remote path is an explicit egress, so raw prompt content\n * (conversation excerpts, script file bodies) must pass an on-device NER\n * pass first — the local path skips this because nothing leaves the box.\n * Supplied by the daemon (apps/daemon/src/pipeline.ts); when omitted the\n * content is sent as-is (used by the wire-level tests).\n */\nexport type PreSendRedactor = (text: string) => Promise<string>;\n\nexport interface OpenAICompatConfig {\n  /** Base URL up to and including the API version, e.g.\n   * `https://api.openai.com/v1` or `http://localhost:11434/v1`.\n   * `/chat/completions` is appended. */\n  readonly baseUrl: string;\n  /** Bearer token. Null for endpoints that don't require auth (local\n   * Ollama / vLLM). */\n  readonly apiKey: string | null;\n  /** Model identifier as the endpoint names it, e.g. `gpt-4o-mini`,\n   * `qwen2.5:4b`, `meta-llama/Llama-3.1-8B-Instruct`. */\n  readonly model: string;\n  /** Per-request timeout. Remote endpoints are less reliable than a\n   * localhost model, so every call is bounded. */\n  readonly timeoutMs: number;\n}\n\n/** Raised when the remote provider is selected but its required env is\n * missing — surfaces at daemon startup, not mid-scan. */\nexport class OpenAICompatConfigError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"OpenAICompatConfigError\";\n  }\n}\n\n/** A non-2xx response or a transport failure from the endpoint. `status`\n * is 0 for transport-level failures (DNS, timeout, refused). */\nexport class OpenAICompatRequestError extends Error {\n  readonly status: number;\n  constructor(status: number, message: string) {\n    super(message);\n    this.name = \"OpenAICompatRequestError\";\n    this.status = status;\n  }\n}\n\nexport const DEFAULT_LLM_TIMEOUT_MS = 60_000;\n\n/** Bounded per-call retry for the remote endpoint. Unlike the local\n * model (which fails hard or not at all), an HTTP endpoint has transient\n * failures — a brief 5xx, a rate-limit, a network blip — that a short\n * retry rides through. Kept small so a hard-down endpoint still surfaces\n * quickly to the resilient wrapper's fallback rather than stalling a\n * scan. Backoff is exponential (500ms, 1s, 2s …) capped, and a 429's\n * `Retry-After` header wins when present. */\nconst MAX_RETRY_ATTEMPTS = 3;\nconst BASE_BACKOFF_MS = 500;\nconst MAX_BACKOFF_MS = 8_000;\n/** Floor on any retry wait so a `Retry-After: 0` (or a tiny value) can't\n * fire all attempts back-to-back in a microsecond burst against a\n * rate-limited endpoint. */\nconst MIN_RETRY_WAIT_MS = 250;\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Validate that `baseUrl` is a well-formed http(s) URL, throwing\n * {@link OpenAICompatConfigError} otherwise. Shared by the env-driven and the\n * install-driven config builders (and reusable by the install/`modelstat mode`\n * prompt so a bad URL is rejected before it is persisted). `label` names the\n * source in the error (`\"MODELSTAT_LLM_BASE_URL\"`, `\"summariser URL\"`, …).\n */\nexport function validateSummarizerUrl(baseUrl: string, label = \"summariser URL\"): void {\n  let parsed: URL;\n  try {\n    parsed = new URL(baseUrl);\n  } catch {\n    throw new OpenAICompatConfigError(`${label} is not a valid URL: \"${baseUrl}\".`);\n  }\n  // Reject non-http(s) so an operator can't point the egress at a file:// (or\n  // any other) scheme — a typo here would otherwise surface mid-scan.\n  if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n    throw new OpenAICompatConfigError(\n      `${label} must use http(s): \"${baseUrl}\" (got \"${parsed.protocol}\").`,\n    );\n  }\n}\n\n/**\n * Build an OpenAI-compatible config from an explicit base URL + model (e.g. the\n * self-hosted summariser endpoint chosen at install), validating the URL and\n * filling the API key + timeout from the environment. Throws\n * {@link OpenAICompatConfigError} on an empty/invalid URL or empty model.\n */\nexport function makeOpenAICompatConfig(\n  baseUrl: string,\n  model: string,\n  label = \"summariser URL\",\n): OpenAICompatConfig {\n  const url = baseUrl.trim();\n  const mdl = model.trim();\n  if (!url) throw new OpenAICompatConfigError(`${label} is required.`);\n  if (!mdl) throw new OpenAICompatConfigError(\"summariser model id is required.\");\n  validateSummarizerUrl(url, label);\n  const env = process.env;\n  const timeoutRaw = Number(env.MODELSTAT_LLM_TIMEOUT_MS ?? DEFAULT_LLM_TIMEOUT_MS);\n  return {\n    baseUrl: url,\n    apiKey: env.MODELSTAT_LLM_API_KEY?.trim() || null,\n    model: mdl,\n    timeoutMs: Number.isFinite(timeoutRaw) && timeoutRaw > 0 ? timeoutRaw : DEFAULT_LLM_TIMEOUT_MS,\n  };\n}\n\n/**\n * Resolve the remote-LLM config from the environment. Throws\n * {@link OpenAICompatConfigError} when `MODELSTAT_LLM_BASE_URL` or\n * `MODELSTAT_LLM_MODEL` is absent — fail-fast at the boundary rather\n * than ship empty abstracts. Used when the self-hosted endpoint is supplied\n * entirely via env (CI / scripted installs); the interactive install path\n * calls {@link makeOpenAICompatConfig} with the persisted URL + model instead.\n */\nexport function defaultOpenAICompatConfig(): OpenAICompatConfig {\n  const env = process.env;\n  const baseUrl = env.MODELSTAT_LLM_BASE_URL?.trim();\n  const model = env.MODELSTAT_LLM_MODEL?.trim();\n  if (!baseUrl) {\n    throw new OpenAICompatConfigError(\n      'MODELSTAT_LLM_BASE_URL is required for self-hosted mode (e.g. \"https://api.openai.com/v1\").',\n    );\n  }\n  if (!model) {\n    throw new OpenAICompatConfigError(\n      'MODELSTAT_LLM_MODEL is required for self-hosted mode (e.g. \"gpt-4o-mini\").',\n    );\n  }\n  return makeOpenAICompatConfig(baseUrl, model, \"MODELSTAT_LLM_BASE_URL\");\n}\n\n/** Minimal shape of the OpenAI chat-completions response we depend on.\n * Parsed (not cast) because it crosses a trust boundary. */\nconst ChatCompletionResponse = z.object({\n  choices: z\n    .array(z.object({ message: z.object({ content: z.string().nullish() }).optional() }))\n    .default([]),\n});\n\n/** Reasoning models (OpenAI o-series, gpt-5) reject the classic\n * `max_tokens` field — they require `max_completion_tokens` — and reject\n * any non-default `temperature`. Detect them by name so the request body\n * matches the endpoint's contract instead of 400-ing on every call.\n * `o\\d+` covers o1…o9 and future two-digit o-series (o10+); `gpt-5(-|$)`\n * matches gpt-5 and gpt-5-* without false-matching gpt-50. The optional\n * `[/:]`-prefix allows vendor-namespaced ids like `openai/o3`. */\nfunction isReasoningModel(model: string): boolean {\n  return /(^|[/:])(o\\d+(-|$)|gpt-5(-|$))/i.test(model.trim());\n}\n\n/** Build the provider-correct chat-completions body. Reasoning models\n * get `max_completion_tokens` and no `temperature`; everything else\n * keeps the widely-supported `max_tokens` + `temperature` pair. */\nfunction buildChatBody(cfg: OpenAICompatConfig, req: ChatRequest, user: string): string {\n  const messages = [\n    { role: \"system\", content: req.system },\n    { role: \"user\", content: user },\n  ];\n  const base = { model: cfg.model, stream: false as const, messages };\n  return JSON.stringify(\n    isReasoningModel(cfg.model)\n      ? { ...base, max_completion_tokens: req.maxTokens }\n      : { ...base, temperature: req.temperature, max_tokens: req.maxTokens },\n  );\n}\n\n/** A 429's `Retry-After` (seconds) as ms, when the header is a sane\n * non-negative number; otherwise null so the caller uses backoff. */\nfunction retryAfterMs(res: Response): number | null {\n  const header = res.headers.get(\"retry-after\");\n  if (!header) return null;\n  const secs = Number(header);\n  if (!Number.isFinite(secs) || secs < 0) return null;\n  // Clamp into [MIN_RETRY_WAIT_MS, MAX_BACKOFF_MS]: a 0 must still pause\n  // briefly, and a multi-minute quota window is capped so a hard-down\n  // endpoint surfaces to the extractive fallback quickly.\n  return Math.min(Math.max(secs * 1000, MIN_RETRY_WAIT_MS), MAX_BACKOFF_MS);\n}\n\nfunction transportError(cfg: OpenAICompatConfig, err: unknown): OpenAICompatRequestError {\n  if (err instanceof DOMException && err.name === \"TimeoutError\") {\n    return new OpenAICompatRequestError(\n      0,\n      `request to ${cfg.baseUrl} timed out after ${cfg.timeoutMs}ms`,\n    );\n  }\n  const reason = err instanceof Error ? err.message : String(err);\n  return new OpenAICompatRequestError(0, `request to ${cfg.baseUrl} failed: ${reason}`);\n}\n\nfunction httpError(res: Response): OpenAICompatRequestError {\n  // Status + reason phrase ONLY — deliberately NOT the response body. On a\n  // content-policy rejection some endpoints echo the offending prompt\n  // fragment in the body, and this message propagates to the local daemon\n  // log via `markDegraded`. The status (e.g. 401/404/429) is enough to\n  // diagnose a misconfigured endpoint without risking a redacted-PII echo.\n  const reason = res.statusText ? ` ${res.statusText}` : \"\";\n  return new OpenAICompatRequestError(res.status, `chat completion failed: ${res.status}${reason}`);\n}\n\n/** Parse a 2xx reply into the answer text, wrapping a non-JSON body or\n * an unexpected shape as {@link OpenAICompatRequestError} so callers see\n * one error type instead of a raw `SyntaxError`/`ZodError`. */\nasync function parseReply(cfg: OpenAICompatConfig, res: Response): Promise<string> {\n  let json: unknown;\n  try {\n    json = await res.json();\n  } catch {\n    throw new OpenAICompatRequestError(res.status, `non-JSON response from ${cfg.baseUrl}`);\n  }\n  const parsed = ChatCompletionResponse.safeParse(json);\n  if (!parsed.success) {\n    throw new OpenAICompatRequestError(\n      res.status,\n      `unexpected response schema from ${cfg.baseUrl}`,\n    );\n  }\n  return stripThinking(parsed.data.choices[0]?.message?.content ?? \"\");\n}\n\n/** One non-streaming chat completion, with bounded retry. `preSend`\n * scrubs the user content (PII/secrets) before it leaves the machine.\n * Retries transport failures, timeouts, 429s, and 5xxs with exponential\n * backoff (honouring `Retry-After`); 4xx client errors are returned\n * immediately. Returns the assistant message with any `<think>` block\n * stripped. Throws {@link OpenAICompatRequestError} once retries are\n * exhausted. */\nasync function chatComplete(\n  cfg: OpenAICompatConfig,\n  req: ChatRequest,\n  preSend?: PreSendRedactor,\n): Promise<string> {\n  const user = preSend ? await preSend(req.user) : req.user;\n  const url = `${cfg.baseUrl.replace(/\\/+$/, \"\")}/chat/completions`;\n  const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n  if (cfg.apiKey) headers.authorization = `Bearer ${cfg.apiKey}`;\n  const body = buildChatBody(cfg, req, user);\n\n  let lastErr = new OpenAICompatRequestError(0, \"request not attempted\");\n  for (let attempt = 0; attempt < MAX_RETRY_ATTEMPTS; attempt++) {\n    const isLast = attempt === MAX_RETRY_ATTEMPTS - 1;\n    let res: Response;\n    try {\n      res = await fetch(url, {\n        method: \"POST\",\n        headers,\n        body,\n        signal: AbortSignal.timeout(cfg.timeoutMs),\n      });\n    } catch (err) {\n      lastErr = transportError(cfg, err);\n      if (!isLast) await delay(Math.min(BASE_BACKOFF_MS * 2 ** attempt, MAX_BACKOFF_MS));\n      continue;\n    }\n    // Retryable server-side conditions: rate limit + transient 5xx.\n    if (res.status === 429 || res.status >= 500) {\n      lastErr = httpError(res);\n      if (!isLast) {\n        const wait = retryAfterMs(res) ?? Math.min(BASE_BACKOFF_MS * 2 ** attempt, MAX_BACKOFF_MS);\n        await delay(wait);\n      }\n      continue;\n    }\n    // 4xx (bad model name, auth, malformed request) won't fix on retry.\n    if (!res.ok) throw httpError(res);\n    return await parseReply(cfg, res);\n  }\n  throw lastErr;\n}\n\n/**\n * A {@link ChatComplete} backed by this endpoint — the remote runtime's\n * single point of variation; the per-pass logic lives in\n * `../pipeline/passes.ts`. `preSend` scrubs the user content (PII/secrets)\n * before it leaves the machine: pass it for passes that carry RAW content\n * (summarise, script-summary) and OMIT it for passes over already-redacted\n * abstracts (cognition, title, link-extract) so we never re-run NER on\n * clean input.\n */\nexport function openaiChat(cfg: OpenAICompatConfig, preSend?: PreSendRedactor): ChatComplete {\n  return (req) => chatComplete(cfg, req, preSend);\n}\n\n/**\n * Summariser adapter — REQUIRED output, drop-in for `llamaSummarize`.\n * Throws on transport failure or empty output so the resilient wrapper in\n * apps/daemon can degrade to the extractive fallback. `preSend` is the\n * remote path's egress guard: the prompt (which embeds the sampled\n * conversation excerpts) is NER/PII-scrubbed on-device before it is\n * POSTed — the local llama path needs no equivalent because the prompt\n * never leaves the machine.\n */\nexport function openaiSummarize(cfg: OpenAICompatConfig, preSend?: PreSendRedactor): Summarizer {\n  return makeSummarizer(openaiChat(cfg, preSend));\n}\n\n/** Cognition adapter — best-effort mood/mind/posture tags over the\n * already-redacted abstract (no `preSend`). Mirrors `llamaCognize`. */\nexport function openaiCognize(cfg: OpenAICompatConfig): Cognizer {\n  return makeCognizer(openaiChat(cfg));\n}\n\n/** Session-title adapter — best-effort, over already-redacted abstracts.\n * Mirrors `llamaEntitle`. */\nexport function openaiEntitle(cfg: OpenAICompatConfig): Entitler {\n  return makeEntitler(openaiChat(cfg));\n}\n\n/** Link-extraction adapter — best-effort, over already-redacted\n * abstracts. Mirrors `llamaExtractLinks`. */\nexport function openaiExtractLinks(cfg: OpenAICompatConfig): LinkExtractor {\n  return makeLinkExtractor(openaiChat(cfg));\n}\n\n/** Per-script content-summary adapter — best-effort. `preSend` scrubs the\n * raw script body before it is POSTed (remote egress guard). Mirrors\n * `llamaScriptSummarize`. */\nexport function openaiScriptSummarize(\n  cfg: OpenAICompatConfig,\n  preSend?: PreSendRedactor,\n): ScriptSummarizer {\n  return makeScriptSummarizer(openaiChat(cfg, preSend));\n}\n","/**\n * Helpers for loading OPTIONAL runtime dependencies via dynamic\n * `import()` without ever putting a *failing* import on a hot path.\n *\n * Why this exists: a rejected dynamic `import()` is not free. Node has\n * to re-run ESM resolution (a chain of filesystem probes) on every\n * attempt, allocates a fresh `ERR_MODULE_NOT_FOUND` error + stack, and\n * the V8 loader retains per-attempt bookkeeping — repeated failing\n * imports grow the heap without bound. The 2026-06-11 daemon OOM was\n * exactly this: `@huggingface/transformers` missing from the staged\n * runtime, the embedder retrying the import once per *turn* during the\n * v1→v3 full-corpus reprocess — ~5 million failed imports, ~1 GB of\n * identical warn lines in err.log, and an 8 GB V8 heap at crash.\n *\n * The rule encoded here: an optional-dep loader may retry a TRANSIENT\n * failure a small bounded number of times, but a missing package is\n * PERMANENT for the life of the process — latch it, warn once, and\n * answer \"unavailable\" from then on without touching the loader again.\n */\n\n/** Max load attempts for failures that don't look permanent (e.g. a\n * flaky network during a model download). After this many consecutive\n * failures the loader must latch unavailable for the process lifetime. */\nexport const OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS = 3;\n\n/**\n * True when the error says the module simply isn't installed/resolvable\n * — there is no point ever retrying the import in this process.\n */\nexport function isMissingOptionalModuleError(err: unknown): boolean {\n  const code = (err as { code?: string } | null)?.code;\n  if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\") return true;\n  const msg = err instanceof Error ? err.message : String(err);\n  return /cannot find (package|module)|cannot resolve|failed to resolve/i.test(msg);\n}\n","/**\n * Node-side Embedder backed by @huggingface/transformers (ONNX +\n * onnxruntime-node) running BAAI/bge-small-en-v1.5.\n *\n * Why this exists: the wire embedding is 384-dim (BGE-small). The CLI\n * and browser daemons must produce vectors from the SAME model so a\n * segment embedded by either is directly comparable (cosine similarity\n * meaningful across runtimes). We run the model via transformers.js —\n * the optional peer dep is already required by the on-device privacy\n * filter, so this adds no new dependency footprint for daemons\n * that have both adapters wired.\n *\n * Browser counterpart lives in packages/daemon-core/src/browser/\n * (transformers.js auto-picks WebGPU there); same model, same vector\n * space, same shape.\n *\n * Loading is lazy — first call downloads ~50 MB of ONNX weights to\n * ~/.cache/huggingface/transformers/, subsequent calls reuse the\n * loaded pipeline. If the optional peer dep is missing OR loading\n * fails, the adapter returns an empty vector — the pipeline's\n * segment-boundary detection falls back to a time-gap heuristic and\n * the segment still ships (the abstract embedding is simply omitted).\n * No throws.\n */\nimport {\n  isMissingOptionalModuleError,\n  OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS,\n} from \"../optional-module.js\";\nimport type { Embedder } from \"../pipeline/index.js\";\n\ninterface FeatureExtractor {\n  (\n    text: string | string[],\n    opts?: { pooling?: \"mean\" | \"cls\"; normalize?: boolean },\n  ): Promise<{ data: Float32Array; dims: number[] }>;\n}\n\nlet cached: FeatureExtractor | null = null;\nlet loadPromise: Promise<FeatureExtractor | null> | null = null;\nlet loadFailedPermanently = false;\nlet loadAttempts = 0;\nlet warnedUnavailable = false;\nlet warnedInferenceError = false;\n\nconst DEFAULT_MODEL = \"Xenova/bge-small-en-v1.5\";\n\n/** Indirection over dynamic import so tests can simulate a missing /\n * flaky module without uninstalling anything. Production always uses\n * the real `import()`. */\ntype ModuleImporter = (id: string) => Promise<unknown>;\nlet importModule: ModuleImporter = (id) => import(/* @vite-ignore */ id);\n\n/** Test hook: replace the dynamic importer and reset all module-level\n * loader state. Not for production use. */\nexport function __setImporterForTests(importer: ModuleImporter | null): void {\n  importModule = importer ?? ((id) => import(/* @vite-ignore */ id));\n  cached = null;\n  loadPromise = null;\n  loadFailedPermanently = false;\n  loadAttempts = 0;\n  warnedUnavailable = false;\n  warnedInferenceError = false;\n}\n\nasync function loadPipeline(model: string): Promise<FeatureExtractor | null> {\n  if (cached) return cached;\n  // Latched-unavailable answers immediately: embed() sits on the\n  // per-turn hot path of a scan, and a full-corpus reprocess calls it\n  // millions of times. Re-running a FAILING dynamic import() from here\n  // is what OOM-crashed the daemon on 2026-06-11 (~5M failed imports,\n  // 8 GB heap, ~1 GB of identical warn lines) — see optional-module.ts.\n  if (loadFailedPermanently) return null;\n  if (!loadPromise) {\n    loadPromise = (async () => {\n      try {\n        // Indirect import via a string variable so TypeScript doesn't\n        // try to resolve @huggingface/transformers at typecheck time\n        // — it's an optional peer dep that consumers install\n        // themselves (e.g. apps/daemon pulls it in because the\n        // privacy-filter adapter also needs it). Matches the pattern\n        // used in src/redact/privacy-filter.ts.\n        const tjs = (await importModule(\"@huggingface/transformers\")) as unknown as {\n          pipeline: (\n            task: string,\n            model: string,\n            opts?: Record<string, unknown>,\n          ) => Promise<FeatureExtractor>;\n        };\n        const p = await tjs.pipeline(\"feature-extraction\", model, {\n          device: \"cpu\",\n          dtype: \"fp32\",\n        });\n        cached = p;\n        return p;\n      } catch (err) {\n        const msg = (err as Error).message;\n        loadAttempts += 1;\n        if (\n          isMissingOptionalModuleError(err) ||\n          /unsupported|architecture|not supported|onnx/i.test(msg) ||\n          loadAttempts >= OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS\n        ) {\n          loadFailedPermanently = true;\n        }\n        if (!warnedUnavailable) {\n          warnedUnavailable = true;\n          // biome-ignore lint/suspicious/noConsole: one-line, user-visible warning\n          console.warn(\n            `[modelstat] transformers.js embedder unavailable (segments will be re-embedded server-side; further attempts ${\n              loadFailedPermanently ? \"disabled\" : `limited to ${OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS}`\n            }, warning once): ${msg}`,\n          );\n        }\n        loadPromise = null;\n        return null;\n      }\n    })();\n  }\n  return loadPromise;\n}\n\n/** Factory — returns an Embedder that fits the pipeline contract.\n * Pass an explicit model id to override the default; useful for\n * eval scripts comparing variants. */\nexport function createTransformersJsEmbedder(model: string = DEFAULT_MODEL): Embedder {\n  return async (text: string): Promise<number[]> => {\n    if (!text || text.trim().length === 0) return [];\n    const pipe = await loadPipeline(model);\n    if (!pipe) return [];\n    try {\n      // bge-small uses mean-pooling + L2 normalisation, so the vectors\n      // land on the unit sphere — directly comparable across runtimes.\n      const out = await pipe(text, { pooling: \"mean\", normalize: true });\n      return Array.from(out.data);\n    } catch (err) {\n      // Warn once, not per call — embed() runs once per turn, so a\n      // deterministic inference failure would otherwise flood the log\n      // for the entire scan (the err.log-grows-to-1GB failure mode).\n      if (!warnedInferenceError) {\n        warnedInferenceError = true;\n        // biome-ignore lint/suspicious/noConsole: one-line warning\n        console.warn(\n          `[modelstat] embed error (returning empty vectors, server will re-embed; warning once): ${(err as Error).message}`,\n        );\n      }\n      return [];\n    }\n  };\n}\n","/**\n * Node-only daemon adapters. Use from the agent CLI.\n *\n * Daemons import from this subpath to get runtime-specific\n * implementations (file-backed queue store, pino logger, Ollama\n * adapters) while keeping the same contracts as the browser side.\n */\n// Back-compat alias — callers that imported SqliteQueueStore still\n// work without a rename. Scheduled for removal once apps/daemon\n// ships a release using FileQueueStore directly.\nexport { FileQueueStore, FileQueueStore as SqliteQueueStore } from \"./file-queue-store.js\";\nexport {\n  DEFAULT_LLAMA_MODEL_URL,\n  defaultLlamaConfig,\n  disposeLlama,\n  ensureLlamaModel,\n  type LlamaConfig,\n  llamaCognize,\n  llamaEntitle,\n  llamaExtractLinks,\n  llamaRedact,\n  llamaScriptSummarize,\n  llamaSummarize,\n} from \"./llama.js\";\nexport {\n  defaultOllamaConfig,\n  type OllamaConfig,\n  ollamaCognize,\n  ollamaEmbed,\n  ollamaSummarize,\n  ollamaTokenize,\n} from \"./ollama.js\";\n// Remote OpenAI-compatible summariser — the runtime behind self-hosted mode\n// (an org-run endpoint) and the env-driven remote provider.\nexport {\n  DEFAULT_LLM_TIMEOUT_MS,\n  defaultOpenAICompatConfig,\n  makeOpenAICompatConfig,\n  type OpenAICompatConfig,\n  OpenAICompatConfigError,\n  OpenAICompatRequestError,\n  openaiCognize,\n  openaiEntitle,\n  openaiExtractLinks,\n  openaiScriptSummarize,\n  openaiSummarize,\n  validateSummarizerUrl,\n} from \"./openai-compat.js\";\n// Transformers.js BGE-small-en-v1.5 embedder — the wire embedding is\n// 384-dim (BGE-small), so CLI and browser segment vectors land in the\n// same space.\nexport { createTransformersJsEmbedder } from \"./transformersjs-embed.js\";\n","/**\n * Auto-configure Claude Code's user `settings.json` so `modelstat statusline`\n * renders at the bottom of every turn. A Claude Code PLUGIN cannot register the\n * main statusLine (only `subagentStatusLine`), so the installer is the only\n * mechanism — this runs as a step of `npx modelstat`.\n *\n * Idempotent + reversible:\n *   - Writing twice is a no-op once ours is in place.\n *   - If the user already has a DIFFERENT statusLine, we don't clobber it: we\n *     stash it under `_modelstatPrevStatusLine` and restore it on uninstall.\n *   - `removeStatusline()` removes ours and restores any stashed one.\n *\n * Best-effort: a parse/write failure is reported to the caller but never aborts\n * the install (the daemon's core duty is ingest, not the statusline).\n */\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\n/** The command we register. Resolved by the user's PATH to the installed\n * `modelstat` bin (the launchd/systemd install puts it there); kept bare so it\n * keeps working across upgrades that re-stage the bundle. */\nexport const STATUSLINE_COMMAND = \"modelstat statusline\";\n\n/** Path to Claude Code's user settings. `CLAUDE_CONFIG_DIR` overrides the\n * default `~/.claude` (mirrors Claude Code's own resolution), so a custom\n * config dir or a test home is honoured. */\nexport function claudeSettingsPath(): string {\n  const base = process.env.CLAUDE_CONFIG_DIR?.trim();\n  return base && base.length > 0\n    ? join(base, \"settings.json\")\n    : join(homedir(), \".claude\", \"settings.json\");\n}\n\ninterface StatusLineSetting {\n  type?: string;\n  command?: string;\n  padding?: number;\n  [k: string]: unknown;\n}\n\ninterface ClaudeSettings {\n  statusLine?: StatusLineSetting;\n  /** Where we stash a pre-existing foreign statusLine so uninstall can restore\n   * it. Not a Claude Code field — namespaced so it can't collide. */\n  _modelstatPrevStatusLine?: StatusLineSetting | null;\n  [k: string]: unknown;\n}\n\n/** True when this statusLine setting is modelstat's (so re-install is a no-op\n * and uninstall only removes ours). Matches on our command substring so a\n * user-tweaked padding/refreshInterval still counts as ours. */\nexport function isModelstatStatusLine(s: StatusLineSetting | undefined | null): boolean {\n  return typeof s?.command === \"string\" && s.command.includes(\"modelstat statusline\");\n}\n\n/** Parse the settings file, tolerating absence (→ {}) and surfacing a real\n * parse error to the caller (so we never silently overwrite a file we couldn't\n * understand). */\nfunction readSettings(path: string): ClaudeSettings {\n  let raw: string;\n  try {\n    raw = readFileSync(path, \"utf8\");\n  } catch {\n    return {}; // no file yet\n  }\n  if (!raw.trim()) return {};\n  const parsed = JSON.parse(raw) as unknown;\n  if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n    throw new Error(`${path} is not a JSON object`);\n  }\n  return parsed as ClaudeSettings;\n}\n\n/** Atomically write settings (pretty-printed, trailing newline) via tmp+rename\n * so a crash mid-write can't truncate the user's config. Backs the previous\n * file up to `<path>.modelstat.bak` the first time we touch it. */\nfunction writeSettings(path: string, settings: ClaudeSettings, hadFile: boolean): void {\n  mkdirSync(dirname(path), { recursive: true });\n  if (hadFile) {\n    try {\n      renameSync(path, `${path}.modelstat.bak`);\n    } catch {\n      /* best-effort backup — don't block the write */\n    }\n  }\n  const tmp = `${path}.modelstat.tmp`;\n  writeFileSync(tmp, `${JSON.stringify(settings, null, 2)}\\n`);\n  renameSync(tmp, path);\n}\n\nexport type StatuslineInstallResult =\n  | { kind: \"installed\"; preserved: boolean }\n  | { kind: \"already\" }\n  | { kind: \"error\"; message: string };\n\n/**\n * Ensure `modelstat statusline` is the registered statusLine. Idempotent. If a\n * foreign statusLine is present it's stashed (and restored on uninstall) rather\n * than dropped.\n */\nexport function installStatusline(): StatuslineInstallResult {\n  const path = claudeSettingsPath();\n  let hadFile = true;\n  let settings: ClaudeSettings;\n  try {\n    settings = readSettings(path);\n    // Detect file presence so we only back up an existing file.\n    try {\n      readFileSync(path, \"utf8\");\n    } catch {\n      hadFile = false;\n    }\n  } catch (e) {\n    return { kind: \"error\", message: (e as Error).message };\n  }\n\n  if (isModelstatStatusLine(settings.statusLine)) return { kind: \"already\" };\n\n  let preserved = false;\n  if (settings.statusLine?.command) {\n    // Don't lose the user's existing statusLine — stash it for restore.\n    settings._modelstatPrevStatusLine = settings.statusLine;\n    preserved = true;\n  }\n  settings.statusLine = { type: \"command\", command: STATUSLINE_COMMAND, padding: 0 };\n\n  try {\n    writeSettings(path, settings, hadFile);\n  } catch (e) {\n    return { kind: \"error\", message: (e as Error).message };\n  }\n  return { kind: \"installed\", preserved };\n}\n\nexport type StatuslineRemoveResult =\n  | { kind: \"removed\"; restored: boolean }\n  | { kind: \"absent\" }\n  | { kind: \"error\"; message: string };\n\n/**\n * Remove modelstat's statusLine. If we previously stashed a foreign one,\n * restore it; otherwise drop the statusLine entirely. Leaves a non-modelstat\n * statusLine untouched (we never installed over it).\n */\nexport function removeStatusline(): StatuslineRemoveResult {\n  const path = claudeSettingsPath();\n  let settings: ClaudeSettings;\n  try {\n    settings = readSettings(path);\n  } catch (e) {\n    return { kind: \"error\", message: (e as Error).message };\n  }\n  if (!isModelstatStatusLine(settings.statusLine)) {\n    // Either nothing, or a statusLine that isn't ours — leave it be, but clean\n    // up a dangling stash if one is somehow present.\n    if (settings._modelstatPrevStatusLine !== undefined) {\n      delete settings._modelstatPrevStatusLine;\n      try {\n        writeSettings(path, settings, true);\n      } catch (e) {\n        return { kind: \"error\", message: (e as Error).message };\n      }\n    }\n    return { kind: \"absent\" };\n  }\n\n  let restored = false;\n  const prev = settings._modelstatPrevStatusLine;\n  if (prev?.command) {\n    settings.statusLine = prev;\n    restored = true;\n  } else {\n    delete settings.statusLine;\n  }\n  delete settings._modelstatPrevStatusLine;\n\n  try {\n    writeSettings(path, settings, true);\n  } catch (e) {\n    return { kind: \"error\", message: (e as Error).message };\n  }\n  return { kind: \"removed\", restored };\n}\n","import type { RawEvent, ToolCallWire } from \"@modelstat/core\";\n\n/** One extracted tool invocation, before segment attribution.\n *\n * Identical to the ToolCallWire shape (and its privacy contract:\n * hashes / byte sizes / allowlisted verbs only, never payloads) minus\n * `segment_id`, which the daemon fills at batch-build time once\n * segments exist — parse time is too early to know it. */\nexport type ToolCallDraft = Omit<ToolCallWire, \"segment_id\">;\n\n/** Local-only context the Node agent needs to summarise the script/bash FILES a\n * command runs: the RAW command + cwd.\n *\n * This is the ONLY place a raw command leaves the parser, and it NEVER gets\n * serialised or shipped — it rides `ParseResult.scriptContexts` purely so the\n * agent can resolve + read + locally summarise referenced files into the\n * redacted `ToolAction.scripts` abstracts. Keyed to its draft by\n * `external_call_id`. The browser daemon ignores it (no filesystem). */\nexport interface LocalToolContext {\n  external_call_id: string;\n  /** Raw shell command, exactly as the agent ran it. Local-only — never shipped. */\n  command: string;\n  /** Event cwd, for resolving relative script paths. Local-only — never shipped. */\n  cwd: string | null;\n}\n\n/** What a parser produces for a single source file (or SQLite row-set).\n *\n * Parsers emit RawEvents only — session-level summarisation is done by\n * the daemon pipeline (@modelstat/daemon-core/pipeline), not here.\n * Keeps parsers cheap + deterministic. */\nexport interface ParseResult {\n  /** All parsed events — EMPTY when the caller provided\n   * `ParserContext.onEvents` (streaming mode), so a multi-hundred-MB\n   * transcript never materialises as one giant array. */\n  events: RawEvent[];\n  /** Per-call tool invocations extracted from the source. Empty for\n   * sources without tool-call data (Cursor). */\n  toolCalls: ToolCallDraft[];\n  /** Local-only per-call contexts (raw command + cwd) for the agent's\n   * script-summary enrichment pass. Undefined/empty for sources with no shell\n   * calls. NEVER shipped — see {@link LocalToolContext}. */\n  scriptContexts?: LocalToolContext[];\n  stats: {\n    rawLines: number;\n    emittedEvents: number;\n    skipped: number;\n  };\n  /** Source file path (for dedupe + replay). */\n  sourceFile: string;\n}\n\n/** Upper bound on how many events a streaming parser hands to\n * `onEvents` per call. Bounds the parser's working set: with a sink\n * attached, at most this many events exist inside the parser at any\n * moment regardless of file size. */\nexport const PARSER_EVENT_CHUNK = 256;\n\nexport interface ParserContext {\n  /** Stable device id. */\n  deviceId: string;\n  /** Absolute path to the file being parsed (or a synthetic key for DBs). */\n  sourceFile: string;\n  /** For incremental parsers: skip bytes before this offset. */\n  byteOffsetStart?: number;\n  /** Streaming sink. When set, the parser delivers events in chunks of\n   * at most PARSER_EVENT_CHUNK as it reads the file and does NOT\n   * accumulate them in `ParseResult.events`. The parser awaits the sink\n   * before reading on, so a slow consumer (e.g. a batch flush that runs\n   * the summariser) applies natural backpressure to the file read.\n   *\n   * This is the memory contract for full-corpus reprocesses (cursor\n   * wipes): the scan loop must see a bounded number of events at a\n   * time, never a whole file's worth — let alone the whole corpus. */\n  onEvents?: (events: RawEvent[]) => void | Promise<void>;\n}\n","/**\n * Resolve a `cwd` into a git context (remote URL, host, slug, branch).\n * Safe to call on a non-repo — returns null fields.\n *\n * Uses Node's child_process sparingly — cached by cwd for the process\n * lifetime, since git lookups can be slow on macOS with iCloud paths.\n */\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { GitContext } from \"@modelstat/core\";\n\nconst pexec = promisify(execFile);\nconst cache = new Map<string, GitContext>();\n\nfunction findRepoRoot(startCwd: string): string | null {\n  let cwd = resolve(startCwd);\n  for (let i = 0; i < 10; i++) {\n    if (existsSync(`${cwd}/.git`)) return cwd;\n    const parent = dirname(cwd);\n    if (parent === cwd) return null;\n    cwd = parent;\n  }\n  return null;\n}\n\nfunction parseRemote(url: string): { host: string | null; slug: string | null } {\n  // git@github.com:org/repo(.git)? OR https://github.com/org/repo(.git)?\n  const ssh = /^(?:git@)?([^:]+):([^/]+)\\/([^.]+?)(?:\\.git)?$/.exec(url);\n  if (ssh) return { host: ssh[1] ?? null, slug: `${ssh[2]}/${ssh[3]}` };\n  try {\n    const u = new URL(url);\n    const m = /^\\/([^/]+)\\/([^/]+?)(?:\\.git)?\\/?$/.exec(u.pathname);\n    if (!m) return { host: u.hostname, slug: null };\n    return { host: u.hostname, slug: `${m[1]}/${m[2]}` };\n  } catch {\n    return { host: null, slug: null };\n  }\n}\n\n/** The main-repo path for a (possibly ephemeral) worktree cwd: strips\n * `/.claude/worktrees/<id>` so a deleted worktree still resolves the real repo's\n * remote. A plain cwd is returned unchanged. */\nexport function mainRepoPath(cwd: string): string {\n  const i = cwd.indexOf(\"/.claude/\");\n  return i === -1 ? cwd : cwd.slice(0, i);\n}\n\n/** The repo-root directory for a cwd — the nearest `.git` (worktrees collapsed\n * to the main repo via {@link mainRepoPath}), or null when none is reachable.\n * Deterministic + sync (an `existsSync` walk). Lets a caller derive a project\n * identity from where the repo actually IS, never a path-substring guess. */\nexport function resolveRepoRoot(cwd: string | null): string | null {\n  if (!cwd) return null;\n  return findRepoRoot(mainRepoPath(cwd));\n}\n\nexport async function resolveGitContext(cwd: string | null): Promise<GitContext | null> {\n  if (!cwd) return null;\n  // Ephemeral worktrees live under `<repo>/.claude/worktrees/<id>` and are often\n  // deleted by the time the daemon parses the session. Resolve from the MAIN repo\n  // (`<repo>`, still on disk) so EVERY session of a repo yields the one canonical\n  // remote slug — not a path-guess off the dead worktree, which split the project\n  // dimension (`acme/acme` vs `acme`). Worktrees share the remote, so this is also\n  // correct for live ones.\n  const target = mainRepoPath(cwd);\n  if (cache.has(target)) return cache.get(target) ?? null;\n  const root = findRepoRoot(target);\n  if (!root) {\n    const empty: GitContext = {\n      remote_url: null,\n      remote_host: null,\n      remote_slug: null,\n      branch: null,\n    };\n    cache.set(target, empty);\n    return empty;\n  }\n\n  const ran = async (args: string[]): Promise<string | null> => {\n    try {\n      const { stdout } = await pexec(\"git\", args, { cwd: root, timeout: 2_000 });\n      return stdout.trim() || null;\n    } catch {\n      return null;\n    }\n  };\n\n  const remoteUrl = await ran([\"config\", \"--get\", \"remote.origin.url\"]);\n  const branch = await ran([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n\n  const parsed = remoteUrl ? parseRemote(remoteUrl) : { host: null, slug: null };\n  const ctx: GitContext = {\n    remote_url: remoteUrl,\n    remote_host: parsed.host,\n    remote_slug: parsed.slug,\n    branch,\n  };\n  cache.set(target, ctx);\n  return ctx;\n}\n\n/** Synchronous best-effort path→slug derivation, used when we cannot\n * invoke git (e.g. walking lots of old sessions, or an ephemeral worktree that\n * was deleted before parse time). Heuristic only. */\nexport function guessRepoSlugFromPath(cwd: string | null): string | null {\n  if (!cwd) return null;\n  // common patterns: /Users/x/www/<org>/<repo> or /home/x/src/<org>/<repo>\n  const m = /\\/(?:www|src|code|repos|projects)\\/([^/]+)\\/([^/]+)/i.exec(cwd);\n  if (!m) return null;\n  const a = m[1];\n  const b = m[2];\n  if (!a || !b) return null;\n  // `<b>` is worktree/tooling noise — e.g. `<repo>/.claude/worktrees/<id>` — not a\n  // repo name: the project is just `<a>`. (Worktrees are ephemeral, so git often\n  // can't resolve the real remote at parse time and we fall through to here.)\n  if (b.startsWith(\".\") || b === \"worktrees\") return a;\n  return `${a}/${b}`;\n}\n","/**\n * On-device verified-outcome detection — the modelstat-native version of the\n * CPVO harness's \"script git\" loader (github.com/sneg55/cpvo). Given a PR the\n * session referenced and the local repo on disk, determine whether it merged\n * (and when) and whether it was later reverted — *without* a GitHub token or\n * webhook. The server's CPVO engine then classifies verified/failed from these\n * signals over the N-day survival window.\n *\n * Heuristic + git-only: it relies on GitHub's merge/squash commit-message\n * convention (`… (#123)` or `Merge pull request #123`) and `git revert`'s\n * `This reverts commit <sha>` body. The pure parsers below are exhaustively\n * unit-tested; the `git` invocation is a thin, best-effort wrapper.\n */\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst pexec = promisify(execFile);\n\n/** What the local git history says about one PR's fate. */\nexport interface PrOutcome {\n  /** A merge commit for the PR was found in history. */\n  merged: boolean;\n  /** ISO-8601 committer date of that merge commit, or null. */\n  merged_at: string | null;\n  /** A later commit reverts the merge (`This reverts commit <sha>`). */\n  reverted: boolean;\n}\n\n/** One parsed commit. */\nexport interface GitCommit {\n  sha: string;\n  /** Committer date, ISO-8601 (`%cI`). */\n  committedAt: string;\n  subject: string;\n  body: string;\n}\n\n// Field separator (US) between commit fields, record separator (RS) between\n// commits — both bytes that never occur in commit text.\nconst FS = \"\\x1f\";\nconst RS = \"\\x1e\";\nconst GIT_LOG_FORMAT = `%H${FS}%cI${FS}%s${FS}%b${RS}`;\n\n/** Parse `git log --format=<GIT_LOG_FORMAT>` output into commits. Pure. */\nexport function parseGitLog(stdout: string): GitCommit[] {\n  const out: GitCommit[] = [];\n  for (const record of stdout.split(RS)) {\n    const rec = record.trim();\n    if (!rec) continue;\n    const [sha = \"\", committedAt = \"\", subject = \"\", ...rest] = rec.split(FS);\n    out.push({ sha, committedAt, subject, body: rest.join(FS) });\n  }\n  return out;\n}\n\n/** The merge/squash commit for a PR number, or null. A GitHub merge subject is\n * `Merge pull request #123 from …`; a squash subject ends `… (#123)`. We match\n * `#<n>` with non-digit boundaries so `#123` doesn't also hit `#1234`. Pure. */\nexport function findMergeCommitForPr(commits: GitCommit[], prNumber: number): GitCommit | null {\n  const re = new RegExp(`(^|\\\\D)#${prNumber}(\\\\D|$)`);\n  return commits.find((c) => re.test(c.subject)) ?? null;\n}\n\n/** Whether any commit reverts `mergeSha` — `git revert` writes\n * `This reverts commit <full-or-short-sha>` into the body. Pure. */\nexport function isReverted(commits: GitCommit[], mergeSha: string): boolean {\n  if (!mergeSha) return false;\n  const short = mergeSha.slice(0, 7);\n  return commits.some(\n    (c) =>\n      c.body.includes(`This reverts commit ${mergeSha}`) ||\n      c.body.includes(`This reverts commit ${short}`),\n  );\n}\n\n/** Classify a PR's outcome from already-parsed commits. Pure — the testable\n * core of {@link checkPullRequestOutcome}. */\nexport function outcomeFromCommits(commits: GitCommit[], prNumber: number): PrOutcome {\n  const merge = findMergeCommitForPr(commits, prNumber);\n  if (!merge) return { merged: false, merged_at: null, reverted: false };\n  return {\n    merged: true,\n    merged_at: merge.committedAt || null,\n    reverted: isReverted(commits, merge.sha),\n  };\n}\n\n/**\n * Run `git log` in `cwd` and determine the PR's outcome. Best-effort: returns\n * null when `cwd` isn't a git repo or git fails (so the caller leaves the PR's\n * lifecycle fields unknown). Bounded to recent history + a short timeout.\n */\nexport async function checkPullRequestOutcome(\n  cwd: string,\n  prNumber: number,\n): Promise<PrOutcome | null> {\n  try {\n    const { stdout } = await pexec(\"git\", [\"log\", \"-n\", \"1000\", `--format=${GIT_LOG_FORMAT}`], {\n      cwd,\n      timeout: 4_000,\n      maxBuffer: 16 * 1024 * 1024,\n    });\n    return outcomeFromCommits(parseGitLog(stdout), prNumber);\n  } catch {\n    return null;\n  }\n}\n","/**\n * On-device per-session file-change capture — the raw signal behind the\n * \"token re-spend heatmap\" (which code a session's spend actually churned).\n * Given a repo on disk and the session's time window, aggregate the lines\n * added/deleted per file across the commits authored in that window — git\n * only, no forge API.\n *\n * Privacy: git emits repo-relative paths + integer line counts only — no file\n * contents and no absolute/home paths, the same public-shape safety class as a\n * repo slug.\n *\n * `--no-renames` so a rename surfaces as a clean delete + add of full paths\n * (never a `{old => new}` compound path), which a per-file rollup can key on.\n * The pure parser below is unit-tested; the `git` invocation is a thin,\n * best-effort wrapper that mirrors {@link checkPullRequestOutcome}.\n */\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst pexec = promisify(execFile);\n\n/** One file's aggregated line delta across the window. */\nexport interface FileChange {\n  /** Repo-relative path (git emits repo-relative; never an absolute path). */\n  path: string;\n  lines_added: number;\n  lines_deleted: number;\n}\n\n/** Parse aggregated per-file line counts from `git log --numstat` output. A\n * numstat line is `<added>\\t<deleted>\\t<path>`; `-` marks a binary file (counted\n * as 0 lines). Non-numstat lines (the per-commit `--format` header, blanks) are\n * ignored, so the same `(added, deleted, path)` from several commits sums. Pure. */\nexport function parseNumstat(stdout: string): FileChange[] {\n  const byPath = new Map<string, FileChange>();\n  for (const line of stdout.split(\"\\n\")) {\n    const m = /^(\\d+|-)\\t(\\d+|-)\\t(.+)$/.exec(line);\n    if (!m) continue;\n    const path = m[3] as string;\n    const added = m[1] === \"-\" ? 0 : Number(m[1]);\n    const deleted = m[2] === \"-\" ? 0 : Number(m[2]);\n    const e = byPath.get(path);\n    if (e) {\n      e.lines_added += added;\n      e.lines_deleted += deleted;\n    } else {\n      byPath.set(path, { path, lines_added: added, lines_deleted: deleted });\n    }\n  }\n  return [...byPath.values()];\n}\n\n/**\n * Aggregate the files changed by commits authored in [`since`, `until`] in the\n * repo at `cwd`. `since`/`until` are ISO-8601 instants (the session's window).\n * Best-effort: returns null when `cwd` isn't a git repo or git fails. Bounded\n * to recent history + a short timeout, like {@link checkPullRequestOutcome}.\n */\nexport async function collectFilesChanged(\n  cwd: string,\n  since: string,\n  until: string,\n): Promise<FileChange[] | null> {\n  try {\n    const { stdout } = await pexec(\n      \"git\",\n      [\n        \"-c\",\n        \"core.quotePath=false\",\n        \"log\",\n        `--since=${since}`,\n        `--until=${until}`,\n        \"--numstat\",\n        \"--no-renames\",\n        \"--format=%H\",\n        \"-n\",\n        \"2000\",\n      ],\n      { cwd, timeout: 4_000, maxBuffer: 16 * 1024 * 1024 },\n    );\n    return parseNumstat(stdout);\n  } catch {\n    return null;\n  }\n}\n","/**\n * Single source of truth for pricing. Shared across every surface that\n * displays or computes a bill, so changing a number here flows through\n * everywhere (landing copy, in-app gauge, usage reporting).\n */\n\nexport const BILLION = 1_000_000_000n;\nexport const MILLION = 1_000_000n;\n\n/** Plan ids. */\nexport type Plan = \"free\" | \"team\";\n\n/**\n * Free plan — hard cap. When an org on `free` hits this we keep\n * accepting events for a grace window but classification is paused\n * so the usage counter can't runaway past the cap.\n */\nexport const FREE_INCLUDED_TOKENS = 100n * MILLION;\n\n/** Team plan — per-seat entitlement, pooled across the org. */\nexport const TEAM_INCLUDED_PER_SEAT = 250n * MILLION;\nexport const TEAM_SEAT_PRICE_USD_CENTS = 500; // $5.00\n\n/**\n * Overage: $25 per billion tokens. Expressed as cents per million\n * so integer math never loses precision when reporting usage to a\n * payment processor (most take integer cents as unit amounts).\n *   $25 / 1,000 M = $0.025 / M = 2.5¢ / M → 2.5 cents/M = 25 cents / 10M\n * We bill in units of 1M tokens at 2.5 cents. Where the processor\n * requires an integer unit amount, use the decimal-string variant.\n */\nexport const OVERAGE_CENTS_PER_MILLION = 2.5; // $0.025 / M\nexport const OVERAGE_USD_PER_BILLION = 25;\n\n/**\n * Compute the current-period bill for an org, in USD cents.\n * Returns { baseCents, overageCents, totalCents, includedTokens,\n * overageTokens } so the UI can show each component.\n */\nexport function computeBill(opts: {\n  plan: Plan;\n  seatCount: number;\n  tokensProcessed: bigint;\n}): {\n  baseCents: number;\n  overageCents: number;\n  totalCents: number;\n  includedTokens: bigint;\n  overageTokens: bigint;\n} {\n  if (opts.plan === \"free\") {\n    return {\n      baseCents: 0,\n      overageCents: 0,\n      totalCents: 0,\n      includedTokens: FREE_INCLUDED_TOKENS,\n      overageTokens: 0n,\n    };\n  }\n  const seatCount = BigInt(Math.max(1, opts.seatCount));\n  const included = TEAM_INCLUDED_PER_SEAT * seatCount;\n  const overage =\n    opts.tokensProcessed > included ? opts.tokensProcessed - included : 0n;\n  const baseCents = Number(seatCount) * TEAM_SEAT_PRICE_USD_CENTS;\n  // Overage: integer-rounded in cents, to the nearest million.\n  const overageMillions = Number(overage / MILLION); // lossy but OK for display\n  const overageCents = Math.round(overageMillions * OVERAGE_CENTS_PER_MILLION);\n  return {\n    baseCents,\n    overageCents,\n    totalCents: baseCents + overageCents,\n    includedTokens: included,\n    overageTokens: overage,\n  };\n}\n\nexport function formatUsd(cents: number): string {\n  const dollars = cents / 100;\n  return `$${dollars.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\nexport function formatTokens(n: bigint | number): string {\n  const v = typeof n === \"bigint\" ? Number(n) : n;\n  if (v >= 1e9) return `${(v / 1e9).toFixed(v >= 1e10 ? 0 : 1)}B`;\n  if (v >= 1e6) return `${(v / 1e6).toFixed(v >= 1e7 ? 0 : 1)}M`;\n  if (v >= 1e3) return `${(v / 1e3).toFixed(0)}K`;\n  return v.toString();\n}\n","/**\n * Canonical enumerations shared across every consumer of the modelstat\n * ingest contract. Keep this list small and meaningful — adding a value\n * is cheap; changing one is a migration.\n */\n\nexport const AGENTS = [\n  \"claude_code\",\n  \"claude_desktop\",\n  \"codex_cli\",\n  \"codex_desktop\",\n  \"cursor\",\n  \"windsurf\",\n  \"void\",\n  \"zed\",\n  \"vscode_copilot\",\n  \"vscode_copilot_chat\",\n  \"vscode_cline\",\n  \"vscode_continue\",\n  \"vscode_codeium\",\n  \"jetbrains_copilot\",\n  \"jetbrains_ai\",\n  \"xcode_copilot\",\n  \"gemini_cli\",\n  \"aider\",\n  \"opencode\",\n  \"crush\",\n  \"kimi\",\n  \"pi\",\n  \"openclaw\",\n  \"hermes\",\n  \"ollama\",\n  \"raw_sdk_anthropic\",\n  \"raw_sdk_openai\",\n  \"raw_sdk_google\",\n  // Web chat UIs (Chrome-extension daemon). Categorically distinct\n  // from *_cli / *_desktop agents — same provider, different surface.\n  \"chatgpt_web\",\n  \"claude_web\",\n  \"gemini_web\",\n  \"grok_web\",\n  \"unknown\",\n] as const;\nexport type Agent = (typeof AGENTS)[number];\n\nexport const PROVIDERS = [\n  \"anthropic\",\n  \"openai\",\n  \"google\",\n  \"cursor\",\n  \"github\", // copilot\n  \"deepseek\",\n  \"moonshot\",\n  \"mistral\",\n  \"xai\",\n  \"ollama_local\",\n  \"unknown\",\n] as const;\nexport type Provider = (typeof PROVIDERS)[number];\n\n/** Top-level categorisation of a session. Closed enum — keeps the cross-org\n * taxonomy sane. Finer-grained custom labels live under `areas`. */\nexport const WORK_TYPES = [\n  \"planning\",\n  \"implementation\",\n  \"debugging\",\n  \"review\",\n  \"refactoring\",\n  \"testing\",\n  \"docs\",\n  \"devops\",\n  \"research\",\n  \"ops\",\n  \"chat\",\n  \"misc\",\n] as const;\nexport type WorkType = (typeof WORK_TYPES)[number];\n\nexport const IDENTITY_OWNER_SCOPES = [\"org\", \"personal\", \"unassigned\"] as const;\nexport type IdentityOwnerScope = (typeof IDENTITY_OWNER_SCOPES)[number];\n\nexport const INSTALL_METHODS = [\n  \"homebrew\",\n  \"homebrew_cask\",\n  \"npm_global\",\n  \"pnpm_global\",\n  \"yarn_global\",\n  \"bun_global\",\n  \"cargo_install\",\n  \"pipx\",\n  \"app_bundle\", // macOS .app\n  \"deb\",\n  \"rpm\",\n  \"aur\",\n  \"nix\",\n  \"flatpak\",\n  \"snap\",\n  \"manual\",\n  \"docker\",\n  \"chrome_extension\",\n  \"unknown\",\n] as const;\nexport type InstallMethod = (typeof INSTALL_METHODS)[number];\n\nexport const OS_FAMILIES = [\"macos\", \"linux\", \"windows\", \"other\"] as const;\nexport type OSFamily = (typeof OS_FAMILIES)[number];\n\n/** Membership roles inside an org. */\nexport const MEMBERSHIP_ROLES = [\n  \"owner\",\n  \"admin\",\n  \"finance\",\n  \"member\",\n  \"viewer\",\n] as const;\nexport type MembershipRole = (typeof MEMBERSHIP_ROLES)[number];\n\nexport const EVENT_KINDS = [\n  \"user_message\",\n  \"assistant_message\",\n  \"tool_call\",\n  \"tool_result\",\n  \"summary\",\n] as const;\nexport type EventKind = (typeof EVENT_KINDS)[number];\n\n/** Outcome of one tool invocation (see ToolCallWire in schemas.ts).\n * `unknown` = the tool_use never got a matching tool_result in the\n * transcript (still running, crashed, or the file was cut off). */\nexport const TOOL_CALL_STATUSES = [\n  \"success\",\n  \"error\",\n  \"denied\",\n  \"timeout\",\n  \"unknown\",\n] as const;\nexport type ToolCallStatus = (typeof TOOL_CALL_STATUSES)[number];\n\n/**\n * Default taxonomy roots seeded for a new org. This is NOT a closed\n * enum — roots can be added/removed/renamed. Keep these generic enough\n * that most orgs keep most of them, narrow enough to be immediately\n * useful out of the box.\n *\n * Each entry: slug used as root_key + display `name` + `color` hint\n * the dashboard starts with.\n */\nexport const DEFAULT_TAXONOMY_ROOTS: ReadonlyArray<{\n  slug: string;\n  name: string;\n  color: string;\n  description: string;\n}> = [\n  { slug: \"projects\",     name: \"Projects\",     color: \"#60a5fa\", description: \"Which codebase or product are we working in?\" },\n  { slug: \"domains\",      name: \"Domains\",      color: \"#f472b6\", description: \"Which functional area (auth, billing, ingestion, …)?\" },\n  { slug: \"initiatives\",  name: \"Initiatives\",  color: \"#fb923c\", description: \"Multi-week efforts the work rolls up into.\" },\n  { slug: \"environments\", name: \"Environments\", color: \"#a3e635\", description: \"Prod vs staging vs dev.\" },\n  { slug: \"persons\",      name: \"Persons\",      color: \"#c084fc\", description: \"Teammates referenced in the work.\" },\n  { slug: \"providers\",    name: \"Providers\",    color: \"#22d3ee\", description: \"Anthropic, OpenAI, Google, …\" },\n  { slug: \"models\",       name: \"Models\",       color: \"#34d399\", description: \"Specific model versions used.\" },\n  { slug: \"work_types\",   name: \"Work types\",   color: \"#facc15\", description: \"Refactor, feature, bugfix, review, …\" },\n  { slug: \"agents\",       name: \"Agents\",       color: \"#f87171\", description: \"Claude Code, Cursor, ChatGPT Web, …\" },\n  { slug: \"components\",   name: \"Components\",   color: \"#818cf8\", description: \"File-or-module-level slices touched by the session.\" },\n  // NB: \"agents\" above = the AI client (claude_code, cursor, …). \"tool_calls\"\n  // = the tools those agents invoke — builtin (Bash, Read) and MCP (mcp:github/create_pr).\n  { slug: \"tool_calls\",   name: \"Tool calls\",   color: \"#2dd4bf\", description: \"Tools invoked by agents — builtin (Bash, Read, …) and MCP (mcp:server/tool).\" },\n];\n\n/** Daemon heartbeat phases. Both CLI and extension emit these via the\n * same HeartbeatPayload schema (packages/core/src/schemas.ts → HeartbeatPayload).\n * Extension treats unused phases as \"never reached\" — still in the enum\n * so the contract stays uniform. */\nexport const DAEMON_PHASES = [\n  \"starting\",\n  \"discovering\",\n  \"idle\",\n  \"scanning\",\n  \"processing\",\n  \"uploading\",\n  \"watching\",\n  \"offline\",\n  \"error\",\n] as const;\nexport type DaemonPhase = (typeof DAEMON_PHASES)[number];\n\n/** How confidently the classifier assigned a work_type / area. */\nexport const CLASSIFICATION_CONFIDENCE = [\n  \"hard\", // deterministic (from git remote, filenames, etc.)\n  \"high\", // >0.8 cosine\n  \"medium\", // 0.6–0.8\n  \"low\", // <0.6\n  \"unclassified\",\n] as const;\nexport type ClassificationConfidence = (typeof CLASSIFICATION_CONFIDENCE)[number];\n","/**\n * ID helpers. modelstat IDs are ULIDs almost everywhere (sortable, URL-safe,\n * 26 chars) — except for provider-side identifiers which we keep in their\n * native format to make reconciliation easy.\n *\n * All id helpers are runtime-agnostic: they work in Node 20+ and in the\n * browser (Chrome extension service worker). See\n * docs/daemon-unification.md for the policy.\n */\n/**\n * Inline ULID — runtime-agnostic (Node 20+, MV3 service worker, browser).\n *\n * We don't use the `ulid` npm package because newer versions check for\n * `window.crypto` at import time and throw \"secure crypto unusable\" in MV3\n * service workers (no `window`). globalThis.crypto.getRandomValues exists\n * in all target runtimes.\n */\nconst ULID_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nfunction ulid(seedTime?: number): string {\n  const t = seedTime ?? Date.now();\n  let timeStr = \"\";\n  let ts = t;\n  for (let i = 9; i >= 0; i--) {\n    timeStr = ULID_ALPHABET[ts % 32] + timeStr;\n    ts = Math.floor(ts / 32);\n  }\n  const bytes = new Uint8Array(16);\n  globalThis.crypto.getRandomValues(bytes);\n  let randStr = \"\";\n  for (let i = 0; i < 16; i++) {\n    randStr += ULID_ALPHABET[bytes[i]! % 32];\n  }\n  return timeStr + randStr;\n}\n\nexport const newId = (): string => ulid();\n\n/** Alias used by the ingest pipeline when creating a new IngestBatch. */\nexport const batchId = (): string => ulid();\n\n/** UUIDv7 — time-ordered, v7-tagged. Uses the platform's crypto.randomUUID()\n * to emit a v4 string then rewrites the timestamp + version nibble. Works\n * in both Node 19+ and modern browsers. */\nexport function uuidv7(): string {\n  // Start from a v4 from the platform RNG (both Node and browser have it).\n  const v4 = crypto.randomUUID();\n  const ms = Date.now();\n  const msHex = ms.toString(16).padStart(12, \"0\");\n  // v4 shape: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n  // v7 shape: hhhhhhhh-hhhh-7xxx-yxxx-xxxxxxxxxxxx (h = big-endian ms)\n  const part0 = msHex.slice(0, 8);\n  const part1 = msHex.slice(8, 12);\n  const part2 = `7${v4.slice(15, 18)}`; // keep last 3 random hex digits, flip version\n  const rest = v4.slice(19); // \"yxxx-xxxxxxxxxxxx\"\n  return `${part0}-${part1}-${part2}-${rest}`;\n}\n\n/**\n * Deterministic dedupe key for a single parsed event.\n *\n * Three legal shapes for `source`:\n *   - `{ file, byteOffset }` — CLI daemon parsing JSONL\n *   - `{ host, conversationId, messageId }` — Chrome extension capturing\n *     a web chat turn\n *   - `{ lineUuid }` — position-independent key for transcript lines whose\n *     identity is the uuid embedded in the line itself. Used for lines that\n *     tools copy verbatim into new files (Claude Code resume transcripts):\n *     a (file, byteOffset) key would mint a fresh id per copy and the\n *     server would count the same turn twice.\n *\n * Output format: `evt_<base36(djb2-64)>`. djb2 is not cryptographic but is\n * collision-free at our event scale (< 1e10 events lifetime) and keeps ids\n * short. Deterministic across Node + browser; no Web Crypto needed.\n *\n * Legacy signature `sourceEventId(deviceId, filePath, byteOffset)` is\n * preserved for backward compat — existing callers don't change. The key\n * derivation for existing shapes is a wire contract: the server dedupes on\n * (scope_id, source_event_id), so changing how a shape hashes would re-ingest\n * all previously-uploaded history under new ids.\n */\nexport function sourceEventId(\n  deviceId: string,\n  sourceOrFilePath:\n    | string\n    | { file: string; byteOffset: number }\n    | { host: string; conversationId: string; messageId: string }\n    | { lineUuid: string },\n  byteOffsetMaybe?: number,\n): string {\n  let key: string;\n  if (typeof sourceOrFilePath === \"string\") {\n    // Legacy 3-arg form.\n    const byteOffset = byteOffsetMaybe ?? 0;\n    key = `fs::${sourceOrFilePath}::${byteOffset}`;\n  } else if (\"file\" in sourceOrFilePath) {\n    key = `fs::${sourceOrFilePath.file}::${sourceOrFilePath.byteOffset}`;\n  } else if (\"lineUuid\" in sourceOrFilePath) {\n    key = `uuid::${sourceOrFilePath.lineUuid}`;\n  } else {\n    key = `web::${sourceOrFilePath.host}::${sourceOrFilePath.conversationId}::${sourceOrFilePath.messageId}`;\n  }\n  const s = `${deviceId}::${key}`;\n  // djb2 hash, base36\n  let h = 5381n;\n  for (let i = 0; i < s.length; i++) {\n    h = (h * 33n) ^ BigInt(s.charCodeAt(i));\n    h &= 0xffffffffffffffffn;\n  }\n  return `evt_${h.toString(36)}`;\n}\n\n/**\n * Deterministic id for a segment. Re-running the summariser pipeline on the\n * exact same input events produces the same id → upserts are idempotent at\n * the segment level (see docs/ingestion-pipeline.md \"Idempotent at every\n * boundary\").\n *\n * Uses djb2-64 like sourceEventId so it runs without Web Crypto (service\n * workers inherit globalThis.crypto but we prefer synchronous code here).\n * Collision resistance is sufficient: ~1e5 segments per user lifetime\n * keeps birthday probability negligible.\n */\nexport function segmentId(\n  sessionId: string,\n  startedAtMs: number,\n  endedAtMs: number,\n  sourceEventIds: readonly string[],\n): string {\n  const sorted = [...sourceEventIds].sort().join(\",\");\n  const s = `${sessionId}|${startedAtMs}|${endedAtMs}|${sorted}`;\n  let h = 5381n;\n  for (let i = 0; i < s.length; i++) {\n    h = (h * 33n) ^ BigInt(s.charCodeAt(i));\n    h &= 0xffffffffffffffffn;\n  }\n  return `seg_${h.toString(36)}`;\n}\n\n/**\n * Deterministic, value-masked \"shape\" of a command's arguments — the tier-1\n * skeleton that may ride the wire. Generic and privacy-first: it keeps\n * STRUCTURE (flags) and masks every value to `§`, so no raw value can leak.\n * The executable is NOT part of `args` — the caller passes the command with\n * the leading program already stripped (it ships separately as `executable`).\n *\n * CROSS-REPO CONTRACT: the backend's Rust implementation reproduces this\n * bit-for-bit — pinned by the golden vectors in ids.test.ts and a matching\n * backend test. Rules: tokenize on ASCII whitespace; a `-`-leading token is a\n * flag, kept verbatim except `--key=value` → `--key=§`; every other\n * (positional/value) token → `§`; join with single spaces.\n *\n * NOTE: conservative for now — masks ALL positionals, including leading\n * subcommands. Whether to keep subcommand keywords is an open policy question\n * (utility vs. leak risk).\n */\nexport function paramShape(args: string): string {\n  const MASK = \"§\";\n  return args\n    .split(/[ \\t\\n\\r\\f]+/)\n    .filter((t) => t.length > 0)\n    .map((t) => {\n      if (t.startsWith(\"-\")) {\n        const eq = t.indexOf(\"=\");\n        return eq === -1 ? t : `${t.slice(0, eq + 1)}${MASK}`;\n      }\n      return MASK;\n    })\n    .join(\" \");\n}\n","/**\n * The `policies` config kind: a signed, ADDITIVE redaction augment layered\n * over the local privacy floor (`./redact-floor`).\n *\n * Hard invariant, enforced by construction: a bundle can only ADD secret\n * patterns. There is no field that removes, disables, or replaces the floor —\n * the worst a (validly signed) bundle can do is cause *more* redaction. The\n * floor itself is compiled into the binary and applied unconditionally\n * (`./redact`). See the never-weakenable tests.\n *\n * This module is the one that may use zod — it is consumed by the daemon's\n * signed-config loader, never by the published SDK (which\n * imports only the dependency-free `./redact-floor`).\n */\n\nimport { z } from \"zod\";\nimport type { RemoteRedactionPattern } from \"./redact.js\";\n\nexport const RedactionPattern = z.object({\n  /** Stable label for the `[REDACTED:name]` placeholder. */\n  name: z\n    .string()\n    .min(1)\n    .max(64)\n    .regex(/^[a-z0-9_]+$/, \"name must be lowercase a-z0-9_\"),\n  /** JS regex source. Compiled with the `g` flag on the client. */\n  regex: z.string().min(1).max(1000),\n  /** Optional extra flags; `g` is always added. Limited to `i m s u`. */\n  flags: z\n    .string()\n    .max(8)\n    .regex(/^[imsu]*$/, \"only i m s u flags allowed\")\n    .optional(),\n});\nexport type RedactionPattern = z.infer<typeof RedactionPattern>;\n\nexport const RedactionPolicyBundle = z.object({\n  version: z.number().int().nonnegative(),\n  /** Additive patterns unioned ON TOP of the bundled floor. There is, by\n   * design, no way to express removal — only addition. */\n  patterns: z.array(RedactionPattern).max(256),\n});\nexport type RedactionPolicyBundle = z.infer<typeof RedactionPolicyBundle>;\n\n/** The bundled fallback: no augment. The floor alone applies until a signed\n * bundle is verified. */\nexport const POLICIES_BUNDLED_FALLBACK: RedactionPolicyBundle = { version: 0, patterns: [] };\n\n/**\n * Config-kind descriptor for `@modelstat/remote-config`'s loader. Typed\n * structurally so `@modelstat/core` need not depend on the loader package.\n */\nexport const POLICIES_CONFIG_KIND: {\n  readonly kind: \"policies\";\n  readonly schema: typeof RedactionPolicyBundle;\n  readonly bundledFallback: RedactionPolicyBundle;\n} = {\n  kind: \"policies\",\n  schema: RedactionPolicyBundle,\n  bundledFallback: POLICIES_BUNDLED_FALLBACK,\n};\n\n/**\n * Compile a verified bundle's patterns into runnable redaction patterns.\n * Invalid regexes are skipped, never thrown — a bad remote pattern must not\n * take down redaction. The `g` flag is always present so `String.replace`\n * redacts every occurrence.\n */\nexport function compilePolicyPatterns(bundle: RedactionPolicyBundle): RemoteRedactionPattern[] {\n  const out: RemoteRedactionPattern[] = [];\n  for (const p of bundle.patterns) {\n    const flags = `g${p.flags ?? \"\"}`;\n    try {\n      out.push({ name: p.name, pattern: new RegExp(p.regex, flags) });\n    } catch {\n      // skip an un-compilable pattern; the floor still applies regardless\n    }\n  }\n  return out;\n}\n","import { z } from \"zod\";\nimport {\n  AGENTS,\n  CLASSIFICATION_CONFIDENCE,\n  DAEMON_PHASES,\n  EVENT_KINDS,\n  IDENTITY_OWNER_SCOPES,\n  INSTALL_METHODS,\n  OS_FAMILIES,\n  PROVIDERS,\n  TOOL_CALL_STATUSES,\n} from \"./enums.js\";\nimport { EventReferences, SessionMetadata } from \"./session-metadata.js\";\n\n/**\n * Canonical event — one row per meaningful turn inside a session.\n * Every parser (Claude Code JSONL, Codex rollout, Cursor SQLite, …)\n * normalises into this shape. The ingest endpoint only accepts this shape.\n */\n\nexport const TokenUsage = z.object({\n  input: z.number().int().nonnegative().default(0),\n  output: z.number().int().nonnegative().default(0),\n  cache_creation: z.number().int().nonnegative().default(0),\n  cache_read: z.number().int().nonnegative().default(0),\n  /** Present on reasoning-model turns (Codex gpt-5.4, Claude extended thinking). */\n  reasoning: z.number().int().nonnegative().default(0),\n});\nexport type TokenUsage = z.infer<typeof TokenUsage>;\n\n/** Git context derived from cwd → nearest `.git`. */\nexport const GitContext = z.object({\n  remote_url: z.string().nullable(),\n  remote_host: z.string().nullable(), // \"github.com\"\n  remote_slug: z.string().nullable(), // \"org/repo\"\n  branch: z.string().nullable(),\n});\nexport type GitContext = z.infer<typeof GitContext>;\n\n/** One raw event from the agent. `source_event_id` is the dedupe key. */\nexport const RawEvent = z.object({\n  source_event_id: z.string(),\n  ts: z.string().datetime({ offset: true }),\n  kind: z.enum(EVENT_KINDS),\n\n  // Attribution\n  agent: z.enum(AGENTS),\n  provider: z.enum(PROVIDERS),\n  model: z.string().max(120).nullable(),\n  session_id: z.string().max(120), // agent-local session id (UUID in most cases)\n  turn_index: z.number().int().nonnegative().nullable(),\n  parent_event_id: z.string().nullable(), // for subagent turns\n\n  // Location\n  cwd: z.string().nullable(),\n  git: GitContext.nullable(),\n\n  // Resource usage\n  tokens: TokenUsage.nullable(),\n  duration_ms: z.number().int().nonnegative().nullable(),\n\n  // Tool calls (aggregate only)\n  tool_calls: z.record(z.string(), z.number().int().nonnegative()).default({}),\n\n  // Files touched, relative to git root. Never absolute — scrubbed by agent.\n  files_touched: z.array(z.string().max(512)).max(256).default([]),\n\n  // Redacted excerpt of the conversation turn (user prompt or\n  // assistant response). The PARSER is responsible for:\n  //   1. Pulling a representative snippet from the turn (≤320 chars).\n  //   2. Running it through @modelstat/core/redact PLUS, when\n  //      available, the on-device Privacy Filter adapter.\n  //   3. Stripping code blocks and file-path noise.\n  // Optional — events without it fall back to metadata-only abstracts\n  // (the historical behaviour). The daemon-core pipeline runs\n  // redact() over it again as defence-in-depth before building the\n  // summarize prompt; it never gets stored long-term server-side, only\n  // used to construct the summarize input.\n  content_excerpt: z.string().max(320).optional(),\n\n  // Public code references (PRs, issues, repos) detected on-device\n  // from this turn's FULL text — the high-recall feed the server rolls up into\n  // SessionMetadata. Only public reference shapes (forge URLs, slugs, numbers,\n  // ticket keys) ride here, never raw text — so it is derived pre-redaction\n  // safely (same class as git.remote_slug). Optional + additive.\n  references: EventReferences.optional(),\n\n  // Reference to originating file for reparsing\n  source_file: z.string().max(1024).nullable(),\n  source_byte_offset: z.number().int().nonnegative().nullable(),\n\n  // Billing mode. Agents with a flat-fee subscription tier (Claude\n  // Code, Cursor Pro, GitHub Copilot, etc) emit events tagged\n  // `pricing_mode: \"subscription\"` — the server short-circuits cost to $0\n  // for those, since token-level pricing doesn't apply once the user\n  // is paying the subscription. `api` (or absent) means pay-per-token\n  // against whatever rates the org has configured.\n  pricing_mode: z.enum([\"subscription\", \"api\"]).optional(),\n});\nexport type RawEvent = z.infer<typeof RawEvent>;\n\n/** Redaction report summary — counts only, never actual content.\n *\n * Three guaranteed fields cover the regex pass (secrets / emails /\n * absolute-paths). Additional `pf_<category>` keys appear when the\n * daemon runs the OpenAI Privacy Filter model client-side — one\n * counter per detected category (pf_name, pf_address, pf_email, etc.).\n * `.catchall()` keeps them on the parsed object instead of stripping. */\nexport const RedactionReport = z\n  .object({\n    secrets_found: z.number().int().nonnegative().default(0),\n    emails_redacted: z.number().int().nonnegative().default(0),\n    paths_redacted_absolute: z.number().int().nonnegative().default(0),\n  })\n  .catchall(z.number().int().nonnegative());\nexport type RedactionReport = z.infer<typeof RedactionReport>;\n\n/** Daemon-tagged segment — the unit of sync between daemon and server.\n *\n * A segment is a semantically-coherent slice of a session: its own tokens,\n * its own tags, its own redacted abstract. The daemon produces segments\n * by redact → tokenize → segment → summarise → tag on device; the server\n * never sees unredacted text.\n *\n * `segment_id` is deterministic (sha256 of session_id ‖ start ‖ end ‖\n * sorted(source_event_ids)), so re-running the pipeline on the same events\n * reproduces the same id and upload is idempotent at the segment level. */\n/**\n * A daemon-emitted tag hint. `root_key` + `name` together identify a\n * target taxonomy node inside the owning org. Root keys are NOT a fixed\n * enum — each org's taxonomy tree can have any set of roots; the\n * TAXONOMY_ROOTS constant in @modelstat/core/enums is just the seed\n * list inserted into a freshly-created org.\n *\n * The server may re-derive its own classification from these hints; the\n * raw hint list also lives on the segment as a debuggable audit trail.\n */\nexport const TaxonomyHintRooted = z.object({\n  root_key: z.string().max(60),\n  name: z.string().max(120),\n  confidence: z.number().min(0).max(1).default(0.7),\n  /** Optional free-text reason the daemon attached this tag — surfaces\n   * in the audit log so the user can see \"why was this tagged X?\" */\n  reason: z.string().max(200).optional(),\n});\nexport type TaxonomyHintRooted = z.infer<typeof TaxonomyHintRooted>;\n\nexport const Segment = z.object({\n  /** sha256-based deterministic id — see @modelstat/core/ids.ts segmentId(). */\n  segment_id: z.string().max(64),\n  session_id: z.string().max(120),\n  agent: z.enum(AGENTS),\n  started_at: z.string().datetime({ offset: true }),\n  ended_at: z.string().datetime({ offset: true }),\n  /** Pre-redacted abstract, ≤ 512 chars. Never contains PII. */\n  abstract: z.string().max(512),\n  /** Tokens spent inside this segment only. */\n  tokens: TokenUsage,\n  /** Tags with strongly-typed root keys. The server may merge these with\n   * its own classifier output. */\n  tags: z.array(TaxonomyHintRooted).max(40).default([]),\n  /** Counts of what was stripped. */\n  redaction: RedactionReport,\n  /** `source_event_id`s covered by this segment. Used for dedupe + replay. */\n  source_event_ids: z.array(z.string()).max(2000),\n  /** Optional embedding of the abstract (BGE-small-en-v1.5, 384 dims).\n   * Present when the daemon has an Embedder adapter configured. */\n  abstract_embedding: z.array(z.number()).length(384).optional(),\n  /** Privacy-preserving on-device behavioral signal — COUNTS/RATIOS ONLY,\n   * never raw text (mirrors RedactionReport). Powers server-side prompt-\n   * friction detection. Optional so older daemons that omit it still validate. */\n  behavior: z\n    .object({\n      /** Developer messages in this segment. */\n      user_turns: z.number().int().nonnegative().default(0),\n      /** User messages that land right after the assistant — a re-prompt /\n       * correction proxy. */\n      correction_count: z.number().int().nonnegative().default(0),\n      /** 0-1 frustration estimate (re-prompt density + negative mood tags). */\n      frustration: z.number().min(0).max(1).default(0),\n    })\n    .optional(),\n  /** Distilled \"what the developer asked for / how they directed the AI\" — from\n   * their MESSAGES ONLY (not the assistant's actions), redacted, ≤512. The\n   * source Insights' rule + skill detectors mine, distinct from the outcome\n   * `abstract`. Optional; absent from daemons that predate it. */\n  user_intent: z.string().max(512).optional(),\n});\nexport type Segment = z.infer<typeof Segment>;\n\n/**\n * On-device action decomposition of a tool call — a nested, additive object so\n * the top-level ToolCallWire stays stable as attributes grow. Bit-aligned with\n * the backend's Rust wire schema: the field set, caps, and defaults must match\n * exactly. Privacy: only governed tokens, the value-masked `param_shape`, and\n * the compliance-redacted command (PII/secrets stripped) ride this —\n * un-redacted raw never does. Produced on-device.\n */\nexport const ToolAction = z\n  .object({\n    /** Where it ran: `shell`, `mcp`, `builtin`, `browser`. (tier 0) */\n    surface: z.string().max(40),\n    /** Concrete program/operation, or a generic bucket token. (tier 0 | bucket) */\n    executable: z.string().max(80).nullable().default(null),\n    /** Verb/intent (`restart`, `read`, …). (tier 0) */\n    action: z.string().max(40).nullable().default(null),\n    /** What it acts on (`deployment`, `file`, …). (tier 0) */\n    object: z.string().max(60).nullable().default(null),\n    /** Governed safe flags (`destructive`, `remote`, …). (tier 0) */\n    qualifiers: z.array(z.string().max(40)).max(8).default([]),\n    /** Value-masked argument skeleton (every value → `§`). Carried in full up\n     * to a malicious-size guard (mirrors backend `MAX_TOOL_ACTION_PARAM_SHAPE_CHARS`);\n     * the daemon clamps rather than truncating semantically. (tier 1) */\n    param_shape: z.string().max(16_384).nullable().default(null),\n    /** Relevant non-sensitive keywords (e.g. [\"rollout\",\"restart\",\"prod\"]),\n     * OpenAI-redacted on-device. (tier 0) */\n    keywords: z.array(z.string().max(40)).max(12).default([]),\n    /** Human-readable command summary (e.g. \"redeploying service payments-api\"),\n     * OpenAI-redacted on-device. (tier 0) */\n    abstract: z.string().max(200).nullable().default(null),\n    /** The compliance-redacted command text — PII/secrets stripped on-device\n     * (SOC2/GDPR), org-internal infra intact; the server derives semantics from\n     * it. Un-redacted raw never ships. (tier 0, post-redaction) */\n    command_redacted: z.string().max(16_384).nullable().default(null),\n    /** Per-script content abstracts for any script/bash FILES the command runs\n     * — summarized on-device by the local model, then redacted. Ordered by\n     * appearance; `token` is the script's token exactly as it appears in\n     * `command_redacted`, so the backend deterministically zips each `summary`\n     * to its place when ingesting the command + its scripts. (tier 0) */\n    scripts: z\n      .array(z.object({ token: z.string().max(200), summary: z.string().max(200) }))\n      .max(8)\n      .default([]),\n    /** Extractor confidence in [0, 1]. */\n    confidence: z.number().min(0).max(1).default(0),\n    /** Provenance of the extraction, e.g. `shell.v3`. */\n    extractor: z.string().max(40),\n  })\n  .strict();\nexport type ToolAction = z.infer<typeof ToolAction>;\n\n/**\n * One tool invocation made by an agent during a session — the per-call\n * daemon to RawEvent.tool_calls (which stays an aggregate count map).\n *\n * Naming discipline: `agent` is the AGENTS enum value (claude_code,\n * codex_cli, …) — the AI client that ran the call. `server`/`name`\n * describe the invoked capability (Bash, Read, mcp:github/create_pr).\n * Never conflate the two.\n *\n * PRIVACY CONTRACT: no raw tool arguments, results, file paths, or\n * command text ever ride this wire. The only payload-derived fields\n * are one-way hashes (`args_hash` / `signature_hash`), byte sizes\n * (`args_bytes` / `result_bytes`), and the governed, value-masked\n * `action` decomposition (ToolAction, tier ≤ 1) — governed tokens and\n * a `§`-masked param skeleton, never the command itself. Tool names\n * ship verbatim: they are vendor identifiers, not user content\n * (dynamic-looking hex/UUID tails are normalised to `<dyn>` at parse\n * time).\n */\nexport const ToolCallWire = z.object({\n  /** tool_use block `id` / codex `call_id`; parsers fall back to a\n   * deterministic `tc_<djb2-base36>` of `${source_event_id}|${call_index}`\n   * when the source line carries no id. */\n  external_call_id: z.string().max(120),\n  /** Agent-local session id — same id space as RawEvent.session_id. */\n  session_id: z.string().max(120),\n  /** The RawEvent that contained the tool_use (dedupe/replay anchor). */\n  source_event_id: z.string(),\n  /** Segment containing source_event_id — filled by the daemon at\n   * batch-build time when known, else null. */\n  segment_id: z.string().max(64).nullable().default(null),\n  /** The agent that made the call (AGENTS enum). */\n  agent: z.enum(AGENTS),\n  /** `builtin` or `mcp:<server>`. */\n  server: z.string().max(120),\n  /** Bare tool name (`Bash`, `create_pr`) — normalised vendor identifier. */\n  name: z.string().max(120),\n  turn_index: z.number().int().nonnegative().nullable(),\n  /** Ordinal of the call within its source event (0-based). */\n  call_index: z.number().int().nonnegative(),\n  /** ts of the line carrying the tool_use. */\n  started_at: z.string().datetime({ offset: true }),\n  /** ts of the line carrying the matching tool_result; null if unmatched. */\n  ended_at: z.string().datetime({ offset: true }).nullable(),\n  status: z.enum(TOOL_CALL_STATUSES),\n  /** Hex sha256 of JSON.stringify(input); `\"\"` when the call had no input. */\n  args_hash: z.string().max(64),\n  /** Sha256 of the sorted top-level arg key names joined by `,`; the\n   * literal `none` when input is not a non-empty object. */\n  signature_hash: z.string().max(64),\n  /** UTF-8 byte length of JSON.stringify(input); 0 if none. */\n  args_bytes: z.number().int().nonnegative(),\n  /** UTF-8 byte length of JSON.stringify(tool_result content); 0 if\n   * unmatched/empty. */\n  result_bytes: z.number().int().nonnegative(),\n  /** Model of the assistant message that issued the call. `<synthetic>`\n   * kept verbatim per the PR #12 attribution rules. */\n  model: z.string().max(120).nullable(),\n  /** On-device action decomposition — nested + additive, `null` when nothing\n   * was extracted. Replaces `command_families`. */\n  action: ToolAction.nullable().default(null),\n});\nexport type ToolCallWire = z.infer<typeof ToolCallWire>;\n\n/** Bundle the daemon ships to the server in one request.\n *\n * The daemon runs the full pipeline locally\n * (redact → segment → summarise → tag) and ships the finished\n * `segments: Segment[]` alongside the raw `events`. Events are\n * internal plumbing (cost math, event-level drilldown);\n * segments are the analytics unit. */\nexport const IngestBatch = z.object({\n  batch_id: z.string(), // ULID\n  device_id: z.string(),\n  daemon_version: z.string().max(40),\n  events: z.array(RawEvent).max(10_000),\n  segments: z.array(Segment).max(2_000).default([]),\n  /** Per-call tool invocations (additive — old agents omit it, old\n   * servers ignore it). See ToolCallWire for the privacy contract:\n   * hashes / byte sizes / governed action tokens only, never payloads. */\n  tool_calls: z.array(ToolCallWire).max(20_000).default([]),\n  /** Optional per-session metadata hint: which installation produced them, etc. */\n  session_installs: z\n    .record(\n      z.string(),\n      z.object({\n        installation_id: z.string(),\n        identity_id: z.string().nullable(),\n      }),\n    )\n    .optional(),\n  /** Optional per-session titles — session_id → short redacted title\n   * (≤120 chars) produced by the daemon's local titler from the\n   * session's segment abstracts. Daemons recompute it from the full\n   * session view on every upload, so the latest batch always carries the\n   * freshest title. Absent for runtimes without a titler (older agents,\n   * no-op browser summariser). */\n  session_titles: z.record(z.string(), z.string().max(120)).optional(),\n  /** Optional per-session deterministic metadata — session_id →\n   * {@link SessionMetadata}: the repos, pull requests, and issues the\n   * session touched, detected on-device across git context, tool calls,\n   * redacted content, and the local model (so it works for any provider).\n   * Additive — old daemons omit it, old servers ignore it (the wire has no\n   * `deny_unknown_fields`). The join layer between AI spend and shipped work. */\n  session_metadata: z.record(z.string(), SessionMetadata).optional(),\n});\nexport type IngestBatch = z.infer<typeof IngestBatch>;\n\n/** Unified heartbeat payload emitted by every daemon. CLI and\n * extension populate all fields; fields that don't apply to a runtime\n * use sensible zeros / nulls rather than being omitted, so the server\n * can parse one schema. */\nexport const HeartbeatPayload = z.object({\n  device_id: z.string(),\n  status: z.enum(DAEMON_PHASES),\n  message: z.string().max(240).nullable(),\n  progress_done: z.number().int().nonnegative().default(0),\n  progress_total: z.number().int().nonnegative().default(0),\n  queue_size: z.number().int().nonnegative().default(0),\n  stats: z.record(z.string(), z.unknown()).default({}),\n  last_event_at: z.string().datetime({ offset: true }).nullable(),\n  daemon_version: z.string().max(40),\n});\nexport type HeartbeatPayload = z.infer<typeof HeartbeatPayload>;\n\n/** Device enrollment payload. */\nexport const DeviceEnrollment = z.object({\n  machine_id: z.string(), // stable, platform-provided\n  hostname: z.string().max(120),\n  os_family: z.enum(OS_FAMILIES),\n  os_version: z.string().max(60),\n  arch: z.enum([\"x86_64\", \"arm64\", \"other\"]),\n  daemon_version: z.string().max(40),\n});\nexport type DeviceEnrollment = z.infer<typeof DeviceEnrollment>;\n\n/**\n * Self-register flow (POST /v1/devices/self-register). The daemon generates\n * an identity client-side (UUIDv7 + optional ed25519 keypair) and registers\n * itself without any prior auth. Server returns a one-time `device_secret`\n * the daemon uses for subsequent calls, plus a 3-word `claim_code` the\n * human will use to attach the device to their account.\n */\nexport const DeviceSelfRegister = z.object({\n  /** Daemon-generated UUIDv7 — must pass shape + recent-timestamp checks. */\n  device_uuid: z.string(),\n  /** Base64-encoded ed25519 public key, exactly 32 raw bytes. Optional\n   * but recommended (used for sender-constrained tokens / DPoP later). */\n  public_key: z.string().optional(),\n  /** Free-form snapshot shown to the human on the claim page so they\n   * can sanity-check what they're claiming. */\n  fingerprint: z\n    .object({\n      hostname: z.string().max(120).optional(),\n      os: z.string().max(60).optional(),\n      os_family: z.enum(OS_FAMILIES).optional(),\n      os_version: z.string().max(60).optional(),\n      arch: z.enum([\"x86_64\", \"arm64\", \"other\"]).optional(),\n      daemon: z.string().max(80).optional(),\n      daemon_version: z.string().max(40).optional(),\n      // Allow extra fields for forward-compat without breaking old agents.\n    })\n    .catchall(z.union([z.string(), z.number(), z.boolean()]))\n    .default({}),\n});\nexport type DeviceSelfRegister = z.infer<typeof DeviceSelfRegister>;\n\nexport const DeviceClaimRequest = z.object({\n  claim_code: z.string().max(40),\n  /** Optional org_id if the user belongs to multiple orgs and wants to\n   * claim into a specific one. Defaults to personal org. */\n  org_id: z.string().uuid().optional(),\n});\nexport type DeviceClaimRequest = z.infer<typeof DeviceClaimRequest>;\n\n/**\n * Provenance for client-side sanitisation. Attached to ingest payloads so\n * the dashboard can show what was redacted/compacted, by which agent, with\n * which policy version. If absent on an upload, the service applies the\n * account's default policy and stamps its own metadata.\n *\n * See the `modelstat` daemon for the canonical client implementation.\n */\nexport const ProcessingMetadata = z.object({\n  redacted_by: z.string().max(120).optional(),\n  redaction_policy: z.string().max(80).optional(),\n  redaction_policy_version: z.string().max(20).optional(),\n  redactions_applied: z.number().int().min(0).optional(),\n  compacted: z.boolean().optional(),\n  summarized: z.boolean().optional(),\n  bytes_saved: z.number().int().min(0).optional(),\n  changes_applied: z.number().int().min(0).optional(),\n  original_size_bytes: z.number().int().min(0).optional(),\n  uploaded_size_bytes: z.number().int().min(0).optional(),\n});\nexport type ProcessingMetadata = z.infer<typeof ProcessingMetadata>;\n\n/**\n * One redaction policy definition the server publishes to clients.\n * Clients (agents, third-party SDKs) fetch /v1/policies and apply the\n * matching named policy locally; the client implementation lives in\n * @modelstat/agent. The server keeps an authoritative registry so a\n * sanitisation policy can be versioned, audited, and updated centrally.\n */\nexport const RedactionPolicy = z.object({\n  name: z.string().max(60),\n  version: z.string().max(20),\n  description: z.string().max(400),\n  redacts: z.array(z.string()).max(40),\n  is_default: z.boolean().default(false),\n  recommended_for: z.string().max(160).optional(),\n});\nexport type RedactionPolicy = z.infer<typeof RedactionPolicy>;\n\n/** One detected tool install on a device. */\nexport const DetectedInstallation = z.object({\n  agent: z.enum(AGENTS),\n  install_method: z.enum(INSTALL_METHODS),\n  binary_path: z.string().nullable(),\n  data_dir: z.string().nullable(),\n  version: z.string().max(40).nullable(),\n  detected_via: z.array(z.string()).max(6),\n});\nexport type DetectedInstallation = z.infer<typeof DetectedInstallation>;\n\n/** A source-account identity detected on the device. */\nexport const DetectedIdentity = z.object({\n  provider: z.enum(PROVIDERS),\n  provider_account_id: z.string().max(200),\n  provider_account_label: z.string().max(200).nullable(),\n  /** Human-facing labels — what the user recognises the account by.\n   *  Populated from the keychain blob / OAuth JWT where available. */\n  account_email: z.string().max(200).nullable().optional(),\n  account_org: z.string().max(200).nullable().optional(),\n  display_name: z.string().max(200).nullable().optional(),\n  owner_scope: z.enum(IDENTITY_OWNER_SCOPES).default(\"unassigned\"),\n  detection_source: z.string().max(80),\n});\nexport type DetectedIdentity = z.infer<typeof DetectedIdentity>;\n\nexport const DiscoveryReport = z.object({\n  device_id: z.string(),\n  installations: z.array(DetectedInstallation).max(200),\n  identities: z.array(DetectedIdentity).max(100),\n  scanned_at: z.string().datetime({ offset: true }),\n});\nexport type DiscoveryReport = z.infer<typeof DiscoveryReport>;\n\nexport const ClassificationConfidenceEnum = z.enum(CLASSIFICATION_CONFIDENCE);\n","export * from \"./billing.js\";\nexport * from \"./enums.js\";\nexport * from \"./ids.js\";\nexport * from \"./policies.js\";\nexport * from \"./redact.js\";\nexport * from \"./redact-floor.js\";\nexport * from \"./schemas.js\";\nexport * from \"./session-metadata.js\";\n","/**\n * Deterministic `executable` normalization for a shell command (`shell.v3`).\n *\n * `executable` is the tier-0 dimension that answers \"which concrete program did\n * this call run?\" — it powers the dashboard's *Executable* breakdown. The v1\n * extractor took the first whitespace token verbatim (`command.split(/\\s+/)[0]`),\n * which is wrong for the overwhelmingly common multi-statement shell call: it\n * surfaced `cd` (the leading `cd x && realcmd`), wrapper/keyword heads (`echo`,\n * `eval`, `export`, `set`, `for`), env-var assignment prefixes (`AWS_PROFILE=dev`,\n * `M=…;`), and raw fragments (`core;`, `bin:$PATH\"`). On real data ~69% of shell\n * rows were garbage and ~52% were just `cd`. Capturing the assignment prefix also\n * leaked secrets (`CK=\"sk_live_…\"`) into a field that — unlike `command_redacted`\n * — never went through redaction.\n *\n * The fix: find the *leading meaningful program*. We split the command into\n * statements (quote-aware), and for each statement peel the noise that hides the\n * real program, then return its basename.\n *\n * Algorithm (deterministic, privacy-preserving — emits only a program basename\n * or the {@link OTHER_BUCKET} token, never an argument/assignment value):\n *  1. Split on `;`, `&&`, `||`, `|`, `&`, and newlines, honoring single/double\n *     quotes and backslash escapes (so a `;` inside `\"…\"` does not split).\n *  2. Skip comment statements (`# …`).\n *  3. Within a statement, peel leading tokens that hide the program:\n *       • group/subshell brackets `{ } ( )` and control openers `do then else`;\n *       • shell-function headers (`probe()`);\n *       • exec wrappers (`sudo env time nice nohup xargs command exec …`);\n *       • variable assignments (`FOO=bar`). An assignment whose value is a command\n *         substitution (`WT=$(ssh …)`) yields the inner program (`ssh`).\n *  4. The next token is the candidate: strip a leading `(`/`$(`/backtick, take the\n *     basename, lowercase.\n *       • a shell builtin/keyword that consumes its statement (`cd echo export set\n *         eval for …`) is remembered as a *fallback* and we move to the next\n *         statement (its trailing tokens are that builtin's args, not a program);\n *       • a token that looks like a program (`^[A-Za-z0-9][A-Za-z0-9._+-]*$`, ≤1\n *         dot, not a data-file extension) is returned;\n *       • anything else (a quoted fragment, a flag, a redaction token, a hostname)\n *         ends the statement and we move on.\n *  5. No program in any statement → the remembered builtin (e.g. a bare `cd`),\n *     else {@link OTHER_BUCKET}.\n *\n * The same logic is mirrored on the server in Rust (`modelstat_core::tool_exec`)\n * so already-ingested rows can be backfilled from `command_redacted`.\n */\n\n/** Bucket token for shell calls that don't reduce to a single program. Starts\n * with `(`, which a real program basename never can, so it never collides. */\nexport const OTHER_BUCKET = \"(other)\";\n\n/** Max executable length (mirrors the Zod `executable: z.string().max(80)`). A\n * real basename is far shorter; this is a paranoia clamp before we ever return. */\nconst MAX_EXECUTABLE_CHARS = 80;\n\n/** Exec wrappers / prefixes whose *next* token is the real program. */\nconst WRAPPERS = new Set([\n  \"sudo\",\n  \"doas\",\n  \"env\",\n  \"command\",\n  \"exec\",\n  \"builtin\",\n  \"nohup\",\n  \"setsid\",\n  \"time\",\n  \"nice\",\n  \"ionice\",\n  \"chrt\",\n  \"stdbuf\",\n  \"xargs\",\n  // control-flow openers that immediately precede a command\n  \"then\",\n  \"do\",\n  \"else\",\n]);\n\n/** Group/subshell brackets to peel (a statement may open inside one). */\nconst BRACKETS = new Set([\"{\", \"}\", \"(\", \")\"]);\n\n/** Shell builtins / keywords that *consume* their statement: their trailing\n * tokens are their own arguments, not a program. When one of these leads a\n * statement we record it as a fallback and move to the next statement, so\n * `cd x && git push` resolves to `git` while a bare `cd ~` stays `cd`. */\nconst NOISE_BUILTINS = new Set([\n  \"cd\",\n  \"pushd\",\n  \"popd\",\n  \"echo\",\n  \"printf\",\n  \"export\",\n  \"unset\",\n  \"set\",\n  \"readonly\",\n  \"typeset\",\n  \"declare\",\n  \"local\",\n  \"alias\",\n  \"source\",\n  \".\",\n  \"eval\",\n  \":\",\n  \"true\",\n  \"false\",\n  \"read\",\n  \"wait\",\n  \"trap\",\n  \"umask\",\n  \"shift\",\n  \"return\",\n  \"getopts\",\n  \"hash\",\n  \"let\",\n  \"test\",\n  \"[\",\n  \"[[\",\n  // loop / conditional keywords\n  \"for\",\n  \"while\",\n  \"until\",\n  \"if\",\n  \"elif\",\n  \"fi\",\n  \"case\",\n  \"esac\",\n  \"select\",\n  \"function\",\n  \"done\",\n]);\n\n/** Data-file extensions a program basename never legitimately ends in — these\n * are filename fragments (`run.output`, `notes.md`) that slipped in as heads. */\nconst DATA_EXTENSIONS = [\n  \".output\",\n  \".txt\",\n  \".log\",\n  \".json\",\n  \".jsonl\",\n  \".md\",\n  \".csv\",\n  \".tmp\",\n  \".out\",\n  \".git\",\n  \".lock\",\n];\n\n/** Split a command into statements on `;`, `&&`, `||`, `|`, `&`, and newlines,\n * honoring single/double quotes and backslash escapes so separators inside a\n * quoted argument don't split. Brackets are kept inline (peeled per-statement). */\nfunction splitStatements(command: string): string[] {\n  const out: string[] = [];\n  let cur = \"\";\n  let single = false;\n  let double = false;\n  for (let i = 0; i < command.length; i++) {\n    const c = command[i];\n    if (single) {\n      cur += c;\n      if (c === \"'\") single = false;\n      continue;\n    }\n    if (double) {\n      if (c === \"\\\\\" && i + 1 < command.length) {\n        cur += c + command[i + 1];\n        i++;\n        continue;\n      }\n      cur += c;\n      if (c === '\"') double = false;\n      continue;\n    }\n    if (c === \"'\") {\n      single = true;\n      cur += c;\n      continue;\n    }\n    if (c === '\"') {\n      double = true;\n      cur += c;\n      continue;\n    }\n    if (c === \"\\\\\" && i + 1 < command.length) {\n      // escaped char (incl. line continuation) — literal, never a separator\n      cur += c + command[i + 1];\n      i++;\n      continue;\n    }\n    if (c === \"#\" && (cur === \"\" || /\\s$/.test(cur))) {\n      // comment at a word boundary → runs to end of line (drop it, incl. any\n      // `;`/`|` inside, so a comment never yields a phantom statement)\n      out.push(cur);\n      cur = \"\";\n      while (i + 1 < command.length && command[i + 1] !== \"\\n\") i++;\n      continue;\n    }\n    if (c === \"\\n\" || c === \";\") {\n      out.push(cur);\n      cur = \"\";\n      continue;\n    }\n    if (c === \"&\" || c === \"|\") {\n      out.push(cur);\n      cur = \"\";\n      if (command[i + 1] === c) i++; // collapse && / ||\n      continue;\n    }\n    cur += c;\n  }\n  out.push(cur);\n  return out;\n}\n\n/** Basename of a path-or-program token: `/usr/bin/git` → `git`, `./d.sh` → `d.sh`. */\nfunction basename(token: string): string {\n  const parts = token.split(\"/\");\n  return parts[parts.length - 1] ?? token;\n}\n\n/** Strip a leading subshell/substitution opener from a candidate token:\n * `(rg` → `rg`, `$(pwd` → `pwd`, `` `git `` → `git`. */\nfunction stripOpener(token: string): string {\n  let t = token;\n  if (t.startsWith(\"$(\")) t = t.slice(2);\n  else if (t.startsWith(\"(\")) t = t.slice(1);\n  if (t.startsWith(\"`\")) t = t.slice(1);\n  return t;\n}\n\nconst ASSIGNMENT = /^[A-Za-z_][A-Za-z0-9_]*=/;\nconst FUNCTION_DEF = /^[A-Za-z_][A-Za-z0-9_]*\\(\\)?$/;\nconst PROGRAM = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;\n\n/** When an assignment's value is a command substitution (`WT=$(ssh …)`), return\n * the inner program candidate (`$(ssh` → `ssh`); otherwise null (plain value). */\nfunction substitutionProgram(token: string): string | null {\n  const rhs = token.slice(token.indexOf(\"=\") + 1);\n  if (rhs.startsWith(\"$((\")) return null; // arithmetic `$((…))`, not a command\n  if (rhs.startsWith(\"$(\") || rhs.startsWith(\"`\")) {\n    const inner = stripOpener(rhs);\n    return inner || null;\n  }\n  return null;\n}\n\n/** True when a basename is a real-looking program (not a fragment, flag, data\n * file, hostname, or redaction token). */\nfunction looksLikeProgram(cand: string): boolean {\n  if (!PROGRAM.test(cand)) return false;\n  if (/^\\d+$/.test(cand)) return false; // a bare number is a fragment, not a program\n  // ≥2 dots ⇒ hostname/qualified name (`acme-x.fly.dev`), not a program.\n  if ((cand.match(/\\./g)?.length ?? 0) >= 2) return false;\n  const lower = cand.toLowerCase();\n  return !DATA_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/** Scan one statement for its leading program. Returns the program (a real\n * command) or a builtin (a statement-consuming shell builtin, used as fallback). */\nfunction scanStatement(stmt: string): { program?: string; builtin?: string } {\n  for (const tok of stmt.split(/\\s+/).filter(Boolean)) {\n    let t = tok;\n    if (BRACKETS.has(t) || FUNCTION_DEF.test(t) || WRAPPERS.has(t)) continue;\n    if (ASSIGNMENT.test(t)) {\n      const sub = substitutionProgram(t);\n      if (sub) t = sub; // WT=$(ssh … → ssh\n      else continue; // plain assignment prefix (incl. secrets) → peel\n    }\n    // leading `(`/`$(`/backtick, then trailing `)`/quote/`;` junk, then path.\n    const cand = basename(stripOpener(t).replace(/[)\"'`;,]+$/, \"\")).toLowerCase();\n    if (!cand || cand.startsWith(\"-\")) break; // a flag ⇒ no program here\n    if (NOISE_BUILTINS.has(cand)) return { builtin: cand }; // rest are its args\n    if (looksLikeProgram(cand)) return { program: cand };\n    break; // unparseable fragment ⇒ next statement\n  }\n  return {};\n}\n\n/**\n * The normalized `executable` for a shell command — the leading meaningful\n * program's basename (lowercased), a bare statement-builtin when that's all the\n * command did, or {@link OTHER_BUCKET}. Never returns an argument, assignment\n * value, secret, or raw fragment. See the module doc for the full spec.\n */\nexport function extractExecutable(command: string): string {\n  let fallback: string | null = null;\n  for (const raw of splitStatements(command)) {\n    const stmt = raw.trim();\n    if (!stmt || stmt.startsWith(\"#\")) continue;\n    const { program, builtin } = scanStatement(stmt);\n    if (program) {\n      return program.length > MAX_EXECUTABLE_CHARS ? OTHER_BUCKET : program;\n    }\n    if (builtin && !fallback) fallback = builtin;\n  }\n  return fallback ?? OTHER_BUCKET;\n}\n","/**\n * Detect every script/bash file a command references, and resolve each to a\n * real on-disk path — deterministic and maximally liberal, with NO\n * project-structure assumptions. Detection is pure-string (browser-safe);\n * resolution takes an injectable `exists` so it is testable and runtime-\n * agnostic (Node `fs.existsSync` in prod). A command can reference several\n * scripts; they are returned in command order so each abstract stays\n * positionally linked to its place in the (redacted) command.\n */\n\n/** Shell metacharacters that separate command segments (`&&`, `||`, `;`, `|`, `&`, newlines). */\nconst SEGMENT_SEP = /\\s*(?:&&|\\|\\||[;|&\\n])\\s*/;\n\n/** A trailing script-ish file extension — a generic structural signal, not a\n * tool/category vocabulary. */\nconst SCRIPT_EXT =\n  /\\.(sh|bash|zsh|ksh|fish|py|rb|js|mjs|cjs|ts|tsx|pl|php|lua|ps1|bat|cmd|r|jl|groovy|kts)$/i;\n\n/** Every script/bash file the command references, in order of appearance. The\n * returned tokens are exactly as they appear in `command` (pre-redaction), so\n * the caller can resolve them on disk and also map them to the redacted form. */\nexport function detectScriptRefs(command: string): string[] {\n  const refs: string[] = [];\n  for (const segment of command.split(SEGMENT_SEP)) {\n    const tokens = segment.trim().split(/\\s+/).filter(Boolean);\n    tokens.forEach((tok, i) => {\n      const t = stripQuotes(tok);\n      if (!t || t.startsWith(\"-\") || t.includes(\"://\")) return; // flags, URLs\n      const looksLikeScript =\n        SCRIPT_EXT.test(t) || // ends in a script extension\n        t.startsWith(\"./\") ||\n        t.startsWith(\"../\") || // an explicit relative executable\n        (i === 0 && t.includes(\"/\")); // a leading path-to-an-executable\n      if (looksLikeScript) refs.push(t);\n    });\n  }\n  return refs;\n}\n\n/** Candidate paths to try for a referenced script, ordered MOST-ABSOLUTE /\n * LONGEST first (so the most specific existing file wins). `roots` are\n * directories from the session/event context (cwd, git root, nearby cwds, …). */\nexport function scriptCandidates(ref: string, roots: readonly string[]): string[] {\n  const out: string[] = [];\n  const push = (p: string) => {\n    if (p && !out.includes(p)) out.push(p);\n  };\n  if (isAbsolute(ref)) push(ref);\n  for (const root of roots) {\n    if (root) push(joinPath(root, ref));\n  }\n  push(ref); // bare, relative to the process cwd\n  return out.sort(\n    (a, b) => Number(isAbsolute(b)) - Number(isAbsolute(a)) || b.length - a.length,\n  );\n}\n\n/** Resolve a script ref to the first existing candidate (most-specific first),\n * or null when none exists. `exists` is injected — Node `fs.existsSync` in\n * prod, a fake in tests. The LLM-prediction fallback for genuinely-ambiguous\n * refs is layered on by the caller. */\nexport function resolveScriptPath(\n  ref: string,\n  roots: readonly string[],\n  exists: (path: string) => boolean,\n): string | null {\n  for (const cand of scriptCandidates(ref, roots)) {\n    if (exists(cand)) return cand;\n  }\n  return null;\n}\n\nfunction isAbsolute(p: string): boolean {\n  return p.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(p);\n}\n\nfunction joinPath(root: string, rel: string): string {\n  return `${root.replace(/\\/+$/, \"\")}/${rel.replace(/^\\.\\//, \"\")}`;\n}\n\nfunction stripQuotes(token: string): string {\n  if (token.length >= 2) {\n    const a = token[0];\n    const b = token[token.length - 1];\n    if ((a === \"'\" && b === \"'\") || (a === '\"' && b === '\"')) return token.slice(1, -1);\n  }\n  return token;\n}\n","/**\n * On-device, deterministic structural extraction for one tool call.\n *\n * Produces ONLY the cheap, generic facts + the compliance-redacted command —\n * no model, no vocabulary, browser-safe and synchronous. The semantic fields\n * (`action` / `object` / `keywords` / `abstract` / `qualifiers`) are left\n * null/empty on purpose: the backend derives those from `command_redacted`\n * with a better, re-runnable model (so stats stay accurate and future-proof).\n *\n * PRIVACY: the only command-derived outputs are `param_shape` (every value\n * masked to `§`) and `command_redacted` (secrets / PII stripped by `redact()`,\n * in-repo paths relativised against `cwd`). The raw command is never returned.\n */\nimport { paramShape, redact, type ToolAction } from \"@modelstat/core\";\n\nimport { extractExecutable } from \"./executable.js\";\n\nexport * from \"./executable.js\";\nexport * from \"./scripts.js\";\n\n/** What the parser has in hand for one observed call at draft-build time\n * (before the args are hashed away). */\nexport interface ToolActionInput {\n  /** `builtin` or `mcp:<server>`. */\n  server: string;\n  /** Bare tool name (`Bash`, `create_pr`, `shell`). */\n  name: string;\n  /** The raw tool input (a shell `{ command }` object, an args object, …). */\n  input: unknown;\n  /** The event's cwd, if known — lets redaction keep in-repo paths relative. */\n  cwd?: string | null;\n}\n\n/**\n * Malicious-size guard, mirrored from the backend\n * (`MAX_TOOL_ACTION_PARAM_SHAPE_CHARS` / `MAX_TOOL_ACTION_COMMAND_CHARS`). The\n * full value-masked / redacted command rides the wire untouched below this;\n * over it we clamp (Unicode-scalar safe) rather than drop. Long random blobs\n * (keys / base64 / hashes) are collapsed by {@link redact}, not by this cap.\n */\nconst MAX_FIELD_CHARS = 16_384;\n\n/** Truncate to at most `max` Unicode code points (matches the backend's\n * char-boundary clamp; never splits a surrogate pair). */\nfunction clampChars(s: string, max: number): string {\n  const cps = [...s];\n  return cps.length > max ? cps.slice(0, max).join(\"\") : s;\n}\n\n/**\n * Extract the deterministic structural facts for one tool call. The returned\n * `ToolAction` is wire-shaped; semantic fields are null/empty (server-derived).\n */\nexport function extractToolAction(call: ToolActionInput): ToolAction {\n  const isMcp = call.server.startsWith(\"mcp:\");\n  const command = isMcp ? null : shellCommandOf(call.input);\n  const surface = isMcp ? \"mcp\" : command != null ? \"shell\" : \"builtin\";\n\n  let executable: string | null = call.name || null;\n  let param_shape: string | null = null;\n  let command_redacted: string | null = null;\n\n  if (command != null) {\n    // executable: the leading *meaningful* program (peels cd / wrappers / env\n    // assignments / pipelines), never a raw fragment or secret. See\n    // `extractExecutable`. param_shape keeps its own contract: the value-masked\n    // skeleton of everything after the first whitespace token.\n    executable = extractExecutable(command);\n    const args = command.trim().split(/\\s+/).slice(1).join(\" \");\n    param_shape = clampChars(paramShape(args), MAX_FIELD_CHARS) || null;\n    command_redacted =\n      clampChars(redact(command, call.cwd ?? undefined).text, MAX_FIELD_CHARS) || null;\n  }\n\n  return {\n    surface,\n    executable,\n    action: null,\n    object: null,\n    qualifiers: [],\n    param_shape,\n    keywords: [],\n    abstract: null,\n    command_redacted,\n    scripts: [],\n    confidence: 0,\n    // Per-surface provenance. shell bumped to v3 (normalized executable, see\n    // `extractExecutable`); builtin/mcp extraction is unchanged → still v1.\n    extractor: `${surface}.${surface === \"shell\" ? \"v3\" : \"v1\"}`,\n  };\n}\n\n/**\n * The local-only context the Node agent needs to read + summarise a shell\n * call's referenced script files: the RAW command + cwd. Returns null for\n * non-shell calls (mcp/builtin) — nothing to read.\n *\n * This is the ONLY function that surfaces the raw command, and it travels on\n * `ParseResult.scriptContexts` (local-only), NEVER on the wire — the shipped\n * `ToolAction` keeps only `command_redacted`. See {@link extractToolAction}.\n */\nexport function extractLocalToolContext(call: ToolActionInput): {\n  command: string;\n  cwd: string | null;\n} | null {\n  if (call.server.startsWith(\"mcp:\")) return null;\n  const command = shellCommandOf(call.input);\n  if (command == null) return null;\n  return { command, cwd: call.cwd ?? null };\n}\n\n/** The shell command string inside a tool input, or null when this isn't a\n * shell-style call. Generic: a string input, or a string/argv `command`/`cmd`\n * field — no tool-name allowlist. */\nfunction shellCommandOf(input: unknown): string | null {\n  if (typeof input === \"string\") return input.trim() ? input : null;\n  if (input && typeof input === \"object\") {\n    const cmd =\n      (input as Record<string, unknown>).command ?? (input as Record<string, unknown>).cmd;\n    if (typeof cmd === \"string\") return cmd.trim() ? cmd : null;\n    if (Array.isArray(cmd)) {\n      const parts = cmd.filter((p): p is string => typeof p === \"string\");\n      if (parts.length) return parts.join(\" \");\n    }\n  }\n  return null;\n}\n","/**\n * Shared tool_call hashing + identity helpers — one implementation for\n * every parser (claude-code, codex) so the wire values stay byte-identical\n * across agents.\n *\n * PRIVACY: these helpers exist so raw tool arguments/results never leave\n * the device. Only one-way sha256 digests and byte lengths are derived\n * here; the inputs themselves are discarded by the caller after hashing\n * (see ToolCallWire in @modelstat/core/schemas for the wire contract).\n *\n * Node-only (node:crypto) — parsers never run in the extension.\n */\nimport { createHash } from \"node:crypto\";\n\n/** Sentinel for signature_hash when input is not a non-empty object. */\nexport const SIGNATURE_NONE = \"none\";\n\nexport interface ArgsHashes {\n  /** Hex sha256 of JSON.stringify(input); `\"\"` when no input. */\n  args_hash: string;\n  /** Hex sha256 of the sorted top-level arg key names joined by `,`;\n   * the literal `none` when input is not a non-empty plain object. */\n  signature_hash: string;\n  /** UTF-8 byte length of JSON.stringify(input); 0 when no input. */\n  args_bytes: number;\n}\n\n/** Hash a tool_use `input` into the three wire fields. `undefined`/`null`\n * (and non-serialisable values) count as \"no input\". */\nexport function hashArgs(input: unknown): ArgsHashes {\n  if (input === undefined || input === null) {\n    return { args_hash: \"\", signature_hash: SIGNATURE_NONE, args_bytes: 0 };\n  }\n  const json = JSON.stringify(input);\n  if (json === undefined) {\n    // Functions/symbols — not serialisable, treat as no input.\n    return { args_hash: \"\", signature_hash: SIGNATURE_NONE, args_bytes: 0 };\n  }\n  const argsHash = createHash(\"sha256\").update(json).digest(\"hex\");\n  let signatureHash = SIGNATURE_NONE;\n  if (typeof input === \"object\" && !Array.isArray(input)) {\n    const keys = Object.keys(input as Record<string, unknown>).sort();\n    if (keys.length > 0) {\n      signatureHash = createHash(\"sha256\").update(keys.join(\",\")).digest(\"hex\");\n    }\n  }\n  return {\n    args_hash: argsHash,\n    signature_hash: signatureHash,\n    args_bytes: Buffer.byteLength(json, \"utf8\"),\n  };\n}\n\n/** UTF-8 byte length of JSON.stringify(value) — for result_bytes.\n * `undefined`/`null`/`\"\"` (unmatched or empty result) → 0. */\nexport function jsonBytes(value: unknown): number {\n  if (value === undefined || value === null || value === \"\") return 0;\n  const json = JSON.stringify(value);\n  return json === undefined ? 0 : Buffer.byteLength(json, \"utf8\");\n}\n\n/** Full UUIDs first (their dashed groups are individually < 8 chars),\n * then any hex run of ≥8 chars that ends a name segment. */\nconst UUID_RE = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/g;\nconst HEX_TAIL_RE = /[0-9a-fA-F]{8,}(?=$|[^0-9a-zA-Z])/g;\n\n/**\n * Tool-name normalization: NFC, trim, hex/UUID-ish tails of\n * ≥8 chars inside a name segment → `<dyn>`, cap 120 chars. Keeps stable\n * vendor identifiers verbatim while collapsing per-session dynamic names\n * (`subscribe_a1b2c3d4e5f6` → `subscribe_<dyn>`).\n */\nexport function normalizeToolName(raw: string): string {\n  const cleaned = raw\n    .normalize(\"NFC\")\n    .trim()\n    .replace(UUID_RE, \"<dyn>\")\n    .replace(HEX_TAIL_RE, \"<dyn>\");\n  return cleaned.slice(0, 120);\n}\n\n/** Split an observed tool name into wire `server` + `name`:\n * `mcp__<server>__<tool>` → `{ server: \"mcp:<server>\", name: \"<tool>\" }`,\n * anything else → `{ server: \"builtin\", name }`. Both parts normalized. */\nexport function splitObservedToolName(observed: string): { server: string; name: string } {\n  const m = /^mcp__([^_].*?)__(.+)$/.exec(observed.trim());\n  if (m?.[1] && m[2]) {\n    return {\n      server: `mcp:${normalizeToolName(m[1]).slice(0, 116)}`,\n      name: normalizeToolName(m[2]),\n    };\n  }\n  return { server: \"builtin\", name: normalizeToolName(observed) };\n}\n\n/** Canonical tool identity: aggregate-map key, taxonomy leaf\n * name, segment-tag name, facet value. `Bash` for builtins,\n * `mcp:<server>/<tool>` for MCP tools. */\nexport function toolIdentity(server: string, name: string): string {\n  return server === \"builtin\" ? name : `${server}/${name}`;\n}\n\n/** Deterministic fallback external_call_id when the source line carries\n * no id: `tc_<djb2-base36>` of `${sourceEventId}|${callIndex}` — same\n * djb2-64 family as sourceEventId/segmentId in @modelstat/core/ids. */\nexport function fallbackCallId(sourceEventId: string, callIndex: number): string {\n  const s = `${sourceEventId}|${callIndex}`;\n  let h = 5381n;\n  for (let i = 0; i < s.length; i++) {\n    h = (h * 33n) ^ BigInt(s.charCodeAt(i));\n    h &= 0xffffffffffffffffn;\n  }\n  return `tc_${h.toString(36)}`;\n}\n","/**\n * Claude Code JSONL parser.\n *\n * Layout reminder (from ~/.claude/projects/<encoded>/<session>.jsonl):\n *   { type: \"user\",           message: { role, content }, uuid, timestamp, sessionId, cwd, version, gitBranch, entrypoint }\n *   { type: \"assistant\",      message: { role, model, id, content, usage: { input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens } }, uuid, timestamp, cwd, ... }\n *   { type: \"tool_use\",       ... }\n *   { type: \"attachment\",     ... }\n *   { type: \"queue-operation\", ... }   // noise, skip\n *\n * Known issue: `usage.input_tokens` in this file can be a streaming\n * placeholder. We still record it as-is.\n *\n * Resumed sessions (`claude --resume` / `--continue`): Claude Code writes a\n * NEW <new-session-uuid>.jsonl that BEGINS with byte-identical copies of the\n * ancestor session's lines — each copy keeps its original `sessionId` and\n * `uuid` — followed by the new lines (which carry the new session's id, i.e.\n * the filename's uuid). Without special handling those copies become fresh\n * events (different file+offset → different source_event_id) under the\n * ancestor's session_id, double-counting its tokens after every resume.\n * Policy (see dedupeIdFor below): a line whose sessionId differs from the\n * filename's uuid is a resume copy — skip it when the ancestor's own file\n * still exists (that file is the canonical source), otherwise emit it keyed\n * by line uuid so orphaned history survives exactly once.\n */\nimport { createHash } from \"node:crypto\";\nimport { createReadStream, existsSync, readdirSync } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { RawEvent } from \"@modelstat/core\";\nimport { detectEventReferences, redact, sourceEventId } from \"@modelstat/core\";\nimport { guessRepoSlugFromPath } from \"../git.js\";\nimport { extractLocalToolContext, extractToolAction } from \"../tool-action/index.js\";\nimport {\n  fallbackCallId,\n  hashArgs,\n  jsonBytes,\n  splitObservedToolName,\n  toolIdentity,\n} from \"../tool-hash/index.js\";\nimport {\n  type LocalToolContext,\n  PARSER_EVENT_CHUNK,\n  type ParseResult,\n  type ParserContext,\n  type ToolCallDraft,\n} from \"../types.js\";\n\n/** Claude Code's `message.content` is either a plain string (older\n * lines, mainly user messages) or an array of typed content blocks\n * (newer lines + most assistant messages). `text` blocks feed the\n * excerpt; `tool_use` / `tool_result` blocks feed per-call extraction\n * (ToolCallDraft) — their raw input/content is reduced to hashes and\n * byte sizes on the spot and never leaves this module. */\ntype ClaudeContentBlock =\n  | { type: \"text\"; text?: string }\n  | { type: \"tool_use\"; id?: string; name?: string; input?: unknown }\n  | { type: \"tool_result\"; tool_use_id?: string; is_error?: boolean; content?: unknown }\n  | { type: string; [k: string]: unknown };\ntype ClaudeMessageContent = string | ClaudeContentBlock[] | undefined;\n\ninterface ClaudeAssistantLine {\n  type: \"assistant\";\n  uuid: string;\n  timestamp: string;\n  sessionId: string;\n  cwd?: string | null;\n  gitBranch?: string | null;\n  version?: string;\n  entrypoint?: string;\n  parentUuid?: string | null;\n  message: {\n    role: \"assistant\";\n    model?: string;\n    id?: string;\n    content?: ClaudeMessageContent;\n    usage?: {\n      input_tokens?: number;\n      output_tokens?: number;\n      cache_creation_input_tokens?: number;\n      cache_read_input_tokens?: number;\n    };\n  };\n}\n\ninterface ClaudeUserLine {\n  type: \"user\";\n  uuid: string;\n  timestamp: string;\n  sessionId: string;\n  cwd?: string | null;\n  gitBranch?: string | null;\n  parentUuid?: string | null;\n  message: {\n    role: \"user\";\n    content?: ClaudeMessageContent;\n  };\n}\n\ntype ClaudeLine = ClaudeAssistantLine | ClaudeUserLine | { type: string; [k: string]: unknown };\n\nfunction decodeEncodedDir(encoded: string): string {\n  // Claude encodes / as -. Not a perfect inverse (- in original filenames\n  // becomes ambiguous) but good enough for display.\n  return encoded.replace(/^-/, \"/\").replace(/-/g, \"/\");\n}\n\n/**\n * Extract a redacted, ≤320-char text excerpt from a Claude Code\n * message.content. Only `text` blocks contribute; tool_use /\n * tool_result blocks are dropped (their input is structured and not\n * meaningful for a one-sentence summary). Code-fenced blocks are\n * stripped so the summariser focuses on natural language. The result\n * is run through @modelstat/core/redact to scrub secrets / emails /\n * absolute paths before it leaves this function.\n *\n * Returns undefined when there's nothing usable — the schema field is\n * optional, so the pipeline falls back to metadata-only summarisation\n * for those events.\n */\nfunction extractExcerpt(content: ClaudeMessageContent): string | undefined {\n  if (!content) return undefined;\n  let text = \"\";\n  if (typeof content === \"string\") {\n    text = content;\n  } else if (Array.isArray(content)) {\n    const parts: string[] = [];\n    for (const block of content) {\n      if (block && block.type === \"text\" && typeof block.text === \"string\") {\n        parts.push(block.text);\n      }\n    }\n    text = parts.join(\" \");\n  }\n  if (!text) return undefined;\n\n  // Strip fenced code blocks — they're noise for a summariser that's\n  // supposed to describe the work, not the code itself.\n  text = text.replace(/```[\\s\\S]*?```/g, \" \").replace(/`[^`]*`/g, \" \");\n  // Collapse whitespace.\n  text = text.replace(/\\s+/g, \" \").trim();\n  if (!text) return undefined;\n\n  // Redact, then trim to the schema cap. The daemon-core pipeline\n  // re-redacts as defence-in-depth; this is the first pass.\n  const cleaned = redact(text).text;\n  const truncated = cleaned.slice(0, 320);\n  return truncated.length > 0 ? truncated : undefined;\n}\n\n/** Join a message's natural-language TEXT (string content or `text` blocks) at\n * FULL length, for public-reference detection. Unlike {@link extractExcerpt} it\n * does not truncate or strip code fences (a PR URL may sit in backticks or past\n * the 320-char excerpt window). tool_use / tool_result blocks are skipped on\n * purpose — command output and file dumps add example-URL noise and hurt\n * precision. Capped so a giant pasted turn can't make the regex scan unbounded.\n * The text is NOT redacted here: detectEventReferences pulls only public ref\n * shapes from it, never raw text. */\nfunction collectRefText(content: ClaudeMessageContent): string {\n  if (!content) return \"\";\n  let text = \"\";\n  if (typeof content === \"string\") {\n    text = content;\n  } else if (Array.isArray(content)) {\n    const parts: string[] = [];\n    for (const block of content) {\n      if (block && block.type === \"text\" && typeof block.text === \"string\") {\n        parts.push(block.text);\n      }\n    }\n    text = parts.join(\" \");\n  }\n  return text.length > 64_000 ? text.slice(0, 64_000) : text;\n}\n\n/** Build one ToolCallDraft from an observed tool_use (content block or\n * top-level line form). Starts life unmatched (`status: \"unknown\"`,\n * `ended_at: null`) — a later tool_result in the same file parse fills\n * those in. PRIVACY: `input` is reduced to sha256 hashes + byte sizes and the\n * on-device extractor's structural `action` (incl. a value-masked shape and a\n * redacted command); the raw value is then discarded. */\nfunction buildToolCallDraft(opts: {\n  observedName: string;\n  rawCallId: unknown;\n  input: unknown;\n  sessionId: string;\n  sourceEventId: string;\n  callIndex: number;\n  startedAt: string;\n  model: string | null;\n  cwd?: string | null;\n  /** When provided, the raw command + cwd for this call are pushed here\n   * (local-only) so the agent can summarise its referenced script files. */\n  contexts?: LocalToolContext[];\n}): ToolCallDraft {\n  const { server, name } = splitObservedToolName(opts.observedName);\n  const hashes = hashArgs(opts.input);\n  const external_call_id =\n    typeof opts.rawCallId === \"string\" && opts.rawCallId.trim() !== \"\"\n      ? opts.rawCallId.trim().slice(0, 120)\n      : fallbackCallId(opts.sourceEventId, opts.callIndex);\n  // Stash the raw command + cwd locally (never shipped) so the Node agent can\n  // read + summarise referenced script FILES into ToolAction.scripts. See\n  // ParseResult.scriptContexts / LocalToolContext.\n  if (opts.contexts) {\n    const local = extractLocalToolContext({ server, name, input: opts.input, cwd: opts.cwd });\n    if (local) opts.contexts.push({ external_call_id, ...local });\n  }\n  return {\n    external_call_id,\n    session_id: opts.sessionId,\n    source_event_id: opts.sourceEventId,\n    agent: \"claude_code\",\n    server,\n    name,\n    // This parser never derives a turn index (events above carry\n    // turn_index: null too), so per-call records can't either.\n    turn_index: null,\n    call_index: opts.callIndex,\n    started_at: opts.startedAt,\n    ended_at: null,\n    status: \"unknown\",\n    args_hash: hashes.args_hash,\n    signature_hash: hashes.signature_hash,\n    args_bytes: hashes.args_bytes,\n    result_bytes: 0,\n    model: opts.model,\n    action: extractToolAction({ server, name, input: opts.input, cwd: opts.cwd }),\n  };\n}\n\nexport async function parseClaudeCodeJsonl(ctx: ParserContext): Promise<ParseResult> {\n  // In streaming mode (ctx.onEvents set) `events` stays empty and\n  // parsed events leave through the sink in PARSER_EVENT_CHUNK-sized\n  // chunks — the parser's working set is bounded no matter how large\n  // the transcript is. See ParserContext.onEvents.\n  const events: RawEvent[] = [];\n  const toolCalls: ToolCallDraft[] = [];\n  // Local-only raw command + cwd per shell call, for the agent's script-summary\n  // pass. Never shipped (see LocalToolContext); returned on ParseResult.\n  const scriptContexts: LocalToolContext[] = [];\n  /** tool_use id → draft still waiting for its tool_result (pairing is\n   * file-local: anything unmatched at EOF stays status \"unknown\"). */\n  const pendingByCallId = new Map<string, ToolCallDraft>();\n  let chunk: RawEvent[] = [];\n  let emitted = 0;\n  const emit = async (e: RawEvent): Promise<void> => {\n    emitted += 1;\n    if (!ctx.onEvents) {\n      events.push(e);\n      return;\n    }\n    chunk.push(e);\n    if (chunk.length >= PARSER_EVENT_CHUNK) {\n      const full = chunk;\n      chunk = [];\n      await ctx.onEvents(full);\n    }\n  };\n  let rawLines = 0;\n  let skipped = 0;\n  let bytePos = 0;\n  const startOffset = ctx.byteOffsetStart ?? 0;\n\n  const stream = createReadStream(ctx.sourceFile, {\n    encoding: \"utf8\",\n    start: startOffset,\n  });\n  const rl = createInterface({ input: stream, crlfDelay: Infinity });\n\n  // Session-level context captured from the first typed line seen.\n  let sessionId: string | null = null;\n  let cwd: string | null = null;\n  let gitBranch: string | null = null;\n  let lastModel: string | null = null;\n\n  // ── Resume-copy dedupe (see module header) ──────────────────────\n  // The filename's uuid is the session this file was written FOR; any\n  // line carrying a different sessionId is copied ancestor history.\n  const filenameSessionId = deriveSessionIdFromFilename(ctx.sourceFile);\n  const ancestorExistsCache = new Map<string, boolean>();\n\n  /** Is the ancestor session's own transcript still on disk? Resumes\n   * routinely cross project dirs (a worktree per session → a different\n   * encoded dir per cwd), so after the fast same-dir probe check every\n   * sibling dir under the projects root. Memoised — a resumed file\n   * carries only a handful of distinct ancestor ids. */\n  function ancestorFileExists(sid: string): boolean {\n    const cached = ancestorExistsCache.get(sid);\n    if (cached !== undefined) return cached;\n    let found = false;\n    const dir = dirname(ctx.sourceFile);\n    try {\n      if (existsSync(join(dir, `${sid}.jsonl`))) {\n        found = true;\n      } else {\n        const root = dirname(dir);\n        for (const entry of readdirSync(root, { withFileTypes: true })) {\n          if (!entry.isDirectory()) continue;\n          if (existsSync(join(root, entry.name, `${sid}.jsonl`))) {\n            found = true;\n            break;\n          }\n        }\n      }\n    } catch {\n      // Unreadable root — can't prove the ancestor exists, so fall\n      // through to emitting the copy under its uuid key (safe: worst\n      // case is one extra, self-deduping record, not lost history).\n    }\n    ancestorExistsCache.set(sid, found);\n    return found;\n  }\n\n  /** Dedupe id for the line about to be emitted, or null to drop it.\n   * Normal lines keep the historical (file, byteOffset) key — changing\n   * that would re-key all previously-ingested history (the server\n   * dedupes on source_event_id) and double-count everything once.\n   * Resume copies are exactly the subset that double-counts today:\n   *   - ancestor file present → null. Its own parse is the canonical\n   *     source for these events; emitting the copy too is what inflates\n   *     the ancestor session.\n   *   - ancestor file gone (e.g. pruned by cleanupPeriodDays) → key by\n   *     the line's uuid, which every copy preserves verbatim: the\n   *     orphaned history is reported once, and copies of these lines in\n   *     later resumes collapse to the same id server-side. */\n  function dedupeIdFor(lineUuid: string, byteOffset: number): string | null {\n    const isResumeCopy = filenameSessionId !== null && sessionId !== filenameSessionId;\n    if (!isResumeCopy) return sourceEventId(ctx.deviceId, ctx.sourceFile, byteOffset);\n    if (ancestorFileExists(sessionId!)) return null;\n    return sourceEventId(ctx.deviceId, { lineUuid });\n  }\n\n  for await (const line of rl) {\n    const byteLen = Buffer.byteLength(line, \"utf8\") + 1; // +1 for the stripped \\n\n    const offsetAtLineStart = startOffset + bytePos;\n    bytePos += byteLen;\n    rawLines += 1;\n    if (!line.trim()) {\n      skipped += 1;\n      continue;\n    }\n\n    let obj: ClaudeLine;\n    try {\n      obj = JSON.parse(line) as ClaudeLine;\n    } catch {\n      skipped += 1;\n      continue;\n    }\n\n    if (obj.type === \"queue-operation\") {\n      skipped += 1;\n      continue;\n    }\n\n    if (obj.type === \"user\" || obj.type === \"assistant\") {\n      const u = obj as ClaudeUserLine | ClaudeAssistantLine;\n      sessionId = u.sessionId ?? sessionId;\n      cwd = u.cwd ?? cwd;\n      gitBranch = u.gitBranch ?? gitBranch;\n    }\n\n    if (obj.type === \"assistant\") {\n      const a = obj as ClaudeAssistantLine;\n      const usage = a.message?.usage ?? {};\n      // Claude Code records locally-generated messages (error notices,\n      // \"No response requested.\") with model \"<synthetic>\". The event\n      // itself keeps that model verbatim, but it must not bleed into\n      // `lastModel` — the user messages that follow belong to the real\n      // model the session is running on.\n      if (a.message?.model && a.message.model !== \"<synthetic>\") {\n        lastModel = a.message.model;\n      }\n      if (!a.uuid || !sessionId) {\n        skipped += 1;\n        continue;\n      }\n      // Resume-copy handling comes after the context capture above so\n      // lastModel/cwd still flow from copied history into the new lines.\n      const eventId = dedupeIdFor(a.uuid, offsetAtLineStart);\n      if (eventId === null) {\n        skipped += 1;\n        continue;\n      }\n\n      const slug = guessRepoSlugFromPath(cwd);\n      const excerpt = extractExcerpt(a.message?.content);\n      const refs = detectEventReferences(collectRefText(a.message?.content));\n\n      // Per-call tool_use extraction + the aggregate identity → count\n      // map carried by this assistant event. Drafts are returned via\n      // ParseResult.toolCalls — they never become RawEvents (the\n      // pipeline would treat those as turns).\n      const aggregate: Record<string, number> = {};\n      const blocks = Array.isArray(a.message?.content) ? a.message.content : [];\n      let callIndex = 0;\n      for (const block of blocks) {\n        if (!block || block.type !== \"tool_use\") continue;\n        const index = callIndex;\n        callIndex += 1;\n        const observed = typeof block.name === \"string\" ? block.name.trim() : \"\";\n        if (!observed) continue;\n        const draft = buildToolCallDraft({\n          observedName: observed,\n          rawCallId: block.id,\n          input: block.input,\n          sessionId,\n          sourceEventId: eventId,\n          callIndex: index,\n          startedAt: a.timestamp,\n          // Model verbatim from the issuing assistant message —\n          // including \"<synthetic>\" (same rule as the event below).\n          model: a.message?.model ?? null,\n          cwd,\n          contexts: scriptContexts,\n        });\n        const identity = toolIdentity(draft.server, draft.name);\n        aggregate[identity] = (aggregate[identity] ?? 0) + 1;\n        toolCalls.push(draft);\n        if (typeof block.id === \"string\" && block.id) pendingByCallId.set(block.id, draft);\n      }\n\n      await emit({\n        source_event_id: eventId,\n        ts: a.timestamp,\n        kind: \"assistant_message\",\n        agent: \"claude_code\",\n        provider: \"anthropic\",\n        model: a.message?.model ?? null,\n        session_id: sessionId,\n        turn_index: null,\n        parent_event_id: a.parentUuid ?? null,\n        cwd,\n        // Emit git context whenever there is ANY signal — a repo slug OR the\n        // session's branch. Gating on `slug` alone dropped the branch (and all\n        // git context) for cwds the path heuristic doesn't match (e.g.\n        // ~/Documents/<repo>), starving the session-metadata join. The branch\n        // is the historical one Claude Code recorded for the turn.\n        git:\n          slug || gitBranch\n            ? {\n                remote_url: null,\n                remote_host: slug?.includes(\"/\") ? \"github.com\" : null,\n                remote_slug: slug,\n                branch: gitBranch,\n              }\n            : null,\n        tokens: {\n          input: usage.input_tokens ?? 0,\n          output: usage.output_tokens ?? 0,\n          cache_creation: usage.cache_creation_input_tokens ?? 0,\n          cache_read: usage.cache_read_input_tokens ?? 0,\n          reasoning: 0,\n        },\n        duration_ms: null,\n        tool_calls: aggregate,\n        files_touched: [],\n        ...(excerpt ? { content_excerpt: excerpt } : {}),\n        ...(refs ? { references: refs } : {}),\n        source_file: ctx.sourceFile,\n        source_byte_offset: offsetAtLineStart,\n        // Files in ~/.claude/projects/ come from the Claude Code app\n        // used via subscription (not the raw API). Mark them so the\n        // server short-circuits token-level cost to $0 — the user has\n        // already paid the flat monthly fee.\n        pricing_mode: \"subscription\",\n      });\n    } else if (obj.type === \"user\") {\n      const u = obj as ClaudeUserLine;\n\n      // Pair tool_result blocks back to their pending tool_use drafts\n      // (matched by tool_use_id). Done before the emission guard below —\n      // a result line that can't emit a user event still ends the call.\n      // Only the result's hash-safe metadata is kept: timestamp, error\n      // flag, and the byte size of its content.\n      const uContent = u.message?.content;\n      if (Array.isArray(uContent)) {\n        for (const block of uContent) {\n          if (!block || block.type !== \"tool_result\") continue;\n          const ref = block.tool_use_id;\n          if (typeof ref !== \"string\") continue;\n          const draft = pendingByCallId.get(ref);\n          if (!draft) continue;\n          pendingByCallId.delete(ref);\n          draft.ended_at = u.timestamp;\n          draft.status = block.is_error === true ? \"error\" : \"success\";\n          draft.result_bytes = jsonBytes(block.content);\n        }\n      }\n\n      if (!u.uuid || !sessionId) {\n        skipped += 1;\n        continue;\n      }\n      const eventId = dedupeIdFor(u.uuid, offsetAtLineStart);\n      if (eventId === null) {\n        skipped += 1;\n        continue;\n      }\n      const excerpt = extractExcerpt(u.message?.content);\n      const refs = detectEventReferences(collectRefText(u.message?.content));\n      await emit({\n        source_event_id: eventId,\n        ts: u.timestamp,\n        kind: \"user_message\",\n        agent: \"claude_code\",\n        provider: \"anthropic\",\n        model: lastModel,\n        session_id: sessionId,\n        turn_index: null,\n        parent_event_id: u.parentUuid ?? null,\n        cwd,\n        git: null,\n        tokens: null,\n        duration_ms: null,\n        tool_calls: {},\n        files_touched: [],\n        ...(excerpt ? { content_excerpt: excerpt } : {}),\n        ...(refs ? { references: refs } : {}),\n        source_file: ctx.sourceFile,\n        source_byte_offset: offsetAtLineStart,\n        pricing_mode: \"subscription\",\n      });\n    } else if (obj.type === \"tool_use\") {\n      // Top-level `type:'tool_use'` line form (see the header comment) —\n      // the same {id, name, input} shape as the content-block variant,\n      // standalone on its own line. It yields a per-call draft only and\n      // must NOT become a RawEvent (the pipeline would count it as a\n      // turn). With no containing assistant event, the draft anchors on\n      // a source_event_id derived from this line's own byte offset —\n      // mirroring how codex response_item lines anchor theirs.\n      const t = obj as {\n        type: \"tool_use\";\n        id?: unknown;\n        name?: unknown;\n        input?: unknown;\n        timestamp?: unknown;\n        sessionId?: unknown;\n      };\n      const observed = typeof t.name === \"string\" ? t.name.trim() : \"\";\n      const ts = typeof t.timestamp === \"string\" ? t.timestamp : null;\n      const sid = (typeof t.sessionId === \"string\" ? t.sessionId : null) ?? sessionId;\n      if (!observed || !ts || !sid) {\n        skipped += 1;\n        continue;\n      }\n      const draft = buildToolCallDraft({\n        observedName: observed,\n        rawCallId: t.id,\n        input: t.input,\n        sessionId: sid,\n        sourceEventId: sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart),\n        callIndex: 0,\n        startedAt: ts,\n        // No issuing assistant message on this line — attribute to the\n        // session's last real model, same as user_message attribution\n        // (lastModel never holds \"<synthetic>\", per the rule above).\n        model: lastModel,\n        cwd,\n        contexts: scriptContexts,\n      });\n      toolCalls.push(draft);\n      if (typeof t.id === \"string\" && t.id) pendingByCallId.set(t.id, draft);\n    } else {\n      skipped += 1;\n    }\n  }\n\n  if (ctx.onEvents && chunk.length > 0) await ctx.onEvents(chunk);\n\n  return {\n    events,\n    toolCalls,\n    scriptContexts,\n    stats: { rawLines, emittedEvents: emitted, skipped },\n    sourceFile: ctx.sourceFile,\n  };\n}\n\nexport function deriveSessionIdFromFilename(path: string): string | null {\n  const m = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\.jsonl$/.exec(path);\n  return m ? (m[1] ?? null) : null;\n}\n\nexport { decodeEncodedDir };\n\n/** Quick checksum of a JSONL file (size + last-line tail) used by the\n * discovery layer to decide if a re-parse is needed. */\nexport async function quickChecksum(\n  path: string,\n): Promise<{ size: number; mtime: number; tailHash: string }> {\n  const st = await stat(path);\n  const stream = createReadStream(path, {\n    start: Math.max(0, st.size - 4096),\n    encoding: \"utf8\",\n  });\n  const h = createHash(\"sha1\");\n  for await (const chunk of stream) h.update(chunk as string);\n  return { size: st.size, mtime: st.mtimeMs, tailHash: h.digest(\"hex\").slice(0, 16) };\n}\n","/**\n * Codex CLI rollout parser.\n *\n * Layout: ~/.codex/sessions/YYYY/MM/DD/rollout-<TS>-<UUID>.jsonl\n * Event stream with types:\n *   { type: \"session_meta\", id, ... }            // newer CLIs nest under payload: { id, cwd, ... }\n *   { type: \"turn_context\", cwd, model, ... }    // newer CLIs nest under payload: { cwd, model, ... }\n *   { type: \"response_item\", role: \"user\"|\"assistant\", ... }\n *   { type: \"event_msg\", payload: { type: \"user_message\"|\"agent_message\"|\"token_count\", ... } }\n *\n * Token accounting lives inside event_msg with payload.type === \"token_count\":\n *   { input_tokens, cached_input_tokens, output_tokens, reasoning_output_tokens, total_tokens, model_context_window }\n *\n * Tool activity lives in response_item lines (payload.type):\n *   function_call          { name, arguments: <JSON string>, call_id }\n *   local_shell_call       { call_id?, id?, status, action: { type: \"exec\", command: string[] | string, ... } }\n *   custom_tool_call       { name, input: <free-text string>, call_id, status }\n *   mcp_tool_call          { server?, tool? | name, arguments?, call_id }\n *   *_output               { call_id, output: <string> } — paired by call_id\n * These produce ToolCallDrafts (never RawEvents); the aggregate identity→count\n * map attaches to the next emitted assistant event of the same session.\n * PRIVACY: arguments/outputs are reduced to hashes + byte sizes on this device\n * (see @modelstat/parsers/tool-hash); the action decomposition is filled by\n * the on-device extractor in a later phase. Raw payloads never leave.\n */\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport type { RawEvent } from \"@modelstat/core\";\nimport { sourceEventId } from \"@modelstat/core\";\nimport { guessRepoSlugFromPath } from \"../git.js\";\nimport { extractLocalToolContext, extractToolAction } from \"../tool-action/index.js\";\nimport {\n  fallbackCallId,\n  hashArgs,\n  jsonBytes,\n  normalizeToolName,\n  splitObservedToolName,\n  toolIdentity,\n} from \"../tool-hash/index.js\";\nimport {\n  type LocalToolContext,\n  PARSER_EVENT_CHUNK,\n  type ParseResult,\n  type ParserContext,\n  type ToolCallDraft,\n} from \"../types.js\";\n\ninterface CodexTokenCount {\n  type: \"token_count\";\n  input_tokens?: number;\n  cached_input_tokens?: number;\n  output_tokens?: number;\n  reasoning_output_tokens?: number;\n  total_tokens?: number;\n  model_context_window?: number;\n}\n\ninterface CodexEventMsg {\n  type: \"event_msg\";\n  payload: { type: string; [k: string]: unknown };\n  timestamp?: string;\n  id?: string;\n}\n\ninterface CodexSessionMeta {\n  type: \"session_meta\";\n  id?: string;\n  created_at?: string;\n  timestamp?: string;\n  /** Newer rollout format nests the meta under payload. */\n  payload?: { id?: string; [k: string]: unknown };\n}\n\ninterface CodexTurnContext {\n  type: \"turn_context\";\n  cwd?: string;\n  model?: string;\n  effort?: string;\n  timestamp?: string;\n  /** Newer rollout format nests the context under payload. */\n  payload?: { cwd?: string; model?: string; [k: string]: unknown };\n}\n\ninterface CodexResponseItem {\n  type: \"response_item\";\n  payload?: { type?: string; [k: string]: unknown };\n  timestamp?: string;\n}\n\ntype CodexLine =\n  | CodexSessionMeta\n  | CodexTurnContext\n  | CodexEventMsg\n  | CodexResponseItem\n  | { type: string; [k: string]: unknown };\n\n/** response_item payload types that open a tool call. */\nconst TOOL_CALL_PAYLOAD_TYPES: ReadonlySet<string> = new Set([\n  \"function_call\",\n  \"local_shell_call\",\n  \"custom_tool_call\",\n  \"mcp_tool_call\",\n]);\n\n/** Their output counterparts, paired back to the call by call_id. */\nconst TOOL_CALL_OUTPUT_PAYLOAD_TYPES: ReadonlySet<string> = new Set([\n  \"function_call_output\",\n  \"local_shell_call_output\",\n  \"custom_tool_call_output\",\n  \"mcp_tool_call_output\",\n]);\n\n/** Codex names \"the shell\" differently across versions (exec_command in\n * current CLIs, shell/local_shell_call in older ones). All map to the\n * wire name `shell`. */\nconst SHELL_TOOL_NAMES: ReadonlySet<string> = new Set([\n  \"shell\",\n  \"local_shell_call\",\n  \"exec_command\",\n  \"run_terminal_cmd\",\n]);\n\nexport function deriveSessionIdFromRolloutPath(path: string): string | null {\n  const m =\n    /rollout-[0-9T-]+-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\.jsonl$/.exec(\n      path,\n    );\n  return m ? (m[1] ?? null) : null;\n}\n\ninterface ExtractedToolCall {\n  /** codex call_id (or id); null → caller derives a deterministic fallback. */\n  callId: string | null;\n  /** Wire server: `builtin` or `mcp:<server>`. */\n  server: string;\n  /** Wire name (normalised; `shell` for shell-ish calls). */\n  name: string;\n  /** What gets hashed as args — parsed object when possible, else raw string. */\n  input: unknown;\n  /** The call line itself said it failed (status: \"failed\"). */\n  failed: boolean;\n}\n\nfunction firstString(...values: unknown[]): string | null {\n  for (const v of values) {\n    if (typeof v === \"string\" && v) return v;\n  }\n  return null;\n}\n\n/** Pin one tool-call payload to the wire shape. Returns null when the\n * payload is too malformed to identify (no name at all). */\nfunction extractToolCallPayload(pt: string, p: Record<string, unknown>): ExtractedToolCall | null {\n  const callId = firstString(p.call_id, p.id);\n  const failed = p.status === \"failed\";\n\n  if (pt === \"local_shell_call\") {\n    const action =\n      p.action && typeof p.action === \"object\" ? (p.action as Record<string, unknown>) : null;\n    return {\n      callId,\n      server: \"builtin\",\n      name: \"shell\",\n      input: action,\n      failed,\n    };\n  }\n\n  const observed = firstString(p.name, p.tool);\n  if (!observed) return null;\n\n  // function_call/mcp_tool_call carry `arguments` as a JSON-encoded string;\n  // custom_tool_call carries free-text `input` (e.g. an apply_patch body)\n  // that must be hashed verbatim, never parsed.\n  let input: unknown = pt === \"custom_tool_call\" ? p.input : (p.arguments ?? p.input);\n  if (typeof input === \"string\" && !input.trim()) input = undefined;\n  if (pt !== \"custom_tool_call\" && typeof input === \"string\") {\n    try {\n      input = JSON.parse(input);\n    } catch {\n      // Not JSON — hash the raw string as-is.\n    }\n  }\n\n  if (SHELL_TOOL_NAMES.has(observed)) {\n    return {\n      callId,\n      server: \"builtin\",\n      name: \"shell\",\n      input,\n      failed,\n    };\n  }\n\n  if (pt === \"mcp_tool_call\" && typeof p.server === \"string\" && p.server) {\n    return {\n      callId,\n      // Mirror splitObservedToolName's cap: 116 + the `mcp:` prefix ≤ 120.\n      server: `mcp:${normalizeToolName(p.server).slice(0, 116)}`,\n      name: normalizeToolName(observed),\n      input,\n      failed,\n    };\n  }\n\n  // Handles both plain names (`update_plan` → builtin) and the\n  // `mcp__<server>__<tool>` form some function_call lines use.\n  const { server, name } = splitObservedToolName(observed);\n  return { callId, server, name, input, failed };\n}\n\n/** Best-effort error sniffing on an output payload. Codex outputs are\n * usually opaque strings (exit codes buried in free text we don't read);\n * structured failure markers are honoured when present. */\nfunction outputIndicatesError(p: Record<string, unknown>): boolean {\n  const out = p.output ?? p.result;\n  if (out && typeof out === \"object\" && !Array.isArray(out)) {\n    const o = out as Record<string, unknown>;\n    if (o.success === false || o.is_error === true) return true;\n  }\n  return false;\n}\n\nexport async function parseCodexRollout(ctx: ParserContext): Promise<ParseResult> {\n  // In streaming mode (ctx.onEvents set) `events` stays empty and\n  // parsed events leave through the sink in PARSER_EVENT_CHUNK-sized\n  // chunks — the parser's working set is bounded no matter how large\n  // the rollout file is. See ParserContext.onEvents.\n  const events: RawEvent[] = [];\n  const toolCalls: ToolCallDraft[] = [];\n  // Local-only raw command + cwd per shell call, for the daemon's script-summary\n  // pass. Never shipped (see LocalToolContext); returned on ParseResult.\n  const scriptContexts: LocalToolContext[] = [];\n  let chunk: RawEvent[] = [];\n  let emitted = 0;\n  const emit = async (e: RawEvent): Promise<void> => {\n    emitted += 1;\n    if (!ctx.onEvents) {\n      events.push(e);\n      return;\n    }\n    chunk.push(e);\n    if (chunk.length >= PARSER_EVENT_CHUNK) {\n      const full = chunk;\n      chunk = [];\n      await ctx.onEvents(full);\n    }\n  };\n  let rawLines = 0;\n  let skipped = 0;\n  let bytePos = 0;\n  const startOffset = ctx.byteOffsetStart ?? 0;\n\n  const stream = createReadStream(ctx.sourceFile, {\n    encoding: \"utf8\",\n    start: startOffset,\n  });\n  const rl = createInterface({ input: stream, crlfDelay: Infinity });\n\n  let sessionId: string | null = deriveSessionIdFromRolloutPath(ctx.sourceFile);\n  let cwd: string | null = null;\n  let model: string | null = null;\n  let turnIndex = 0;\n  /** Last timestamp seen on any line — started_at fallback for the rare\n   * response_item without its own ts. */\n  let lastTs: string | null = null;\n  /** Calls awaiting their *_output counterpart, keyed by call_id. */\n  const openCalls = new Map<string, ToolCallDraft>();\n  /** identity → count since the last assistant event; attaches to the next\n   * one emitted in the same session (best-effort — dropped at EOF/session\n   * switch when no assistant event follows; the drafts always ship). */\n  let pendingToolAggregate: Record<string, number> = {};\n\n  for await (const line of rl) {\n    const byteLen = Buffer.byteLength(line, \"utf8\") + 1;\n    const offsetAtLineStart = startOffset + bytePos;\n    bytePos += byteLen;\n    rawLines += 1;\n    if (!line.trim()) {\n      skipped += 1;\n      continue;\n    }\n\n    let obj: CodexLine;\n    try {\n      obj = JSON.parse(line) as CodexLine;\n    } catch {\n      skipped += 1;\n      continue;\n    }\n\n    const lineTs = (obj as { timestamp?: unknown }).timestamp;\n    if (typeof lineTs === \"string\" && lineTs) lastTs = lineTs;\n\n    if (obj.type === \"session_meta\") {\n      const m = obj as CodexSessionMeta;\n      const id = m.id ?? m.payload?.id ?? null;\n      if (id && id !== sessionId) {\n        // New session in the same file — don't let the aggregate map or\n        // call_id pairing leak across the boundary.\n        sessionId = id;\n        pendingToolAggregate = {};\n        openCalls.clear();\n      }\n      continue;\n    }\n    if (obj.type === \"turn_context\") {\n      const t = obj as CodexTurnContext;\n      cwd = t.cwd ?? t.payload?.cwd ?? cwd;\n      model = t.model ?? t.payload?.model ?? model;\n      continue;\n    }\n\n    if (obj.type === \"response_item\") {\n      const r = obj as CodexResponseItem;\n      const payload = r.payload;\n      const pt = payload && typeof payload.type === \"string\" ? payload.type : null;\n\n      if (pt && TOOL_CALL_PAYLOAD_TYPES.has(pt) && sessionId) {\n        const extracted = extractToolCallPayload(pt, payload as Record<string, unknown>);\n        if (!extracted) {\n          skipped += 1;\n          continue;\n        }\n        // started_at must be deterministic across re-parses so the same\n        // event re-uploads idempotently: a wall-clock fallback would make\n        // replays look like fresh events. So we take the line's own ts,\n        // else the last ts seen in this file — and if neither exists we\n        // SKIP the draft, mirroring claude-code, which never emits a\n        // tool_use without a line timestamp. No current-time constructor\n        // may reach started_at.\n        const ts = r.timestamp ?? lastTs;\n        if (!ts) {\n          skipped += 1;\n          continue;\n        }\n        const srcId = sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart);\n        const { args_hash, signature_hash, args_bytes } = hashArgs(extracted.input);\n        const externalCallId = (extracted.callId ?? fallbackCallId(srcId, 0)).slice(0, 120);\n        // Stash the raw command + cwd locally (never shipped) so the Node daemon\n        // can summarise referenced script FILES into ToolAction.scripts. See\n        // ParseResult.scriptContexts / LocalToolContext.\n        const localCtx = extractLocalToolContext({\n          server: extracted.server,\n          name: extracted.name,\n          input: extracted.input,\n          cwd,\n        });\n        if (localCtx) scriptContexts.push({ external_call_id: externalCallId, ...localCtx });\n        const draft: ToolCallDraft = {\n          external_call_id: externalCallId,\n          session_id: sessionId,\n          source_event_id: srcId,\n          agent: \"codex_cli\",\n          server: extracted.server,\n          name: extracted.name,\n          turn_index: turnIndex,\n          // Each response_item line carries exactly one call.\n          call_index: 0,\n          started_at: ts,\n          ended_at: null,\n          status: extracted.failed ? \"error\" : \"unknown\",\n          args_hash,\n          signature_hash,\n          args_bytes,\n          result_bytes: 0,\n          model,\n          action: extractToolAction({\n            server: extracted.server,\n            name: extracted.name,\n            input: extracted.input,\n            cwd,\n          }),\n        };\n        toolCalls.push(draft);\n        if (extracted.callId) openCalls.set(extracted.callId, draft);\n        const identity = toolIdentity(extracted.server, extracted.name);\n        pendingToolAggregate[identity] = (pendingToolAggregate[identity] ?? 0) + 1;\n        continue;\n      }\n\n      if (pt && TOOL_CALL_OUTPUT_PAYLOAD_TYPES.has(pt)) {\n        const p = payload as Record<string, unknown>;\n        // Mirror the call-side key derivation (extractToolCallPayload uses\n        // firstString(p.call_id, p.id)): an id-only call (e.g. some\n        // local_shell_call shapes) is stored under its `id`, so the output\n        // lookup must fall back to `id` too — otherwise an id-only-on-both-\n        // sides pair never matches and ships status 'unknown'.\n        const callId = firstString(p.call_id, p.id);\n        const open = callId ? openCalls.get(callId) : undefined;\n        if (!callId || !open) {\n          // Output for a call we never saw (truncated file) — nothing to pair.\n          skipped += 1;\n          continue;\n        }\n        openCalls.delete(callId);\n        open.ended_at = r.timestamp ?? lastTs ?? open.started_at;\n        open.result_bytes = jsonBytes(p.output ?? p.result);\n        if (open.status === \"unknown\") {\n          open.status = outputIndicatesError(p) ? \"error\" : \"success\";\n        }\n        continue;\n      }\n\n      // message / reasoning / web_search_call (no call_id to pair) — not tool data.\n      skipped += 1;\n      continue;\n    }\n\n    if (obj.type === \"event_msg\") {\n      const m = obj as CodexEventMsg;\n      const ts = m.timestamp ?? new Date().toISOString();\n      const payload = m.payload;\n      if (!payload?.type) {\n        skipped += 1;\n        continue;\n      }\n\n      if (payload.type === \"token_count\") {\n        const tk = payload as CodexTokenCount;\n        if (!sessionId) {\n          skipped += 1;\n          continue;\n        }\n        const slug = guessRepoSlugFromPath(cwd);\n        await emit({\n          source_event_id: sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart),\n          ts,\n          kind: \"assistant_message\",\n          agent: \"codex_cli\",\n          provider: \"openai\",\n          model,\n          session_id: sessionId,\n          turn_index: turnIndex,\n          parent_event_id: null,\n          cwd,\n          git: slug\n            ? {\n                remote_url: null,\n                remote_host: slug.includes(\"/\") ? \"github.com\" : null,\n                remote_slug: slug,\n                branch: null,\n              }\n            : null,\n          tokens: {\n            // OpenAI's `input_tokens` / `output_tokens` are INCLUSIVE totals:\n            // `cached_input_tokens` is a subset of input, `reasoning_output_tokens`\n            // a subset of output. Store the buckets DISJOINT (input excl. cache,\n            // output excl. reasoning) so the pricer bills input + cache_read +\n            // output + reasoning as non-overlapping line items — otherwise cached\n            // AND reasoning tokens are paid for twice (up to ~2× on a reasoning-heavy\n            // turn). Matches the Claude parser, whose provider already reports these\n            // buckets disjoint. Total is preserved: each subset is re-added as its\n            // own bucket, so input+output+cache_read+reasoning == the original sum.\n            input: Math.max(0, (tk.input_tokens ?? 0) - (tk.cached_input_tokens ?? 0)),\n            output: Math.max(0, (tk.output_tokens ?? 0) - (tk.reasoning_output_tokens ?? 0)),\n            cache_creation: 0,\n            cache_read: tk.cached_input_tokens ?? 0,\n            reasoning: tk.reasoning_output_tokens ?? 0,\n          },\n          duration_ms: null,\n          tool_calls: pendingToolAggregate,\n          files_touched: [],\n          source_file: ctx.sourceFile,\n          source_byte_offset: offsetAtLineStart,\n        });\n        pendingToolAggregate = {};\n        turnIndex += 1;\n        continue;\n      }\n      if (payload.type === \"user_message\") {\n        if (!sessionId) {\n          skipped += 1;\n          continue;\n        }\n        await emit({\n          source_event_id: sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart),\n          ts,\n          kind: \"user_message\",\n          agent: \"codex_cli\",\n          provider: \"openai\",\n          model,\n          session_id: sessionId,\n          turn_index: null,\n          parent_event_id: null,\n          cwd,\n          git: null,\n          tokens: null,\n          duration_ms: null,\n          tool_calls: {},\n          files_touched: [],\n          source_file: ctx.sourceFile,\n          source_byte_offset: offsetAtLineStart,\n        });\n        continue;\n      }\n      // other event_msg payloads (agent_message without token data, errors, …)\n      skipped += 1;\n      continue;\n    }\n\n    skipped += 1;\n  }\n\n  if (ctx.onEvents && chunk.length > 0) await ctx.onEvents(chunk);\n\n  return {\n    events,\n    toolCalls,\n    scriptContexts,\n    stats: { rawLines, emittedEvents: emitted, skipped },\n    sourceFile: ctx.sourceFile,\n  };\n}\n","\n// We are modularizing this manually because the current modularize setting in Emscripten has some issues:\n// https://github.com/kripken/emscripten/issues/5820\n// In addition, When you use emcc's modularization, it still expects to export a global object called `Module`,\n// which is able to be used/called before the WASM is loaded.\n// The modularization below exports a promise that loads and resolves to the actual sql.js module.\n// That way, this module can't be used before the WASM is finished loading.\n\n// We are going to define a function that a user will call to start loading initializing our Sql.js library\n// However, that function might be called multiple times, and on subsequent calls, we don't actually want it to instantiate a new instance of the Module\n// Instead, we want to return the previously loaded module\n\n// TODO: Make this not declare a global if used in the browser\nvar initSqlJsPromise = undefined;\n\nvar initSqlJs = function (moduleConfig) {\n\n    if (initSqlJsPromise){\n      return initSqlJsPromise;\n    }\n    // If we're here, we've never called this function before\n    initSqlJsPromise = new Promise(function (resolveModule, reject) {\n\n        // We are modularizing this manually because the current modularize setting in Emscripten has some issues:\n        // https://github.com/kripken/emscripten/issues/5820\n\n        // The way to affect the loading of emcc compiled modules is to create a variable called `Module` and add\n        // properties to it, like `preRun`, `postRun`, etc\n        // We are using that to get notified when the WASM has finished loading.\n        // Only then will we return our promise\n\n        // If they passed in a moduleConfig object, use that\n        // Otherwise, initialize Module to the empty object\n        var Module = typeof moduleConfig !== 'undefined' ? moduleConfig : {};\n\n        // EMCC only allows for a single onAbort function (not an array of functions)\n        // So if the user defined their own onAbort function, we remember it and call it\n        var originalOnAbortFunction = Module['onAbort'];\n        Module['onAbort'] = function (errorThatCausedAbort) {\n            reject(new Error(errorThatCausedAbort));\n            if (originalOnAbortFunction){\n              originalOnAbortFunction(errorThatCausedAbort);\n            }\n        };\n\n        Module['postRun'] = Module['postRun'] || [];\n        Module['postRun'].push(function () {\n            // When Emscripted calls postRun, this promise resolves with the built Module\n            resolveModule(Module);\n        });\n\n        // There is a section of code in the emcc-generated code below that looks like this:\n        // (Note that this is lowercase `module`)\n        // if (typeof module !== 'undefined') {\n        //     module['exports'] = Module;\n        // }\n        // When that runs, it's going to overwrite our own modularization export efforts in shell-post.js!\n        // The only way to tell emcc not to emit it is to pass the MODULARIZE=1 or MODULARIZE_INSTANCE=1 flags,\n        // but that carries with it additional unnecessary baggage/bugs we don't want either.\n        // So, we have three options:\n        // 1) We undefine `module`\n        // 2) We remember what `module['exports']` was at the beginning of this function and we restore it later\n        // 3) We write a script to remove those lines of code as part of the Make process.\n        //\n        // Since those are the only lines of code that care about module, we will undefine it. It's the most straightforward\n        // of the options, and has the side effect of reducing emcc's efforts to modify the module if its output were to change in the future.\n        // That's a nice side effect since we're handling the modularization efforts ourselves\n        module = undefined;\n\n        // The emcc-generated code and shell-post.js code goes below,\n        // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort\nvar k;k||=typeof Module != 'undefined' ? Module : {};var aa=!!globalThis.window,ba=!!globalThis.WorkerGlobalScope,ca=globalThis.process?.versions?.node&&\"renderer\"!=globalThis.process?.type;\nk.onRuntimeInitialized=function(){function a(f,l){switch(typeof l){case \"boolean\":bc(f,l?1:0);break;case \"number\":cc(f,l);break;case \"string\":dc(f,l,-1,-1);break;case \"object\":if(null===l)lb(f);else if(null!=l.length){var n=da(l.length);m.set(l,n);ec(f,n,l.length,-1);ea(n)}else sa(f,\"Wrong API use : tried to return a value of an unknown type (\"+l+\").\",-1);break;default:lb(f)}}function b(f,l){for(var n=[],p=0;p<f;p+=1){var u=r(l+4*p,\"i32\"),v=fc(u);if(1===v||2===v)u=gc(u);else if(3===v)u=hc(u);else if(4===\nv){v=u;u=ic(v);v=jc(v);for(var K=new Uint8Array(u),I=0;I<u;I+=1)K[I]=m[v+I];u=K}else u=null;n.push(u)}return n}function c(f,l){this.Qa=f;this.db=l;this.Oa=1;this.mb=[]}function d(f,l){this.db=l;this.fb=fa(f);if(null===this.fb)throw Error(\"Unable to allocate memory for the SQL string\");this.lb=this.fb;this.$a=this.sb=null}function e(f){this.filename=\"dbfile_\"+(4294967295*Math.random()>>>0);if(null!=f){var l=this.filename,n=\"/\",p=l;n&&(n=\"string\"==typeof n?n:ha(n),p=l?ia(n+\"/\"+l):n);l=ja(!0,!0);p=ka(p,\nl);if(f){if(\"string\"==typeof f){n=Array(f.length);for(var u=0,v=f.length;u<v;++u)n[u]=f.charCodeAt(u);f=n}la(p,l|146);n=ma(p,577);na(n,f,0,f.length,0);oa(n);la(p,l)}}this.handleError(q(this.filename,g));this.db=r(g,\"i32\");ob(this.db);this.gb={};this.Sa={}}var g=y(4),h=k.cwrap,q=h(\"sqlite3_open\",\"number\",[\"string\",\"number\"]),w=h(\"sqlite3_close_v2\",\"number\",[\"number\"]),t=h(\"sqlite3_exec\",\"number\",[\"number\",\"string\",\"number\",\"number\",\"number\"]),x=h(\"sqlite3_changes\",\"number\",[\"number\"]),D=h(\"sqlite3_prepare_v2\",\n\"number\",[\"number\",\"string\",\"number\",\"number\",\"number\"]),pb=h(\"sqlite3_sql\",\"string\",[\"number\"]),lc=h(\"sqlite3_normalized_sql\",\"string\",[\"number\"]),qb=h(\"sqlite3_prepare_v2\",\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\"]),mc=h(\"sqlite3_bind_text\",\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\"]),rb=h(\"sqlite3_bind_blob\",\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\"]),nc=h(\"sqlite3_bind_double\",\"number\",[\"number\",\"number\",\"number\"]),oc=h(\"sqlite3_bind_int\",\"number\",[\"number\",\n\"number\",\"number\"]),pc=h(\"sqlite3_bind_parameter_index\",\"number\",[\"number\",\"string\"]),qc=h(\"sqlite3_step\",\"number\",[\"number\"]),rc=h(\"sqlite3_errmsg\",\"string\",[\"number\"]),sc=h(\"sqlite3_column_count\",\"number\",[\"number\"]),tc=h(\"sqlite3_data_count\",\"number\",[\"number\"]),uc=h(\"sqlite3_column_double\",\"number\",[\"number\",\"number\"]),sb=h(\"sqlite3_column_text\",\"string\",[\"number\",\"number\"]),vc=h(\"sqlite3_column_blob\",\"number\",[\"number\",\"number\"]),wc=h(\"sqlite3_column_bytes\",\"number\",[\"number\",\"number\"]),xc=h(\"sqlite3_column_type\",\n\"number\",[\"number\",\"number\"]),yc=h(\"sqlite3_column_name\",\"string\",[\"number\",\"number\"]),zc=h(\"sqlite3_reset\",\"number\",[\"number\"]),Ac=h(\"sqlite3_clear_bindings\",\"number\",[\"number\"]),Bc=h(\"sqlite3_finalize\",\"number\",[\"number\"]),tb=h(\"sqlite3_create_function_v2\",\"number\",\"number string number number number number number number number\".split(\" \")),fc=h(\"sqlite3_value_type\",\"number\",[\"number\"]),ic=h(\"sqlite3_value_bytes\",\"number\",[\"number\"]),hc=h(\"sqlite3_value_text\",\"string\",[\"number\"]),jc=h(\"sqlite3_value_blob\",\n\"number\",[\"number\"]),gc=h(\"sqlite3_value_double\",\"number\",[\"number\"]),cc=h(\"sqlite3_result_double\",\"\",[\"number\",\"number\"]),lb=h(\"sqlite3_result_null\",\"\",[\"number\"]),dc=h(\"sqlite3_result_text\",\"\",[\"number\",\"string\",\"number\",\"number\"]),ec=h(\"sqlite3_result_blob\",\"\",[\"number\",\"number\",\"number\",\"number\"]),bc=h(\"sqlite3_result_int\",\"\",[\"number\",\"number\"]),sa=h(\"sqlite3_result_error\",\"\",[\"number\",\"string\",\"number\"]),ub=h(\"sqlite3_aggregate_context\",\"number\",[\"number\",\"number\"]),ob=h(\"RegisterExtensionFunctions\",\n\"number\",[\"number\"]),vb=h(\"sqlite3_update_hook\",\"number\",[\"number\",\"number\",\"number\"]);c.prototype.bind=function(f){if(!this.Qa)throw\"Statement closed\";this.reset();return Array.isArray(f)?this.Gb(f):null!=f&&\"object\"===typeof f?this.Hb(f):!0};c.prototype.step=function(){if(!this.Qa)throw\"Statement closed\";this.Oa=1;var f=qc(this.Qa);switch(f){case 100:return!0;case 101:return!1;default:throw this.db.handleError(f);}};c.prototype.Ab=function(f){null==f&&(f=this.Oa,this.Oa+=1);return uc(this.Qa,f)};\nc.prototype.Ob=function(f){null==f&&(f=this.Oa,this.Oa+=1);f=sb(this.Qa,f);if(\"function\"!==typeof BigInt)throw Error(\"BigInt is not supported\");return BigInt(f)};c.prototype.Tb=function(f){null==f&&(f=this.Oa,this.Oa+=1);return sb(this.Qa,f)};c.prototype.getBlob=function(f){null==f&&(f=this.Oa,this.Oa+=1);var l=wc(this.Qa,f);f=vc(this.Qa,f);for(var n=new Uint8Array(l),p=0;p<l;p+=1)n[p]=m[f+p];return n};c.prototype.get=function(f,l){l=l||{};null!=f&&this.bind(f)&&this.step();f=[];for(var n=tc(this.Qa),\np=0;p<n;p+=1)switch(xc(this.Qa,p)){case 1:var u=l.useBigInt?this.Ob(p):this.Ab(p);f.push(u);break;case 2:f.push(this.Ab(p));break;case 3:f.push(this.Tb(p));break;case 4:f.push(this.getBlob(p));break;default:f.push(null)}return f};c.prototype.qb=function(){for(var f=[],l=sc(this.Qa),n=0;n<l;n+=1)f.push(yc(this.Qa,n));return f};c.prototype.zb=function(f,l){f=this.get(f,l);l=this.qb();for(var n={},p=0;p<l.length;p+=1)n[l[p]]=f[p];return n};c.prototype.Sb=function(){return pb(this.Qa)};c.prototype.Pb=\nfunction(){return lc(this.Qa)};c.prototype.run=function(f){null!=f&&this.bind(f);this.step();return this.reset()};c.prototype.wb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);f=fa(f);this.mb.push(f);this.db.handleError(mc(this.Qa,l,f,-1,0))};c.prototype.Fb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);var n=da(f.length);m.set(f,n);this.mb.push(n);this.db.handleError(rb(this.Qa,l,n,f.length,0))};c.prototype.vb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);this.db.handleError((f===(f|0)?oc:nc)(this.Qa,\nl,f))};c.prototype.Ib=function(f){null==f&&(f=this.Oa,this.Oa+=1);rb(this.Qa,f,0,0,0)};c.prototype.xb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);switch(typeof f){case \"string\":this.wb(f,l);return;case \"number\":this.vb(f,l);return;case \"bigint\":this.wb(f.toString(),l);return;case \"boolean\":this.vb(f+0,l);return;case \"object\":if(null===f){this.Ib(l);return}if(null!=f.length){this.Fb(f,l);return}}throw\"Wrong API use : tried to bind a value of an unknown type (\"+f+\").\";};c.prototype.Hb=function(f){var l=\nthis;Object.keys(f).forEach(function(n){var p=pc(l.Qa,n);0!==p&&l.xb(f[n],p)});return!0};c.prototype.Gb=function(f){for(var l=0;l<f.length;l+=1)this.xb(f[l],l+1);return!0};c.prototype.reset=function(){this.freemem();return 0===Ac(this.Qa)&&0===zc(this.Qa)};c.prototype.freemem=function(){for(var f;void 0!==(f=this.mb.pop());)ea(f)};c.prototype.Ya=function(){this.freemem();var f=0===Bc(this.Qa);delete this.db.gb[this.Qa];this.Qa=0;return f};d.prototype.next=function(){if(null===this.fb)return{done:!0};\nnull!==this.$a&&(this.$a.Ya(),this.$a=null);if(!this.db.db)throw this.ob(),Error(\"Database closed\");var f=pa(),l=y(4);qa(g);qa(l);try{this.db.handleError(qb(this.db.db,this.lb,-1,g,l));this.lb=r(l,\"i32\");var n=r(g,\"i32\");if(0===n)return this.ob(),{done:!0};this.$a=new c(n,this.db);this.db.gb[n]=this.$a;return{value:this.$a,done:!1}}catch(p){throw this.sb=z(this.lb),this.ob(),p;}finally{ra(f)}};d.prototype.ob=function(){ea(this.fb);this.fb=null};d.prototype.Qb=function(){return null!==this.sb?this.sb:\nz(this.lb)};\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator&&(d.prototype[Symbol.iterator]=function(){return this});e.prototype.run=function(f,l){if(!this.db)throw\"Database closed\";if(l){f=this.tb(f,l);try{f.step()}finally{f.Ya()}}else this.handleError(t(this.db,f,0,0,g));return this};e.prototype.exec=function(f,l,n){if(!this.db)throw\"Database closed\";var p=null,u=null,v=null;try{v=u=fa(f);var K=y(4);for(f=[];0!==r(v,\"i8\");){qa(g);qa(K);this.handleError(qb(this.db,v,-1,g,K));var I=r(g,\n\"i32\");v=r(K,\"i32\");if(0!==I){var H=null;p=new c(I,this);for(null!=l&&p.bind(l);p.step();)null===H&&(H={columns:p.qb(),values:[]},f.push(H)),H.values.push(p.get(null,n));p.Ya()}}return f}catch(L){throw p&&p.Ya(),L;}finally{u&&ea(u)}};e.prototype.Mb=function(f,l,n,p,u){\"function\"===typeof l&&(p=n,n=l,l=void 0);f=this.tb(f,l);try{for(;f.step();)n(f.zb(null,u))}finally{f.Ya()}if(\"function\"===typeof p)return p()};e.prototype.tb=function(f,l){qa(g);this.handleError(D(this.db,f,-1,g,0));f=r(g,\"i32\");if(0===\nf)throw\"Nothing to prepare\";var n=new c(f,this);null!=l&&n.bind(l);return this.gb[f]=n};e.prototype.Ub=function(f){return new d(f,this)};e.prototype.Nb=function(){Object.values(this.gb).forEach(function(l){l.Ya()});Object.values(this.Sa).forEach(A);this.Sa={};this.handleError(w(this.db));var f=ta(this.filename);this.handleError(q(this.filename,g));this.db=r(g,\"i32\");ob(this.db);return f};e.prototype.close=function(){null!==this.db&&(Object.values(this.gb).forEach(function(f){f.Ya()}),Object.values(this.Sa).forEach(A),\nthis.Sa={},this.Za&&(A(this.Za),this.Za=void 0),this.handleError(w(this.db)),ua(\"/\"+this.filename),this.db=null)};e.prototype.handleError=function(f){if(0===f)return null;f=rc(this.db);throw Error(f);};e.prototype.Rb=function(){return x(this.db)};e.prototype.Kb=function(f,l){Object.prototype.hasOwnProperty.call(this.Sa,f)&&(A(this.Sa[f]),delete this.Sa[f]);var n=va(function(p,u,v){u=b(u,v);try{var K=l.apply(null,u)}catch(I){sa(p,I,-1);return}a(p,K)},\"viii\");this.Sa[f]=n;this.handleError(tb(this.db,\nf,l.length,1,0,n,0,0,0));return this};e.prototype.Jb=function(f,l){var n=l.init||function(){return null},p=l.finalize||function(H){return H},u=l.step;if(!u)throw\"An aggregate function must have a step function in \"+f;var v={};Object.hasOwnProperty.call(this.Sa,f)&&(A(this.Sa[f]),delete this.Sa[f]);l=f+\"__finalize\";Object.hasOwnProperty.call(this.Sa,l)&&(A(this.Sa[l]),delete this.Sa[l]);var K=va(function(H,L,Pa){var V=ub(H,1);Object.hasOwnProperty.call(v,V)||(v[V]=n());L=b(L,Pa);L=[v[V]].concat(L);\ntry{v[V]=u.apply(null,L)}catch(Dc){delete v[V],sa(H,Dc,-1)}},\"viii\"),I=va(function(H){var L=ub(H,1);try{var Pa=p(v[L])}catch(V){delete v[L];sa(H,V,-1);return}a(H,Pa);delete v[L]},\"vi\");this.Sa[f]=K;this.Sa[l]=I;this.handleError(tb(this.db,f,u.length-1,1,0,0,K,I,0));return this};e.prototype.Zb=function(f){this.Za&&(vb(this.db,0,0),A(this.Za),this.Za=void 0);if(!f)return this;this.Za=va(function(l,n,p,u,v){switch(n){case 18:l=\"insert\";break;case 23:l=\"update\";break;case 9:l=\"delete\";break;default:throw\"unknown operationCode in updateHook callback: \"+\nn;}p=z(p);u=z(u);if(v>Number.MAX_SAFE_INTEGER)throw\"rowId too big to fit inside a Number\";f(l,p,u,Number(v))},\"viiiij\");vb(this.db,this.Za,0);return this};c.prototype.bind=c.prototype.bind;c.prototype.step=c.prototype.step;c.prototype.get=c.prototype.get;c.prototype.getColumnNames=c.prototype.qb;c.prototype.getAsObject=c.prototype.zb;c.prototype.getSQL=c.prototype.Sb;c.prototype.getNormalizedSQL=c.prototype.Pb;c.prototype.run=c.prototype.run;c.prototype.reset=c.prototype.reset;c.prototype.freemem=\nc.prototype.freemem;c.prototype.free=c.prototype.Ya;d.prototype.next=d.prototype.next;d.prototype.getRemainingSQL=d.prototype.Qb;e.prototype.run=e.prototype.run;e.prototype.exec=e.prototype.exec;e.prototype.each=e.prototype.Mb;e.prototype.prepare=e.prototype.tb;e.prototype.iterateStatements=e.prototype.Ub;e.prototype[\"export\"]=e.prototype.Nb;e.prototype.close=e.prototype.close;e.prototype.handleError=e.prototype.handleError;e.prototype.getRowsModified=e.prototype.Rb;e.prototype.create_function=e.prototype.Kb;\ne.prototype.create_aggregate=e.prototype.Jb;e.prototype.updateHook=e.prototype.Zb;k.Database=e};var wa=\"./this.program\",xa=(a,b)=>{throw b;},ya=globalThis.document?.currentScript?.src;\"undefined\"!=typeof __filename?ya=__filename:ba&&(ya=self.location.href);var za=\"\",Aa,Ba;\nif(ca){var fs=require(\"node:fs\");za=__dirname+\"/\";Ba=a=>{a=Ca(a)?new URL(a):a;return fs.readFileSync(a)};Aa=async a=>{a=Ca(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1<process.argv.length&&(wa=process.argv[1].replace(/\\\\/g,\"/\"));process.argv.slice(2);\"undefined\"!=typeof module&&(module.exports=k);xa=(a,b)=>{process.exitCode=a;throw b;}}else if(aa||ba){try{za=(new URL(\".\",ya)).href}catch{}ba&&(Ba=a=>{var b=new XMLHttpRequest;b.open(\"GET\",a,!1);b.responseType=\"arraybuffer\";b.send(null);return new Uint8Array(b.response)});\nAa=async a=>{if(Ca(a))return new Promise((c,d)=>{var e=new XMLHttpRequest;e.open(\"GET\",a,!0);e.responseType=\"arraybuffer\";e.onload=()=>{200==e.status||0==e.status&&e.response?c(e.response):d(e.status)};e.onerror=d;e.send(null)});var b=await fetch(a,{credentials:\"same-origin\"});if(b.ok)return b.arrayBuffer();throw Error(b.status+\" : \"+b.url);}}var Da=console.log.bind(console),B=console.error.bind(console),Ea,Fa=!1,Ga,Ca=a=>a.startsWith(\"file://\"),m,C,Ha,E,F,Ia,Ja,G;\nfunction Ka(){var a=La.buffer;m=new Int8Array(a);Ha=new Int16Array(a);C=new Uint8Array(a);new Uint16Array(a);E=new Int32Array(a);F=new Uint32Array(a);Ia=new Float32Array(a);Ja=new Float64Array(a);G=new BigInt64Array(a);new BigUint64Array(a)}function Ma(a){k.onAbort?.(a);a=\"Aborted(\"+a+\")\";B(a);Fa=!0;throw new WebAssembly.RuntimeError(a+\". Build with -sASSERTIONS for more info.\");}var Na;\nasync function Oa(a){if(!Ea)try{var b=await Aa(a);return new Uint8Array(b)}catch{}if(a==Na&&Ea)a=new Uint8Array(Ea);else if(Ba)a=Ba(a);else throw\"both async and sync fetching of the wasm failed\";return a}async function Qa(a,b){try{var c=await Oa(a);return await WebAssembly.instantiate(c,b)}catch(d){B(`failed to asynchronously prepare wasm: ${d}`),Ma(d)}}\nasync function Ra(a){var b=Na;if(!Ea&&!Ca(b)&&!ca)try{var c=fetch(b,{credentials:\"same-origin\"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){B(`wasm streaming compile failed: ${d}`),B(\"falling back to ArrayBuffer instantiation\")}return Qa(b,a)}class Sa{name=\"ExitStatus\";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}var Ta=a=>{for(;0<a.length;)a.shift()(k)},Ua=[],Va=[],Wa=()=>{var a=k.preRun.shift();Va.push(a)},J=0,Xa=null;\nfunction r(a,b=\"i8\"){b.endsWith(\"*\")&&(b=\"*\");switch(b){case \"i1\":return m[a];case \"i8\":return m[a];case \"i16\":return Ha[a>>1];case \"i32\":return E[a>>2];case \"i64\":return G[a>>3];case \"float\":return Ia[a>>2];case \"double\":return Ja[a>>3];case \"*\":return F[a>>2];default:Ma(`invalid type for getValue: ${b}`)}}var Ya=!0;\nfunction qa(a){var b=\"i32\";b.endsWith(\"*\")&&(b=\"*\");switch(b){case \"i1\":m[a]=0;break;case \"i8\":m[a]=0;break;case \"i16\":Ha[a>>1]=0;break;case \"i32\":E[a>>2]=0;break;case \"i64\":G[a>>3]=BigInt(0);break;case \"float\":Ia[a>>2]=0;break;case \"double\":Ja[a>>3]=0;break;case \"*\":F[a>>2]=0;break;default:Ma(`invalid type for setValue: ${b}`)}}\nvar Za=new TextDecoder,$a=(a,b,c,d)=>{c=b+c;if(d)return c;for(;a[b]&&!(b>=c);)++b;return b},z=(a,b,c)=>a?Za.decode(C.subarray(a,$a(C,a,b,c))):\"\",ab=(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var e=a[d];\".\"===e?a.splice(d,1):\"..\"===e?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift(\"..\");return a},ia=a=>{var b=\"/\"===a.charAt(0),c=\"/\"===a.slice(-1);(a=ab(a.split(\"/\").filter(d=>!!d),!b).join(\"/\"))||b||(a=\".\");a&&c&&(a+=\"/\");return(b?\"/\":\"\")+a},bb=a=>{var b=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/.exec(a).slice(1);\na=b[0];b=b[1];if(!a&&!b)return\".\";b&&=b.slice(0,-1);return a+b},cb=a=>a&&a.match(/([^\\/]+|\\/)\\/*$/)[1],db=()=>{if(ca){var a=require(\"node:crypto\");return b=>a.randomFillSync(b)}return b=>crypto.getRandomValues(b)},eb=a=>{(eb=db())(a)},fb=(...a)=>{for(var b=\"\",c=!1,d=a.length-1;-1<=d&&!c;d--){c=0<=d?a[d]:\"/\";if(\"string\"!=typeof c)throw new TypeError(\"Arguments to path.resolve must be strings\");if(!c)return\"\";b=c+\"/\"+b;c=\"/\"===c.charAt(0)}b=ab(b.split(\"/\").filter(e=>!!e),!c).join(\"/\");return(c?\"/\":\n\"\")+b||\".\"},gb=a=>{var b=$a(a,0);return Za.decode(a.buffer?a.subarray(0,b):new Uint8Array(a.slice(0,b)))},hb=[],ib=a=>{for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},M=(a,b,c,d)=>{if(!(0<d))return 0;var e=c;d=c+d-1;for(var g=0;g<a.length;++g){var h=a.codePointAt(g);if(127>=h){if(c>=d)break;b[c++]=h}else if(2047>=h){if(c+1>=d)break;b[c++]=192|h>>6;b[c++]=128|h&63}else if(65535>=h){if(c+2>=d)break;b[c++]=224|h>>12;b[c++]=128|\nh>>6&63;b[c++]=128|h&63}else{if(c+3>=d)break;b[c++]=240|h>>18;b[c++]=128|h>>12&63;b[c++]=128|h>>6&63;b[c++]=128|h&63;g++}}b[c]=0;return c-e},jb=[];function kb(a,b){jb[a]={input:[],output:[],eb:b};mb(a,nb)}\nvar nb={open(a){var b=jb[a.node.rdev];if(!b)throw new N(43);a.tty=b;a.seekable=!1},close(a){a.tty.eb.fsync(a.tty)},fsync(a){a.tty.eb.fsync(a.tty)},read(a,b,c,d){if(!a.tty||!a.tty.eb.Bb)throw new N(60);for(var e=0,g=0;g<d;g++){try{var h=a.tty.eb.Bb(a.tty)}catch(q){throw new N(29);}if(void 0===h&&0===e)throw new N(6);if(null===h||void 0===h)break;e++;b[c+g]=h}e&&(a.node.atime=Date.now());return e},write(a,b,c,d){if(!a.tty||!a.tty.eb.ub)throw new N(60);try{for(var e=0;e<d;e++)a.tty.eb.ub(a.tty,b[c+e])}catch(g){throw new N(29);\n}d&&(a.node.mtime=a.node.ctime=Date.now());return e}},wb={Bb(){a:{if(!hb.length){var a=null;if(ca){var b=Buffer.alloc(256),c=0,d=process.stdin.fd;try{c=fs.readSync(d,b,0,256)}catch(e){if(e.toString().includes(\"EOF\"))c=0;else throw e;}0<c&&(a=b.slice(0,c).toString(\"utf-8\"))}else globalThis.window?.prompt&&(a=window.prompt(\"Input: \"),null!==a&&(a+=\"\\n\"));if(!a){a=null;break a}b=Array(ib(a)+1);a=M(a,b,0,b.length);b.length=a;hb=b}a=hb.shift()}return a},ub(a,b){null===b||10===b?(Da(gb(a.output)),a.output=\n[]):0!=b&&a.output.push(b)},fsync(a){0<a.output?.length&&(Da(gb(a.output)),a.output=[])},hc(){return{bc:25856,dc:5,ac:191,cc:35387,$b:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ic(){return 0},jc(){return[24,80]}},xb={ub(a,b){null===b||10===b?(B(gb(a.output)),a.output=[]):0!=b&&a.output.push(b)},fsync(a){0<a.output?.length&&(B(gb(a.output)),a.output=[])}},O={Wa:null,Xa(){return O.createNode(null,\"/\",16895,0)},createNode(a,b,c,d){if(24576===(c&61440)||4096===(c&61440))throw new N(63);\nO.Wa||(O.Wa={dir:{node:{Ta:O.La.Ta,Ua:O.La.Ua,lookup:O.La.lookup,ib:O.La.ib,rename:O.La.rename,unlink:O.La.unlink,rmdir:O.La.rmdir,readdir:O.La.readdir,symlink:O.La.symlink},stream:{Va:O.Ma.Va}},file:{node:{Ta:O.La.Ta,Ua:O.La.Ua},stream:{Va:O.Ma.Va,read:O.Ma.read,write:O.Ma.write,jb:O.Ma.jb,kb:O.Ma.kb}},link:{node:{Ta:O.La.Ta,Ua:O.La.Ua,readlink:O.La.readlink},stream:{}},yb:{node:{Ta:O.La.Ta,Ua:O.La.Ua},stream:yb}});c=zb(a,b,c,d);P(c.mode)?(c.La=O.Wa.dir.node,c.Ma=O.Wa.dir.stream,c.Na={}):32768===\n(c.mode&61440)?(c.La=O.Wa.file.node,c.Ma=O.Wa.file.stream,c.Ra=0,c.Na=null):40960===(c.mode&61440)?(c.La=O.Wa.link.node,c.Ma=O.Wa.link.stream):8192===(c.mode&61440)&&(c.La=O.Wa.yb.node,c.Ma=O.Wa.yb.stream);c.atime=c.mtime=c.ctime=Date.now();a&&(a.Na[b]=c,a.atime=a.mtime=a.ctime=c.atime);return c},fc(a){return a.Na?a.Na.subarray?a.Na.subarray(0,a.Ra):new Uint8Array(a.Na):new Uint8Array(0)},La:{Ta(a){var b={};b.dev=8192===(a.mode&61440)?a.id:1;b.ino=a.id;b.mode=a.mode;b.nlink=1;b.uid=0;b.gid=0;b.rdev=\na.rdev;P(a.mode)?b.size=4096:32768===(a.mode&61440)?b.size=a.Ra:40960===(a.mode&61440)?b.size=a.link.length:b.size=0;b.atime=new Date(a.atime);b.mtime=new Date(a.mtime);b.ctime=new Date(a.ctime);b.blksize=4096;b.blocks=Math.ceil(b.size/b.blksize);return b},Ua(a,b){for(var c of[\"mode\",\"atime\",\"mtime\",\"ctime\"])null!=b[c]&&(a[c]=b[c]);void 0!==b.size&&(b=b.size,a.Ra!=b&&(0==b?(a.Na=null,a.Ra=0):(c=a.Na,a.Na=new Uint8Array(b),c&&a.Na.set(c.subarray(0,Math.min(b,a.Ra))),a.Ra=b)))},lookup(){O.nb||(O.nb=\nnew N(44),O.nb.stack=\"<generic error, no stack>\");throw O.nb;},ib(a,b,c,d){return O.createNode(a,b,c,d)},rename(a,b,c){try{var d=Q(b,c)}catch(g){}if(d){if(P(a.mode))for(var e in d.Na)throw new N(55);Ab(d)}delete a.parent.Na[a.name];b.Na[c]=a;a.name=c;b.ctime=b.mtime=a.parent.ctime=a.parent.mtime=Date.now()},unlink(a,b){delete a.Na[b];a.ctime=a.mtime=Date.now()},rmdir(a,b){var c=Q(a,b),d;for(d in c.Na)throw new N(55);delete a.Na[b];a.ctime=a.mtime=Date.now()},readdir(a){return[\".\",\"..\",...Object.keys(a.Na)]},\nsymlink(a,b,c){a=O.createNode(a,b,41471,0);a.link=c;return a},readlink(a){if(40960!==(a.mode&61440))throw new N(28);return a.link}},Ma:{read(a,b,c,d,e){var g=a.node.Na;if(e>=a.node.Ra)return 0;a=Math.min(a.node.Ra-e,d);if(8<a&&g.subarray)b.set(g.subarray(e,e+a),c);else for(d=0;d<a;d++)b[c+d]=g[e+d];return a},write(a,b,c,d,e,g){b.buffer===m.buffer&&(g=!1);if(!d)return 0;a=a.node;a.mtime=a.ctime=Date.now();if(b.subarray&&(!a.Na||a.Na.subarray)){if(g)return a.Na=b.subarray(c,c+d),a.Ra=d;if(0===a.Ra&&\n0===e)return a.Na=b.slice(c,c+d),a.Ra=d;if(e+d<=a.Ra)return a.Na.set(b.subarray(c,c+d),e),d}g=e+d;var h=a.Na?a.Na.length:0;h>=g||(g=Math.max(g,h*(1048576>h?2:1.125)>>>0),0!=h&&(g=Math.max(g,256)),h=a.Na,a.Na=new Uint8Array(g),0<a.Ra&&a.Na.set(h.subarray(0,a.Ra),0));if(a.Na.subarray&&b.subarray)a.Na.set(b.subarray(c,c+d),e);else for(g=0;g<d;g++)a.Na[e+g]=b[c+g];a.Ra=Math.max(a.Ra,e+d);return d},Va(a,b,c){1===c?b+=a.position:2===c&&32768===(a.node.mode&61440)&&(b+=a.node.Ra);if(0>b)throw new N(28);\nreturn b},jb(a,b,c,d,e){if(32768!==(a.node.mode&61440))throw new N(43);a=a.node.Na;if(e&2||!a||a.buffer!==m.buffer){e=!0;d=65536*Math.ceil(b/65536);var g=Bb(65536,d);g&&C.fill(0,g,g+d);d=g;if(!d)throw new N(48);if(a){if(0<c||c+b<a.length)a.subarray?a=a.subarray(c,c+b):a=Array.prototype.slice.call(a,c,c+b);m.set(a,d)}}else e=!1,d=a.byteOffset;return{Xb:d,Eb:e}},kb(a,b,c,d){O.Ma.write(a,b,0,d,c,!1);return 0}}},ja=(a,b)=>{var c=0;a&&(c|=365);b&&(c|=146);return c},Cb=null,Db={},Eb=[],Fb=1,R=null,Gb=!1,\nHb=!0,N=class{name=\"ErrnoError\";constructor(a){this.Pa=a}},Ib=class{hb={};node=null;get flags(){return this.hb.flags}set flags(a){this.hb.flags=a}get position(){return this.hb.position}set position(a){this.hb.position=a}},Jb=class{La={};Ma={};bb=null;constructor(a,b,c,d){a||=this;this.parent=a;this.Xa=a.Xa;this.id=Fb++;this.name=b;this.mode=c;this.rdev=d;this.atime=this.mtime=this.ctime=Date.now()}get read(){return 365===(this.mode&365)}set read(a){a?this.mode|=365:this.mode&=-366}get write(){return 146===\n(this.mode&146)}set write(a){a?this.mode|=146:this.mode&=-147}};\nfunction S(a,b={}){if(!a)throw new N(44);b.pb??(b.pb=!0);\"/\"===a.charAt(0)||(a=\"//\"+a);var c=0;a:for(;40>c;c++){a=a.split(\"/\").filter(q=>!!q);for(var d=Cb,e=\"/\",g=0;g<a.length;g++){var h=g===a.length-1;if(h&&b.parent)break;if(\".\"!==a[g])if(\"..\"===a[g])if(e=bb(e),d===d.parent){a=e+\"/\"+a.slice(g+1).join(\"/\");c--;continue a}else d=d.parent;else{e=ia(e+\"/\"+a[g]);try{d=Q(d,a[g])}catch(q){if(44===q?.Pa&&h&&b.Wb)return{path:e};throw q;}!d.bb||h&&!b.pb||(d=d.bb.root);if(40960===(d.mode&61440)&&(!h||b.ab)){if(!d.La.readlink)throw new N(52);\nd=d.La.readlink(d);\"/\"===d.charAt(0)||(d=bb(e)+\"/\"+d);a=d+\"/\"+a.slice(g+1).join(\"/\");continue a}}}return{path:e,node:d}}throw new N(32);}function ha(a){for(var b;;){if(a===a.parent)return a=a.Xa.Db,b?\"/\"!==a[a.length-1]?`${a}/${b}`:a+b:a;b=b?`${a.name}/${b}`:a.name;a=a.parent}}function Kb(a,b){for(var c=0,d=0;d<b.length;d++)c=(c<<5)-c+b.charCodeAt(d)|0;return(a+c>>>0)%R.length}\nfunction Ab(a){var b=Kb(a.parent.id,a.name);if(R[b]===a)R[b]=a.cb;else for(b=R[b];b;){if(b.cb===a){b.cb=a.cb;break}b=b.cb}}function Q(a,b){var c=P(a.mode)?(c=Lb(a,\"x\"))?c:a.La.lookup?0:2:54;if(c)throw new N(c);for(c=R[Kb(a.id,b)];c;c=c.cb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.La.lookup(a,b)}function zb(a,b,c,d){a=new Jb(a,b,c,d);b=Kb(a.parent.id,a.name);a.cb=R[b];return R[b]=a}function P(a){return 16384===(a&61440)}\nfunction Lb(a,b){return Hb?0:b.includes(\"r\")&&!(a.mode&292)||b.includes(\"w\")&&!(a.mode&146)||b.includes(\"x\")&&!(a.mode&73)?2:0}function Mb(a,b){if(!P(a.mode))return 54;try{return Q(a,b),20}catch(c){}return Lb(a,\"wx\")}function Nb(a,b,c){try{var d=Q(a,b)}catch(e){return e.Pa}if(a=Lb(a,\"wx\"))return a;if(c){if(!P(d.mode))return 54;if(d===d.parent||\"/\"===ha(d))return 10}else if(P(d.mode))return 31;return 0}function Ob(a){if(!a)throw new N(63);return a}\nfunction T(a){a=Eb[a];if(!a)throw new N(8);return a}function Pb(a,b=-1){a=Object.assign(new Ib,a);if(-1==b)a:{for(b=0;4096>=b;b++)if(!Eb[b])break a;throw new N(33);}a.fd=b;return Eb[b]=a}function Qb(a,b=-1){a=Pb(a,b);a.Ma?.ec?.(a);return a}function Rb(a,b,c){var d=a?.Ma.Ua;a=d?a:b;d??=b.La.Ua;Ob(d);d(a,c)}var yb={open(a){a.Ma=Db[a.node.rdev].Ma;a.Ma.open?.(a)},Va(){throw new N(70);}};function mb(a,b){Db[a]={Ma:b}}\nfunction Sb(a,b){var c=\"/\"===b;if(c&&Cb)throw new N(10);if(!c&&b){var d=S(b,{pb:!1});b=d.path;d=d.node;if(d.bb)throw new N(10);if(!P(d.mode))throw new N(54);}b={type:a,kc:{},Db:b,Vb:[]};a=a.Xa(b);a.Xa=b;b.root=a;c?Cb=a:d&&(d.bb=b,d.Xa&&d.Xa.Vb.push(b))}function Tb(a,b,c){var d=S(a,{parent:!0}).node;a=cb(a);if(!a)throw new N(28);if(\".\"===a||\"..\"===a)throw new N(20);var e=Mb(d,a);if(e)throw new N(e);if(!d.La.ib)throw new N(63);return d.La.ib(d,a,b,c)}\nfunction ka(a,b=438){return Tb(a,b&4095|32768,0)}function U(a,b=511){return Tb(a,b&1023|16384,0)}function Ub(a,b,c){\"undefined\"==typeof c&&(c=b,b=438);Tb(a,b|8192,c)}function Vb(a,b){if(!fb(a))throw new N(44);var c=S(b,{parent:!0}).node;if(!c)throw new N(44);b=cb(b);var d=Mb(c,b);if(d)throw new N(d);if(!c.La.symlink)throw new N(63);c.La.symlink(c,b,a)}\nfunction Wb(a){var b=S(a,{parent:!0}).node;a=cb(a);var c=Q(b,a),d=Nb(b,a,!0);if(d)throw new N(d);if(!b.La.rmdir)throw new N(63);if(c.bb)throw new N(10);b.La.rmdir(b,a);Ab(c)}function ua(a){var b=S(a,{parent:!0}).node;if(!b)throw new N(44);a=cb(a);var c=Q(b,a),d=Nb(b,a,!1);if(d)throw new N(d);if(!b.La.unlink)throw new N(63);if(c.bb)throw new N(10);b.La.unlink(b,a);Ab(c)}function Xb(a,b){a=S(a,{ab:!b}).node;return Ob(a.La.Ta)(a)}\nfunction Yb(a,b,c,d){Rb(a,b,{mode:c&4095|b.mode&-4096,ctime:Date.now(),Lb:d})}function la(a,b){a=\"string\"==typeof a?S(a,{ab:!0}).node:a;Yb(null,a,b)}function Zb(a,b,c){if(P(b.mode))throw new N(31);if(32768!==(b.mode&61440))throw new N(28);var d=Lb(b,\"w\");if(d)throw new N(d);Rb(a,b,{size:c,timestamp:Date.now()})}\nfunction ma(a,b,c=438){if(\"\"===a)throw new N(44);if(\"string\"==typeof b){var d={r:0,\"r+\":2,w:577,\"w+\":578,a:1089,\"a+\":1090}[b];if(\"undefined\"==typeof d)throw Error(`Unknown file open mode: ${b}`);b=d}c=b&64?c&4095|32768:0;if(\"object\"==typeof a)d=a;else{var e=a.endsWith(\"/\");var g=S(a,{ab:!(b&131072),Wb:!0});d=g.node;a=g.path}g=!1;if(b&64)if(d){if(b&128)throw new N(20);}else{if(e)throw new N(31);d=Tb(a,c|511,0);g=!0}if(!d)throw new N(44);8192===(d.mode&61440)&&(b&=-513);if(b&65536&&!P(d.mode))throw new N(54);\nif(!g&&(d?40960===(d.mode&61440)?e=32:(e=[\"r\",\"w\",\"rw\"][b&3],b&512&&(e+=\"w\"),e=P(d.mode)&&(\"r\"!==e||b&576)?31:Lb(d,e)):e=44,e))throw new N(e);b&512&&!g&&(e=d,e=\"string\"==typeof e?S(e,{ab:!0}).node:e,Zb(null,e,0));b=Pb({node:d,path:ha(d),flags:b&-131713,seekable:!0,position:0,Ma:d.Ma,Yb:[],error:!1});b.Ma.open&&b.Ma.open(b);g&&la(d,c&511);return b}function oa(a){if(null===a.fd)throw new N(8);a.rb&&(a.rb=null);try{a.Ma.close&&a.Ma.close(a)}catch(b){throw b;}finally{Eb[a.fd]=null}a.fd=null}\nfunction $b(a,b,c){if(null===a.fd)throw new N(8);if(!a.seekable||!a.Ma.Va)throw new N(70);if(0!=c&&1!=c&&2!=c)throw new N(28);a.position=a.Ma.Va(a,b,c);a.Yb=[]}function ac(a,b,c,d,e){if(0>d||0>e)throw new N(28);if(null===a.fd)throw new N(8);if(1===(a.flags&2097155))throw new N(8);if(P(a.node.mode))throw new N(31);if(!a.Ma.read)throw new N(28);var g=\"undefined\"!=typeof e;if(!g)e=a.position;else if(!a.seekable)throw new N(70);b=a.Ma.read(a,b,c,d,e);g||(a.position+=b);return b}\nfunction na(a,b,c,d,e){if(0>d||0>e)throw new N(28);if(null===a.fd)throw new N(8);if(0===(a.flags&2097155))throw new N(8);if(P(a.node.mode))throw new N(31);if(!a.Ma.write)throw new N(28);a.seekable&&a.flags&1024&&$b(a,0,2);var g=\"undefined\"!=typeof e;if(!g)e=a.position;else if(!a.seekable)throw new N(70);b=a.Ma.write(a,b,c,d,e,void 0);g||(a.position+=b);return b}\nfunction ta(a){var b=b||0;var c=\"binary\";\"utf8\"!==c&&\"binary\"!==c&&Ma(`Invalid encoding type \"${c}\"`);b=ma(a,b);a=Xb(a).size;var d=new Uint8Array(a);ac(b,d,0,a,0);\"utf8\"===c&&(d=gb(d));oa(b);return d}\nfunction W(a,b,c){a=ia(\"/dev/\"+a);var d=ja(!!b,!!c);W.Cb??(W.Cb=64);var e=W.Cb++<<8|0;mb(e,{open(g){g.seekable=!1},close(){c?.buffer?.length&&c(10)},read(g,h,q,w){for(var t=0,x=0;x<w;x++){try{var D=b()}catch(pb){throw new N(29);}if(void 0===D&&0===t)throw new N(6);if(null===D||void 0===D)break;t++;h[q+x]=D}t&&(g.node.atime=Date.now());return t},write(g,h,q,w){for(var t=0;t<w;t++)try{c(h[q+t])}catch(x){throw new N(29);}w&&(g.node.mtime=g.node.ctime=Date.now());return t}});Ub(a,d,e)}var X={};\nfunction Y(a,b,c){if(\"/\"===b.charAt(0))return b;a=-100===a?\"/\":T(a).path;if(0==b.length){if(!c)throw new N(44);return a}return a+\"/\"+b}\nfunction kc(a,b){F[a>>2]=b.dev;F[a+4>>2]=b.mode;F[a+8>>2]=b.nlink;F[a+12>>2]=b.uid;F[a+16>>2]=b.gid;F[a+20>>2]=b.rdev;G[a+24>>3]=BigInt(b.size);E[a+32>>2]=4096;E[a+36>>2]=b.blocks;var c=b.atime.getTime(),d=b.mtime.getTime(),e=b.ctime.getTime();G[a+40>>3]=BigInt(Math.floor(c/1E3));F[a+48>>2]=c%1E3*1E6;G[a+56>>3]=BigInt(Math.floor(d/1E3));F[a+64>>2]=d%1E3*1E6;G[a+72>>3]=BigInt(Math.floor(e/1E3));F[a+80>>2]=e%1E3*1E6;G[a+88>>3]=BigInt(b.ino);return 0}\nvar Cc=void 0,Ec=()=>{var a=E[+Cc>>2];Cc+=4;return a},Fc=0,Gc=[0,31,60,91,121,152,182,213,244,274,305,335],Hc=[0,31,59,90,120,151,181,212,243,273,304,334],Ic={},Jc=a=>{Ga=a;Ya||0<Fc||(k.onExit?.(a),Fa=!0);xa(a,new Sa(a))},Kc=a=>{if(!Fa)try{a()}catch(b){b instanceof Sa||\"unwind\"==b||xa(1,b)}finally{if(!(Ya||0<Fc))try{Ga=a=Ga,Jc(a)}catch(b){b instanceof Sa||\"unwind\"==b||xa(1,b)}}},Lc={},Nc=()=>{if(!Mc){var a={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:(globalThis.navigator?.language??\n\"C\").replace(\"-\",\"_\")+\".UTF-8\",_:wa||\"./this.program\"},b;for(b in Lc)void 0===Lc[b]?delete a[b]:a[b]=Lc[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);Mc=c}return Mc},Mc,Oc=(a,b,c,d)=>{var e={string:t=>{var x=0;if(null!==t&&void 0!==t&&0!==t){x=ib(t)+1;var D=y(x);M(t,C,D,x);x=D}return x},array:t=>{var x=y(t.length);m.set(t,x);return x}};a=k[\"_\"+a];var g=[],h=0;if(d)for(var q=0;q<d.length;q++){var w=e[c[q]];w?(0===h&&(h=pa()),g[q]=w(d[q])):g[q]=d[q]}c=a(...g);return c=function(t){0!==h&&ra(h);return\"string\"===\nb?z(t):\"boolean\"===b?!!t:t}(c)},fa=a=>{var b=ib(a)+1,c=da(b);c&&M(a,C,c,b);return c},Pc,Qc=[],A=a=>{Pc.delete(Z.get(a));Z.set(a,null);Qc.push(a)},Rc=a=>{const b=a.length;return[b%128|128,b>>7,...a]},Sc={i:127,p:127,j:126,f:125,d:124,e:111},Tc=a=>Rc(Array.from(a,b=>Sc[b])),va=(a,b)=>{if(!Pc){Pc=new WeakMap;var c=Z.length;if(Pc)for(var d=0;d<0+c;d++){var e=Z.get(d);e&&Pc.set(e,d)}}if(c=Pc.get(a)||0)return c;c=Qc.length?Qc.pop():Z.grow(1);try{Z.set(c,a)}catch(g){if(!(g instanceof TypeError))throw g;\nb=Uint8Array.of(0,97,115,109,1,0,0,0,1,...Rc([1,96,...Tc(b.slice(1)),...Tc(\"v\"===b[0]?\"\":b[0])]),2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(b);b=(new WebAssembly.Instance(b,{e:{f:a}})).exports.f;Z.set(c,b)}Pc.set(a,c);return c};R=Array(4096);Sb(O,\"/\");U(\"/tmp\");U(\"/home\");U(\"/home/web_user\");\n(function(){U(\"/dev\");mb(259,{read:()=>0,write:(d,e,g,h)=>h,Va:()=>0});Ub(\"/dev/null\",259);kb(1280,wb);kb(1536,xb);Ub(\"/dev/tty\",1280);Ub(\"/dev/tty1\",1536);var a=new Uint8Array(1024),b=0,c=()=>{0===b&&(eb(a),b=a.byteLength);return a[--b]};W(\"random\",c);W(\"urandom\",c);U(\"/dev/shm\");U(\"/dev/shm/tmp\")})();\n(function(){U(\"/proc\");var a=U(\"/proc/self\");U(\"/proc/self/fd\");Sb({Xa(){var b=zb(a,\"fd\",16895,73);b.Ma={Va:O.Ma.Va};b.La={lookup(c,d){c=+d;var e=T(c);c={parent:null,Xa:{Db:\"fake\"},La:{readlink:()=>e.path},id:c+1};return c.parent=c},readdir(){return Array.from(Eb.entries()).filter(([,c])=>c).map(([c])=>c.toString())}};return b}},\"/proc/self/fd\")})();k.noExitRuntime&&(Ya=k.noExitRuntime);k.print&&(Da=k.print);k.printErr&&(B=k.printErr);k.wasmBinary&&(Ea=k.wasmBinary);k.thisProgram&&(wa=k.thisProgram);\nif(k.preInit)for(\"function\"==typeof k.preInit&&(k.preInit=[k.preInit]);0<k.preInit.length;)k.preInit.shift()();k.stackSave=()=>pa();k.stackRestore=a=>ra(a);k.stackAlloc=a=>y(a);k.cwrap=(a,b,c,d)=>{var e=!c||c.every(g=>\"number\"===g||\"boolean\"===g);return\"string\"!==b&&e&&!d?k[\"_\"+a]:(...g)=>Oc(a,b,c,g)};k.addFunction=va;k.removeFunction=A;k.UTF8ToString=z;k.stringToNewUTF8=fa;k.writeArrayToMemory=(a,b)=>{m.set(a,b)};\nvar da,ea,Bb,Uc,ra,y,pa,La,Z,Vc={a:(a,b,c,d)=>Ma(`Assertion failed: ${z(a)}, at: `+[b?z(b):\"unknown filename\",c,d?z(d):\"unknown function\"]),i:function(a,b){try{return a=z(a),la(a,b),0}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return-c.Pa}},L:function(a,b,c){try{b=z(b);b=Y(a,b);if(c&-8)return-28;var d=S(b,{ab:!0}).node;if(!d)return-44;a=\"\";c&4&&(a+=\"r\");c&2&&(a+=\"w\");c&1&&(a+=\"x\");return a&&Lb(d,a)?-2:0}catch(e){if(\"undefined\"==typeof X||\"ErrnoError\"!==e.name)throw e;return-e.Pa}},\nj:function(a,b){try{var c=T(a);Yb(c,c.node,b,!1);return 0}catch(d){if(\"undefined\"==typeof X||\"ErrnoError\"!==d.name)throw d;return-d.Pa}},h:function(a){try{var b=T(a);Rb(b,b.node,{timestamp:Date.now(),Lb:!1});return 0}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return-c.Pa}},b:function(a,b,c){Cc=c;try{var d=T(a);switch(b){case 0:var e=Ec();if(0>e)break;for(;Eb[e];)e++;return Qb(d,e).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return e=Ec(),d.flags|=e,0;case 12:return e=\nEc(),Ha[e+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(g){if(\"undefined\"==typeof X||\"ErrnoError\"!==g.name)throw g;return-g.Pa}},g:function(a,b){try{var c=T(a),d=c.node,e=c.Ma.Ta;a=e?c:d;e??=d.La.Ta;Ob(e);var g=e(a);return kc(b,g)}catch(h){if(\"undefined\"==typeof X||\"ErrnoError\"!==h.name)throw h;return-h.Pa}},H:function(a,b){b=-9007199254740992>b||9007199254740992<b?NaN:Number(b);try{if(isNaN(b))return-61;var c=T(a);if(0>b||0===(c.flags&2097155))throw new N(28);Zb(c,c.node,b);return 0}catch(d){if(\"undefined\"==\ntypeof X||\"ErrnoError\"!==d.name)throw d;return-d.Pa}},G:function(a,b){try{if(0===b)return-28;var c=ib(\"/\")+1;if(b<c)return-68;M(\"/\",C,a,b);return c}catch(d){if(\"undefined\"==typeof X||\"ErrnoError\"!==d.name)throw d;return-d.Pa}},K:function(a,b){try{return a=z(a),kc(b,Xb(a,!0))}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return-c.Pa}},C:function(a,b,c){try{return b=z(b),b=Y(a,b),U(b,c),0}catch(d){if(\"undefined\"==typeof X||\"ErrnoError\"!==d.name)throw d;return-d.Pa}},J:function(a,\nb,c,d){try{b=z(b);var e=d&256;b=Y(a,b,d&4096);return kc(c,e?Xb(b,!0):Xb(b))}catch(g){if(\"undefined\"==typeof X||\"ErrnoError\"!==g.name)throw g;return-g.Pa}},x:function(a,b,c,d){Cc=d;try{b=z(b);b=Y(a,b);var e=d?Ec():0;return ma(b,c,e).fd}catch(g){if(\"undefined\"==typeof X||\"ErrnoError\"!==g.name)throw g;return-g.Pa}},v:function(a,b,c,d){try{b=z(b);b=Y(a,b);if(0>=d)return-28;var e=S(b).node;if(!e)throw new N(44);if(!e.La.readlink)throw new N(28);var g=e.La.readlink(e);var h=Math.min(d,ib(g)),q=m[c+h];M(g,\nC,c,d+1);m[c+h]=q;return h}catch(w){if(\"undefined\"==typeof X||\"ErrnoError\"!==w.name)throw w;return-w.Pa}},u:function(a){try{return a=z(a),Wb(a),0}catch(b){if(\"undefined\"==typeof X||\"ErrnoError\"!==b.name)throw b;return-b.Pa}},f:function(a,b){try{return a=z(a),kc(b,Xb(a))}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return-c.Pa}},r:function(a,b,c){try{b=z(b);b=Y(a,b);if(c)if(512===c)Wb(b);else return-28;else ua(b);return 0}catch(d){if(\"undefined\"==typeof X||\"ErrnoError\"!==d.name)throw d;\nreturn-d.Pa}},q:function(a,b,c){try{b=z(b);b=Y(a,b,!0);var d=Date.now(),e,g;if(c){var h=F[c>>2]+4294967296*E[c+4>>2],q=E[c+8>>2];1073741823==q?e=d:1073741822==q?e=null:e=1E3*h+q/1E6;c+=16;h=F[c>>2]+4294967296*E[c+4>>2];q=E[c+8>>2];1073741823==q?g=d:1073741822==q?g=null:g=1E3*h+q/1E6}else g=e=d;if(null!==(g??e)){a=e;var w=S(b,{ab:!0}).node;Ob(w.La.Ua)(w,{atime:a,mtime:g})}return 0}catch(t){if(\"undefined\"==typeof X||\"ErrnoError\"!==t.name)throw t;return-t.Pa}},m:()=>Ma(\"\"),l:()=>{Ya=!1;Fc=0},A:function(a,\nb){a=-9007199254740992>a||9007199254740992<a?NaN:Number(a);a=new Date(1E3*a);E[b>>2]=a.getSeconds();E[b+4>>2]=a.getMinutes();E[b+8>>2]=a.getHours();E[b+12>>2]=a.getDate();E[b+16>>2]=a.getMonth();E[b+20>>2]=a.getFullYear()-1900;E[b+24>>2]=a.getDay();var c=a.getFullYear();E[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?Hc:Gc)[a.getMonth()]+a.getDate()-1|0;E[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();\nE[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},y:function(a,b,c,d,e,g,h){e=-9007199254740992>e||9007199254740992<e?NaN:Number(e);try{var q=T(d);if(0!==(b&2)&&0===(c&2)&&2!==(q.flags&2097155))throw new N(2);if(1===(q.flags&2097155))throw new N(2);if(!q.Ma.jb)throw new N(43);if(!a)throw new N(28);var w=q.Ma.jb(q,a,e,b,c);var t=w.Xb;E[g>>2]=w.Eb;F[h>>2]=t;return 0}catch(x){if(\"undefined\"==typeof X||\"ErrnoError\"!==x.name)throw x;return-x.Pa}},z:function(a,b,c,d,e,g){g=-9007199254740992>g||\n9007199254740992<g?NaN:Number(g);try{var h=T(e);if(c&2){c=g;if(32768!==(h.node.mode&61440))throw new N(43);if(!(d&2)){var q=C.slice(a,a+b);h.Ma.kb&&h.Ma.kb(h,q,c,b,d)}}}catch(w){if(\"undefined\"==typeof X||\"ErrnoError\"!==w.name)throw w;return-w.Pa}},n:(a,b)=>{Ic[a]&&(clearTimeout(Ic[a].id),delete Ic[a]);if(!b)return 0;var c=setTimeout(()=>{delete Ic[a];Kc(()=>Uc(a,performance.now()))},b);Ic[a]={id:c,lc:b};return 0},B:(a,b,c,d)=>{var e=(new Date).getFullYear(),g=(new Date(e,0,1)).getTimezoneOffset();\ne=(new Date(e,6,1)).getTimezoneOffset();F[a>>2]=60*Math.max(g,e);E[b>>2]=Number(g!=e);b=h=>{var q=Math.abs(h);return`UTC${0<=h?\"-\":\"+\"}${String(Math.floor(q/60)).padStart(2,\"0\")}${String(q%60).padStart(2,\"0\")}`};a=b(g);b=b(e);e<g?(M(a,C,c,17),M(b,C,d,17)):(M(a,C,d,17),M(b,C,c,17))},d:()=>Date.now(),s:()=>2147483648,c:()=>performance.now(),o:a=>{var b=C.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,\nd)/65536))-La.buffer.byteLength+65535)/65536|0;try{La.grow(d);Ka();var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},E:(a,b)=>{var c=0,d=0,e;for(e of Nc()){var g=b+c;F[a+d>>2]=g;c+=M(e,C,g,Infinity)+1;d+=4}return 0},F:(a,b)=>{var c=Nc();F[a>>2]=c.length;a=0;for(var d of c)a+=ib(d)+1;F[b>>2]=a;return 0},e:function(a){try{var b=T(a);oa(b);return 0}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return c.Pa}},p:function(a,b){try{var c=T(a);m[b]=c.tty?2:P(c.mode)?3:40960===(c.mode&\n61440)?7:4;Ha[b+2>>1]=0;G[b+8>>3]=BigInt(0);G[b+16>>3]=BigInt(0);return 0}catch(d){if(\"undefined\"==typeof X||\"ErrnoError\"!==d.name)throw d;return d.Pa}},w:function(a,b,c,d){try{a:{var e=T(a);a=b;for(var g,h=b=0;h<c;h++){var q=F[a>>2],w=F[a+4>>2];a+=8;var t=ac(e,m,q,w,g);if(0>t){var x=-1;break a}b+=t;if(t<w)break;\"undefined\"!=typeof g&&(g+=t)}x=b}F[d>>2]=x;return 0}catch(D){if(\"undefined\"==typeof X||\"ErrnoError\"!==D.name)throw D;return D.Pa}},D:function(a,b,c,d){b=-9007199254740992>b||9007199254740992<\nb?NaN:Number(b);try{if(isNaN(b))return 61;var e=T(a);$b(e,b,c);G[d>>3]=BigInt(e.position);e.rb&&0===b&&0===c&&(e.rb=null);return 0}catch(g){if(\"undefined\"==typeof X||\"ErrnoError\"!==g.name)throw g;return g.Pa}},I:function(a){try{var b=T(a);return b.Ma?.fsync?.(b)}catch(c){if(\"undefined\"==typeof X||\"ErrnoError\"!==c.name)throw c;return c.Pa}},t:function(a,b,c,d){try{a:{var e=T(a);a=b;for(var g,h=b=0;h<c;h++){var q=F[a>>2],w=F[a+4>>2];a+=8;var t=na(e,m,q,w,g);if(0>t){var x=-1;break a}b+=t;if(t<w)break;\n\"undefined\"!=typeof g&&(g+=t)}x=b}F[d>>2]=x;return 0}catch(D){if(\"undefined\"==typeof X||\"ErrnoError\"!==D.name)throw D;return D.Pa}},k:Jc};\nfunction Wc(){function a(){k.calledRun=!0;if(!Fa){if(!k.noFSInit&&!Gb){var b,c;Gb=!0;b??=k.stdin;c??=k.stdout;d??=k.stderr;b?W(\"stdin\",b):Vb(\"/dev/tty\",\"/dev/stdin\");c?W(\"stdout\",null,c):Vb(\"/dev/tty\",\"/dev/stdout\");d?W(\"stderr\",null,d):Vb(\"/dev/tty1\",\"/dev/stderr\");ma(\"/dev/stdin\",0);ma(\"/dev/stdout\",1);ma(\"/dev/stderr\",1)}Xc.N();Hb=!1;k.onRuntimeInitialized?.();if(k.postRun)for(\"function\"==typeof k.postRun&&(k.postRun=[k.postRun]);k.postRun.length;){var d=k.postRun.shift();Ua.push(d)}Ta(Ua)}}if(0<\nJ)Xa=Wc;else{if(k.preRun)for(\"function\"==typeof k.preRun&&(k.preRun=[k.preRun]);k.preRun.length;)Wa();Ta(Va);0<J?Xa=Wc:k.setStatus?(k.setStatus(\"Running...\"),setTimeout(()=>{setTimeout(()=>k.setStatus(\"\"),1);a()},1)):a()}}var Xc;\n(async function(){function a(c){c=Xc=c.exports;k._sqlite3_free=c.P;k._sqlite3_value_text=c.Q;k._sqlite3_prepare_v2=c.R;k._sqlite3_step=c.S;k._sqlite3_reset=c.T;k._sqlite3_exec=c.U;k._sqlite3_finalize=c.V;k._sqlite3_column_name=c.W;k._sqlite3_column_text=c.X;k._sqlite3_column_type=c.Y;k._sqlite3_errmsg=c.Z;k._sqlite3_clear_bindings=c._;k._sqlite3_value_blob=c.$;k._sqlite3_value_bytes=c.aa;k._sqlite3_value_double=c.ba;k._sqlite3_value_int=c.ca;k._sqlite3_value_type=c.da;k._sqlite3_result_blob=c.ea;\nk._sqlite3_result_double=c.fa;k._sqlite3_result_error=c.ga;k._sqlite3_result_int=c.ha;k._sqlite3_result_int64=c.ia;k._sqlite3_result_null=c.ja;k._sqlite3_result_text=c.ka;k._sqlite3_aggregate_context=c.la;k._sqlite3_column_count=c.ma;k._sqlite3_data_count=c.na;k._sqlite3_column_blob=c.oa;k._sqlite3_column_bytes=c.pa;k._sqlite3_column_double=c.qa;k._sqlite3_bind_blob=c.ra;k._sqlite3_bind_double=c.sa;k._sqlite3_bind_int=c.ta;k._sqlite3_bind_text=c.ua;k._sqlite3_bind_parameter_index=c.va;k._sqlite3_sql=\nc.wa;k._sqlite3_normalized_sql=c.xa;k._sqlite3_changes=c.ya;k._sqlite3_close_v2=c.za;k._sqlite3_create_function_v2=c.Aa;k._sqlite3_update_hook=c.Ba;k._sqlite3_open=c.Ca;da=k._malloc=c.Da;ea=k._free=c.Ea;k._RegisterExtensionFunctions=c.Fa;Bb=c.Ga;Uc=c.Ha;ra=c.Ia;y=c.Ja;pa=c.Ka;La=c.M;Z=c.O;Ka();J--;k.monitorRunDependencies?.(J);0==J&&Xa&&(c=Xa,Xa=null,c());return Xc}J++;k.monitorRunDependencies?.(J);var b={a:Vc};if(k.instantiateWasm)return new Promise(c=>{k.instantiateWasm(b,(d,e)=>{c(a(d,e))})});\nNa??=k.locateFile?k.locateFile(\"sql-wasm.wasm\",za):za+\"sql-wasm.wasm\";return a((await Ra(b)).instance)})();Wc();\n\n\n        // The shell-pre.js and emcc-generated code goes above\n        return Module;\n    }); // The end of the promise being returned\n\n  return initSqlJsPromise;\n} // The end of our initSqlJs function\n\n// This bit below is copied almost exactly from what you get when you use the MODULARIZE=1 flag with emcc\n// However, we don't want to use the emcc modularization. See shell-pre.js\nif (typeof exports === 'object' && typeof module === 'object'){\n    module.exports = initSqlJs;\n    // This will allow the module to be used in ES6 or CommonJS\n    module.exports.default = initSqlJs;\n}\nelse if (typeof define === 'function' && define['amd']) {\n    define([], function() { return initSqlJs; });\n}\nelse if (typeof exports === 'object'){\n    exports[\"Module\"] = initSqlJs;\n}\n","/**\n * Cursor parser (skeleton).\n *\n * Cursor doesn't expose token counts — only AI-attributed code lines\n * (ai_code_hashes, scored_commits) and conversation metadata. v1 produces\n * *sessions* with message counts and empty token fields; the UI can still\n * show the session list and per-project activity. Token/cost estimation\n * from subscription cost ÷ events is a later feature.\n *\n * Uses sql.js (pure-WASM SQLite) rather than better-sqlite3 to keep the\n * install tree free of native bindings. The Cursor workspaceStorage .db\n * files are a few MB at most, so in-memory WASM reads are plenty fast.\n * No more deprecated prebuild-install in the npm warnings.\n */\nimport { readFileSync } from \"node:fs\";\nimport initSqlJs, { type Database, type SqlJsStatic } from \"sql.js\";\nimport type { RawEvent } from \"@modelstat/core\";\nimport { sourceEventId } from \"@modelstat/core\";\nimport type { ParseResult, ParserContext } from \"../types.js\";\n\ninterface AiCodeHashRow {\n  hash: string;\n  source: string | null;\n  model: string | null;\n  requestId: string | null;\n  conversationId: string | null;\n  timestamp: number | null;\n}\n\nlet sqlJsPromise: Promise<SqlJsStatic> | null = null;\n\n/**\n * Lazy-load the sql.js runtime. We only initialise once per process\n * regardless of how many Cursor .db files we parse — sql.js's wasm\n * module is about 650 KB and decoding it on every call would dominate\n * parse time.\n */\nfunction getSqlJs(): Promise<SqlJsStatic> {\n  if (!sqlJsPromise) sqlJsPromise = initSqlJs();\n  return sqlJsPromise;\n}\n\n/**\n * Read the Cursor tracking DB and emit one RawEvent per AI-attributed\n * code hash. Async because sql.js's init is async; callers upstream\n * (the worker ingest pipeline) already await parser results.\n */\nexport async function parseCursorTrackingDb(\n  ctx: ParserContext,\n): Promise<ParseResult> {\n  const events: RawEvent[] = [];\n  let rawLines = 0;\n\n  const SQL = await getSqlJs();\n  const fileBytes = readFileSync(ctx.sourceFile);\n  let db: Database | null = null;\n  try {\n    db = new SQL.Database(fileBytes);\n    const result = db.exec(\n      `SELECT hash, source, model, requestId, conversationId, timestamp\n         FROM ai_code_hashes\n        WHERE conversationId IS NOT NULL AND timestamp IS NOT NULL\n        ORDER BY timestamp ASC`,\n    );\n    // sql.js returns an array of result sets (one per semicolon-separated\n    // statement). An empty array means the query returned zero rows —\n    // not an error, just a DB with no AI activity yet.\n    const rows = rowsFromExec(result);\n    for (const r of rows as unknown as AiCodeHashRow[]) {\n      rawLines += 1;\n      if (!r.conversationId || !r.timestamp) continue;\n      const ts = new Date(r.timestamp).toISOString();\n      events.push({\n        source_event_id: sourceEventId(\n          ctx.deviceId,\n          `${ctx.sourceFile}#${r.hash}`,\n          r.timestamp,\n        ),\n        ts,\n        kind: \"assistant_message\",\n        agent: \"cursor\",\n        provider: \"cursor\",\n        model: r.model,\n        session_id: r.conversationId,\n        turn_index: null,\n        parent_event_id: null,\n        cwd: null,\n        git: null,\n        tokens: null, // unknown — Cursor doesn't record\n        duration_ms: null,\n        tool_calls: {},\n        files_touched: [],\n        source_file: ctx.sourceFile,\n        source_byte_offset: null,\n      });\n    }\n  } finally {\n    db?.close();\n  }\n\n  return {\n    events,\n    toolCalls: [], // ai_code_hashes has no tool-call data — always empty\n    stats: {\n      rawLines,\n      emittedEvents: events.length,\n      skipped: rawLines - events.length,\n    },\n    sourceFile: ctx.sourceFile,\n  };\n}\n\n/**\n * sql.js returns `{columns, values}` where values is a 2D array. Turn\n * it into an array of {col: val} records keyed by column name so the\n * caller can read them like better-sqlite3's .all() output.\n */\nfunction rowsFromExec(\n  result: Array<{ columns: string[]; values: Array<Array<unknown>> }>,\n): Array<Record<string, unknown>> {\n  if (result.length === 0) return [];\n  const first = result[0]!;\n  const out: Array<Record<string, unknown>> = [];\n  for (const row of first.values) {\n    const rec: Record<string, unknown> = {};\n    for (let i = 0; i < first.columns.length; i++) {\n      rec[first.columns[i]!] = row[i];\n    }\n    out.push(rec);\n  }\n  return out;\n}\n","/**\n * pi harness JSONL parser.\n *\n * Layout: ~/.pi/agent/sessions/<encoded-cwd>/<TS>_<UUID>.jsonl\n *   (encoded-cwd mirrors Claude Code's scheme — `/` → `-`, wrapped in `--…--`).\n *\n * Line shapes (every line carries top-level { type, id?, parentId?, timestamp }):\n *   { type: \"session\", version, id: <session-uuid>, timestamp, cwd }\n *   { type: \"model_change\", provider, modelId, ... }      // session-level current model\n *   { type: \"thinking_level_change\", thinkingLevel, ... } // noise\n *   { type: \"custom\", customType, data, ... }             // UI state — noise\n *   { type: \"message\", message: { role, ... } }\n *\n * `message.role` is one of:\n *   user        { role, content: [{ type: \"text\", text }], timestamp }\n *   assistant   { role, content: [ thinking | text | toolCall ], api, provider,\n *                 model, usage: { input, output, cacheRead, cacheWrite,\n *                 totalTokens, cost, cacheWrite1h }, stopReason, timestamp }\n *               toolCall block → { type: \"toolCall\", id, name, arguments }\n *   toolResult  { role, toolCallId, toolName, content: [{ type, text }], isError, timestamp }\n *\n * Tool activity lives in assistant `toolCall` content blocks, paired back to\n * their `toolResult` line by toolCallId — yielding ToolCallDrafts (never\n * RawEvents). PRIVACY: arguments/results are reduced to sha256 hashes + byte\n * sizes on this device (see @modelstat/parsers/tool-hash); raw payloads never\n * leave. The session's per-token cost pi already computed is ignored — the\n * server prices from token counts like every other agent.\n */\n\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport type { Provider, RawEvent } from \"@modelstat/core\";\nimport { detectEventReferences, redact, sourceEventId } from \"@modelstat/core\";\nimport { guessRepoSlugFromPath } from \"../git.js\";\nimport { extractLocalToolContext, extractToolAction } from \"../tool-action/index.js\";\nimport {\n  fallbackCallId,\n  hashArgs,\n  jsonBytes,\n  splitObservedToolName,\n  toolIdentity,\n} from \"../tool-hash/index.js\";\nimport {\n  type LocalToolContext,\n  PARSER_EVENT_CHUNK,\n  type ParseResult,\n  type ParserContext,\n  type ToolCallDraft,\n} from \"../types.js\";\n\ntype PiContentBlock =\n  | { type: \"text\"; text?: string }\n  | { type: \"thinking\"; thinking?: string }\n  | { type: \"toolCall\"; id?: string; name?: string; arguments?: unknown };\n\ninterface PiUsage {\n  input?: number;\n  output?: number;\n  cacheRead?: number;\n  cacheWrite?: number;\n}\n\ninterface PiMessageLine {\n  type: \"message\";\n  timestamp: string;\n  message: {\n    role: \"user\" | \"assistant\" | \"toolResult\";\n    content?: PiContentBlock[];\n    // assistant-only\n    provider?: string;\n    model?: string;\n    usage?: PiUsage;\n    // toolResult-only\n    toolCallId?: string;\n    toolName?: string;\n    isError?: boolean;\n  };\n}\n\ninterface PiSessionLine {\n  type: \"session\";\n  id?: string;\n  timestamp?: string;\n  cwd?: string | null;\n}\n\ninterface PiModelChangeLine {\n  type: \"model_change\";\n  provider?: string;\n  modelId?: string;\n}\n\ntype PiLine =\n  | PiSessionLine\n  | PiModelChangeLine\n  | PiMessageLine\n  | { type: string; [k: string]: unknown };\n\n/** Map pi's free-form provider string onto the closed PROVIDERS enum.\n * Substring matches (not equality) on purpose: pi sometimes records a model\n * name in the provider slot (e.g. `pi-claude-cli`, `claude-opus-4-8`). */\nfunction mapProvider(raw: string | null | undefined): Provider {\n  if (!raw) return \"unknown\";\n  const p = raw.toLowerCase();\n  if (p.includes(\"anthropic\") || p.includes(\"claude\")) return \"anthropic\";\n  if (p.includes(\"openai\") || p.includes(\"gpt\") || p.includes(\"codex\")) return \"openai\";\n  if (p.includes(\"google\") || p.includes(\"gemini\")) return \"google\";\n  if (p.includes(\"deepseek\")) return \"deepseek\";\n  if (p.includes(\"moonshot\") || p.includes(\"kimi\")) return \"moonshot\";\n  if (p.includes(\"mistral\")) return \"mistral\";\n  if (p.includes(\"xai\") || p.includes(\"grok\")) return \"xai\";\n  if (p.includes(\"ollama\")) return \"ollama_local\";\n  return \"unknown\";\n}\n\n/** pi session filename is `<ISO-ish-TS>_<session-uuid>.jsonl`. */\nexport function deriveSessionIdFromPiPath(path: string): string | null {\n  const m = /_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\.jsonl$/.exec(path);\n  return m ? (m[1] ?? null) : null;\n}\n\n/** Join every `text` block's text (thinking/toolCall blocks dropped — they're\n * structured or private). Shared by the excerpt + reference passes below. */\nfunction joinTextBlocks(content: PiContentBlock[] | undefined): string {\n  if (!Array.isArray(content)) return \"\";\n  const parts: string[] = [];\n  for (const block of content) {\n    if (block.type === \"text\" && typeof block.text === \"string\") parts.push(block.text);\n  }\n  return parts.join(\" \");\n}\n\n/** Redacted, ≤320-char text excerpt from a pi message's content. Code fences\n * stripped, then scrubbed via @modelstat/core/redact. */\nfunction extractExcerpt(content: PiContentBlock[] | undefined): string | undefined {\n  let text = joinTextBlocks(content);\n  if (!text) return undefined;\n  text = text.replace(/```[\\s\\S]*?```/g, \" \").replace(/`[^`]*`/g, \" \");\n  text = text.replace(/\\s+/g, \" \").trim();\n  if (!text) return undefined;\n  const cleaned = redact(text).text;\n  const truncated = cleaned.slice(0, 320);\n  return truncated.length > 0 ? truncated : undefined;\n}\n\n/** Full-length TEXT join (no truncation/code-strip) for public-reference\n * detection. Capped so a giant turn can't make the regex scan unbounded. Not\n * redacted — detectEventReferences pulls only public ref shapes, never raw text. */\nfunction collectRefText(content: PiContentBlock[] | undefined): string {\n  const text = joinTextBlocks(content);\n  return text.length > 64_000 ? text.slice(0, 64_000) : text;\n}\n\nexport async function parsePiSession(ctx: ParserContext): Promise<ParseResult> {\n  // Streaming mode (ctx.onEvents set): `events` stays empty and parsed events\n  // leave through the sink in PARSER_EVENT_CHUNK-sized chunks, so the working\n  // set is bounded no matter how large the transcript is.\n  const events: RawEvent[] = [];\n  const toolCalls: ToolCallDraft[] = [];\n  const scriptContexts: LocalToolContext[] = [];\n  /** toolCall id → draft awaiting its toolResult (pairing is file-local). */\n  const pendingByCallId = new Map<string, ToolCallDraft>();\n  let chunk: RawEvent[] = [];\n  let emitted = 0;\n  const emit = async (e: RawEvent): Promise<void> => {\n    emitted += 1;\n    if (!ctx.onEvents) {\n      events.push(e);\n      return;\n    }\n    chunk.push(e);\n    if (chunk.length >= PARSER_EVENT_CHUNK) {\n      const full = chunk;\n      chunk = [];\n      await ctx.onEvents(full);\n    }\n  };\n  let rawLines = 0;\n  let skipped = 0;\n  let bytePos = 0;\n  const startOffset = ctx.byteOffsetStart ?? 0;\n\n  const stream = createReadStream(ctx.sourceFile, { encoding: \"utf8\", start: startOffset });\n  const rl = createInterface({ input: stream, crlfDelay: Infinity });\n\n  // Session id comes from the filename (canonical) with a fallback to the\n  // `session` line's own id for atypically-named files.\n  let sessionId: string | null = deriveSessionIdFromPiPath(ctx.sourceFile);\n  let cwd: string | null = null;\n  // Last model_change provider/model — the session-level default an assistant\n  // message inherits when it doesn't carry its own.\n  let lastProvider: string | null = null;\n  let lastModel: string | null = null;\n\n  for await (const line of rl) {\n    const byteLen = Buffer.byteLength(line, \"utf8\") + 1; // +1 for the stripped \\n\n    const offsetAtLineStart = startOffset + bytePos;\n    bytePos += byteLen;\n    rawLines += 1;\n    if (!line.trim()) {\n      skipped += 1;\n      continue;\n    }\n\n    let obj: PiLine;\n    try {\n      obj = JSON.parse(line) as PiLine;\n    } catch {\n      skipped += 1;\n      continue;\n    }\n\n    if (obj.type === \"session\") {\n      const s = obj as PiSessionLine;\n      if (!sessionId && s.id) sessionId = s.id;\n      cwd = s.cwd ?? cwd;\n      continue;\n    }\n\n    if (obj.type === \"model_change\") {\n      const mc = obj as PiModelChangeLine;\n      lastProvider = mc.provider ?? lastProvider;\n      lastModel = mc.modelId ?? lastModel;\n      continue;\n    }\n\n    if (obj.type !== \"message\") {\n      skipped += 1;\n      continue;\n    }\n\n    const ml = obj as PiMessageLine;\n    const m = ml.message;\n    if (!m?.role || !ml.timestamp || !sessionId) {\n      skipped += 1;\n      continue;\n    }\n\n    if (m.role === \"assistant\") {\n      const usage = m.usage ?? {};\n      if (m.model) lastModel = m.model;\n      if (m.provider) lastProvider = m.provider;\n      const provider = mapProvider(m.provider ?? lastProvider);\n      const model = m.model ?? lastModel ?? null;\n      const eventId = sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart);\n      const slug = guessRepoSlugFromPath(cwd);\n      const excerpt = extractExcerpt(m.content);\n      const refs = detectEventReferences(collectRefText(m.content));\n\n      // Per-call toolCall extraction + the aggregate identity → count map\n      // carried by this assistant event. Drafts ride ParseResult.toolCalls —\n      // they never become RawEvents (the pipeline would count them as turns).\n      const aggregate: Record<string, number> = {};\n      const blocks = Array.isArray(m.content) ? m.content : [];\n      let callIndex = 0;\n      for (const block of blocks) {\n        if (block.type !== \"toolCall\") continue;\n        const index = callIndex;\n        callIndex += 1;\n        const observed = typeof block.name === \"string\" ? block.name.trim() : \"\";\n        if (!observed) continue;\n        const { server, name } = splitObservedToolName(observed);\n        const input = block.arguments;\n        const hashes = hashArgs(input);\n        const rawId = block.id;\n        const externalCallId =\n          typeof rawId === \"string\" && rawId.trim() !== \"\"\n            ? rawId.trim().slice(0, 120)\n            : fallbackCallId(eventId, index);\n        const local = extractLocalToolContext({ server, name, input, cwd });\n        if (local) scriptContexts.push({ external_call_id: externalCallId, ...local });\n        const draft: ToolCallDraft = {\n          external_call_id: externalCallId,\n          session_id: sessionId,\n          source_event_id: eventId,\n          agent: \"pi\",\n          server,\n          name,\n          turn_index: null,\n          call_index: index,\n          started_at: ml.timestamp,\n          ended_at: null,\n          status: \"unknown\",\n          args_hash: hashes.args_hash,\n          signature_hash: hashes.signature_hash,\n          args_bytes: hashes.args_bytes,\n          result_bytes: 0,\n          model,\n          action: extractToolAction({ server, name, input, cwd }),\n        };\n        const identity = toolIdentity(server, name);\n        aggregate[identity] = (aggregate[identity] ?? 0) + 1;\n        toolCalls.push(draft);\n        if (typeof rawId === \"string\" && rawId) pendingByCallId.set(rawId, draft);\n      }\n\n      await emit({\n        source_event_id: eventId,\n        ts: ml.timestamp,\n        kind: \"assistant_message\",\n        agent: \"pi\",\n        provider,\n        model,\n        session_id: sessionId,\n        turn_index: null,\n        parent_event_id: null,\n        cwd,\n        git: slug\n          ? {\n              remote_url: null,\n              remote_host: slug.includes(\"/\") ? \"github.com\" : null,\n              remote_slug: slug,\n              branch: null,\n            }\n          : null,\n        tokens: {\n          input: usage.input ?? 0,\n          output: usage.output ?? 0,\n          cache_creation: usage.cacheWrite ?? 0,\n          cache_read: usage.cacheRead ?? 0,\n          reasoning: 0,\n        },\n        duration_ms: null,\n        tool_calls: aggregate,\n        files_touched: [],\n        ...(excerpt ? { content_excerpt: excerpt } : {}),\n        ...(refs ? { references: refs } : {}),\n        source_file: ctx.sourceFile,\n        source_byte_offset: offsetAtLineStart,\n      });\n      continue;\n    }\n\n    if (m.role === \"toolResult\") {\n      // Pair back to the pending draft (matched by toolCallId). Only the\n      // hash-safe metadata is kept: timestamp, error flag, result byte size.\n      const ref = m.toolCallId;\n      if (typeof ref === \"string\") {\n        const draft = pendingByCallId.get(ref);\n        if (draft) {\n          pendingByCallId.delete(ref);\n          draft.ended_at = ml.timestamp;\n          draft.status = m.isError === true ? \"error\" : \"success\";\n          draft.result_bytes = jsonBytes(m.content);\n        }\n      }\n      skipped += 1;\n      continue;\n    }\n\n    // user message\n    const excerpt = extractExcerpt(m.content);\n    const refs = detectEventReferences(collectRefText(m.content));\n    await emit({\n      source_event_id: sourceEventId(ctx.deviceId, ctx.sourceFile, offsetAtLineStart),\n      ts: ml.timestamp,\n      kind: \"user_message\",\n      agent: \"pi\",\n      provider: mapProvider(lastProvider),\n      model: lastModel,\n      session_id: sessionId,\n      turn_index: null,\n      parent_event_id: null,\n      cwd,\n      git: null,\n      tokens: null,\n      duration_ms: null,\n      tool_calls: {},\n      files_touched: [],\n      ...(excerpt ? { content_excerpt: excerpt } : {}),\n      ...(refs ? { references: refs } : {}),\n      source_file: ctx.sourceFile,\n      source_byte_offset: offsetAtLineStart,\n    });\n  }\n\n  if (ctx.onEvents && chunk.length > 0) await ctx.onEvents(chunk);\n\n  return {\n    events,\n    toolCalls,\n    scriptContexts,\n    stats: { rawLines, emittedEvents: emitted, skipped },\n    sourceFile: ctx.sourceFile,\n  };\n}\n","/**\n * Source Discovery Engine.\n *\n * Runs every strategy and returns a merged list of\n * detected installations + identities. Deterministic, idempotent — safe\n * to run on a cron.\n *\n * Strategies implemented (v1):\n *   1. Known-path probe\n *   3. Binary walk\n *   4. Signature-based file scan (macOS `mdfind`; Linux `find` with depth limit)\n *   6. Application registry (macOS `system_profiler`)\n *\n * Later strategies (live process sniff, Docker, SDK proxy, etc.) are\n * scaffolded with TODOs — they're easy follow-ups once v1 ships.\n */\nimport { execFile, execSync } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Agent, DetectedIdentity, DetectedInstallation } from \"@modelstat/core\";\n\nconst pexec = promisify(execFile);\n\n// ──────────────────────────────────────────────────────────────\n// Registry of sources. Extend this list to add a new agent — no\n// code changes needed in the discovery logic itself.\n// ──────────────────────────────────────────────────────────────\n\ninterface SourceSpec {\n  agent: Agent;\n  /** Preferred data-dir candidates, in order. */\n  dataDirs: { macos?: string[]; linux?: string[] };\n  /** Env vars that override the data dir. */\n  dataDirEnv?: string[];\n  /** Binary names to look for on PATH. */\n  binaries?: string[];\n  /** macOS .app bundle ids. */\n  bundleIds?: string[];\n  /** Signature match — a file path glob (used with `mdfind` or bounded\n   * `find`) + the first-line key that must be present. */\n  fileSignatures?: Array<{\n    filenameGlob: string;\n    firstLineHasKey?: string;\n  }>;\n}\n\nconst H = (p: string): string => (p.startsWith(\"~\") ? p.replace(\"~\", homedir()) : p);\n\nconst SOURCES: SourceSpec[] = [\n  {\n    agent: \"claude_code\",\n    dataDirs: {\n      macos: [\"~/.claude\"],\n      linux: [\"$XDG_CONFIG_HOME/claude\", \"~/.claude\", \"~/.config/claude\"],\n    },\n    dataDirEnv: [\"CLAUDE_HOME\"],\n    binaries: [\"claude\", \"claude-code\"],\n    fileSignatures: [\n      { filenameGlob: \"projects/**/*.jsonl\", firstLineHasKey: \"sessionId\" },\n    ],\n  },\n  {\n    agent: \"codex_cli\",\n    dataDirs: {\n      macos: [\"~/.codex\"],\n      linux: [\"$XDG_CONFIG_HOME/codex\", \"~/.codex\"],\n    },\n    dataDirEnv: [\"CODEX_HOME\"],\n    binaries: [\"codex\"],\n    fileSignatures: [{ filenameGlob: \"sessions/**/rollout-*.jsonl\" }],\n  },\n  {\n    agent: \"claude_desktop\",\n    dataDirs: {\n      macos: [\"~/Library/Application Support/Claude\"],\n      linux: [\"~/.config/Claude\"],\n    },\n    bundleIds: [\"com.anthropic.claudeforbrowser\", \"com.anthropic.claudeelectron\"],\n  },\n  {\n    agent: \"cursor\",\n    dataDirs: {\n      macos: [\"~/Library/Application Support/Cursor\"],\n      linux: [\"~/.config/Cursor\"],\n    },\n    bundleIds: [\"co.anysphere.cursor\", \"com.todesktop.230313mzl4w4u92\"],\n  },\n  {\n    agent: \"windsurf\",\n    dataDirs: {\n      macos: [\"~/Library/Application Support/Windsurf\"],\n      linux: [\"~/.config/Windsurf\"],\n    },\n    bundleIds: [\"com.codeium.windsurf\"],\n  },\n  {\n    agent: \"zed\",\n    dataDirs: {\n      macos: [\"~/Library/Application Support/Zed\", \"~/.config/zed\"],\n      linux: [\"~/.config/zed\"],\n    },\n    binaries: [\"zed\"],\n    bundleIds: [\"dev.zed.Zed\"],\n  },\n  {\n    agent: \"gemini_cli\",\n    dataDirs: {\n      macos: [\"~/.gemini\"],\n      linux: [\"~/.gemini\"],\n    },\n    binaries: [\"gemini\"],\n  },\n  {\n    agent: \"aider\",\n    dataDirs: { macos: [\"~/.aider\"], linux: [\"~/.aider\"] },\n    binaries: [\"aider\"],\n  },\n  {\n    agent: \"ollama\",\n    dataDirs: { macos: [\"~/.ollama\"], linux: [\"~/.ollama\"] },\n    binaries: [\"ollama\"],\n    bundleIds: [\"com.electron.ollama\"],\n  },\n  {\n    agent: \"pi\",\n    dataDirs: {\n      macos: [\"~/.pi/agent\"],\n      linux: [\"$XDG_CONFIG_HOME/pi/agent\", \"~/.pi/agent\"],\n    },\n    dataDirEnv: [\"PI_HOME\"],\n    binaries: [\"pi\"],\n    fileSignatures: [{ filenameGlob: \"sessions/**/*.jsonl\", firstLineHasKey: \"cwd\" }],\n  },\n  {\n    agent: \"openclaw\",\n    dataDirs: { macos: [\"~/.openclaw\", \"~/.claw\"], linux: [\"~/.openclaw\", \"~/.claw\"] },\n    binaries: [\"openclaw\", \"claw\", \"clawdbot\", \"moltbot\"],\n  },\n];\n\n// ──────────────────────────────────────────────────────────────\n// Public API\n// ──────────────────────────────────────────────────────────────\n\nexport interface DiscoveryOptions {\n  /** Extra data-dir paths to check, per agent. Honours $HOME. */\n  extraDataDirs?: Partial<Record<Agent, string[]>>;\n  /** Skip these expensive strategies. */\n  skip?: Array<\"binaryWalk\" | \"fileSignatures\" | \"appRegistry\">;\n}\n\nexport interface DiscoveryOutput {\n  installations: DetectedInstallation[];\n  identities: DetectedIdentity[];\n}\n\nexport async function discover(options: DiscoveryOptions = {}): Promise<DiscoveryOutput> {\n  const os = platform() === \"darwin\" ? \"macos\" : \"linux\";\n  const skip = new Set(options.skip ?? []);\n  const installations: DetectedInstallation[] = [];\n  const identities: DetectedIdentity[] = [];\n\n  // (1) known-path probe\n  for (const spec of SOURCES) {\n    const candidates = new Set<string>();\n    for (const raw of spec.dataDirs[os] ?? []) candidates.add(expandPath(raw));\n    for (const env of spec.dataDirEnv ?? []) {\n      const v = process.env[env];\n      if (v) candidates.add(v);\n    }\n    for (const extra of options.extraDataDirs?.[spec.agent] ?? []) candidates.add(expandPath(extra));\n\n    for (const p of candidates) {\n      if (existsSync(p) && statSync(p).isDirectory()) {\n        installations.push({\n          agent: spec.agent,\n          install_method: \"manual\",\n          binary_path: null,\n          data_dir: p,\n          version: null,\n          detected_via: [\"known_path\"],\n        });\n      }\n    }\n  }\n\n  // (3) binary walk\n  if (!skip.has(\"binaryWalk\")) {\n    const binDirs = binaryLookupDirs(os);\n    for (const spec of SOURCES) {\n      for (const bin of spec.binaries ?? []) {\n        for (const dir of binDirs) {\n          const p = join(dir, bin);\n          if (existsSync(p)) {\n            const version = await safeVersionProbe(p);\n            installations.push({\n              agent: spec.agent,\n              install_method: classifyInstallMethod(p, os),\n              binary_path: p,\n              data_dir: null,\n              version,\n              detected_via: [\"binary_walk\"],\n            });\n          }\n        }\n      }\n    }\n  }\n\n  // (6) application registry (macOS)\n  if (!skip.has(\"appRegistry\") && os === \"macos\") {\n    try {\n      const apps = await macosListApps();\n      for (const spec of SOURCES) {\n        for (const bid of spec.bundleIds ?? []) {\n          const hit = apps.find((a) => a.bundleId === bid);\n          if (hit) {\n            installations.push({\n              agent: spec.agent,\n              install_method: \"app_bundle\",\n              binary_path: hit.path,\n              data_dir: null,\n              version: hit.version,\n              detected_via: [\"app_registry\"],\n            });\n          }\n        }\n      }\n    } catch {\n      // system_profiler can fail on weird machines — non-fatal\n    }\n  }\n\n  // (4) signature-based file scan — limited to known dirs in v1 to keep\n  // startup fast; full `mdfind`/`find` pass is an agent cron.\n\n  // Identity probes — best-effort, filesystem-only (no Keychain yet).\n  identities.push(...(await probeIdentities(os)));\n\n  // Dedupe\n  return {\n    installations: dedupeInstalls(installations),\n    identities: dedupeIdentities(identities),\n  };\n}\n\n// ──────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction expandPath(p: string): string {\n  let s = p;\n  s = s.replace(/\\$XDG_CONFIG_HOME/g, process.env.XDG_CONFIG_HOME ?? `${homedir()}/.config`);\n  s = s.replace(/\\$XDG_DATA_HOME/g, process.env.XDG_DATA_HOME ?? `${homedir()}/.local/share`);\n  s = s.replace(/\\$HOME/g, homedir());\n  s = H(s);\n  return resolve(s);\n}\n\nfunction binaryLookupDirs(os: \"macos\" | \"linux\"): string[] {\n  const dirs = new Set<string>();\n  (process.env.PATH ?? \"\").split(\":\").forEach((d) => d && dirs.add(d));\n  const extra =\n    os === \"macos\"\n      ? [\n          \"/opt/homebrew/bin\",\n          \"/usr/local/bin\",\n          `${homedir()}/.bun/bin`,\n          `${homedir()}/.volta/bin`,\n          `${homedir()}/.cargo/bin`,\n          `${homedir()}/.local/bin`,\n          `${homedir()}/.asdf/shims`,\n          `${homedir()}/.mise/shims`,\n          `${homedir()}/.npm-global/bin`,\n          `${homedir()}/.yarn/bin`,\n        ]\n      : [\n          \"/usr/local/bin\",\n          \"/usr/bin\",\n          \"/snap/bin\",\n          \"/var/lib/flatpak/exports/bin\",\n          `${homedir()}/.local/bin`,\n          `${homedir()}/.bun/bin`,\n          `${homedir()}/.cargo/bin`,\n          `${homedir()}/.nvm`,\n        ];\n  for (const d of extra) dirs.add(d);\n  return Array.from(dirs);\n}\n\nfunction classifyInstallMethod(binPath: string, os: \"macos\" | \"linux\"): DetectedInstallation[\"install_method\"] {\n  if (binPath.includes(\"/homebrew/\") || binPath.includes(\"/Cellar/\")) return \"homebrew\";\n  if (binPath.includes(\"/.nvm/\") || binPath.includes(\"/node_modules/\")) return \"npm_global\";\n  if (binPath.includes(\"/.npm-global/\")) return \"npm_global\";\n  if (binPath.includes(\"/.pnpm/\") || binPath.includes(\"/.pnpm-global/\")) return \"pnpm_global\";\n  if (binPath.includes(\"/.yarn/\")) return \"yarn_global\";\n  if (binPath.includes(\"/.bun/\")) return \"bun_global\";\n  if (binPath.includes(\"/.cargo/\")) return \"cargo_install\";\n  if (binPath.startsWith(\"/Applications/\") || binPath.includes(\".app/Contents/\")) return \"app_bundle\";\n  if (os === \"linux\" && binPath.startsWith(\"/snap/\")) return \"snap\";\n  if (os === \"linux\" && binPath.includes(\"/flatpak/\")) return \"flatpak\";\n  return \"manual\";\n}\n\nasync function safeVersionProbe(binPath: string): Promise<string | null> {\n  try {\n    const { stdout } = await pexec(binPath, [\"--version\"], { timeout: 1500 });\n    return stdout.trim().split(/\\s+/).pop() ?? null;\n  } catch {\n    return null;\n  }\n}\n\nasync function macosListApps(): Promise<Array<{ bundleId: string; path: string; version: string | null }>> {\n  try {\n    const out = execSync(\n      \"system_profiler SPApplicationsDataType -json 2>/dev/null | head -c 8000000\",\n      { timeout: 15_000 },\n    ).toString();\n    const parsed = JSON.parse(out) as { SPApplicationsDataType?: Array<{ path?: string; version?: string; info?: string }> };\n    const apps = parsed.SPApplicationsDataType ?? [];\n    return apps.map((a) => ({\n      bundleId: \"\", // system_profiler JSON doesn't expose bundleId directly; requires mdls for each\n      path: a.path ?? \"\",\n      version: a.version ?? null,\n    }));\n  } catch {\n    return [];\n  }\n}\n\nasync function probeIdentities(os: \"macos\" | \"linux\"): Promise<DetectedIdentity[]> {\n  const ids: DetectedIdentity[] = [];\n  const fs = await import(\"node:fs\");\n\n  // Claude Code — credentials live in macOS Keychain at \"Claude Code-credentials\"\n  if (os === \"macos\") {\n    try {\n      const out = execSync(\n        'security find-generic-password -s \"Claude Code-credentials\" -w 2>/dev/null',\n        { timeout: 3000 },\n      ).toString();\n      const body = JSON.parse(out) as {\n        claudeAiOauth?: {\n          accessToken?: string;\n          refreshToken?: string;\n          subscriptionType?: string;\n          rateLimitTier?: string;\n          scopes?: string[];\n          // Newer blobs may carry account/org identity — extract when present.\n          account?: { uuid?: string; email_address?: string; email?: string };\n          organization?: { uuid?: string; name?: string };\n        };\n      };\n      const oauth = body.claudeAiOauth;\n      const tok = oauth?.accessToken;\n      if (tok) {\n        // Prefer a stable account/org id; the OAuth account uuid (when the\n        // blob carries it) is best. Fall back to a hash of the refresh\n        // token (stable across access-token refreshes) only as a last\n        // resort — tokens DO eventually rotate, so a refreshed login may\n        // create a fresh identity the user can relabel/merge via a rule.\n        const email = oauth?.account?.email_address ?? oauth?.account?.email ?? null;\n        const orgName = oauth?.organization?.name ?? null;\n        const stableId =\n          oauth?.account?.uuid ??\n          oauth?.organization?.uuid ??\n          (oauth?.refreshToken ?? tok).slice(0, 48);\n        ids.push({\n          provider: \"anthropic\",\n          provider_account_id: stableId,\n          provider_account_label:\n            email ?? orgName ?? oauth?.subscriptionType ?? \"Claude account\",\n          account_email: email,\n          account_org: orgName ?? oauth?.subscriptionType ?? null,\n          display_name: null,\n          owner_scope: \"unassigned\",\n          detection_source: \"claude_keychain\",\n        });\n      }\n    } catch {\n      /* no keychain entry → no identity */\n    }\n  }\n\n  // Claude Code (desktop app + recent CLI) — the OAuth account lives in\n  // ~/.claude.json's `oauthAccount`, not only the \"Claude Code-credentials\"\n  // keychain item the older CLI used (absent for desktop-app users, the most\n  // common case). Plain file we already read, so no keychain-ACL / launchd\n  // permission issues; dedupeIdentities collapses this with the keychain hit\n  // when both exist (same accountUuid).\n  const claudeConfigs = [`${homedir()}/.claude.json`];\n  if (process.env.CLAUDE_CONFIG_DIR) {\n    claudeConfigs.unshift(`${process.env.CLAUDE_CONFIG_DIR}/.claude.json`);\n  }\n  for (const candidate of claudeConfigs) {\n    if (!existsSync(candidate)) continue;\n    try {\n      const data = await fs.promises.readFile(candidate, \"utf8\");\n      const obj = JSON.parse(data) as {\n        oauthAccount?: {\n          accountUuid?: string;\n          emailAddress?: string;\n          organizationUuid?: string;\n          organizationName?: string;\n          displayName?: string;\n          billingType?: string;\n        };\n      };\n      const acct = obj.oauthAccount;\n      const stableId = acct?.accountUuid ?? acct?.organizationUuid;\n      if (acct && stableId) {\n        ids.push({\n          provider: \"anthropic\",\n          provider_account_id: stableId,\n          provider_account_label:\n            acct.emailAddress ?? acct.organizationName ?? acct.displayName ?? \"Claude account\",\n          account_email: acct.emailAddress ?? null,\n          account_org: acct.organizationName ?? acct.billingType ?? null,\n          display_name: acct.displayName ?? null,\n          owner_scope: \"unassigned\",\n          detection_source: \"claude_json_oauth\",\n        });\n        break;\n      }\n    } catch {\n      /* ignore */\n    }\n  }\n\n  // Codex auth.json — JWT id_token contains email + sub + auth_provider\n  for (const candidate of [\n    `${homedir()}/.codex/auth.json`,\n    `${homedir()}/.config/codex/auth.json`,\n  ]) {\n    if (!existsSync(candidate)) continue;\n    try {\n      const data = await fs.promises.readFile(candidate, \"utf8\");\n      const obj = JSON.parse(data) as {\n        auth_mode?: string;\n        tokens?: { id_token?: string; account_id?: string };\n      };\n      const jwt = obj.tokens?.id_token;\n      let email: string | null = null;\n      let sub: string | null = null;\n      let name: string | null = null;\n      let org: string | null = null;\n      let provider: \"openai\" | \"google\" = \"openai\";\n      if (jwt) {\n        const parts = jwt.split(\".\");\n        if (parts.length >= 2) {\n          try {\n            const pad = \"=\".repeat((4 - (parts[1]!.length % 4)) % 4);\n            const body = JSON.parse(\n              Buffer.from(parts[1]! + pad, \"base64url\").toString(\"utf8\"),\n            ) as {\n              email?: string;\n              sub?: string;\n              auth_provider?: string;\n              name?: string;\n              \"https://api.openai.com/auth\"?: {\n                organization_id?: string;\n                chatgpt_plan_type?: string;\n              };\n            };\n            email = body.email ?? null;\n            sub = body.sub ?? null;\n            name = body.name ?? null;\n            const oai = body[\"https://api.openai.com/auth\"];\n            org = oai?.organization_id ?? oai?.chatgpt_plan_type ?? null;\n            if (body.auth_provider === \"google\") provider = \"openai\"; // still OpenAI / ChatGPT account, auth'd via Google\n          } catch {\n            /* fall through */\n          }\n        }\n      }\n      // Prefer the stable account_id as the key (survives token refresh).\n      const pid = obj.tokens?.account_id ?? sub ?? email;\n      if (pid) {\n        ids.push({\n          provider,\n          provider_account_id: pid,\n          provider_account_label: email,\n          account_email: email,\n          account_org: org,\n          display_name: name,\n          owner_scope: \"unassigned\",\n          detection_source: \"codex_auth_json\",\n        });\n      }\n    } catch {\n      /* ignore */\n    }\n  }\n\n  // Gemini oauth_creds.json — email as id\n  for (const candidate of [\n    `${homedir()}/.gemini/oauth_creds.json`,\n    `${homedir()}/.config/gemini/oauth_creds.json`,\n  ]) {\n    if (!existsSync(candidate)) continue;\n    try {\n      const data = await fs.promises.readFile(candidate, \"utf8\");\n      const obj = JSON.parse(data) as { email?: string; token?: { email?: string } };\n      const email = obj.email ?? obj.token?.email;\n      if (email) {\n        ids.push({\n          provider: \"google\",\n          provider_account_id: email,\n          provider_account_label: email,\n          account_email: email,\n          owner_scope: \"unassigned\",\n          detection_source: \"gemini_oauth_creds\",\n        });\n      }\n    } catch {\n      /* ignore */\n    }\n  }\n\n  // Cursor — globalStorage/storage.json has the user id + subscription\n  for (const candidate of [\n    `${homedir()}/Library/Application Support/Cursor/User/globalStorage/storage.json`,\n    `${homedir()}/.config/Cursor/User/globalStorage/storage.json`,\n  ]) {\n    if (!existsSync(candidate)) continue;\n    try {\n      const data = await fs.promises.readFile(candidate, \"utf8\");\n      const obj = JSON.parse(data) as Record<string, unknown>;\n      // Cursor stores its auth under `cursorAuth/*` keys — take the first one.\n      for (const k of Object.keys(obj)) {\n        if (k.startsWith(\"cursorAuth\") && typeof obj[k] === \"string\") {\n          try {\n            const auth = JSON.parse(obj[k] as string) as {\n              sub?: string;\n              email?: string;\n              cachedSignUpType?: string;\n            };\n            if (auth.sub || auth.email) {\n              ids.push({\n                provider: \"cursor\",\n                provider_account_id: auth.sub ?? auth.email!,\n                provider_account_label: auth.email ?? null,\n                account_email: auth.email ?? null,\n                owner_scope: \"unassigned\",\n                detection_source: \"cursor_global_storage\",\n              });\n              break;\n            }\n          } catch {\n            /* ignore */\n          }\n        }\n      }\n    } catch {\n      /* ignore */\n    }\n  }\n\n  return ids;\n}\n\nfunction dedupeInstalls(list: DetectedInstallation[]): DetectedInstallation[] {\n  const seen = new Map<string, DetectedInstallation>();\n  for (const i of list) {\n    const k = `${i.agent}|${i.binary_path ?? \"\"}|${i.data_dir ?? \"\"}`;\n    const prev = seen.get(k);\n    if (!prev) {\n      seen.set(k, i);\n    } else {\n      prev.detected_via = Array.from(new Set([...prev.detected_via, ...i.detected_via]));\n      prev.version = prev.version ?? i.version;\n    }\n  }\n  return Array.from(seen.values());\n}\n\nfunction dedupeIdentities(list: DetectedIdentity[]): DetectedIdentity[] {\n  const seen = new Map<string, DetectedIdentity>();\n  for (const i of list) {\n    const k = `${i.provider}|${i.provider_account_id}`;\n    if (!seen.has(k)) seen.set(k, i);\n  }\n  return Array.from(seen.values());\n}\n","export * from \"./types.js\";\nexport * from \"./git.js\";\n// On-device verified-outcome (CPVO) detection from local git history.\nexport * from \"./git-outcome.js\";\n// On-device per-session file-change capture — the token re-spend heatmap signal.\nexport * from \"./git-files.js\";\n// On-device structural extraction + script detection/resolution. Surfaces\n// detectScriptRefs / scriptCandidates / resolveScriptPath + extractToolAction /\n// extractLocalToolContext for the agent's script-summary enrichment pass.\nexport * from \"./tool-action/index.js\";\nexport * from \"./claude-code/index.js\";\nexport * from \"./codex/index.js\";\nexport * from \"./cursor/index.js\";\nexport * from \"./pi/index.js\";\nexport * from \"./discovery/index.js\";\n","/**\n * Per-session insights — the daemon side of Feature 1 (\"live per-session\n * insights\").\n *\n * After a session scan the daemon asks the server for that session's rolled-up\n * insights (tokens, $ assigned, taxonomy nodes detected, status) via the\n * unified MCP `session_insights` tool, and CACHES the payload under\n * `~/.modelstat/sessions/<sessionId>.json`. The always-on `modelstat\n * statusline` command reads ONLY this cache (never the network), so the\n * status line is instant and offline-tolerant.\n *\n * The server's enrichment is async (tokens+cost land in ~2s, taxonomy follows\n * the LLM tick), so a freshly-scanned session is often `analyzing` for a few\n * seconds. We short-poll a small, bounded number of times so the cache lands\n * `ready` without spinning.\n */\nimport { readFileSync } from \"node:fs\";\nimport { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport { request } from \"undici\";\nimport { createLogger } from \"@modelstat/daemon-core/logger\";\nimport { state } from \"./config.js\";\nimport { homePath } from \"./paths.js\";\n\nconst logger = createLogger(\"daemon.insights\");\n\n/** One taxonomy node detected for a session — the chips the widget +\n * statusline render. Mirrors the server's `session_insights` shape; kept\n * permissive so a server-side field addition can't break the cache. */\nexport interface InsightTaxonomyNode {\n  id: string;\n  name: string;\n  path?: string;\n  root_key?: string;\n  color?: string | null;\n  emoji?: string | null;\n}\n\n/** Parsed `session_insights` payload as cached on disk. Optional/loose on\n * purpose — the authoritative schema is the server's; the statusline reads\n * defensively. */\nexport interface SessionInsights {\n  status: \"ready\" | \"analyzing\" | \"not_ingested\" | string;\n  segments_pending?: number;\n  session_ids?: string[];\n  missing_session_ids?: string[];\n  started_at?: string | null;\n  ended_at?: string | null;\n  segment_count?: number;\n  tokens?: {\n    input?: number;\n    output?: number;\n    cache_read?: number;\n    cache_creation?: number;\n    reasoning?: number;\n    total?: number;\n  };\n  cost_usd?: string | number | null;\n  taxonomy_nodes?: InsightTaxonomyNode[];\n  /** Stamped by the daemon when it wrote the cache (not from the server). */\n  cached_at?: string;\n}\n\n/** Directory holding the per-session insight cache files. */\nfunction sessionsDir(): string {\n  return homePath(\"sessions\");\n}\n\n/** Absolute path to one session's cached insights. The id is path-segment\n * safe (Claude/Codex session ids are UUIDs), but encode anyway so an unusual\n * id can never escape the directory. */\nexport function sessionInsightsPath(sessionId: string): string {\n  return homePath(\"sessions\", `${encodeURIComponent(sessionId)}.json`);\n}\n\n/**\n * Read a session's cached insights SYNCHRONOUSLY — the statusline's only data\n * source. Returns null when there's no cache (session not scanned yet) or the\n * file is unreadable/corrupt. Deliberately sync + swallowing: `modelstat\n * statusline` runs on every Claude Code render and must never block on I/O or\n * throw (a crashing statusline would wedge the prompt). The cache is small\n * (one session's rollup), so a sync read is cheap.\n */\nexport function readCachedInsightsSync(sessionId: string): SessionInsights | null {\n  try {\n    const raw = readFileSync(sessionInsightsPath(sessionId), \"utf8\");\n    return JSON.parse(raw) as SessionInsights;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Call the server's unified MCP `session_insights` tool for a session chain.\n * Returns the parsed payload, or null when the daemon isn't enrolled / the\n * call fails / the body isn't the expected JSON-in-text shape (the caller\n * treats null as \"nothing to cache this round\").\n */\nexport async function fetchSessionInsights(\n  sessionIds: string[],\n  opts: { eager?: boolean } = {},\n): Promise<SessionInsights | null> {\n  const bearer = state.bearer;\n  if (!bearer) return null;\n  if (sessionIds.length === 0) return null;\n  try {\n    const res = await request(`${state.apiUrl}/v1/mcp/call`, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\", authorization: `Bearer ${bearer}` },\n      body: JSON.stringify({\n        name: \"session_insights\",\n        arguments: { session_ids: sessionIds, eager: opts.eager === true },\n      }),\n    });\n    if (res.statusCode >= 300) {\n      await res.body.dump();\n      return null;\n    }\n    const body = (await res.body.json()) as {\n      content?: Array<{ type?: string; text?: string }>;\n      isError?: boolean;\n    };\n    if (body.isError) return null;\n    // The MCP envelope carries the insights JSON as the first text block.\n    const text = body.content?.find((c) => c.type === \"text\")?.text ?? body.content?.[0]?.text;\n    if (!text) return null;\n    return JSON.parse(text) as SessionInsights;\n  } catch (e) {\n    logger.warn(`session_insights fetch failed: ${(e as Error).message}`);\n    return null;\n  }\n}\n\n/** Atomically write a session's insights to the cache (tmp + rename), stamping\n * `cached_at`. Best-effort — a write failure never sinks a scan. */\nexport async function cacheSessionInsights(\n  sessionId: string,\n  insights: SessionInsights,\n): Promise<void> {\n  const path = sessionInsightsPath(sessionId);\n  const payload = { ...insights, cached_at: new Date().toISOString() };\n  try {\n    await mkdir(sessionsDir(), { recursive: true });\n    const tmp = `${path}.tmp`;\n    await writeFile(tmp, JSON.stringify(payload));\n    await rename(tmp, path);\n  } catch (e) {\n    logger.warn(`session insights cache write failed for ${sessionId}: ${(e as Error).message}`);\n  }\n}\n\n/** Bounded short-poll while the server is still `analyzing` a freshly-scanned\n * session. Small + capped: the server enriches in seconds and the statusline\n * happily renders an interim `analyzing` cache, so this never blocks for long. */\nconst POLL_DELAYS_MS = [1200, 2000, 3000, 4000] as const;\n\n/**\n * Fetch + cache one session chain's insights, eagerly prioritising the\n * server's enrichment, and short-poll a few times while it's `analyzing` so\n * the cached payload converges to `ready`. Caches every interim result too, so\n * the statusline shows progress (`analyzing` → numbers) without waiting for the\n * terminal state. Best-effort throughout.\n *\n * @param sessionIds the compaction chain (or a single id). The cache is keyed\n *   by the FIRST id — the one Claude Code reports as the live `session_id`,\n *   which is what `modelstat statusline` looks up.\n */\nexport async function refreshSessionInsights(sessionIds: string[]): Promise<void> {\n  if (sessionIds.length === 0) return;\n  const cacheKey = sessionIds[0] as string;\n\n  let insights = await fetchSessionInsights(sessionIds, { eager: true });\n  if (insights) await cacheSessionInsights(cacheKey, insights);\n\n  for (const delay of POLL_DELAYS_MS) {\n    if (!insights || insights.status !== \"analyzing\") break;\n    await sleep(delay);\n    // Re-poll without re-prioritising — the priority signal already fired.\n    const next = await fetchSessionInsights(sessionIds, { eager: false });\n    if (next) {\n      insights = next;\n      await cacheSessionInsights(cacheKey, next);\n    }\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * ID helpers for daemons. Thin re-export from @modelstat/core/ids —\n * kept here so daemon code has one import location (\"everything\n * daemons need comes from @modelstat/daemon-core\").\n */\nexport {\n  batchId,\n  newId,\n  segmentId,\n  sourceEventId,\n  uuidv7,\n} from \"@modelstat/core/ids\";\n","/**\n * Shared queue state machine.\n *\n * Both daemons feed captured events into an IngestQueue with a\n * runtime-specific QueueStore (SqliteQueueStore on Node, IdbQueueStore\n * in the extension). The state machine itself — dedupe, debouncing,\n * batching, retry — is implemented once here.\n *\n * This file intentionally ships the *types + tick function* only; the\n * store impls live in @modelstat/daemon-core/{node,browser} subpaths,\n * added in the step-5 follow-up of the unification migration.\n */\nimport type { IngestBatch, RawEvent, Segment, ToolCallWire } from \"@modelstat/core/schemas\";\nimport {\n  FORCE_SHIP_THRESHOLD,\n  INGEST_BATCH_MAX_EVENTS,\n  SESSION_DEBOUNCE_MS,\n} from \"../config/index.js\";\nimport { batchId } from \"../ids.js\";\n\n/** Max per-call tool invocations per IngestBatch — mirrors the\n * `tool_calls: z.array(ToolCallWire).max(20_000)` cap on IngestBatch\n * (@modelstat/core/schemas). The server 400s (and the uploader drops)\n * any batch above it, so batch builders must split BEFORE the cap. */\nexport const INGEST_BATCH_MAX_TOOL_CALLS = 20_000;\n\n/** A tool call before segment attribution — ToolCallWire minus\n * `segment_id`, which is only knowable once segments are built.\n * Structurally identical to ToolCallDraft in @modelstat/parsers\n * (defined there for parser output); duplicated as an Omit here so\n * daemon-core doesn't grow a dependency on the parsers package. */\nexport type ToolCallDraft = Omit<ToolCallWire, \"segment_id\">;\n\nexport interface QueueItem {\n  /** Dedupe key — must match the upcoming event's `source_event_id`. */\n  source_event_id: string;\n  session_id: string;\n  agent: string;\n  event: RawEvent;\n  last_event_ts_ms: number;\n  synced: boolean;\n  sent_batch_id: string | null;\n  /** Per-call tool invocations born from `event` (same privacy\n   * contract as ToolCallWire: hashes / sizes / allowlisted verbs\n   * only). Optional — runtimes without tool-call data (the extension)\n   * never set it, and old stored rows simply lack the key. */\n  tool_calls?: ToolCallDraft[];\n}\n\nexport interface QueueStore {\n  put(item: QueueItem): Promise<void>;\n  has(sourceEventId: string): Promise<boolean>;\n  listUnsentBySession(): Promise<Map<string, QueueItem[]>>;\n  markSent(sourceEventIds: string[], batchId: string | null): Promise<void>;\n  countUnsent(): Promise<number>;\n}\n\nexport interface PipelineRunner {\n  /** Given a group of same-session events, return Segment[]. Phase-1\n   * CLI pipeline will return a single heuristic segment here; later\n   * phases plug in the real redact→tokenize→segment→summarise→tag\n   * flow via @modelstat/daemon-core/pipeline. */\n  run(events: RawEvent[]): Promise<Segment[]>;\n}\n\n/** One pass through the queue: gather unsent events per session, apply\n * debounce, run the pipeline, return batches ready for upload. Caller\n * (the daemon's tick loop) is responsible for actually uploading\n * and calling `markSent` on commit. */\nexport async function buildBatches(opts: {\n  store: QueueStore;\n  pipeline: PipelineRunner;\n  deviceId: string;\n  daemonVersion: string;\n  nowMs: number;\n  debounceMs?: number;\n  maxEvents?: number;\n  forceShipThreshold?: number;\n}): Promise<IngestBatch[]> {\n  const debounceMs = opts.debounceMs ?? SESSION_DEBOUNCE_MS;\n  const maxEvents = opts.maxEvents ?? INGEST_BATCH_MAX_EVENTS;\n  const forceThreshold = opts.forceShipThreshold ?? FORCE_SHIP_THRESHOLD;\n  const bySession = await opts.store.listUnsentBySession();\n  const batches: IngestBatch[] = [];\n  let eventsInCurrentBatch: RawEvent[] = [];\n  let sessionIdsInCurrentBatch: string[] = [];\n  let toolCallsInCurrentBatch: ToolCallDraft[] = [];\n  for (const [, items] of bySession) {\n    if (items.length === 0) continue;\n    // Debounce: skip sessions still producing events, unless over the\n    // force-ship threshold.\n    const lastTs = Math.max(...items.map((i) => i.last_event_ts_ms));\n    const quiet = opts.nowMs - lastTs >= debounceMs;\n    if (!quiet && items.length < forceThreshold) continue;\n\n    for (const item of items) {\n      const itemCalls = item.tool_calls ?? [];\n      // Split BEFORE either cap overflows. A tool call always ships in\n      // the same batch as its emitting event, so the tool-call cap\n      // check must run pre-push (post-push splitting would leave a\n      // straddling event's calls on the wrong side). The non-empty\n      // guard keeps a pathological single event with >cap calls from\n      // looping — it ships alone (the wire schema will reject it, but\n      // that's a parser bug, not a batching one).\n      if (\n        eventsInCurrentBatch.length >= maxEvents ||\n        (eventsInCurrentBatch.length > 0 &&\n          toolCallsInCurrentBatch.length + itemCalls.length > INGEST_BATCH_MAX_TOOL_CALLS)\n      ) {\n        batches.push(\n          await finalise({\n            events: eventsInCurrentBatch,\n            sessionIds: sessionIdsInCurrentBatch,\n            toolCalls: toolCallsInCurrentBatch,\n            pipeline: opts.pipeline,\n            deviceId: opts.deviceId,\n            daemonVersion: opts.daemonVersion,\n          }),\n        );\n        eventsInCurrentBatch = [];\n        sessionIdsInCurrentBatch = [];\n        toolCallsInCurrentBatch = [];\n      }\n      eventsInCurrentBatch.push(item.event);\n      sessionIdsInCurrentBatch.push(item.session_id);\n      toolCallsInCurrentBatch.push(...itemCalls);\n    }\n  }\n  if (eventsInCurrentBatch.length > 0) {\n    batches.push(\n      await finalise({\n        events: eventsInCurrentBatch,\n        sessionIds: sessionIdsInCurrentBatch,\n        toolCalls: toolCallsInCurrentBatch,\n        pipeline: opts.pipeline,\n        deviceId: opts.deviceId,\n        daemonVersion: opts.daemonVersion,\n      }),\n    );\n  }\n  return batches;\n}\n\n/**\n * Fill `segment_id` on tool-call drafts from the segments built over\n * the same events: a call whose `source_event_id` appears in a\n * segment's `source_event_ids` belongs to that segment. Calls whose\n * source event no segment covers (codex response_item anchors, slices\n * that failed to summarise) ship with `segment_id: null` — they stay\n * queryable by session server-side. Pure so both ship paths (agent\n * scan loop + this queue) share and test one implementation.\n */\nexport function attachSegmentIds(\n  calls: readonly ToolCallDraft[],\n  segments: readonly Segment[],\n): ToolCallWire[] {\n  const segmentByEvent = new Map<string, string>();\n  for (const seg of segments) {\n    for (const id of seg.source_event_ids) segmentByEvent.set(id, seg.segment_id);\n  }\n  return attachSegmentIdsByMap(calls, segmentByEvent);\n}\n\n/**\n * Same as {@link attachSegmentIds} but from a prebuilt `source_event_id →\n * segment_id` index. The streaming scan path needs this: a file whose\n * events straddle a batch-flush boundary has its early events (and their\n * segments) shipped in an earlier batch, while its tool-call drafts are\n * buffered at parse-end and ship later — so the call's segment is no\n * longer in the *current* batch's segment list. Resolving against an\n * index accumulated over every batch seen this run keeps those straddling\n * calls attributed instead of dropping to `segment_id: null`. (The queue\n * path doesn't need this — it keeps each call in the same batch as its\n * event — so it still calls {@link attachSegmentIds} directly.)\n */\nexport function attachSegmentIdsByMap(\n  calls: readonly ToolCallDraft[],\n  segmentByEvent: ReadonlyMap<string, string>,\n): ToolCallWire[] {\n  return calls.map((c) => ({\n    ...c,\n    segment_id: segmentByEvent.get(c.source_event_id) ?? null,\n  }));\n}\n\nasync function finalise(args: {\n  events: RawEvent[];\n  sessionIds: string[];\n  toolCalls: ToolCallDraft[];\n  pipeline: PipelineRunner;\n  deviceId: string;\n  daemonVersion: string;\n}): Promise<IngestBatch> {\n  // Pipeline runs per-session so segments don't span session boundaries.\n  const segments: Segment[] = [];\n  const bySession = new Map<string, RawEvent[]>();\n  for (let i = 0; i < args.events.length; i++) {\n    const sid = args.sessionIds[i] ?? args.events[i]?.session_id ?? \"unknown\";\n    const arr = bySession.get(sid) ?? [];\n    const ev = args.events[i];\n    if (ev) arr.push(ev);\n    bySession.set(sid, arr);\n  }\n  for (const [, sessionEvents] of bySession) {\n    const segs = await args.pipeline.run(sessionEvents);\n    segments.push(...segs);\n  }\n  return {\n    batch_id: batchId(),\n    device_id: args.deviceId,\n    daemon_version: args.daemonVersion,\n    events: args.events,\n    segments,\n    // Segments are in hand here, so segment attribution happens at the\n    // last responsible moment before the wire.\n    tool_calls: attachSegmentIds(args.toolCalls, segments),\n  };\n}\n","/**\n * Deterministic, dependency-free extractive summariser — the always-works\n * fallback for when the bundled LLM can't run on this machine (GPU/CPU runtime\n * failed to load, the ~2.7 GB GGUF isn't downloaded yet, no network on first\n * scan, an incompatible prebuilt binary). Instead of BLOCKING ingest — the old\n * behaviour, which refused to start the daemon — we ship a real, if plainer,\n * abstract built by extracting the user's apparent intent from the sampled\n * excerpts and appending the structural facts.\n *\n * This is intentionally NOT an LLM: no model, no native code, no I/O. It always\n * produces output, so the daemon never stalls. It IS clearly lower quality than\n * the Qwen summariser, so the daemon runs it in a flagged \"degraded\" mode and\n * re-summarises these segments at model quality once the LLM is available again\n * (see the self-heal in apps/daemon/src/daemon.ts).\n *\n * Crucially it does NOT emit the metadata-only placeholder (\"100 turns on\n * claude_code\") the LLM path guards against: it leads with real extracted prose\n * from the conversation, so downstream classification accepts it.\n */\nimport { ABSTRACT_OUTPUT_MAX_CHARS } from \"./prompts.js\";\nimport type { Summarizer } from \"./index.js\";\n\n// Short conversational openers that carry no task signal — skipped when picking\n// the lead so the abstract starts with what the user was actually doing.\nconst GREETING = /^(hi|hey|hello|thanks?|thank you|ok(ay)?|yes|no|sure|please|cool|great|nice)\\b[\\s!.,]*/i;\n// Leading politeness/filler stripped from the lead so it reads as an action.\nconst LEAD_FILLER =\n  /^(can you|could you|could we|can we|please|i(?:'d| would)? (?:like|want)(?: you)? to|i need(?: you)? to|let'?s|help me|i'?m trying to|i am trying to|now|so|ok(?:ay)?)\\s+/i;\n\n/** Pull the `[turn N] \"…\"` excerpt bodies back out of a built summariser prompt —\n * the fallback when a caller didn't pass structured `excerpts` (e.g. the browser\n * summarisers share the same Summarizer shape). */\nfunction parsePromptExcerpts(prompt: string): string[] {\n  const out: string[] = [];\n  const re = /\\[turn \\d+\\]\\s*\"([^\"]*)\"/g;\n  let m: RegExpExecArray | null = re.exec(prompt);\n  while (m) {\n    if (m[1]) out.push(m[1]);\n    m = re.exec(prompt);\n  }\n  return out;\n}\n\n/** The `Session context: …` facts line from a built prompt, if present. */\nfunction parsePromptFacts(prompt: string): string {\n  const m = /Session context:\\s*(.+?)\\.\\s*(?:\\n|$)/.exec(prompt);\n  return m?.[1]?.trim() ?? \"\";\n}\n\n/** First substantive excerpt (the intent), preferring the earliest non-greeting\n * line of real length; falls back to the longest early line, then anything. */\nfunction pickIntent(lines: string[]): string | null {\n  const early = lines.slice(0, 5);\n  const substantive = early.filter((l) => l.length >= 16 && !GREETING.test(l));\n  if (substantive.length > 0) return substantive[0]!;\n  // Nothing substantive up front — take the longest early line so we still lead\n  // with content rather than a bare \"hi\".\n  const byLen = [...early].sort((a, b) => b.length - a.length);\n  return byLen[0] ?? lines.find((l) => l.length > 0) ?? null;\n}\n\n/** Trim leading politeness/filler and capitalise so the lead reads as an action\n * phrase (\"fix the Metal crash\" → \"Fix the Metal crash\"). */\nfunction cleanLead(s: string): string {\n  let t = s.replace(GREETING, \"\").trim();\n  t = t.replace(LEAD_FILLER, \"\").trim();\n  if (!t) t = s.trim();\n  return t.charAt(0).toUpperCase() + t.slice(1);\n}\n\nfunction clamp(s: string, max: number): string {\n  const t = s.replace(/\\s+/g, \" \").trim();\n  if (t.length <= max) return t;\n  // Cut on a word boundary just under the cap, then add an ellipsis.\n  const cut = t.slice(0, max - 1);\n  const sp = cut.lastIndexOf(\" \");\n  return `${(sp > max * 0.6 ? cut.slice(0, sp) : cut).trimEnd()}…`;\n}\n\n/**\n * Build the always-works extractive summariser. Uses the structured `excerpts`\n * + `facts` the pipeline passes; falls back to parsing them out of `prompt` for\n * callers that only provide the built prompt string. Never throws, never empty.\n */\nexport function heuristicSummarize(): Summarizer {\n  return async ({ prompt, excerpts, facts }) => {\n    const lines = (excerpts && excerpts.length > 0 ? excerpts : parsePromptExcerpts(prompt))\n      .map((s) => s.replace(/\\s+/g, \" \").trim())\n      .filter((s) => s.length > 0);\n    const factText = (facts?.trim() || parsePromptFacts(prompt)).replace(/\\s+/g, \" \").trim();\n\n    const intent = pickIntent(lines);\n    const lead = intent ? cleanLead(intent) : \"AI coding session\";\n    // Append the structural facts as bracketed context — repo, turn count,\n    // files, tools — so the abstract still carries the metadata signal.\n    const body = factText ? `${lead} [${factText}]` : lead;\n    return clamp(body, ABSTRACT_OUTPUT_MAX_CHARS);\n  };\n}\n","/**\n * Daemon pipeline — redact → tokenize → segment → summarise → tag.\n *\n * The runtime (CLI on Node via Ollama, extension in browser via WebLLM)\n * passes in concrete adapters; this module encodes the algorithm once\n * and leaves the heavy ML calls to the adapter layer.\n *\n * Segmentation strategy\n *   - Time gap ≥ SEGMENT_TIME_GAP_MS (15 min) → new segment\n *   - Cosine distance between consecutive turn embeddings >\n *     SEGMENT_TOPIC_THRESHOLD (0.35) → new segment\n *   - Hard cap: SEGMENT_MAX_TURNS (100) or SEGMENT_MAX_DURATION_MS\n *     (30 min) — whichever first\n *   - Singletons merged into neighbours so every emitted segment has\n *     ≥ 2 turns (unless the whole session is one turn).\n */\n\nimport type { Agent } from \"@modelstat/core/enums\";\nimport { segmentId } from \"@modelstat/core/ids\";\nimport { redact } from \"@modelstat/core/redact\";\nimport type { RawEvent, Segment } from \"@modelstat/core/schemas\";\nimport {\n  type CognitionTags,\n  cognitionHints,\n  type Cognizer,\n  formatCognitionSuffix,\n} from \"./cognition.js\";\nimport { ABSTRACT_OUTPUT_MAX_CHARS, SUMMARISER_MAX_TOKENS } from \"./prompts.js\";\nimport type { LinkExtractor } from \"./session-metadata.js\";\nimport type { Entitler } from \"./title.js\";\n\n// ── Adapter types ────────────────────────────────────────────────\n\nexport type Embedder = (text: string) => Promise<number[]>;\nexport type Summarizer = (input: {\n  prompt: string;\n  maxTokens: number;\n  /** Structured excerpts (the sampled, redacted conversation turns) the `prompt`\n   * was built from. The LLM path uses `prompt`; the dependency-free heuristic\n   * fallback uses these directly. Optional for back-compat with other adapters. */\n  excerpts?: string[];\n  /** One-line structural facts (repo, turns, files, tools) — same source as the\n   * prompt's `Session context:` line. Used by the heuristic fallback. */\n  facts?: string;\n}) => Promise<string>;\n\nexport { heuristicSummarize } from \"./heuristic-summary.js\";\nexport type Tokenizer = (text: string) => number | Promise<number>;\n/**\n * Optional model-based redactor that runs AFTER the regex pass.\n * Typical implementation: OpenAI Privacy Filter via Transformers.js\n * — see `createPrivacyFilterRedactor` in\n * @modelstat/daemon-core/redact/privacy-filter. Returns the same\n * shape the regex pass returns so the pipeline can compose them\n * without special-casing.\n */\nexport type Redactor = (text: string) => Promise<{\n  text: string;\n  counts: Record<string, number>;\n}>;\n\nexport interface PipelineAdapters {\n  embed: Embedder;\n  summarize: Summarizer;\n  tokenize: Tokenizer;\n  /** Optional second-pass redactor. When omitted, only the regex pass\n   * runs (back-compatible with consumers who haven't added the\n   * Privacy Filter adapter yet). */\n  redact?: Redactor;\n  /** Optional cognition pass — runs after summarise + redact, tags the\n   * user's emotional state and meta-cognitive mode, and APPENDS the\n   * result to the abstract as a human-readable suffix\n   * (`[Mood: frustrated, curious] [Mind: debugging]`). Nothing else\n   * about the segment changes — the tags travel inside the abstract\n   * text (no hardcoded enum, no dedicated wire field).\n   *\n   * Best-effort: runtime failures or null replies leave the abstract\n   * unchanged. Cognition is a fun / auxiliary feature, NOT part of\n   * the core pipeline contract. */\n  cognize?: Cognizer;\n  /** Optional session-title pass — used by `buildSessionTitles` (NOT\n   * by the per-segment flow) to name each session from its segment\n   * abstracts for the dashboard's sessions list. Best-effort: when\n   * absent or failing, titles fall back to a deterministic derivation\n   * from the first abstract. See pipeline/title.ts. */\n  entitle?: Entitler;\n  /** Optional on-device link-extraction pass — used by\n   * `buildSessionMetadata` (NOT by the per-segment flow) to surface\n   * PR/issue/commit references from a session's redacted abstracts for ANY\n   * provider. Best-effort: when absent or failing, deterministic git +\n   * content detection still runs. See pipeline/session-metadata.ts. */\n  extractLinks?: LinkExtractor;\n}\n\n/**\n * Per-segment progress, emitted by {@link buildSegmentsForSession} as it\n * works through a batch so a long summarise pass isn't an opaque block to\n * the UI. The Node daemon turns these into the live \"Summarising 3/8 ·\n * session 2/4\" line the menu-bar tray shows; the browser path can ignore\n * it.\n *\n * `segment === 0` means the session is still being analyzed/segmented\n * (turn embeddings + boundary detection) so the per-session slice total\n * isn't known yet — render it as \"Analyzing…\".\n */\nexport interface SegmentProgress {\n  /** 1-based index of the session being processed within this batch. */\n  session: number;\n  /** Total number of sessions in this batch. */\n  sessionTotal: number;\n  /** 1-based index of the segment within the current session, or 0 while\n   * the session is still being segmented (totals not yet known). */\n  segment: number;\n  /** Number of segments in the current session, or 0 if not yet known. */\n  segmentTotal: number;\n}\nexport type SegmentProgressFn = (p: SegmentProgress) => void;\n\n// ── Constants ────────────────────────────────────────────────────\n\n/** Start a new segment when two consecutive turns are more than 15 min apart. */\nexport const SEGMENT_TIME_GAP_MS = 15 * 60_000;\n\n/** Start a new segment when the cosine distance between two adjacent\n * turn embeddings exceeds this threshold. Tuned on dogfood data; raise\n * to split more aggressively, lower to keep sessions together. */\nexport const SEGMENT_TOPIC_THRESHOLD = 0.35;\n\nexport const SEGMENT_MAX_TURNS = 100;\nexport const SEGMENT_MAX_DURATION_MS = 30 * 60_000;\n\n/**\n * Hard char-count ceiling on a segment's accumulated `content_excerpt`\n * length, summed across turns. Beyond this the bundled summariser\n * starts losing focus and produces vague \"many things were done\"\n * sentences instead of one precise tweet.\n *\n * Empirically tuned for Qwen3.5-4B (the bundled model): with our\n * sampling strategy of 7 excerpts × 350 chars = ~2.5K chars of\n * actual conversation content sent to the model, segments larger\n * than ~12K chars start sampling so sparsely that the abstract\n * loses precision. Below ~3K chars the model has so little to\n * summarise it produces generic genre descriptions. Sweet spot\n * is roughly 4K-12K chars per segment.\n *\n * The cap fires AFTER the time-gap, max-turns, and topic-shift\n * checks, so it only kicks in for long, on-topic, fast-typing\n * sessions where none of the natural boundaries fired.\n */\nexport const SEGMENT_MAX_CONTENT_CHARS = 12_000;\n\n/** Storage cap on the `abstract` column. Larger than the user-visible\n * output cap (`ABSTRACT_OUTPUT_MAX_CHARS` = 200) so a future\n * longer-output prompt still fits in the schema without a migration. */\nexport const ABSTRACT_MAX_CHARS = 512;\n\n/**\n * Excerpt sampling for the summariser prompt. Tuned for Qwen3.5-4B:\n *   - 7 excerpts spans the segment evenly enough that the model can\n *     describe the arc (start → resolution) instead of just the first\n *     turn's intent.\n *   - 350 chars per excerpt keeps the total input under 2.5 KB,\n *     leaving the model plenty of context window for thinking + output\n *     while still capturing enough substance per turn that small models\n *     can latch onto specific details.\n *   - Combined budget (~2.5K chars input → ~700 input tokens) matches\n *     the empirical sweet spot for instruction-following on small\n *     summarisation tasks; pushing higher dilutes attention.\n */\nexport const SUMMARISER_EXCERPT_COUNT = 7;\nexport const SUMMARISER_EXCERPT_MAX_CHARS = 350;\n\n// ── Public API ───────────────────────────────────────────────────\n\n/**\n * Build one-or-more Segments from a list of same-session RawEvents.\n * Given the adapter set, runs redact → segment boundaries → per-\n * segment summarise → per-segment tag. Emits deterministic tags\n * (project / provider / model / tool / environment) from event\n * metadata; LLM-derived tags (work_type, domain, components) are\n * attached per segment.\n */\nexport async function buildSegmentsForSession(\n  events: RawEvent[],\n  adapters: PipelineAdapters,\n  onProgress?: SegmentProgressFn,\n): Promise<Segment[]> {\n  if (events.length === 0) return [];\n  // Group by session_id — defensive; caller should do this already.\n  const bySession = new Map<string, RawEvent[]>();\n  for (const ev of events) {\n    const arr = bySession.get(ev.session_id) ?? [];\n    arr.push(ev);\n    bySession.set(ev.session_id, arr);\n  }\n  const sessions = [...bySession.entries()];\n  const out: Segment[] = [];\n  for (let si = 0; si < sessions.length; si++) {\n    const [sessionId, evs] = sessions[si]!;\n    const segs = await buildForOneSession(\n      sessionId,\n      evs,\n      adapters,\n      onProgress\n        ? (segment, segmentTotal) =>\n            onProgress({ session: si + 1, sessionTotal: sessions.length, segment, segmentTotal })\n        : undefined,\n    );\n    out.push(...segs);\n  }\n  return out;\n}\n\nasync function buildForOneSession(\n  sessionId: string,\n  events: RawEvent[],\n  adapters: PipelineAdapters,\n  onSlice?: (segment: number, segmentTotal: number) => void,\n): Promise<Segment[]> {\n  // Announce the session immediately. The embedding + boundary-detection\n  // work below can take several seconds on a large session, and without\n  // this the UI would sit frozen on the previous line until the first\n  // slice is summarised. `0` total = \"still analyzing, count unknown\".\n  onSlice?.(0, 0);\n  const sorted = [...events].sort((a, b) => a.ts.localeCompare(b.ts));\n\n  // Pre-compute turn embeddings from a stable surface: kind + model +\n  // tool-call summary. Content would leak PII; these tags are metadata\n  // and already redacted.\n  //\n  // Embed failures are tolerated turn-by-turn: one slow/missing\n  // embedder should NOT kill the scan cycle. If embeddings are not\n  // available, segment boundaries fall back to time-gap / max-turns\n  // heuristics, which are good enough for v1. This was the reason every\n  // CLI upload had been dying silently — a missing Ollama on the user's\n  // machine would throw out of this loop, break `buildSegments`, and\n  // propagate up to \"Upload failed: fetch failed\" without ever actually\n  // hitting /v1/ingest.\n  const turnSurfaces = sorted.map((e) => turnSurface(e));\n  const turnEmbeddings: number[][] = [];\n  for (const s of turnSurfaces) {\n    if (s.length === 0) {\n      turnEmbeddings.push([]);\n      continue;\n    }\n    try {\n      turnEmbeddings.push(await adapters.embed(s));\n    } catch {\n      turnEmbeddings.push([]);\n    }\n  }\n\n  // Compute boundary indices (exclusive end of each slice).\n  // Track running content size so we can split LONG-on-topic\n  // sessions before they exceed the bundled summariser's\n  // attention sweet spot (see SEGMENT_MAX_CONTENT_CHARS docs).\n  const boundaries: number[] = [];\n  let runStart = 0;\n  let runStartMs = Date.parse(sorted[0]!.ts);\n  let runChars = (sorted[0]!.content_excerpt ?? \"\").length;\n  for (let i = 1; i < sorted.length; i++) {\n    const prev = sorted[i - 1]!;\n    const cur = sorted[i]!;\n    const gap = Date.parse(cur.ts) - Date.parse(prev.ts);\n    const runMs = Date.parse(cur.ts) - runStartMs;\n    const turnsInRun = i - runStart;\n    let split = false;\n    if (gap >= SEGMENT_TIME_GAP_MS) split = true;\n    else if (turnsInRun >= SEGMENT_MAX_TURNS) split = true;\n    else if (runMs >= SEGMENT_MAX_DURATION_MS) split = true;\n    else if (runChars >= SEGMENT_MAX_CONTENT_CHARS) split = true;\n    else if (\n      turnEmbeddings[i - 1]!.length > 0 &&\n      turnEmbeddings[i]!.length > 0 &&\n      cosineDistance(turnEmbeddings[i - 1]!, turnEmbeddings[i]!) > SEGMENT_TOPIC_THRESHOLD\n    ) {\n      split = true;\n    }\n    if (split) {\n      boundaries.push(i);\n      runStart = i;\n      runStartMs = Date.parse(cur.ts);\n      runChars = (cur.content_excerpt ?? \"\").length;\n    } else {\n      runChars += (cur.content_excerpt ?? \"\").length;\n    }\n  }\n  boundaries.push(sorted.length);\n\n  // Materialise slices.\n  const slices: RawEvent[][] = [];\n  let prev = 0;\n  for (const b of boundaries) {\n    slices.push(sorted.slice(prev, b));\n    prev = b;\n  }\n\n  // Merge tiny singletons into neighbour to avoid per-turn fragments.\n  const merged: RawEvent[][] = [];\n  for (const slice of slices) {\n    const last = merged[merged.length - 1];\n    if (slice.length === 1 && last) {\n      last.push(...slice);\n    } else {\n      merged.push(slice);\n    }\n  }\n\n  const segments: Segment[] = [];\n  let failed = 0;\n  let lastError: string | null = null;\n  for (let mi = 0; mi < merged.length; mi++) {\n    const slice = merged[mi]!;\n    // Report progress before each slice so the daemon's heartbeat (and\n    // the tray reading it) advances on every summarise step — the long\n    // pole during a backfill — instead of looking wedged for minutes.\n    onSlice?.(mi + 1, merged.length);\n    try {\n      const seg = await summariseSlice(sessionId, slice, adapters);\n      if (seg) segments.push(seg);\n    } catch (err) {\n      // Per-slice failure (no excerpts, model error, model timeout)\n      // must NOT block the rest of the batch. The previous behaviour\n      // — propagating the throw — meant a single all-tool_use slice\n      // killed the whole upload, leaving thousands of healthy events\n      // queued forever and the daemon wedged on \"Uploading X events\"\n      // with zero /v1/ingest hits to show for it. Track the failures\n      // for visibility but keep summarising the rest.\n      failed += 1;\n      lastError = err instanceof Error ? err.message : String(err);\n      // biome-ignore lint/suspicious/noConsole: per-slice failure\n      console.warn(`[modelstat] slice failed in session ${sessionId}: ${lastError}`);\n    }\n  }\n  if (failed > 0) {\n    // biome-ignore lint/suspicious/noConsole: end-of-batch summary\n    console.warn(\n      `[modelstat] session ${sessionId}: ${segments.length} segments built, ${failed} slices failed (last error: ${lastError ?? \"?\"}). Continuing with the healthy slices.`,\n    );\n  }\n  return segments;\n}\n\nasync function summariseSlice(\n  sessionId: string,\n  slice: RawEvent[],\n  adapters: PipelineAdapters,\n): Promise<Segment | null> {\n  if (slice.length === 0) return null;\n  const first = slice[0]!;\n  const last = slice[slice.length - 1]!;\n  const startedAtMs = Date.parse(first.ts);\n  const endedAtMs = Date.parse(last.ts);\n\n  // Token totals from upstream parser — exact for JSONL, tokenizer\n  // fallback for browser captures.\n  const tokens = {\n    input: 0,\n    output: 0,\n    cache_creation: 0,\n    cache_read: 0,\n    reasoning: 0,\n  };\n  for (const ev of slice) {\n    if (!ev.tokens) continue;\n    tokens.input += ev.tokens.input;\n    tokens.output += ev.tokens.output;\n    tokens.cache_creation += ev.tokens.cache_creation;\n    tokens.cache_read += ev.tokens.cache_read;\n    tokens.reasoning += ev.tokens.reasoning;\n  }\n\n  // Build the summariser input from BOTH structural facts and\n  // sampled conversation excerpts. Parsers populate `content_excerpt`\n  // per RawEvent (after running PII redaction on the raw turn text).\n  // Without these excerpts the summariser has nothing but metadata to\n  // work with — the resulting abstract collapses to \"100 turns on\n  // claude_code\", a placeholder that downstream consumers reject.\n  const promptFacts = [\n    first.git?.remote_slug ? `repo ${first.git.remote_slug}` : null,\n    first.git?.branch ? `branch ${first.git.branch}` : null,\n    `${slice.length} turns on ${first.agent}`,\n    first.files_touched?.length\n      ? `files touched: ${first.files_touched.slice(0, 5).join(\", \")}`\n      : null,\n    Object.keys(first.tool_calls ?? {}).length\n      ? `tool calls: ${Object.keys(first.tool_calls).slice(0, 5).join(\", \")}`\n      : null,\n  ]\n    .filter(Boolean)\n    .join(\"; \");\n\n  // Sample excerpts: first turn (usually the user's intent), middle,\n  // last (usually resolution). Plus quartile picks. Re-redact on our\n  // side as defence-in-depth even though the parser is supposed to\n  // have already redacted.\n  const excerpts = sampleAndRedactExcerpts(slice);\n  if (excerpts.length === 0) {\n    // No usable content excerpts in this slice — usually a parser\n    // bug (extractExcerpt stripped everything as code blocks) or a\n    // session that was 100% tool_use with no prose. Refuse to\n    // summarise without content; the alternative is feeding the\n    // model a metadata-only prompt and getting \"100 turns on\n    // claude_code\" back, which downstream then refuses to classify\n    // (PlaceholderAbstractError). Fail at the SOURCE so the user's\n    // logs say exactly what's wrong instead of failing later, far from\n    // the cause.\n    throw new Error(\n      `parser produced 0 content excerpts for session ${sessionId} (${slice.length} turns) — the summariser would only see metadata and produce \"${slice.length} turns on ${first.agent}\". Check the parser for ${first.agent} (likely extractExcerpt stripped everything as code or the session is pure tool_use).`,\n    );\n  }\n  const excerptBlock = excerpts\n    .map((e, i) => `  [turn ${i + 1}] \"${e.replace(/\\s+/g, \" \").trim()}\"`)\n    .join(\"\\n\");\n\n  const prompt = `Session context: ${promptFacts || \"generic coding session\"}.\n\nSampled excerpts from the conversation (already redacted of PII and secrets):\n${excerptBlock}\n\nWrite a ≤${ABSTRACT_OUTPUT_MAX_CHARS}-char summary (1-2 sentences) naming exactly what was achieved: the concrete action, what it acted on, and the specific target (repo/branch/service/component) when identifiable from the context above. Lead with an outcome verb and pack in concrete domain keywords (frameworks, features, decisions). Skip narration and filler.`;\n\n  // Summarisation is core product output, not an optional polish\n  // step. If the adapter throws, propagate — silently writing the\n  // metadata template (\"100 turns on claude_code\") as the abstract\n  // makes the dashboard look fine while every segment is useless.\n  // Empty output is treated as a failure for the same reason. The\n  // caller (scan loop) is responsible for surfacing the error and\n  // not advancing the queue cursor on failed batches.\n  const rawAbstract = await adapters.summarize({\n    prompt,\n    maxTokens: SUMMARISER_MAX_TOKENS,\n    // Structured inputs for the dependency-free fallback summariser (used when\n    // the bundled LLM can't load); the LLM path ignores these and uses `prompt`.\n    excerpts,\n    facts: promptFacts,\n  });\n  if (!rawAbstract || rawAbstract.trim().length === 0) {\n    throw new Error(\n      `summariser returned empty abstract for session ${sessionId} (${slice.length} turns) — check that the configured summariser is healthy`,\n    );\n  }\n\n  // Two-pass redaction: regex always (cheap, microseconds), then\n  // optional model-based pass (Privacy Filter via the redact adapter).\n  // Failures in the model pass are swallowed — the regex result is\n  // shipped as-is so a transient issue never blocks ingest.\n  const regexPass = redact(rawAbstract);\n  let abstractText = regexPass.text;\n  const counts: Record<string, number> = { ...regexPass.counts };\n  if (adapters.redact) {\n    try {\n      const modelPass = await adapters.redact(regexPass.text);\n      abstractText = modelPass.text;\n      for (const [k, v] of Object.entries(modelPass.counts)) {\n        if (k.startsWith(\"pf_\")) counts[k] = v;\n      }\n    } catch {\n      // Keep regex result; server-side defence-in-depth picks up the slack.\n    }\n  }\n  const redacted = { text: abstractText, counts };\n\n  // Cognition pass — best-effort. Reads the redacted abstract and\n  // returns short mood / meta-cognitive tags, which we APPEND as a\n  // human-readable suffix. The tags travel inside the abstract text\n  // (no special primitives, no schema columns, no wire-format\n  // additions). If the runtime is unavailable or returns null the\n  // abstract is unchanged.\n  let cognition: CognitionTags | null = null;\n  if (adapters.cognize) {\n    try {\n      cognition = await adapters.cognize({ abstract: redacted.text });\n    } catch {\n      /* cognition pass is best-effort; keep the bare abstract */\n    }\n  }\n  const cognitionSuffix = cognition ? formatCognitionSuffix(cognition) : \"\";\n  const abstractWithCognition = cognitionSuffix\n    ? `${redacted.text} ${cognitionSuffix}`\n    : redacted.text;\n\n  // Privacy-preserving behavioral signal — COUNTS/RATIOS ONLY, never raw\n  // text (mirrors RedactionReport). Powers server-side prompt-friction\n  // detection: how many user turns / corrections happened plus a 0-1\n  // frustration estimate. Computed on-device from event structure +\n  // cognition mood tags; nothing identifiable leaves the machine.\n  const behavior = computeBehavior(slice, cognition);\n\n  // Deterministic tags from event metadata — no LLM needed. These always apply.\n  const tags: Segment[\"tags\"] = [\n    { root_key: \"agents\", name: first.agent, confidence: 1 },\n    { root_key: \"providers\", name: first.provider, confidence: 1 },\n  ];\n  if (first.model) tags.push({ root_key: \"models\", name: first.model, confidence: 1 });\n  if (first.git?.remote_slug) {\n    tags.push({ root_key: \"projects\", name: first.git.remote_slug, confidence: 1 });\n  }\n  if (first.git?.branch) {\n    const env = inferEnvironment(first.git.branch);\n    if (env) tags.push({ root_key: \"environments\", name: env, confidence: 0.7 });\n  }\n\n  // Components hint from files_touched — keep the unique top-level paths.\n  const components = new Set<string>();\n  for (const ev of slice) {\n    for (const f of ev.files_touched ?? []) {\n      const seg = f.split(\"/\").slice(0, 2).join(\"/\");\n      if (seg) components.add(seg);\n    }\n  }\n  for (const c of [...components].slice(0, 8)) {\n    tags.push({ root_key: \"components\", name: c, confidence: 0.6 });\n  }\n\n  // Local-time dimensions (WHEN the work happened). The daemon runs on the\n  // engineer's machine, so it has their wall-clock; the server only ever sees\n  // UTC and could never derive these. The taxonomy temporal/cadence drivers turn\n  // them into Time-of-Day / Cadence nodes — only for buckets that actually occur.\n  tags.push(...temporalHints(startedAtMs));\n\n  // Mood + Posture dimensions (the HUMAN behind the work) from the best-effort\n  // cognition pass — the PRIMARY emotion + stance become one leaf each via the\n  // server's Mood/Posture drivers (the full set stays in the abstract suffix). A\n  // no-op when cognition was unavailable or empty, so the dimensions are\n  // real-data-only by construction.\n  tags.push(...cognitionHints(cognition));\n\n  // Tool-call mix — aggregate the per-event count maps (canonical\n  // identity → calls, see RawEvent.tool_calls) across the slice and\n  // tag the top-8 identities. Confidence encodes share-of-calls\n  // (rounded to 2dp) so heavy hitters rank higher at classify time,\n  // floored at 0.05 so a single call in a busy slice still registers.\n  // 8 tool tags + the ≤13 tags above stay well under the 40-tag cap\n  // on Segment.tags.\n  const toolCallCounts = new Map<string, number>();\n  let toolCallTotal = 0;\n  for (const ev of slice) {\n    for (const [identity, n] of Object.entries(ev.tool_calls ?? {})) {\n      if (!(n > 0)) continue;\n      toolCallCounts.set(identity, (toolCallCounts.get(identity) ?? 0) + n);\n      toolCallTotal += n;\n    }\n  }\n  const topToolCalls = [...toolCallCounts.entries()]\n    // TaxonomyHintRooted.name caps at 120 chars; a pathological MCP\n    // identity (`mcp:<server≤116>/<tool≤120>`) can exceed it and would\n    // 400 the whole batch server-side. Such identities can't ride a\n    // hint at all (truncating would mismatch the server-side leaf), so\n    // skip them here — the per-call ToolCallWire rows still carry them\n    // via the separately-capped server/name fields.\n    .filter(([identity]) => identity.length <= 120)\n    .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n    .slice(0, 8);\n  for (const [identity, count] of topToolCalls) {\n    const share = Math.round((count / toolCallTotal) * 100) / 100;\n    tags.push({\n      root_key: \"tool_calls\",\n      name: identity,\n      confidence: Math.min(1, Math.max(0.05, share)),\n    });\n  }\n\n  // Mean embedding across turn embeddings as the segment embedding —\n  // cheaper than re-embedding the (short) abstract and keeps the\n  // vector grounded in the actual content.\n  let segmentEmbedding: number[] | undefined;\n  try {\n    const embedded = await adapters.embed(redacted.text.slice(0, ABSTRACT_MAX_CHARS));\n    if (embedded.length > 0) segmentEmbedding = embedded;\n  } catch {\n    segmentEmbedding = undefined;\n  }\n\n  // User-intent distillation — from the DEVELOPER'S MESSAGES ONLY (not the\n  // assistant's actions or tool calls). This is the source Insights' rule +\n  // skill detectors mine: \"what does the user actually ask for / how do they\n  // direct the AI\" — which the outcome abstract (what the assistant DID) can't\n  // answer. On-device, redacted, bounded, best-effort.\n  const userIntent = await summariseUserIntent(slice, adapters);\n\n  const sourceEventIds = slice.map((e) => e.source_event_id);\n  const id = segmentId(sessionId, startedAtMs, endedAtMs, sourceEventIds);\n  return {\n    segment_id: id,\n    session_id: sessionId,\n    agent: first.agent as Agent,\n    started_at: first.ts,\n    ended_at: last.ts,\n    // Slice to the user-visible cap (ABSTRACT_OUTPUT_MAX_CHARS, default\n    // 400) — well below the 512 storage cap. Models occasionally\n    // overshoot the prompt's \"≤N chars\" instruction; the slice is the\n    // hard guarantee the dashboard relies on.\n    abstract: abstractWithCognition.slice(0, ABSTRACT_OUTPUT_MAX_CHARS),\n    tokens,\n    tags,\n    // counts is `Record<string, number>` after the optional model\n    // merge; the schema's RedactionReport requires the three regex\n    // counters (always populated from regexPass.counts) plus a\n    // number-valued catchall for pf_*.\n    redaction: redacted.counts as Segment[\"redaction\"],\n    source_event_ids: sourceEventIds,\n    abstract_embedding:\n      segmentEmbedding && segmentEmbedding.length === 384 ? segmentEmbedding : undefined,\n    behavior,\n    user_intent: userIntent,\n  };\n}\n\n/** Caps for the user-intent distillation (separate from the abstract so the\n * abstract's contract — length, prompt, fallback — is left untouched). */\nconst USER_INTENT_MAX_CHARS = 240;\nconst USER_INTENT_MAX_TOKENS = 120;\n\n/** Distill what the DEVELOPER asked for / how they directed the AI, from their\n * OWN messages only — the source Insights' rule + skill detectors mine. The\n * outcome abstract describes what the assistant DID, which is the wrong signal\n * for \"what does the user want\". On-device, redacted, bounded, best-effort:\n * returns undefined when there's no user prose or the summariser is unavailable. */\nasync function summariseUserIntent(\n  slice: RawEvent[],\n  adapters: PipelineAdapters,\n): Promise<string | undefined> {\n  const userExcerpts = slice\n    .filter((e) => e.kind === \"user_message\")\n    .map((e) => e.content_excerpt?.replace(/\\s+/g, \" \").trim())\n    .filter((x): x is string => !!x && x.length > 0);\n  if (userExcerpts.length === 0) return undefined;\n  // The ask is usually first; later messages add direction/corrections.\n  const sample =\n    userExcerpts.length <= 6\n      ? userExcerpts\n      : [...userExcerpts.slice(0, 4), ...userExcerpts.slice(-2)];\n  const block = sample.map((e, i) => `  [msg ${i + 1}] \"${e.slice(0, 240)}\"`).join(\"\\n\");\n  try {\n    const raw = await adapters.summarize({\n      prompt: `The developer's own messages to an AI coding assistant (already redacted of PII and secrets):\n${block}\n\nIn ≤${USER_INTENT_MAX_CHARS} chars, summarise WHAT THE DEVELOPER ASKED FOR or DIRECTED — their goal or task in their own framing, AND any standing preferences / directives / conventions they expressed (e.g. \"always be thorough\", \"ship fast\", a naming or workflow convention). Focus on the DEVELOPER'S intent and voice, NOT what the assistant did. Reply with only the summary.`,\n      maxTokens: USER_INTENT_MAX_TOKENS,\n      excerpts: sample,\n      facts: \"\",\n    });\n    if (!raw || !raw.trim()) return undefined;\n    // Same two-pass redaction as the abstract (regex floor + optional model).\n    const regexPass = redact(raw);\n    let text = regexPass.text;\n    if (adapters.redact) {\n      try {\n        text = (await adapters.redact(regexPass.text)).text;\n      } catch {\n        /* keep the regex result */\n      }\n    }\n    const trimmed = text.trim().slice(0, USER_INTENT_MAX_CHARS);\n    return trimmed.length > 0 ? trimmed : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\n\n/** Substrings that mark a frustrated/blocked mood in a cognition emotion\n * tag (matched case-insensitively, so inflections like \"frustrated\" /\n * \"frustration\" hit). A generic linguistic cue set — NOT domain/tool vocab. */\nconst FRUSTRATION_MARKERS = [\n  \"frustrat\",\n  \"annoy\",\n  \"stuck\",\n  \"confus\",\n  \"irritat\",\n  \"block\",\n  \"stress\",\n  \"angr\",\n  \"overwhelm\",\n] as const;\n\n/** Privacy-preserving per-segment behavioral signal — COUNTS/RATIOS ONLY.\n * `user_turns`: developer messages in the slice. `correction_count`: user\n * messages that land right after an assistant message (a re-prompt /\n * correction proxy). `frustration`: 0-1, raised by re-prompt density and by\n * negative cognition mood tags. Never includes raw text. */\nfunction computeBehavior(\n  slice: RawEvent[],\n  cognition: CognitionTags | null,\n): { user_turns: number; correction_count: number; frustration: number } {\n  let userTurns = 0;\n  let correctionCount = 0;\n  let prevWasAssistant = false;\n  for (const ev of slice) {\n    if (ev.kind === \"user_message\") {\n      userTurns++;\n      if (prevWasAssistant) correctionCount++;\n      prevWasAssistant = false;\n    } else if (ev.kind === \"assistant_message\") {\n      prevWasAssistant = true;\n    }\n  }\n  const frustratedMood =\n    cognition?.emotions?.some((e) => {\n      const lower = e.toLowerCase();\n      return FRUSTRATION_MARKERS.some((m) => lower.includes(m));\n    }) ?? false;\n  const frustration = Math.min(\n    1,\n    Math.max(correctionCount / 4, frustratedMood ? 0.8 : 0),\n  );\n  return {\n    user_turns: userTurns,\n    correction_count: correctionCount,\n    frustration: Math.round(frustration * 100) / 100,\n  };\n}\n\n/**\n * Pick representative turn excerpts from a slice and re-redact them\n * before they reach the summariser prompt. Strategy:\n *   • Always include the first event with content (the user's intent).\n *   • Always include the last event with content (the resolution).\n *   • Up to 3 evenly-spaced events in between.\n *   • Skip events without content_excerpt — silent fallback to\n *     metadata-only behaviour for older parsers.\n * Re-runs regex redaction on every excerpt as defence-in-depth even\n * though the parser is supposed to have done it already.\n */\nfunction sampleAndRedactExcerpts(slice: RawEvent[]): string[] {\n  const withContent: Array<{ idx: number; text: string }> = [];\n  for (let i = 0; i < slice.length; i++) {\n    const c = slice[i]?.content_excerpt;\n    if (c && c.trim().length > 0) withContent.push({ idx: i, text: c });\n  }\n  if (withContent.length === 0) return [];\n\n  const picks: number[] = [0]; // first\n  if (withContent.length > 1) picks.push(withContent.length - 1); // last\n  for (const frac of [0.25, 0.5, 0.75]) {\n    const idx = Math.floor(withContent.length * frac);\n    if (!picks.includes(idx)) picks.push(idx);\n    if (picks.length >= 5) break;\n  }\n  picks.sort((a, b) => a - b);\n\n  const out: string[] = [];\n  for (const i of picks) {\n    const raw = withContent[i]?.text;\n    if (!raw) continue;\n    const redacted = redact(raw).text;\n    out.push(redacted.slice(0, 200));\n  }\n  return out;\n}\n\nfunction turnSurface(e: RawEvent): string {\n  const parts: string[] = [e.kind, e.agent];\n  if (e.model) parts.push(e.model);\n  const toolCalls = Object.keys(e.tool_calls ?? {});\n  if (toolCalls.length) parts.push(`tools:${toolCalls.join(\",\")}`);\n  if (e.files_touched?.length) parts.push(`files:${e.files_touched.length}`);\n  return parts.join(\" \");\n}\n\nfunction cosineDistance(a: number[], b: number[]): number {\n  let dot = 0;\n  let na = 0;\n  let nb = 0;\n  const n = Math.min(a.length, b.length);\n  for (let i = 0; i < n; i++) {\n    dot += a[i]! * b[i]!;\n    na += a[i]! * a[i]!;\n    nb += b[i]! * b[i]!;\n  }\n  const denom = Math.sqrt(na) * Math.sqrt(nb);\n  return denom > 0 ? 1 - dot / denom : 1;\n}\n\nfunction inferEnvironment(branch: string): string | null {\n  const b = branch.toLowerCase();\n  if (b === \"main\" || b === \"master\" || b.startsWith(\"release/\")) return \"Prod\";\n  if (b === \"staging\" || b.startsWith(\"staging/\")) return \"Staging\";\n  if (b === \"dev\" || b === \"develop\" || b.startsWith(\"dev/\")) return \"Dev\";\n  return null;\n}\n\n/** Local-time taxonomy hints for a slice (WHEN the work happened). The daemon\n *  runs on the engineer's OWN machine, so `getHours()`/`getDay()` give THEIR\n *  wall-clock — the server only ever sees UTC and could never derive these. The\n *  taxonomy temporal/cadence drivers turn these into Time-of-Day / Cadence nodes,\n *  and only for the buckets that actually occur (an engineer who never codes at\n *  night simply has no Night node). Friday is split out from the rest of the week\n *  on purpose — it's the relatable one. */\nexport function temporalHints(startedAtMs: number): Segment[\"tags\"] {\n  const d = new Date(startedAtMs);\n  const h = d.getHours();\n  const timeOfDay =\n    h >= 5 && h < 12\n      ? \"Morning\"\n      : h >= 12 && h < 17\n        ? \"Midday\"\n        : h >= 17 && h < 21\n          ? \"Evening\"\n          : \"Night\";\n  const day = d.getDay(); // 0 = Sun … 6 = Sat\n  const cadence = day === 0 || day === 6 ? \"Weekend\" : day === 5 ? \"Friday\" : \"Weekday\";\n  return [\n    { root_key: \"time_of_day\", name: timeOfDay, confidence: 1 },\n    { root_key: \"cadence\", name: cadence, confidence: 1 },\n  ];\n}\n\n// Re-exports for convenience of consumers that previously imported\n// redact + summariser types from daemon-core/pipeline.\nexport { type RedactionResult, redact } from \"@modelstat/core/redact\";\nexport {\n  buildCognitionUserPrompt,\n  COGNITION_MAX_TOKENS,\n  COGNITION_SYSTEM_PROMPT,\n  COGNITION_TEMPERATURE,\n  type CognitionInput,\n  type CognitionTags,\n  type Cognizer,\n  cognitionHints,\n  EMPTY_COGNITION,\n  formatCognitionSuffix,\n  MAX_COGNITION_TAG_CHARS,\n  MAX_COGNITION_TAGS_PER_FIELD,\n  parseCognitionReply,\n  sanitiseTags,\n} from \"./cognition.js\";\nexport {\n  BROWSER_EMBED_MODEL,\n  OLLAMA_CHAT_MODEL,\n  OLLAMA_EMBED_MODEL,\n  QWEN_CHARS_PER_TOKEN,\n  SUMMARISER_MAX_TOKENS,\n  SUMMARISER_MODEL_FAMILY,\n  SUMMARISER_SYSTEM_PROMPT,\n  SUMMARISER_TEMPERATURE,\n  SUMMARISER_TOP_K,\n  WEBLLM_CHAT_MODEL,\n} from \"./prompts.js\";\nexport {\n  buildScriptSummaryUserPrompt,\n  SCRIPT_SUMMARY_INPUT_MAX_CHARS,\n  SCRIPT_SUMMARY_MAX_TOKENS,\n  SCRIPT_SUMMARY_OUTPUT_MAX_CHARS,\n  SCRIPT_SUMMARY_SYSTEM_PROMPT,\n  SCRIPT_SUMMARY_TEMPERATURE,\n  type ScriptSummarizer,\n} from \"./script-summary.js\";\nexport {\n  buildLinkExtractUserPrompt,\n  buildSessionMetadata,\n  LINK_EXTRACT_MAX_ABSTRACTS,\n  LINK_EXTRACT_MAX_TOKENS,\n  LINK_EXTRACT_SYSTEM_PROMPT,\n  LINK_EXTRACT_TEMPERATURE,\n  type LinkExtractInput,\n  type LinkExtractor,\n  type SessionMetadataOptions,\n} from \"./session-metadata.js\";\nexport {\n  buildSessionTitles,\n  buildTitleUserPrompt,\n  type Entitler,\n  fallbackTitle,\n  sampleAbstracts,\n  sanitiseTitle,\n  stripCognitionSuffix,\n  TITLE_MAX_CHARS,\n  TITLE_WIRE_MAX_CHARS,\n  TITLER_MAX_ABSTRACTS,\n  TITLER_MAX_TOKENS,\n  TITLER_SYSTEM_PROMPT,\n  TITLER_TEMPERATURE,\n  type TitleInput,\n} from \"./title.js\";\nexport {\n  applyLlmRedactions,\n  composeRedactors,\n  LLM_REDACTION_MARKER,\n  parseRedactReply,\n  REDACT_MAX_TOKENS,\n  REDACT_SYSTEM_PROMPT,\n  REDACT_TEMPERATURE,\n  shouldDeepRedact,\n} from \"./redaction.js\";\n","/**\n * On-device NER/PII redaction adapter (Transformers.js / ONNX).\n *\n * Builds a Redactor function the daemon pipeline runs AFTER the regex pass.\n * Running on-device means PII never leaves the machine — the whole point of\n * \"privacy filter\". It loads a token-classification (NER) model and redacts each\n * detected entity span (person, org, location, …) as `[REDACTED:<TYPE>]`. The\n * BIO span-merging below is model-AGNOSTIC, so any standard NER model works.\n *\n * Default model: `Xenova/bert-base-NER` (dtype q8). NOTE: the previous default\n * `openai/privacy-filter` is NOT loadable by Transformers.js — its `model_type`\n * (\"openai_privacy_filter\") is unsupported, so that adapter ALWAYS threw at load\n * and fell through to pass-through (the NER layer never actually ran).\n * bert-base-NER is a standard, supported architecture that loads on-device and\n * detects person/org/location entities; structured PII (emails, keys, paths) is\n * covered by the regex floor and the local-LLM backstop around this layer.\n *\n * Loading is lazy: the model downloads on first call and caches in IndexedDB\n * (browser) or ~/.cache/huggingface (Node). If @huggingface/transformers isn't\n * installed, the adapter logs once and returns a no-op pass-through redactor, so\n * the pipeline always falls through to the regex result + LLM backstop.\n *\n * Default device:\n *   • Browser: \"webgpu\" (Transformers.js auto-falls-back to \"wasm\")\n *   • Node:    \"cpu\"    (onnxruntime-node)\n *\n * IMPORTANT: this is an OPTIONAL adapter. The consuming package (apps/daemon)\n * declares `@huggingface/transformers` and stages it beside the bundle; we use a\n * runtime dynamic import so missing the dep doesn't break the build for\n * consumers that don't care.\n */\n\nimport type { RedactionResult } from \"@modelstat/core/redact\";\nimport {\n  isMissingOptionalModuleError,\n  OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS,\n} from \"../optional-module.js\";\n\nexport type Redactor = (text: string) => Promise<RedactionResult>;\n\nexport interface PrivacyFilterAdapterOptions {\n  /** Override the model id. Defaults to \"Xenova/bert-base-NER\" (a Transformers.js-\n   * compatible token-classification model). Any standard BIO-tagged NER model works. */\n  model?: string;\n  /** Device hint passed through to Transformers.js. Default: webgpu\n   * in the browser, cpu in Node. The library auto-falls-back to\n   * `wasm` if WebGPU is unavailable. */\n  device?: \"webgpu\" | \"wasm\" | \"cpu\";\n  /** Quantisation of the on-device weights. q8 is the default — small + fast on\n   * CPU and the variant bert-base-NER publishes (it has no q4 build). */\n  dtype?: \"fp32\" | \"fp16\" | \"q8\" | \"q4\";\n  /** Optional progress callback — Transformers.js fires this during\n   * the model download so the UI can show a \"loading 32%\" indicator\n   * the first time the user opens an extension popup or runs the\n   * CLI. Receives Transformers.js's progress events as-is. */\n  onProgress?: (e: { status?: string; progress?: number; file?: string }) => void;\n  /** Test hook: replace the dynamic `import()` used to load\n   * @huggingface/transformers so tests can simulate a missing or flaky\n   * module. Production callers leave this unset. */\n  importModule?: (id: string) => Promise<unknown>;\n}\n\n/** Escape a string for literal use inside a RegExp. */\nfunction escapeRegExp(s: string): string {\n  return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Reconstruct an entity's surface text from its WordPiece tokens.\n * `##`-prefixed tokens are continuations of the previous word (joined\n * with no space); every other token starts a new word (space-joined).\n * e.g. [\"Globe\", \"##x\", \"Corporation\"] → \"Globex Corporation\". */\nexport function reconstructSurface(words: string[]): string {\n  let s = \"\";\n  for (const w of words) {\n    if (w.startsWith(\"##\")) s += w.slice(2);\n    else s += s ? ` ${w}` : w;\n  }\n  return s.trim();\n}\n\n/**\n * Build a Redactor backed by OpenAI Privacy Filter.\n *\n * The returned function is safe to call from the start — model\n * loading is deferred until the first invocation, then cached. If\n * loading ever fails (no Transformers.js, no network, etc.) we fall\n * back to a pass-through that returns the input verbatim with empty\n * counts; the pipeline's regex result is what the segment ends up\n * carrying.\n */\nexport async function createPrivacyFilterRedactor(\n  opts: PrivacyFilterAdapterOptions = {},\n): Promise<Redactor> {\n  const isBrowser =\n    typeof globalThis !== \"undefined\" &&\n    typeof (globalThis as { window?: unknown }).window !== \"undefined\";\n  const device = opts.device ?? (isBrowser ? \"webgpu\" : \"cpu\");\n  const dtype = opts.dtype ?? \"q8\";\n  const modelId = opts.model ?? \"Xenova/bert-base-NER\";\n\n  // Loose typing — the pipeline() return type is a complex union and\n  // typing it strictly drags in @huggingface/transformers as a hard\n  // dependency. We only need the call signature here.\n  type TokenClassifier = (\n    text: string,\n  ) => Promise<Array<{ entity: string; word: string; start?: number; end?: number }>>;\n\n  const importModule = opts.importModule ?? ((id: string) => import(/* @vite-ignore */ id));\n\n  let cached: TokenClassifier | null = null;\n  let loadPromise: Promise<TokenClassifier | null> | null = null;\n  let loadFailedPermanently = false;\n  let loadAttempts = 0;\n  let warnedUnavailable = false;\n  let warnedInferenceError = false;\n\n  async function loadPipeline(): Promise<TokenClassifier | null> {\n    if (cached) return cached;\n    // Latched-unavailable answers immediately. The redactor runs once\n    // per segment during a scan; re-running a FAILING dynamic import()\n    // from here is the same heap leak + log flood that OOM-crashed the\n    // daemon during the 2026-06-11 full reprocess — see the embedder in\n    // ../node/transformersjs-embed.ts and ../optional-module.ts.\n    if (loadFailedPermanently) return null;\n    if (!loadPromise) {\n      loadPromise = (async () => {\n        try {\n          // Dynamic import via an injectable indirection so TypeScript\n          // doesn't statically resolve the module. @huggingface/\n          // transformers is an OPTIONAL peer dep; consumers who don't\n          // need on-device redaction shouldn't have to install it.\n          const tjs = (await importModule(\"@huggingface/transformers\")) as unknown as {\n            pipeline: (\n              task: string,\n              model: string,\n              opts?: Record<string, unknown>,\n            ) => Promise<TokenClassifier>;\n          };\n          const p = await tjs.pipeline(\"token-classification\", modelId, {\n            device,\n            dtype,\n            ...(opts.onProgress ? { progress_callback: opts.onProgress } : {}),\n          });\n          cached = p;\n          return p;\n        } catch (err) {\n          loadPromise = null;\n          loadAttempts += 1;\n          if (\n            isMissingOptionalModuleError(err) ||\n            loadAttempts >= OPTIONAL_MODULE_MAX_LOAD_ATTEMPTS\n          ) {\n            loadFailedPermanently = true;\n          }\n          if (!warnedUnavailable) {\n            warnedUnavailable = true;\n            // eslint-disable-next-line no-console\n            console.warn(\n              \"[privacy-filter] adapter unavailable — install @huggingface/transformers in the consuming package to enable model-based redaction. Falling back to pass-through (warning once).\",\n              (err as Error).message,\n            );\n          }\n          return null;\n        }\n      })();\n    }\n    return loadPromise;\n  }\n\n  return async function redactWithPrivacyFilter(text: string): Promise<RedactionResult> {\n    const empty: RedactionResult = {\n      text,\n      counts: {\n        secrets_found: 0,\n        emails_redacted: 0,\n        paths_redacted_absolute: 0,\n      },\n    };\n    if (!text) return empty;\n    const classify = await loadPipeline();\n    if (!classify) return empty;\n\n    let tokens: Awaited<ReturnType<TokenClassifier>>;\n    try {\n      tokens = await classify(text);\n    } catch (err) {\n      // Warn once, not per segment — a deterministic inference failure\n      // would otherwise repeat for every segment of a long scan.\n      if (!warnedInferenceError) {\n        warnedInferenceError = true;\n        // eslint-disable-next-line no-console\n        console.warn(\n          \"[privacy-filter] inference failed, returning input unchanged (warning once):\",\n          (err as Error).message,\n        );\n      }\n      return empty;\n    }\n\n    // Decode entities from the BIO tags: a `B-` tag or a type change starts a\n    // new entity, an `I-` of the same type extends it. Transformers.js\n    // returns one entry per subword (O tokens already dropped); we keep each\n    // token's word + character offsets so redaction can use whichever the\n    // model actually provides.\n    type NerToken = { word: string; start?: number; end?: number };\n    const spans: Array<{ type: string; tokens: NerToken[] }> = [];\n    for (const t of tokens) {\n      const ent = t.entity ?? \"\";\n      if (!ent || ent === \"O\" || ent === \"0\") continue;\n      const type = ent.replace(/^[BILUE]-/, \"\").toUpperCase();\n      const last = spans[spans.length - 1];\n      if (last && last.type === type && !/^B-/i.test(ent)) last.tokens.push(t);\n      else spans.push({ type, tokens: [t] });\n    }\n\n    let out = text;\n    const extra: Record<string, number> = {};\n    const bump = (type: string, n = 1): void => {\n      const key = `pf_${type.toLowerCase()}`;\n      extra[key] = (extra[key] ?? 0) + n;\n    };\n\n    const haveOffsets =\n      spans.length > 0 &&\n      spans.every((s) =>\n        s.tokens.every((t) => t.start != null && t.end != null && t.end > t.start),\n      );\n\n    if (haveOffsets) {\n      // Precise: redact exactly the detected span — an identical name\n      // elsewhere in the text is left untouched. Right-to-left so each\n      // splice keeps the remaining offsets valid.\n      const ranges = spans\n        .map((s) => ({\n          type: s.type,\n          start: Math.min(...s.tokens.map((t) => t.start as number)),\n          end: Math.max(...s.tokens.map((t) => t.end as number)),\n        }))\n        .sort((a, b) => b.start - a.start);\n      for (const r of ranges) {\n        bump(r.type);\n        out = `${out.slice(0, r.start)}[REDACTED:${r.type}]${out.slice(r.end)}`;\n      }\n    } else {\n      // No offsets: reconstruct each entity's surface text and redact every\n      // WORD-BOUNDARY occurrence (Unicode \"not flanked by a letter/digit\").\n      // Trades precision for recall — an identical name elsewhere is also\n      // redacted — but word boundaries (NOT raw substring) keep \"Mark\" from\n      // mangling \"Marketing\". Longest surface first so \"Ada Lovelace\" is\n      // redacted before a standalone \"Ada\".\n      const surfaces = new Map<string, string>();\n      for (const s of spans) {\n        const surface = reconstructSurface(s.tokens.map((t) => t.word));\n        if (surface && !surfaces.has(surface)) surfaces.set(surface, s.type);\n      }\n      for (const [surface, type] of [...surfaces].sort((a, b) => b[0].length - a[0].length)) {\n        const re = new RegExp(\n          `(?<![\\\\p{L}\\\\p{N}])${escapeRegExp(surface)}(?![\\\\p{L}\\\\p{N}])`,\n          \"gu\",\n        );\n        let n = 0;\n        out = out.replace(re, () => {\n          n += 1;\n          return `[REDACTED:${type}]`;\n        });\n        if (n > 0) bump(type, n);\n      }\n    }\n\n    return {\n      text: out,\n      counts: {\n        secrets_found: 0,\n        emails_redacted: 0,\n        paths_redacted_absolute: 0,\n        ...extra,\n      },\n    };\n  };\n}\n","/**\n * On-device per-script content summaries.\n *\n * A tool command often runs script/bash FILES (`./deploy.sh`,\n * `scripts/migrate.py`, …). `command_redacted` tells the backend the file was\n * run but not what it DOES. This pass reads each referenced file locally,\n * compacts it to one factual sentence with the bundled model, and attaches the\n * (redacted) abstract to `ToolAction.scripts` as `{ token, summary }`.\n *\n * PRIVACY: on the default LOCAL path the raw command and the file CONTENTS never\n * leave the device — only the model's one-sentence abstract ships, and only after\n * `redact()` strips any secret/PII it might still contain. On the opt-in REMOTE\n * path (MODELSTAT_LLM_PROVIDER=openai) the script body IS sent to the endpoint to\n * be summarised, but only after the daemon's pre-send scrubber (regex floor +\n * on-device NER/PII) runs over it first — see `makeRemotePreSend` in pipeline.ts.\n * `token` is the script's token AS IT APPEARS\n * IN `command_redacted` (verified to be a substring), so the backend zips each\n * abstract to its place in the redacted command deterministically — no fuzzy\n * matching, no raw paths.\n *\n * Best-effort + additive: any failure (file missing, unreadable, model error)\n * just leaves that script out; the call still ships its redacted command. The\n * whole pass can be skipped (browser daemon, model unavailable) with no loss\n * beyond the abstracts.\n *\n * Generic by construction: detection is a pure structural signal (script-ish\n * extension / explicit path), resolution tries liberal candidate roots, and the\n * model describes whatever the file actually does — no tool/category vocabulary.\n */\n\nimport type { Redactor, ScriptSummarizer } from \"@modelstat/daemon-core/pipeline\";\nimport type { ToolCallDraft } from \"@modelstat/daemon-core/queue\";\nimport { redact, type ToolAction } from \"@modelstat/core\";\nimport { detectScriptRefs, type LocalToolContext, resolveScriptPath } from \"@modelstat/parsers\";\n\n/** Wire cap on `ToolAction.scripts` (z.array(...).max(8)). */\nconst MAX_SCRIPTS_PER_CALL = 8;\n/** Wire cap on `ToolAction.scripts[].summary` (z.string().max(200)). */\nconst MAX_SUMMARY_CHARS = 200;\n\nexport interface EnrichScriptsDeps {\n  /** Turns a script's `{ ref, content }` into a one-sentence abstract (or\n   * null). Best-effort — see `ScriptSummarizer`. */\n  summarize: ScriptSummarizer;\n  /** Existence probe — `fs.existsSync` in prod, a fake in tests. */\n  exists: (path: string) => boolean;\n  /** Read a resolved script's text. The caller is expected to cap bytes; an\n   * over-long body is also sliced inside the prompt builder. */\n  readFile: (path: string) => Promise<string>;\n  /** Candidate root dirs from a call's cwd. Defaults to {@link defaultRoots}. */\n  roots?: (cwd: string | null) => string[];\n  /** Optional model-based redactor (Privacy Filter + LLM backstop) run over a\n   * script summary AFTER the deterministic `redact()` pass — defense-in-depth on\n   * the model-generated sentence. Omitted ⇒ summaries get the regex floor only. */\n  modelRedact?: Redactor;\n}\n\n/**\n * Deep-redact each draft's `command_redacted` with the model passes (layers 2+3\n * behind {@link Redactor}). Layer 1 (the deterministic floor) already ran at\n * extraction; this adds the Privacy Filter + LLM backstop to the SHIPPED command\n * — the most sensitive field, previously regex-only. Deduped per distinct\n * command (many calls share one), best-effort (a failure keeps the layer-1\n * command), mutates the drafts in place. Run BEFORE script enrichment so script\n * tokens are matched against the final redacted command.\n */\nexport async function enrichToolCallRedaction(\n  drafts: readonly ToolCallDraft[],\n  redactModel: Redactor,\n): Promise<void> {\n  const cache = new Map<string, string>();\n  for (const draft of drafts) {\n    const action = draft.action;\n    const cmd = action?.command_redacted;\n    if (!action || !cmd) continue;\n    try {\n      let deep = cache.get(cmd);\n      if (deep === undefined) {\n        deep = (await redactModel(cmd)).text;\n        cache.set(cmd, deep);\n      }\n      action.command_redacted = deep;\n    } catch {\n      // best-effort: keep the layer-1 redacted command\n    }\n  }\n}\n\n/**\n * Liberal, generic candidate roots from a cwd: the dir itself, a few ancestors\n * (monorepo roots / `../` refs), and a handful of conventional script subdirs so\n * a BARE `deploy.sh` still resolves to `<cwd>/scripts/deploy.sh`. No\n * project-structure assumptions beyond \"scripts tend to live near cwd\". The\n * resolver tries these most-absolute / longest-first, so the most specific\n * existing file wins.\n */\nexport function defaultRoots(cwd: string | null): string[] {\n  if (!cwd) return [];\n  const seg = cwd.replace(/\\/+$/, \"\").split(\"/\");\n  const ancestors: string[] = [];\n  for (let i = seg.length; i >= Math.max(1, seg.length - 3); i--) {\n    ancestors.push(seg.slice(0, i).join(\"/\") || \"/\");\n  }\n  const subdirs = [\"scripts\", \"bin\", \"tools\", \"ci\", \".github/scripts\"];\n  const roots = [...ancestors];\n  for (const a of ancestors) for (const s of subdirs) roots.push(`${a}/${s}`);\n  return roots;\n}\n\n/**\n * Enrich each draft's `ToolAction.scripts` in place from the matching local\n * context (raw command + cwd). Mutates drafts; returns nothing. Never throws —\n * per-call failures are swallowed so enrichment can't sink an upload.\n */\nexport async function enrichToolCallScripts(\n  drafts: readonly ToolCallDraft[],\n  contexts: readonly LocalToolContext[],\n  deps: EnrichScriptsDeps,\n): Promise<void> {\n  if (contexts.length === 0) return;\n  const ctxById = new Map(contexts.map((c) => [c.external_call_id, c]));\n  for (const draft of drafts) {\n    if (!draft.action) continue;\n    const ctx = ctxById.get(draft.external_call_id);\n    if (!ctx) continue;\n    try {\n      await enrichOneAction(draft.action, ctx, deps);\n    } catch {\n      // Additive + best-effort: a single bad script never sinks the draft.\n    }\n  }\n}\n\n/** Fill one action's `scripts` from its raw command + cwd. */\nasync function enrichOneAction(\n  action: ToolAction,\n  ctx: LocalToolContext,\n  deps: EnrichScriptsDeps,\n): Promise<void> {\n  // No redacted command → nothing on the wire to anchor a token to.\n  const redactedCommand = action.command_redacted;\n  if (!redactedCommand) return;\n\n  const refs = detectScriptRefs(ctx.command);\n  if (refs.length === 0) return;\n\n  const roots = (deps.roots ?? defaultRoots)(ctx.cwd);\n  const seen = new Set<string>();\n  const out: Array<{ token: string; summary: string }> = [];\n\n  for (const ref of refs) {\n    if (out.length >= MAX_SCRIPTS_PER_CALL) break;\n\n    // The token must be EXACTLY a substring of command_redacted so the backend\n    // can zip it deterministically. Redact the ref the same way the command was\n    // redacted (same cwd), then require the result to actually appear in the\n    // redacted command. A ref whose path was masked to a `[REDACTED:…]`\n    // placeholder (out-of-repo absolute, secret-bearing) has no stable, unique\n    // token — skip it rather than ship an unlinkable / sensitive abstract.\n    const token = redact(ref, ctx.cwd ?? undefined).text.trim();\n    if (!token || token.startsWith(\"[REDACTED\") || seen.has(token)) continue;\n    if (!redactedCommand.includes(token)) continue;\n\n    // Resolve on disk (most-absolute / longest candidate first) + read.\n    const path = resolveScriptPath(ref, roots, deps.exists);\n    if (!path) continue;\n    let content: string;\n    try {\n      content = await deps.readFile(path);\n    } catch {\n      continue;\n    }\n    if (!content.trim()) continue;\n\n    const summaryRaw = await deps.summarize({ ref, content });\n    if (!summaryRaw) continue;\n    // Defence-in-depth: the model could echo a secret/PII from the file body.\n    // Regex floor first, then the optional model passes (PF + LLM), then cap.\n    let summaryText = redact(summaryRaw).text;\n    if (deps.modelRedact) {\n      try {\n        summaryText = (await deps.modelRedact(summaryText)).text;\n      } catch {\n        // best-effort: keep the regex-floor summary\n      }\n    }\n    const summary = summaryText.trim().slice(0, MAX_SUMMARY_CHARS);\n    if (!summary) continue;\n\n    seen.add(token);\n    out.push({ token, summary });\n  }\n\n  if (out.length > 0) action.scripts = out;\n}\n","/**\n * CLI-side pipeline binding — wires the summariser/embedder pair the\n * daemon runs and hands them to daemon-core.\n *\n * The summariser runtime follows the install-time MODE (state.summarizerMode;\n * see runtime-state.ts). Redaction — the regex floor plus the on-device NER/PII\n * pass — runs client-side in EVERY mode; only the summarisation LOCATION moves:\n *\n *   - `local`       — the bundled `node-llama-cpp` runtime. The daemon ships\n *     `node-llama-cpp` and stages this platform's prebuilt binary beside the\n *     bundle at install time (service.ts `installNativeRuntime`); a ~2.7 GB\n *     Qwen3.5-4B GGUF lazy-downloads to `~/.modelstat/models/`. This is the\n *     ONLY mode that touches the local model.\n *   - `self-hosted` — summarise via an org-run OpenAI-compatible endpoint (its\n *     URL + model chosen at install; see `remoteAdapters`). EXPLICIT egress:\n *     prompt content is NER/PII-scrubbed on-device before it leaves the box.\n *   - `cloud`       — no local summariser at all. The scan loop ships redacted\n *     turns to /v1/ingest/raw and modelstat's cloud summarises server-side\n *     (see scan.ts). `getAdapters()` is only reached here as the NER-down\n *     fallback, which degrades to local extractive abstracts (no egress).\n *\n * A degraded extractive fallback keeps ingest alive whenever the selected\n * runtime can't run (bundled binary won't load, self-hosted endpoint\n * misconfigured, NER redactor unavailable): the dependency-free heuristic\n * summariser ships real, if plainer, abstracts rather than blocking. Because\n * summarisation is core product output the degradation is LOUD (a one-time\n * startup warning), never a silent no-op.\n *\n * The adapters are built once and cached for the life of the process.\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile as fsReadFile } from \"node:fs/promises\";\nimport type { RawEvent, Segment, SessionMetadata } from \"@modelstat/core\";\nimport { redact as redactFloor } from \"@modelstat/core/redact\";\nimport {\n  createTransformersJsEmbedder,\n  defaultLlamaConfig,\n  llamaCognize,\n  llamaEntitle,\n  llamaExtractLinks,\n  llamaRedact,\n  llamaScriptSummarize,\n  llamaSummarize,\n  makeOpenAICompatConfig,\n  type OpenAICompatConfig,\n  openaiCognize,\n  openaiEntitle,\n  openaiExtractLinks,\n  openaiScriptSummarize,\n  openaiSummarize,\n} from \"@modelstat/daemon-core/node\";\nimport {\n  buildSegmentsForSession,\n  buildSessionMetadata as buildSessionMetadataCore,\n  buildSessionTitles as buildSessionTitlesCore,\n  composeRedactors,\n  heuristicSummarize,\n  type PipelineAdapters,\n  type Redactor,\n  type ScriptSummarizer,\n  type SegmentProgressFn,\n  type Summarizer,\n} from \"@modelstat/daemon-core/pipeline\";\nimport type { ToolCallDraft } from \"@modelstat/daemon-core/queue\";\nimport { createPrivacyFilterRedactor } from \"@modelstat/daemon-core/redact/privacy-filter\";\nimport {\n  checkPullRequestOutcome,\n  collectFilesChanged,\n  type LocalToolContext,\n  resolveGitContext,\n} from \"@modelstat/parsers\";\nimport { state } from \"./config.js\";\nimport { enrichToolCallRedaction, enrichToolCallScripts } from \"./enrich-scripts.js\";\nimport { runtimeState } from \"./runtime-state.js\";\n\nlet adapters: PipelineAdapters | null = null;\n\n// The local 384-dim BGE-small embedder + the Qwen-family tokenizer\n// heuristic are identical across every adapter set (bundled, remote,\n// degraded) — embeddings ALWAYS stay on-device regardless of summariser\n// provider. The embedder factory returns a closure that does its real\n// (async, cached) work on first call, so constructing it once here is\n// free until the first segment.\nconst localEmbed = createTransformersJsEmbedder();\nconst tokenize = (text: string): number => Math.max(1, Math.ceil(text.length / 4));\n\n// ── Always-works summariser ────────────────────────────────────────────────\n// The bundled Qwen LLM is the quality path, but it must NEVER block ingest. If\n// it can't run on this machine (native runtime missing, model not downloaded,\n// no network, incompatible binary, or even CPU load failing after the Metal\n// guard), we degrade to the dependency-free extractive fallback so the daemon\n// keeps shipping real abstracts instead of refusing to start.\n\nlet degradedThisProcess = false;\n// After a CATCHABLE llm failure, skip the LLM for this long before retrying, so\n// a persistent failure doesn't re-attempt on every single segment. The window\n// is provider-aware: the LOCAL path guards against re-downloading the 2.7 GB\n// GGUF on every miss, so it waits 10 min; the REMOTE path's failures are\n// transient HTTP blips that resolve in seconds (and chatComplete already\n// retried with backoff), so a long blackout would needlessly degrade a whole\n// scan — it waits 1 min.\nconst LLM_RETRY_COOLDOWN_LOCAL_MS = 10 * 60_000;\nconst LLM_RETRY_COOLDOWN_REMOTE_MS = 60_000;\nlet llmRetryAfter = 0;\n\n/** True if this process has fallen back to the extractive summariser at least\n * once — read by daemon.ts for the degraded status line + self-heal. */\nexport function summariserDegradedThisProcess(): boolean {\n  return degradedThisProcess;\n}\n\nfunction markDegraded(reason: string, notice?: string): void {\n  if (!degradedThisProcess) {\n    degradedThisProcess = true;\n    // biome-ignore lint/suspicious/noConsole: loud, one-time degradation notice\n    console.warn(\n      notice ??\n        `[modelstat] ⚠ summariser DEGRADED — LLM unavailable (${reason}); shipping ` +\n          \"extractive fallback abstracts so ingest continues. They re-summarise at model \" +\n          \"quality automatically once the LLM is healthy again.\",\n    );\n  }\n  // Persist so the NEXT start can self-heal (re-scan to upgrade these abstracts).\n  runtimeState.setSummariserDegraded(true);\n}\n\n/**\n * The daemon's summariser: the provided LLM (bundled Qwen or remote) when it\n * works, the dependency-free extractive fallback when it can't. Per-call fallback on a\n * catchable LLM failure, debounced so a persistent failure doesn't hammer the\n * LLM (or its model download). An UNCATCHABLE native abort (e.g. the Metal\n * GGML_ASSERT) is handled one layer down by the CPU-fallback guard in\n * daemon-core/node/llama.ts. Never throws, never empty — ingest always proceeds.\n */\nfunction resilientSummarize(llm: Summarizer, cooldownMs: number): Summarizer {\n  const heuristic = heuristicSummarize();\n  return async (input) => {\n    if (Date.now() >= llmRetryAfter) {\n      try {\n        const out = await llm(input);\n        if (out && out.trim().length > 0) return out;\n        // Empty LLM output — treat as a transient miss; use the fallback for\n        // this one call without entering cooldown (the model is loaded/fine).\n      } catch (err) {\n        llmRetryAfter = Date.now() + cooldownMs;\n        markDegraded((err as Error).message);\n      }\n    } else {\n      markDegraded(\"LLM in post-failure cooldown\");\n    }\n    return heuristic(input);\n  };\n}\n\n/** Builds the single set of pipeline adapters: a transformers.js\n * embedder, the bundled Qwen3.5-4B summariser + cognizer, a local\n * tokenizer heuristic, and the model-based PII redactor. Only the\n * SUMMARISER is mandatory — the others degrade gracefully (the redactor\n * falls back to the regex pass, cognition is best-effort).\n *\n * Cognition pass — best-effort. Uses the SAME bundled Qwen3.5-4B\n * model as the summariser via a second LlamaChatSession (separate\n * context sequence with `COGNITION_SYSTEM_PROMPT`). Adds ~200-500ms\n * per segment on Apple Silicon and a few tens of MB of KV-cache RAM\n * for the second context. The pipeline catches any failure and ships\n * the segment without the `[Mood: …] [Mind: …]` suffix, so wiring it\n * here is purely additive. */\nasync function bundledAdapters(): Promise<PipelineAdapters> {\n  const llamaCfg = defaultLlamaConfig();\n  return {\n    // transformers.js BGE-small embedder — the wire embedding is\n    // 384-dim (BGE-small), so segment vectors are directly comparable\n    // across runtimes via cosine similarity. (This path used to ship\n    // vector-less with empty arrays; hooking embeddings here attaches a\n    // real abstract embedding to each segment.)\n    embed: localEmbed,\n    summarize: resilientSummarize(llamaSummarize(llamaCfg), LLM_RETRY_COOLDOWN_LOCAL_MS),\n    tokenize,\n    cognize: llamaCognize(llamaCfg),\n    // Session-title pass — same bundled model, third chat session with\n    // TITLER_SYSTEM_PROMPT. One short call per session per upload (the\n    // sessions-list title in the dashboard). Best-effort like cognize:\n    // failures fall back to a deterministic title in buildSessionTitles.\n    entitle: llamaEntitle(llamaCfg),\n    // Link-extraction pass — same bundled model, fifth chat session with\n    // LINK_EXTRACT_SYSTEM_PROMPT. One short call per session that surfaces\n    // PR/issue/commit references from the redacted abstracts, so detection\n    // works even for clients whose logs carry no git data. Best-effort:\n    // failures fall back to the deterministic git + content channels in\n    // buildSessionMetadata.\n    extractLinks: llamaExtractLinks(llamaCfg),\n    // Model-based PII redactor (OpenAI Privacy Filter via\n    // transformers.js / ONNX). Runs locally on CPU after the regex\n    // pass in packages/core/redact.ts. ~1 GB model downloaded on\n    // first run; subsequent runs reuse the cached weights. The\n    // factory is async because it dynamic-imports\n    // @huggingface/transformers — if the optional peer dep isn't\n    // installed it returns a pass-through redactor (regex pass is\n    // still the last line of defence).\n    // Defense-in-depth redaction, layers 2+3, stacked behind one adapter and\n    // applied to BOTH the abstract (in daemon-core) and `command_redacted` (in\n    // enrichRedaction below): the OpenAI Privacy Filter (NER/PII) then the\n    // local-LLM backstop for secrets the fixed patterns miss. Layer 1 (the\n    // deterministic regex floor in @modelstat/core/redact) already ran first.\n    redact: composeRedactors(await createPrivacyFilterRedactor(), llamaRedact(llamaCfg)),\n  };\n}\n\ntype ResolvedProvider =\n  | { readonly kind: \"local\" }\n  | { readonly kind: \"openai\"; readonly cfg: OpenAICompatConfig }\n  | { readonly kind: \"cloud\" }\n  | { readonly kind: \"misconfigured\"; readonly reason: string };\n\nlet resolvedProvider: ResolvedProvider | null = null;\n\n/** Resolve, ONCE, which summariser runtime the install-time mode selects —\n * never throwing. Self-hosted with an incomplete endpoint config resolves to\n * `misconfigured` (carrying the operator-facing reason) so the daemon degrades\n * to the extractive fallback with a loud notice instead of crashing mid-scan.\n * The result is cached: the mode is immutable for the process lifetime (a\n * `modelstat mode` change bounces the service), and every call site shares one\n * snapshot so e.g. the script summariser can't drift to a different endpoint. */\nfunction resolveProvider(): ResolvedProvider {\n  if (resolvedProvider) return resolvedProvider;\n  const mode = state.summarizerMode;\n  if (mode === \"local\") {\n    resolvedProvider = { kind: \"local\" };\n  } else if (mode === \"cloud\") {\n    resolvedProvider = { kind: \"cloud\" };\n  } else {\n    // self-hosted — summarise via the org's OpenAI-compatible endpoint\n    // (URL + model chosen at install, or overridden by MODELSTAT_LLM_* env).\n    try {\n      const { url, model } = state.selfHosted;\n      resolvedProvider = {\n        kind: \"openai\",\n        cfg: makeOpenAICompatConfig(url, model, \"self-hosted summariser URL\"),\n      };\n    } catch (err) {\n      resolvedProvider = { kind: \"misconfigured\", reason: (err as Error).message };\n    }\n  }\n  return resolvedProvider;\n}\n\n/** Test-only: drop the cached provider so the next resolveProvider() re-reads\n * the mode. The daemon never needs this (a mode change bounces the process). */\nexport function _resetProviderForTests(): void {\n  resolvedProvider = null;\n  adapters = null;\n  cloudRedactor = null;\n}\n\n/** Build the remote-egress scrubber: the deterministic regex floor\n * (always) followed by the on-device NER/PII pass (best-effort), applied\n * to every raw prompt body — sampled conversation excerpts AND script\n * file contents — BEFORE it is POSTed to the remote endpoint. This is the\n * half of redaction the local path gets for free: there raw text feeds an\n * on-device model so only the OUTPUT abstract needs scrubbing; here the\n * INPUT leaves the box, so it must be scrubbed first too. The same\n * `nerRedact` instance backs the output `redact` adapter — one model,\n * both directions. */\nfunction makeRemotePreSend(nerRedact: Redactor): (text: string) => Promise<string> {\n  return async (text: string): Promise<string> => {\n    const floored = redactFloor(text).text;\n    try {\n      return (await nerRedact(floored)).text;\n    } catch {\n      // NER is best-effort; the regex floor already ran, so ship that.\n      return floored;\n    }\n  };\n}\n\n/** Loud, one-time notice that summarisation now leaves the machine: the\n * summariser prompt (sampled, regex-floor-redacted excerpts) and script\n * bodies are sent to the remote endpoint, while embeddings + the\n * Privacy-Filter PII pass stay on-device. Surfaced at startup so it is\n * never silent — this product's promise is that raw content stays local. */\nfunction warnRemoteEgress(cfg: OpenAICompatConfig): void {\n  // biome-ignore lint/suspicious/noConsole: one-time egress notice\n  console.warn(\n    `[modelstat] ⚠ self-hosted summariser ENABLED — session excerpts + script bodies are sent to ${cfg.baseUrl} (model ${cfg.model}). ` +\n      \"Embeddings + on-device PII redaction stay local. Run `modelstat mode local` for the bundled on-device model.\",\n  );\n}\n\n/** Probe the on-device NER redactor with a sentinel PERSON entity to prove\n * it actually runs. `createPrivacyFilterRedactor` degrades to a SILENT\n * pass-through when its `@huggingface/transformers` peer dep is missing —\n * which on the remote path would let names/orgs the regex floor can't catch\n * leave the box unredacted. The sentinel name is not a regex-floor target,\n * so a redacted result proves the NER model is live. */\nasync function nerRedactorActive(nerRedact: Redactor): Promise<boolean> {\n  const sentinel = \"Escalate the incident to Katherine Johnson at Globex Corporation.\";\n  try {\n    const out = (await nerRedact(sentinel)).text;\n    return !out.includes(\"Katherine Johnson\");\n  } catch {\n    return false;\n  }\n}\n\n/** Remote OpenAI-compatible adapter set. Chat passes go to the endpoint;\n * the embedder stays local (preserving the 384-dim wire vector) and the\n * redactor is the local Privacy Filter ONLY — no remote redaction\n * backstop, since asking a third party to scrub a likely-secret string\n * would exfiltrate the very secret. Takes the already-built (and\n * NER-verified) Privacy Filter so the egress scrubber and the output\n * redactor share one proven-live instance. */\nfunction remoteAdapters(cfg: OpenAICompatConfig, privacyFilter: Redactor): PipelineAdapters {\n  // One Privacy-Filter instance backs BOTH the pre-send egress scrubber\n  // (excerpts + script bodies, on the way out) and the output `redact`\n  // adapter (the returned abstract). cognize/entitle/extractLinks run over\n  // already-redacted abstracts, so they need no pre-send pass.\n  const preSend = makeRemotePreSend(privacyFilter);\n  return {\n    embed: localEmbed,\n    summarize: resilientSummarize(openaiSummarize(cfg, preSend), LLM_RETRY_COOLDOWN_REMOTE_MS),\n    tokenize,\n    cognize: openaiCognize(cfg),\n    entitle: openaiEntitle(cfg),\n    extractLinks: openaiExtractLinks(cfg),\n    redact: privacyFilter,\n  };\n}\n\n/** Extractive-only adapter set: NO LLM at all (heuristic summariser +\n * local embedder + local PII redactor). Used when the remote provider is\n * misconfigured — keep ingest alive on the dependency-free fallback rather\n * than crash, and WITHOUT silently spinning up the 2.7 GB local model the\n * operator explicitly opted out of by choosing the remote provider. */\nasync function degradedAdapters(): Promise<PipelineAdapters> {\n  return {\n    embed: localEmbed,\n    summarize: heuristicSummarize(),\n    tokenize,\n    redact: await createPrivacyFilterRedactor(),\n  };\n}\n\nasync function getAdapters(): Promise<PipelineAdapters> {\n  if (adapters) return adapters;\n  const provider = resolveProvider();\n  // Misconfigured remote provider (bad MODELSTAT_LLM_PROVIDER, or missing\n  // base-url/model): never crash a scan over a config typo. Surface it loudly\n  // with the fix, then ship extractive abstracts until the operator corrects\n  // the env and restarts.\n  if (provider.kind === \"misconfigured\") {\n    markDegraded(\n      provider.reason,\n      `[modelstat] ⚠ self-hosted summariser MISCONFIGURED (${provider.reason}) — shipping ` +\n        \"extractive fallback abstracts so ingest continues. Fix the endpoint with \" +\n        \"`modelstat mode self-hosted --url <URL> --model <ID>` and restart.\",\n    );\n    adapters = await degradedAdapters();\n    return adapters;\n  }\n  // Cloud mode: modelstat's cloud summarises server-side from the redacted\n  // turns the scan loop ships to /v1/ingest/raw, so there is NO local summariser\n  // to build. We only reach here as scan.ts's NER-down fallback — degrade to the\n  // extractive set (local, no egress, no model) so ingest still ships abstracts.\n  if (provider.kind === \"cloud\") {\n    adapters = await degradedAdapters();\n    return adapters;\n  }\n  // Self-hosted: summarise via an org-run OpenAI-compatible endpoint (for orgs\n  // that want the model off modelstat's cloud but off the user's machine too).\n  // Explicit egress — warn loudly, then build the remote set (embeddings + PII\n  // redaction stay local).\n  if (provider.kind === \"openai\") {\n    // FAIL-CLOSED on the egress guard. The remote path's privacy promise is\n    // that raw excerpts/script bodies are NER/PII-scrubbed on-device before\n    // they leave the box. If that NER redactor is a silent pass-through\n    // (its optional dep is missing), we must NOT ship raw content to a third\n    // party with only the regex floor — so we refuse the remote path and\n    // degrade to the extractive fallback (local, no egress) instead.\n    const privacyFilter = await createPrivacyFilterRedactor();\n    if (!(await nerRedactorActive(privacyFilter))) {\n      markDegraded(\n        \"remote NER redactor unavailable\",\n        \"[modelstat] ⚠ remote summariser DISABLED — the on-device NER/PII redactor \" +\n          \"(@huggingface/transformers) isn't available, so session excerpts + script bodies \" +\n          \"can't be scrubbed before leaving the machine. Shipping extractive fallback abstracts \" +\n          \"(no egress) instead. Install @huggingface/transformers to enable the remote model.\",\n      );\n      adapters = await degradedAdapters();\n      return adapters;\n    }\n    warnRemoteEgress(provider.cfg);\n    adapters = remoteAdapters(provider.cfg, privacyFilter);\n    return adapters;\n  }\n  // The bundled node-llama-cpp summariser is the quality path, staged beside the\n  // bundle at install time (apps/daemon/src/service.ts `installNativeRuntime`).\n  // It must never BLOCK ingest, though: if the native binding can't load we\n  // degrade to the dependency-free extractive fallback (resilientSummarize; the\n  // auxiliary llama passes already no-op) rather than refusing to start and\n  // leaving the user with zero data. Probe the import for an honest one-line\n  // startup log — but do NOT throw on failure.\n  let llmReady = true;\n  try {\n    await import(\"node-llama-cpp\");\n  } catch {\n    llmReady = false;\n  }\n  // biome-ignore lint/suspicious/noConsole: one-line startup status\n  console.log(\n    llmReady\n      ? \"[modelstat] using bundled local summariser (Qwen3.5-4B, runs on this machine)\"\n      : \"[modelstat] bundled summariser runtime not loadable — using extractive fallback (degraded) until it is\",\n  );\n  adapters = await bundledAdapters();\n  return adapters;\n}\n\n// ── Cloud mode: redact turns on-device, summarise server-side ────────────────\n// Cloud mode ships cleaned turns (not a local abstract) to /v1/ingest/raw, so\n// the on-device NER/PII pass has to run over the EXCERPTS themselves — the\n// parser already floor-redacted them, but the NER pass is what the normal path\n// applies only to the derived abstract. Built + probed once; the sentinel proof\n// (nerRedactorActive) makes the fail-closed decision below honest.\nlet cloudRedactor: { redact: Redactor; nerActive: boolean } | null = null;\n\nasync function cloudRawRedactor(): Promise<{ redact: Redactor; nerActive: boolean }> {\n  if (cloudRedactor) return cloudRedactor;\n  const redact = await createPrivacyFilterRedactor();\n  cloudRedactor = { redact, nerActive: await nerRedactorActive(redact) };\n  return cloudRedactor;\n}\n\n/**\n * Prepare a Cloud-mode raw batch: run the FULL redaction pipeline over every\n * event excerpt and tool-call command before they leave the machine. The regex\n * floor already ran in the parser; this adds the on-device NER/PII pass, so the\n * turns modelstat's cloud summarises are secrets- AND names/orgs-scrubbed.\n *\n * FAIL-CLOSED: returns `null` when the on-device NER redactor is unavailable\n * (its `@huggingface/transformers` peer dep is missing / a silent pass-through).\n * The caller then degrades to LOCAL extractive abstracts — NO raw egress —\n * rather than shipping floor-only-redacted turns off the box. Mutates `drafts`\n * in place (their `command_redacted` gets the NER pass) and returns the redacted\n * events; the tool-call floor already ran in the parser too.\n *\n * NOTE: the daemon's parsers cap `content_excerpt` at 320 chars, so Cloud ships\n * the same per-turn excerpts the local model would summarise — not literally\n * untruncated turns like the raw SDK. Widening that is a parser change (a\n * follow-up), not part of this client wiring.\n */\nexport async function prepareCloudRawEvents(\n  events: RawEvent[],\n  drafts: readonly ToolCallDraft[],\n): Promise<RawEvent[] | null> {\n  const { redact, nerActive } = await cloudRawRedactor();\n  if (!nerActive) return null; // fail-closed — caller keeps data local\n  const redacted = await Promise.all(\n    events.map(async (e) => {\n      if (!e.content_excerpt) return e;\n      const floored = redactFloor(e.content_excerpt).text;\n      const scrubbed = (await redact(floored)).text;\n      return scrubbed === e.content_excerpt ? e : { ...e, content_excerpt: scrubbed };\n    }),\n  );\n  // Tool-call commands leave the box too — give command_redacted the same NER\n  // pass (its floor already ran in the parser). No LLM script summaries here.\n  if (drafts.length) await enrichToolCallRedaction(drafts, redact);\n  return redacted;\n}\n\nexport async function buildSegments(\n  events: RawEvent[],\n  onProgress?: SegmentProgressFn,\n): Promise<Segment[]> {\n  return buildSegmentsForSession(events, await getAdapters(), onProgress);\n}\n\n/**\n * One title per session from the given segments — the sessions-list\n * line in the dashboard. Runs the local titler (same bundled model,\n * see `entitle` above); deterministic fallback inside daemon-core\n * means this never throws for healthy segments.\n */\nexport async function buildSessionTitles(segments: Segment[]): Promise<Record<string, string>> {\n  const a = await getAdapters();\n  return buildSessionTitlesCore(segments, a.entitle);\n}\n\n/**\n * Per-session repo/PR/commit/issue metadata for the given segments + events\n * — the join layer between AI spend and shipped work. Fuses git context\n * (resolved on disk via the parsers' `resolveGitContext`, which is cwd-cached\n * for the process), deterministic scanning of the redacted abstracts, and the\n * bundled link-extraction model (see `extractLinks` above). Best-effort\n * throughout: any channel can no-op without blocking the upload.\n */\nexport async function buildSessionMetadata(\n  segments: Segment[],\n  events: RawEvent[],\n): Promise<Record<string, SessionMetadata>> {\n  const a = await getAdapters();\n  return buildSessionMetadataCore(segments, events, {\n    resolveGit: resolveGitContext,\n    extractLinks: a.extractLinks,\n    checkPrOutcome: checkPullRequestOutcome,\n    collectFilesChanged,\n  });\n}\n\n/** Max bytes read from any one script before summarising. Scripts are small;\n * this bounds memory + model input (the prompt builder slices further). */\nconst MAX_SCRIPT_READ_BYTES = 64 * 1024;\n\nlet scriptSummarizer: ScriptSummarizer | null = null;\n\n/** The per-script content summariser for the active provider. Remote when\n * MODELSTAT_LLM_PROVIDER=openai — script bodies leave the box, so they go\n * through the same pre-send NER/PII scrubber as the summariser excerpts\n * (`modelRedact` is the local Privacy Filter from the cached adapter set).\n * Bundled on-device model otherwise. Misconfigured → a no-op summariser so\n * we neither call out nor spin up the opted-out local model. */\nfunction buildScriptSummarizer(modelRedact: Redactor | undefined): ScriptSummarizer {\n  const provider = resolveProvider();\n  // Cloud summarises server-side and misconfigured has no runtime — neither\n  // should spin up the opted-out local model, so both no-op.\n  if (provider.kind === \"misconfigured\" || provider.kind === \"cloud\") return async () => null;\n  if (provider.kind === \"openai\") {\n    const preSend = modelRedact ? makeRemotePreSend(modelRedact) : undefined;\n    return openaiScriptSummarize(provider.cfg, preSend);\n  }\n  return llamaScriptSummarize(defaultLlamaConfig());\n}\n\n/**\n * Fill each draft's `ToolAction.scripts` with on-device, redacted per-script\n * content abstracts. Runs the bundled model (fourth chat session)\n * over the script/bash FILES a command referenced, reading them locally; only\n * the redacted one-sentence abstracts ship.\n *\n * Best-effort + additive: gated on the native runtime being loadable (same as\n * summarisation, via `getAdapters`); individual script failures are swallowed\n * inside `enrichToolCallScripts`. Mutates the drafts in place. No-op when there\n * are no shell contexts (e.g. an MCP-only file).\n */\nexport async function enrichScripts(\n  drafts: readonly ToolCallDraft[],\n  contexts: readonly LocalToolContext[] = [],\n): Promise<void> {\n  if (drafts.length === 0) return;\n  // Gate on the native runtime being loadable — same requirement as the\n  // summariser. (getAdapters is cached; usually already warm by this point.)\n  const built = await getAdapters();\n  // Defense-in-depth over `command_redacted` for EVERY draft (not just ones that\n  // ran a script): layers 2+3 (Privacy Filter + LLM backstop) on top of the\n  // layer-1 floor that already ran at extraction.\n  if (built.redact) await enrichToolCallRedaction(drafts, built.redact);\n  // Per-script content summaries only apply when a command ran a script FILE.\n  if (contexts.length === 0) return;\n  if (!scriptSummarizer) scriptSummarizer = buildScriptSummarizer(built.redact);\n  await enrichToolCallScripts(drafts, contexts, {\n    summarize: scriptSummarizer,\n    exists: existsSync,\n    readFile: async (path) => {\n      const buf = await fsReadFile(path);\n      return buf.subarray(0, MAX_SCRIPT_READ_BYTES).toString(\"utf8\");\n    },\n    modelRedact: built.redact,\n  });\n}\n\n/**\n * Preflight check — exercise the summariser end-to-end at daemon\n * startup so its state (real LLM vs degraded extractive fallback)\n * surfaces NOW, in the startup log, instead of being inferred later\n * from abstract quality.\n *\n * Returns the active summariser's label and whether it's running\n * DEGRADED (the LLM couldn't load, extractive fallback in use). Never\n * throws — the fallback is deterministic, so ingest always proceeds.\n * Called from `modelstat start` / `scan` boot.\n */\nexport async function preflightSummariser(): Promise<{ label: string; degraded: boolean }> {\n  // Cloud mode has no local summariser to exercise — modelstat's cloud\n  // summarises the redacted turns server-side. Report it plainly; a missing\n  // local model can't \"degrade\" ingest here. (If the on-device NER redactor is\n  // unavailable at scan time, scan.ts falls back to local extractive abstracts\n  // and marks degraded there — the honest place to detect it.)\n  if (resolveProvider().kind === \"cloud\") {\n    return { label: \"cloud — modelstat summarises server-side (no local model)\", degraded: false };\n  }\n  const a = await getAdapters();\n  const out = await a.summarize({\n    prompt:\n      'Session context: smoke test. Sampled excerpts:\\n  [turn 1] \"hello world\"\\nWrite ONE sentence (≤240 chars) describing what the human was doing.',\n    maxTokens: 32,\n    excerpts: [\"smoke test — verifying the summariser is alive\"],\n    facts: \"preflight smoke test\",\n  });\n  const degraded = summariserDegradedThisProcess();\n  // The fallback is deterministic + never empty, so empty output means even it\n  // failed — degrade rather than throw (ingest availability wins).\n  if (!out || out.trim().length === 0) {\n    return { label: \"summariser produced no output\", degraded: true };\n  }\n  const sample = out.length > 60 ? `${out.slice(0, 57)}…` : out;\n  const provider = resolveProvider();\n  const engine = degraded\n    ? \"extractive fallback (LLM unavailable)\"\n    : provider.kind === \"openai\"\n      ? `remote ${provider.cfg.model}`\n      : \"Qwen3.5-4B\";\n  return { label: `${engine} — \"${sample}\"`, degraded };\n}\n","/**\n * Local loopback ingest receiver — the server half of the SDKs'\n * `local_daemon` transport mode (sdks/{node,python,rust}; their\n * `DEFAULT_DAEMON_URL` is `http://127.0.0.1:4319/v1/ingest`).\n *\n * An SDK in `local_daemon` mode POSTs an `IngestBatch` of its own LLM-call\n * captures to loopback. The daemon owns the rest of the contract:\n *\n *   1. durable retry — events land in a {@link FileQueueStore} and survive a\n *      restart / offline window (the SDK is fire-and-forget; see the SDK's\n *      transport.ts: \"the local daemon owns durable retry\");\n *   2. on-device summarisation — the drain runs the SAME pipeline the file\n *      scan uses (redact → segment → summarise → tag), so only the daemon's\n *      redacted segment abstracts leave the machine (the raw per-turn excerpt\n *      is stripped before upload — see {@link drainLocalQueue});\n *   3. authenticated upload — under THIS device's secret, so the SDK ships\n *      zero credentials.\n *\n * Trust is loopback: the server binds `127.0.0.1` only and accepts any local\n * POST (same-user threat model). No request signing, no token — the daemon,\n * not the SDK, holds the device identity.\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { homedir } from \"node:os\";\nimport { resolve, sep } from \"node:path\";\nimport type { RawEvent } from \"@modelstat/core\";\nimport { createLogger } from \"@modelstat/daemon-core/logger\";\nimport { FileQueueStore } from \"@modelstat/daemon-core/node\";\nimport {\n  buildBatches,\n  type PipelineRunner,\n  type ToolCallDraft,\n} from \"@modelstat/daemon-core/queue\";\nimport { uploadBatch } from \"./api.js\";\nimport { homePath } from \"./paths.js\";\nimport { buildSegments } from \"./pipeline.js\";\n\nconst logger = createLogger(\"daemon.local-ingest\");\n\n/** Default loopback port — must match the SDKs' `DEFAULT_DAEMON_URL`. */\nexport const DEFAULT_LOCAL_INGEST_PORT = 4319;\n/** Cap on one POST body. SDK batches are small (≤256 events per flush);\n * this is a generous abuse guard, not a tuning knob. */\nconst MAX_BODY_BYTES = 16 * 1024 * 1024;\n\n/** What `POST /v1/control/scan` asks the daemon to force-scan. `file` is one\n * explicit transcript path; `session_ids` a compaction chain; neither = the\n * newest transcript. `wait` makes the response block until the scan + insight\n * refresh finish (used by `modelstat sync --session --wait`). */\nexport interface ControlScanRequest {\n  session_ids?: string[];\n  file?: string;\n  wait?: boolean;\n}\n\n/** The daemon-supplied force-scan worker, injected so receiver.ts has no\n * import cycle back to scan.ts / daemon.ts. Resolves when the scan (and the\n * subsequent server insight refresh) have completed. */\nexport type ControlScanHandler = (target: {\n  sessionIds?: string[];\n  file?: string;\n}) => Promise<void>;\n\n/** Roots an explicit `file` target is allowed to live under — the same\n * transcript directories the scanner discovers. Anything else is rejected so a\n * local POST can't make the daemon parse (and ship summaries of) an arbitrary\n * file on disk. */\nfunction transcriptRoots(): string[] {\n  const home = homedir();\n  return [resolve(home, \".claude/projects\"), resolve(home, \".codex/sessions\")];\n}\n\n/** True when `file` resolves to a path strictly inside one of the transcript\n * roots (defeats `..` traversal — we compare resolved, separator-bounded\n * prefixes). */\nexport function isAllowedTranscriptFile(file: string): boolean {\n  const target = resolve(file);\n  return transcriptRoots().some(\n    (root) => target === root || target.startsWith(root + sep),\n  );\n}\n\nlet store: FileQueueStore | null = null;\nfunction queue(): FileQueueStore {\n  // A snapshot file distinct from the file-scan path's store, so\n  // SDK-sourced and file-scanned events never share an on-disk document.\n  if (!store) store = new FileQueueStore(homePath(\"sdk-ingest-queue.json\"));\n  return store;\n}\n\nconst pipeline: PipelineRunner = { run: (events) => buildSegments(events) };\n\ninterface WireBatch {\n  events: RawEvent[];\n  // The SDK wire carries ToolCallWire (which has `segment_id`); we strip it\n  // and re-attribute from the daemon's own segments at batch-build.\n  toolCalls: Array<ToolCallDraft & { source_event_id: string; segment_id?: string | null }>;\n}\n\n/** Minimal structural validation. The authoritative validator is the backend\n * (Rust serde — which the uploader's `400 = drop` retry matrix already\n * handles, and which is leniently optional on the nullable fields the SDK\n * omits, unlike the strict `@modelstat/core` zod schema). Here we check only\n * the fields needed to build {@link QueueItem}s and pass the rest through. */\nfunction parseBatch(json: unknown): WireBatch | { error: string } {\n  if (typeof json !== \"object\" || json === null) return { error: \"body must be a JSON object\" };\n  const b = json as Record<string, unknown>;\n  if (!Array.isArray(b.events) || b.events.length === 0)\n    return { error: \"events must be a non-empty array\" };\n  if (b.events.length > 10_000) return { error: \"too many events (max 10000)\" };\n  for (const e of b.events) {\n    if (typeof e !== \"object\" || e === null) return { error: \"each event must be an object\" };\n    const ev = e as Record<string, unknown>;\n    for (const k of [\"source_event_id\", \"session_id\", \"agent\", \"ts\"] as const) {\n      if (typeof ev[k] !== \"string\" || (ev[k] as string).length === 0)\n        return { error: `event.${k} is required` };\n    }\n  }\n  const toolCalls = Array.isArray(b.tool_calls) ? (b.tool_calls as WireBatch[\"toolCalls\"]) : [];\n  return { events: b.events as RawEvent[], toolCalls };\n}\n\n/** Enqueue one batch's events. Idempotent: {@link FileQueueStore} dedupes by\n * `source_event_id`, so a retried POST (the SDK retries once) is a no-op. */\nasync function enqueue(batch: WireBatch): Promise<number> {\n  const q = queue();\n  for (const event of batch.events) {\n    const calls: ToolCallDraft[] = batch.toolCalls\n      .filter((tc) => tc.source_event_id === event.source_event_id)\n      // Drop any `segment_id` the SDK sent — it's (re)attributed at\n      // batch-build from the daemon's own segments. `put` enqueues a draft.\n      .map(({ segment_id: _segmentId, ...draft }) => draft as ToolCallDraft);\n    await q.put({\n      source_event_id: event.source_event_id,\n      session_id: event.session_id,\n      agent: event.agent,\n      event,\n      last_event_ts_ms: Date.parse(event.ts) || Date.now(),\n      synced: false,\n      sent_batch_id: null,\n      tool_calls: calls.length > 0 ? calls : undefined,\n    });\n  }\n  return batch.events.length;\n}\n\nlet draining = false;\n/**\n * One drain pass: build batches from the durable queue (per-session\n * debounce + on-device summariser, via {@link buildBatches}), strip the raw\n * per-turn excerpt so only redacted segment abstracts leave the machine,\n * upload under the device secret, then mark the shipped events sent.\n *\n * Coalesced — never overlaps itself; the bundled summariser also serialises\n * its own calls, so this runs safely alongside the file-scan path. On upload\n * failure the events stay durably queued and the next tick retries.\n */\nexport async function drainLocalQueue(opts: {\n  deviceId: string;\n  daemonVersion: string;\n}): Promise<{ batches: number; events: number }> {\n  if (draining) return { batches: 0, events: 0 };\n  draining = true;\n  try {\n    const q = queue();\n    if ((await q.countUnsent()) === 0) return { batches: 0, events: 0 };\n    const batches = await buildBatches({\n      store: q,\n      pipeline,\n      deviceId: opts.deviceId,\n      daemonVersion: opts.daemonVersion,\n      nowMs: Date.now(),\n    });\n    let events = 0;\n    for (const batch of batches) {\n      // Privacy: the daemon has already produced redacted segment abstracts;\n      // the per-event turn excerpt is only summariser input and must not\n      // leave the machine — honours the SDK's \"raw text never leaves the\n      // machine\" contract even when the SDK shipped with redaction \"none\".\n      const shipped = {\n        ...batch,\n        events: batch.events.map(({ content_excerpt: _excerpt, ...rest }) => rest),\n      };\n      const res = await uploadBatch(shipped);\n      if (!res.committed) {\n        // PERMANENT reject (400/422). Mark sent anyway so this one poison batch\n        // doesn't wedge the queue — a TRANSIENT failure throws above and is\n        // retried, never marked. Loud: it's daemon-side data loss.\n        console.error(\n          `SDK ingest batch ${batch.batch_id} dropped — server rejected it (${res.reason}); skipping so the queue keeps draining`,\n        );\n      }\n      await q.markSent(\n        batch.events.map((e) => e.source_event_id),\n        batch.batch_id,\n      );\n      if (res.committed) events += batch.events.length;\n    }\n    return { batches: batches.length, events };\n  } finally {\n    draining = false;\n  }\n}\n\n/** Unsent depth — surfaced in the heartbeat so the dashboard shows SDK\n * backlog draining. */\nexport function localQueueDepth(): Promise<number> {\n  return queue().countUnsent();\n}\n\nexport interface LocalIngestReceiver {\n  readonly port: number;\n  close(): Promise<void>;\n}\n\nexport interface StartReceiverOptions {\n  port?: number;\n  /** Optional force-scan worker. When provided, the receiver serves\n   * `POST /v1/control/scan` (loopback) so `modelstat sync --session` can warm\n   * a running daemon instead of cold-loading its own summariser. Omitted (e.g.\n   * in tests) → that route 404s. */\n  onControlScan?: ControlScanHandler;\n}\n\n/**\n * Start the loopback receiver. Best-effort: a busy port (a stale listener;\n * the singleton daemon lock already prevents a second daemon) disables the\n * SDK path with a warning rather than crashing the daemon's core file-scan\n * duty. Resolves `null` when the receiver could not bind.\n */\nexport function startLocalIngestReceiver(\n  opts: StartReceiverOptions = {},\n): Promise<LocalIngestReceiver | null> {\n  const port =\n    opts.port ?? (Number(process.env.MODELSTAT_LOCAL_INGEST_PORT) || DEFAULT_LOCAL_INGEST_PORT);\n  // Single-flight the control scan: a burst of /v1/control/scan posts (the\n  // plugin + statusline can both fire on one turn) coalesces into at most one\n  // in-flight scan plus one queued follow-up, mirroring the daemon's own\n  // scan-coalescing so two eager scans never run concurrently.\n  const controlRunner = opts.onControlScan\n    ? createControlRunner(opts.onControlScan)\n    : null;\n  return new Promise((resolve) => {\n    const server = createServer((req, res) => void handle(req, res, controlRunner));\n    let settled = false;\n    server.on(\"error\", (err: NodeJS.ErrnoException) => {\n      if (settled) return;\n      settled = true;\n      logger.warn(\n        `local ingest receiver disabled — SDK local_daemon mode unavailable: ${err.code ?? err.message} on 127.0.0.1:${port}`,\n      );\n      resolve(null);\n    });\n    server.listen(port, \"127.0.0.1\", () => {\n      settled = true;\n      // With port 0 the OS assigns a free port (used by tests); report the\n      // actual bound port, not the requested one.\n      const addr = server.address();\n      const boundPort = typeof addr === \"object\" && addr ? addr.port : port;\n      logger.info(`local ingest receiver on http://127.0.0.1:${boundPort}/v1/ingest`);\n      resolve({\n        port: boundPort,\n        close: () => new Promise<void>((r) => server.close(() => r())),\n      });\n    });\n  });\n}\n\n/** Coalescing wrapper around the force-scan handler. Returns the promise for\n * the run that will cover this request's target — a `wait:true` caller awaits\n * it; a fire-and-forget caller ignores it. Errors are surfaced to the awaiter\n * but never crash the receiver. */\ninterface ControlRunner {\n  run(target: { sessionIds?: string[]; file?: string }): Promise<void>;\n}\nfunction createControlRunner(handler: ControlScanHandler): ControlRunner {\n  let active: Promise<void> | null = null;\n  return {\n    run(target) {\n      // Chain onto any in-flight scan so we never run two at once; the new\n      // target runs after the current one drains.\n      const prev = active ?? Promise.resolve();\n      const next = prev.catch(() => undefined).then(() => handler(target));\n      active = next.catch(() => undefined);\n      return next;\n    },\n  };\n}\n\nasync function handle(\n  req: IncomingMessage,\n  res: ServerResponse,\n  controlRunner: ControlRunner | null,\n): Promise<void> {\n  const send = (code: number, body: unknown): void => {\n    res.writeHead(code, { \"content-type\": \"application/json\" });\n    res.end(JSON.stringify(body));\n  };\n  const path = (req.url ?? \"\").split(\"?\")[0];\n  if (req.method === \"GET\" && path === \"/healthz\") return send(200, { ok: true });\n  if (req.method === \"POST\" && path === \"/v1/control/scan\") {\n    return handleControlScan(req, send, controlRunner);\n  }\n  // SDK local_daemon mode posts to /v1/ingest; accept /raw too (the daemon\n  // redacts + summarises regardless of which door the SDK used).\n  if (req.method !== \"POST\" || (path !== \"/v1/ingest\" && path !== \"/v1/ingest/raw\")) {\n    return send(404, { error: \"not found\" });\n  }\n  let size = 0;\n  const chunks: Buffer[] = [];\n  try {\n    for await (const chunk of req) {\n      size += (chunk as Buffer).length;\n      if (size > MAX_BODY_BYTES) {\n        send(413, { error: \"batch too large\" });\n        req.destroy();\n        return;\n      }\n      chunks.push(chunk as Buffer);\n    }\n  } catch {\n    return send(400, { error: \"read error\" });\n  }\n  let json: unknown;\n  try {\n    json = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n  } catch {\n    return send(400, { error: \"invalid json\" });\n  }\n  const parsed = parseBatch(json);\n  if (\"error\" in parsed) return send(400, parsed);\n  try {\n    const accepted = await enqueue(parsed);\n    return send(200, { accepted, queued: true });\n  } catch (e) {\n    logger.warn(`local ingest enqueue failed: ${(e as Error).message}`);\n    return send(500, { error: \"enqueue failed\" });\n  }\n}\n\n/** Read + validate a control-scan body, then dispatch the force-scan. With\n * `wait:true` the response blocks until the scan + insight refresh finish;\n * otherwise it returns immediately with `{started:true}`. */\nasync function handleControlScan(\n  req: IncomingMessage,\n  send: (code: number, body: unknown) => void,\n  controlRunner: ControlRunner | null,\n): Promise<void> {\n  if (!controlRunner) return send(503, { error: \"control scan unavailable\" });\n  // Bodies are tiny (a few ids); a generous small cap is plenty.\n  const chunks: Buffer[] = [];\n  let size = 0;\n  try {\n    for await (const chunk of req) {\n      size += (chunk as Buffer).length;\n      if (size > 64 * 1024) {\n        send(413, { error: \"control body too large\" });\n        req.destroy();\n        return;\n      }\n      chunks.push(chunk as Buffer);\n    }\n  } catch {\n    return send(400, { error: \"read error\" });\n  }\n  let body: ControlScanRequest;\n  try {\n    const raw = chunks.length ? Buffer.concat(chunks).toString(\"utf8\") : \"{}\";\n    body = JSON.parse(raw) as ControlScanRequest;\n  } catch {\n    return send(400, { error: \"invalid json\" });\n  }\n  const sessionIds = Array.isArray(body.session_ids)\n    ? body.session_ids.filter((s): s is string => typeof s === \"string\" && s.length > 0)\n    : undefined;\n  let file: string | undefined;\n  if (body.file !== undefined) {\n    if (typeof body.file !== \"string\" || !isAllowedTranscriptFile(body.file)) {\n      return send(400, { error: \"file must be under ~/.claude/projects or ~/.codex/sessions\" });\n    }\n    file = body.file;\n  }\n  const target = { sessionIds, file };\n  const run = controlRunner.run(target);\n  if (body.wait === true) {\n    try {\n      await run;\n      return send(200, { ok: true, scanned: true });\n    } catch (e) {\n      return send(500, { error: `scan failed: ${(e as Error).message}` });\n    }\n  }\n  // Fire-and-forget: don't let an unawaited rejection crash the process.\n  void run.catch((e) => logger.warn(`control scan failed: ${(e as Error).message}`));\n  return send(200, { ok: true, started: true });\n}\n","/**\n * Contract types shared between every daemon runtime. Re-exports\n * from @modelstat/core so daemons import one canonical location\n * and we don't split the type graph.\n */\nexport {\n  HeartbeatPayload,\n  IngestBatch,\n  RawEvent,\n  RedactionReport,\n  Segment,\n  TaxonomyHintRooted,\n  TokenUsage,\n} from \"@modelstat/core/schemas\";\nexport type {\n  HeartbeatPayload as HeartbeatPayloadT,\n  IngestBatch as IngestBatchT,\n  RawEvent as RawEventT,\n  RedactionReport as RedactionReportT,\n  Segment as SegmentT,\n  TaxonomyHintRooted as TaxonomyHintRootedT,\n  TokenUsage as TokenUsageT,\n} from \"@modelstat/core/schemas\";\n\nexport {\n  AGENTS,\n  type Agent,\n  DAEMON_PHASES,\n  type DaemonPhase,\n  DEFAULT_TAXONOMY_ROOTS,\n  PROVIDERS,\n  type Provider,\n  WORK_TYPES,\n  type WorkType,\n} from \"@modelstat/core/enums\";\n","/**\n * @modelstat/daemon-core — shared core for every daemon runtime.\n *\n * Design: docs/daemon-unification.md. One contract per concern\n * (IDs, logger, HTTP, queue state machine, pipeline, heartbeat);\n * runtime-specific adapters live in subpaths (node/, browser/) that\n * this package will gain as each unification step lands.\n *\n * Consumers should import from the subpaths (./contracts, ./http,\n * ./queue, ./pipeline, ./logger, ./ids, ./config) rather than this\n * barrel to keep bundle size tight in the extension.\n */\n\nexport * from \"./contracts/index.js\";\nexport * from \"./ids.js\";\nexport * from \"./logger.js\";\nexport * from \"./config/index.js\";\nexport * from \"./http/index.js\";\nexport * from \"./queue/index.js\";\nexport * from \"./pipeline/index.js\";\n","/**\n * Authoritative git-remote enrichment — run over a batch of parsed events\n * BEFORE segmentation so the project identity keys on the real repository.\n *\n * The parsers seed `git.remote_slug` from {@link guessRepoSlugFromPath}, a pure\n * path heuristic: it matches a container word (`www` | `src` | `code` | `repos`\n * | `projects`) anywhere in the cwd and takes the NEXT two path segments as\n * `owner/repo`. That misfires whenever the container word is a repo-INTERNAL\n * directory — a session run inside a repo's own `…/src/app/case-studies` tree\n * reports the SUBDIRECTORY `app/case-studies` as if it were a repository, which\n * surfaces as a bogus row in \"Spend by Repo\" (the `projects` hint → the\n * `workstreams` taxonomy dimension).\n *\n * The repo is a hard fact, not a guess. For each cwd we resolve, in order:\n *   1. the real `owner/repo` from `remote.origin.url` ({@link resolveGitContext},\n *      worktrees collapsed to the main repo, cwd-cached); else\n *   2. the repo-ROOT directory name ({@link resolveRepoRoot}) — a bare repo name\n *      that can NEVER be a subdirectory — for a repo with no remote (local-only,\n *      or origin unset).\n * Only when NO `.git` is reachable at all (a repo already deleted from disk by\n * parse time) do we leave the parser's path guess — a rare residual the one-off\n * server cleanup mops up.\n *\n * Both paths are ANCHORED on where `.git` actually is, so a subdirectory can\n * never be emitted — no hard-coded directory-name list. The HISTORICAL branch\n * the parser captured for the turn is preserved (env inference + branch-ticket\n * detection want the branch as it was); only the repo identity is corrected.\n */\nimport { basename } from \"node:path\";\nimport type { GitContext, RawEvent } from \"@modelstat/core\";\nimport { resolveGitContext, resolveRepoRoot } from \"@modelstat/parsers\";\n\n/** Resolve a cwd to its on-disk git context. Injected in tests; defaults to the\n * parsers' real, cwd-cached resolver. */\nexport type GitResolver = (cwd: string | null) => Promise<GitContext | null>;\n/** Resolve a cwd to its repo-root directory. Injected in tests; defaults to the\n * parsers' `.git`-walk resolver. */\nexport type RootResolver = (cwd: string | null) => string | null;\n\n/** The corrected repo identity for a cwd (slug is always present here). */\ninterface RepoIdentity {\n  remote_url: string | null;\n  remote_host: string | null;\n  remote_slug: string;\n  branch: string | null;\n}\n\nexport async function resolveAuthoritativeGit(\n  events: RawEvent[],\n  resolveGit: GitResolver = resolveGitContext,\n  resolveRoot: RootResolver = resolveRepoRoot,\n): Promise<RawEvent[]> {\n  // One resolution per DISTINCT cwd (both resolvers are cwd-cached anyway).\n  const cwds = new Set<string>();\n  for (const e of events) if (e.cwd) cwds.add(e.cwd);\n  if (cwds.size === 0) return events;\n\n  const resolved = new Map<string, RepoIdentity>();\n  for (const cwd of cwds) {\n    let g: GitContext | null = null;\n    try {\n      g = await resolveGit(cwd);\n    } catch {\n      g = null; // best-effort — a failing git read falls through to the root name\n    }\n    if (g?.remote_slug) {\n      // Authoritative: a real `owner/repo` remote.\n      resolved.set(cwd, {\n        remote_url: g.remote_url,\n        remote_host: g.remote_host,\n        remote_slug: g.remote_slug,\n        branch: g.branch,\n      });\n      continue;\n    }\n    // No remote → key on the repo-root directory NAME (bare, never a subpath)\n    // instead of the parser's path guess.\n    let root: string | null = null;\n    try {\n      root = resolveRoot(cwd);\n    } catch {\n      root = null;\n    }\n    const name = root ? basename(root) : \"\";\n    if (name) {\n      resolved.set(cwd, {\n        remote_url: null,\n        remote_host: null,\n        remote_slug: name,\n        branch: g?.branch ?? null,\n      });\n    }\n    // else: no `.git` reachable — leave the event's parsed value untouched.\n  }\n  if (resolved.size === 0) return events;\n\n  return events.map((e) => {\n    const id = e.cwd ? resolved.get(e.cwd) : undefined;\n    if (!id) return e;\n    return {\n      ...e,\n      git: {\n        remote_url: id.remote_url,\n        remote_host: id.remote_host,\n        remote_slug: id.remote_slug,\n        // Keep the branch the parser recorded for THIS turn; fall back to the\n        // on-disk branch only when the event carried none.\n        branch: e.git?.branch ?? id.branch,\n      },\n    };\n  });\n}\n","/**\n * One-shot scan: walk known Claude Code + Codex directories, parse each\n * JSONL, run the shared daemon pipeline (redact → segment →\n * summarise → tag), upload the resulting batch.\n *\n * Tracks per-file cursors in conf so a second scan only sends\n * incremental events.\n */\nimport { readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { IngestBatch, RawEvent, Segment, SessionMetadata } from \"@modelstat/core\";\nimport { batchId } from \"@modelstat/daemon-core\";\nimport { INGEST_BATCH_MAX_EVENTS } from \"@modelstat/daemon-core/config\";\nimport type { SegmentProgressFn } from \"@modelstat/daemon-core/pipeline\";\nimport { attachSegmentIdsByMap, type ToolCallDraft } from \"@modelstat/daemon-core/queue\";\nimport {\n  deriveSessionIdFromFilename,\n  deriveSessionIdFromPiPath,\n  deriveSessionIdFromRolloutPath,\n  type LocalToolContext,\n  type ParseResult,\n  type ParserContext,\n  parseClaudeCodeJsonl,\n  parseCodexRollout,\n  parsePiSession,\n  quickChecksum,\n} from \"@modelstat/parsers\";\nimport { uploadBatch } from \"./api.js\";\nimport { state } from \"./config.js\";\nimport { resolveAuthoritativeGit } from \"./git-enrich.js\";\nimport {\n  buildSegments,\n  buildSessionMetadata,\n  buildSessionTitles,\n  enrichScripts,\n  prepareCloudRawEvents,\n} from \"./pipeline.js\";\n\n/** Substituted by tsup's `define` (see tsup.config.ts) — a string\n * literal in the bundle; falls back to \"daemon-dev\" when run unbundled\n * (tsx / tests), where the define isn't applied. */\nconst DAEMON_VERSION =\n  typeof __MODELSTAT_VERSION__ === \"string\" ? __MODELSTAT_VERSION__ : \"daemon-dev\";\n// Shared cross-daemon batch size — same value the extension uses, so\n// both sides present an identical rate-limit profile to the ingest endpoint.\nconst BATCH_MAX_EVENTS = INGEST_BATCH_MAX_EVENTS;\n/** Wire cap on IngestBatch.tool_calls (z.array(ToolCallWire).max(20_000)\n * in @modelstat/core/schemas) — the server 400s anything above it, so\n * the buffer must flush BEFORE crossing it. Never binding in practice\n * (one event batch × typical calls-per-event stays far below), but a\n * tool-storm session shouldn't be able to sink a whole upload. */\nconst BATCH_MAX_TOOL_CALLS = 20_000;\n\n/** Regression guard on the in-flight event buffer. The scan loop's\n * memory contract is \"at most one batch of events in memory at a\n * time\": parsers stream events in small chunks (ParserContext.onEvents)\n * and the buffer flushes the moment it reaches BATCH_MAX_EVENTS, so it\n * can only briefly overshoot by less than one parser chunk. If a future\n * refactor reintroduces whole-file (or whole-corpus) accumulation —\n * the bug class behind the 2026-06-11 v1→v3 reprocess OOM — this trips\n * loudly on the first oversized file instead of dying hours in with a\n * V8 heap-limit crash. */\nconst BATCH_BUFFER_HARD_CAP = BATCH_MAX_EVENTS * 2;\n\n/** A fully-zeroed TokenUsage. Our wire contract marks `RawEvent.tokens`\n * nullable (events with no usage — user turns, tool results — naturally\n * carry none), but the ingest server deserializes it as a required\n * struct and 400s the *entire batch* on the first null. Coerce null →\n * zeros at the wire boundary so one token-less event can't sink a whole\n * upload. Zeros are accurate: these events incur no billable tokens. */\nconst ZERO_TOKENS = {\n  input: 0,\n  output: 0,\n  cache_creation: 0,\n  cache_read: 0,\n  reasoning: 0,\n} as const;\n\nfunction withNonNullTokens(e: RawEvent): RawEvent {\n  return e.tokens ? e : { ...e, tokens: { ...ZERO_TOKENS } };\n}\n\n/** Per-batch tallies handed to the upload callbacks. `segments` is the\n * number of cognition segments built from the batch's events — the\n * unit the menu-bar tray surfaces as \"sent\". */\nexport interface BatchCounts {\n  events: number;\n  segments: number;\n}\n\nexport interface ScanCallbacks {\n  /** Called before we parse each file — index is 0-based, total is the\n   * count of files discovered across all tools. */\n  onFile?: (path: string, index: number, total: number) => void;\n  /** Called right before we POST a batch to /v1/ingest — i.e. these\n   * segments are now in-flight. */\n  onUpload?: (counts: BatchCounts) => void;\n  /** Called after the POST is confirmed accepted. `events` is the\n   * server-accepted count; `segments` is what we sent. */\n  onUploaded?: (counts: BatchCounts) => void;\n  /** Called when a batch is PERMANENTLY rejected (400/422) and quarantined —\n   * skipped so newer data keeps flowing. Surfaced loudly (it's daemon-side data\n   * loss for an un-encodable batch); the tray/statusline can show a drop count. */\n  onDropped?: (info: BatchCounts & { reason: string }) => void;\n  /** Per-segment progress while a batch is being summarised — the slow,\n   * previously-opaque phase. Forwarded straight from the pipeline so the\n   * daemon can keep the heartbeat (and the tray) ticking. */\n  onProgress?: SegmentProgressFn;\n}\n\n/** Streaming event sink: a parser pushes its file's events in small chunks. */\nexport type EventSink = (events: RawEvent[]) => Promise<void>;\n/** A discovered transcript file + its streaming parser. */\nexport interface ScanJob {\n  path: string;\n  parse: (\n    sink: EventSink,\n  ) => Promise<{ toolCalls: ToolCallDraft[]; scriptContexts: LocalToolContext[] }>;\n}\n\n/**\n * Walk the known Claude Code + Codex transcript roots and return one\n * {@link ScanJob} per `.jsonl`. Shared by the incremental {@link scanAll} and the\n * self-healing reconcile, so both reason over the exact same file set.\n */\nexport async function discoverJobs(deviceId: string): Promise<ScanJob[]> {\n  const jobs: ScanJob[] = [];\n\n  // Claude Code\n  try {\n    const base = join(homedir(), \".claude/projects\");\n    const projects = await readdir(base).catch(() => []);\n    for (const p of projects) {\n      const dir = join(base, p);\n      const ds = await stat(dir).catch(() => null);\n      if (!ds?.isDirectory()) continue;\n      const files = await readdir(dir);\n      for (const f of files) {\n        if (!f.endsWith(\".jsonl\")) continue;\n        const full = join(dir, f);\n        jobs.push({\n          path: full,\n          parse: async (sink) => {\n            const r = await parseClaudeCodeJsonl({ deviceId, sourceFile: full, onEvents: sink });\n            return { toolCalls: r.toolCalls ?? [], scriptContexts: r.scriptContexts ?? [] };\n          },\n        });\n      }\n    }\n  } catch (e) {\n    console.warn(\"claude scan skipped:\", (e as Error).message);\n  }\n\n  // Codex\n  try {\n    const base = join(homedir(), \".codex/sessions\");\n    const years = await readdir(base).catch(() => []);\n    for (const y of years) {\n      const months = await readdir(join(base, y)).catch(() => []);\n      for (const m of months) {\n        const days = await readdir(join(base, y, m)).catch(() => []);\n        for (const d of days) {\n          const files = await readdir(join(base, y, m, d)).catch(() => []);\n          for (const f of files) {\n            if (!f.startsWith(\"rollout-\") || !f.endsWith(\".jsonl\")) continue;\n            const full = join(base, y, m, d, f);\n            jobs.push({\n              path: full,\n              parse: async (sink) => {\n                const r = await parseCodexRollout({ deviceId, sourceFile: full, onEvents: sink });\n                return { toolCalls: r.toolCalls ?? [], scriptContexts: r.scriptContexts ?? [] };\n              },\n            });\n          }\n        }\n      }\n    }\n  } catch (e) {\n    console.warn(\"codex scan skipped:\", (e as Error).message);\n  }\n\n  // pi — ~/.pi/agent/sessions/<encoded-cwd>/<TS>_<uuid>.jsonl\n  try {\n    const base = join(homedir(), \".pi/agent/sessions\");\n    const projects = await readdir(base).catch(() => []);\n    for (const p of projects) {\n      const dir = join(base, p);\n      const ds = await stat(dir).catch(() => null);\n      if (!ds?.isDirectory()) continue;\n      const files = await readdir(dir);\n      for (const f of files) {\n        if (!f.endsWith(\".jsonl\")) continue;\n        const full = join(dir, f);\n        jobs.push({\n          path: full,\n          parse: async (sink) => {\n            const r = await parsePiSession({ deviceId, sourceFile: full, onEvents: sink });\n            return { toolCalls: r.toolCalls ?? [], scriptContexts: r.scriptContexts ?? [] };\n          },\n        });\n      }\n    }\n  } catch (e) {\n    console.warn(\"pi scan skipped:\", (e as Error).message);\n  }\n\n  return jobs;\n}\n\n/** Tallies returned by every scan pass (full corpus or single session). */\nexport interface ScanResult {\n  filesScanned: number;\n  filesUnchanged: number;\n  batchesUploaded: number;\n  eventsUploaded: number;\n  segmentsUploaded: number;\n  /** Batches PERMANENTLY rejected (400/422) and quarantined this run — skipped so\n   * the scan keeps flowing. Non-zero = daemon-side data loss worth investigating. */\n  batchesDropped: number;\n  /** True when the per-cycle file cap was hit and older files still remain —\n   * the caller should re-scan promptly to drain the rest (newest-first).\n   * Always false for an uncapped {@link scanSession}. */\n  morePending: boolean;\n}\n\n/** Tuning knobs for {@link runScanOverJobs}, the shared parse→summarise→upload\n * loop behind both {@link scanAll} (incremental, capped) and\n * {@link scanSession} (force-read, uncapped). */\ninterface RunScanOptions {\n  /** Cap on CHANGED files processed per call; `null` = no cap (single-session\n   * force-scan). When the cap is hit with files still pending, the result's\n   * `morePending` is set so the caller re-scans promptly. */\n  maxFiles: number | null;\n  /** Skip the per-file cursor unchanged-guard and re-read every job from byte\n   * 0. The cursor is still ADVANCED after a confirmed upload, so a later\n   * incremental scan stays correct. Used by {@link scanSession} so the current\n   * session re-uploads even though the daemon already processed it. */\n  forceReadAll: boolean;\n}\n\n// Cold-start / big-backfill bound: process at most this many CHANGED files\n// per incremental scan cycle. A fresh device with thousands of old transcripts\n// used to load the whole backlog, OOM, and die BEFORE the first upload ever\n// landed — and cursors only advance on a CONFIRMED upload, so it crash-looped\n// with zero progress. Capping + recent-first means the newest session lands\n// fast, memory stays near the model's resident footprint, and the rest drains\n// over quick follow-up cycles (see `morePending`).\nconst MAX_FILES_PER_SCAN = 12;\n\nexport async function scanAll(cb: ScanCallbacks = {}): Promise<ScanResult> {\n  const deviceId = state.deviceId;\n  if (!deviceId) throw new Error(\"daemon not enrolled — run `register` first\");\n\n  // Each job streams its file's events into the provided sink in small\n  // chunks (ParserContext.onEvents) instead of returning them all at\n  // once — a single multi-hundred-MB transcript must never materialise\n  // as one array. The sink flushes batches as it fills, so a full\n  // reprocess after a cursor wipe holds at most ~one batch in memory.\n  // Per-call tool invocations (ToolCallDraft) are NOT streamed — they're\n  // hash/byte metadata only (tiny), so the parser returns the whole\n  // file's set, which the caller drains into the event stream below.\n  const jobs = await discoverJobs(deviceId);\n\n  // Recent-first: newest transcripts upload first, so a session you JUST\n  // finished shows up within seconds instead of waiting behind a backlog of\n  // old ones (readdir order is arbitrary).\n  const ordered = await orderJobsNewestFirst(jobs);\n\n  return runScanOverJobs(\n    ordered,\n    deviceId,\n    { maxFiles: MAX_FILES_PER_SCAN, forceReadAll: false },\n    cb,\n  );\n}\n\n/**\n * Force-scan ONE session's transcript(s) immediately — the eager path behind\n * `modelstat sync --session` and the loopback control endpoint. A warm daemon\n * (summariser already resident) can land a session you JUST finished in\n * seconds, instead of waiting for the watch/backstop cycle.\n *\n * Targeting:\n *   - `sessionIds` — map each id to its `<id>.jsonl` (Claude Code) or\n *     `rollout-…-<id>.jsonl` (Codex) among the discovered jobs. A compaction\n *     chain is just several ids; pass them all.\n *   - `file` — scan one explicit transcript path (already validated by the\n *     caller as living under a known transcript root).\n *   - neither — fall back to the single newest `.jsonl` across all roots, so a\n *     bare `modelstat sync --session` still does the useful thing.\n *\n * Unlike {@link scanAll} this BYPASSES the per-file cursor unchanged-skip\n * (the daemon may have already uploaded this session) but still advances the\n * cursor after a confirmed upload — so the regular incremental scan stays\n * consistent. Uncapped: a single session is bounded work.\n */\nexport async function scanSession(\n  target: { sessionIds?: string[]; file?: string } = {},\n  cb: ScanCallbacks = {},\n): Promise<ScanResult> {\n  const deviceId = state.deviceId;\n  if (!deviceId) throw new Error(\"daemon not enrolled — run `register` first\");\n\n  const all = await discoverJobs(deviceId);\n  let selected: ScanJob[];\n\n  if (target.file) {\n    // Caller validated the path is under a known transcript root. Reuse the\n    // discovered job if we already enumerated it (keeps its parser wiring);\n    // otherwise build one ad-hoc so an explicit --file still works even when\n    // discovery didn't surface it (e.g. a brand-new file mid-write).\n    const existing = all.find((j) => j.path === target.file);\n    selected = existing ? [existing] : [jobForFile(deviceId, target.file)];\n  } else if (target.sessionIds && target.sessionIds.length > 0) {\n    const wanted = new Set(target.sessionIds);\n    selected = all.filter((j) => {\n      const sid = sessionIdForPath(j.path);\n      return sid != null && wanted.has(sid);\n    });\n  } else {\n    // No target → newest transcript across all roots, so a bare invocation is\n    // still useful (mirrors scanAll's recent-first intent at size 1).\n    const ordered = await orderJobsNewestFirst(all);\n    selected = ordered.slice(0, 1);\n  }\n\n  if (selected.length === 0) {\n    return {\n      filesScanned: 0,\n      filesUnchanged: 0,\n      batchesUploaded: 0,\n      eventsUploaded: 0,\n      segmentsUploaded: 0,\n      batchesDropped: 0,\n      morePending: false,\n    };\n  }\n\n  return runScanOverJobs(selected, deviceId, { maxFiles: null, forceReadAll: true }, cb);\n}\n\n/** Map a discovered transcript path back to its session id — Claude Code's\n * `<uuid>.jsonl` or Codex's `rollout-…-<uuid>.jsonl`. Null when neither shape\n * matches (so it's never confused with a real id). */\nfunction sessionIdForPath(path: string): string | null {\n  if (path.includes(\"/.pi/agent/sessions/\")) return deriveSessionIdFromPiPath(path);\n  return deriveSessionIdFromFilename(path) ?? deriveSessionIdFromRolloutPath(path);\n}\n\n/** Build a one-off {@link ScanJob} for an explicit transcript path, picking\n * the parser from the directory shape (Codex rollouts live under\n * `.codex/sessions`; everything else is Claude Code JSONL). */\nfunction parserForFile(full: string): (ctx: ParserContext) => Promise<ParseResult> {\n  if (full.includes(\"/.codex/sessions/\") && /rollout-.*\\.jsonl$/.test(full)) {\n    return parseCodexRollout;\n  }\n  if (full.includes(\"/.pi/agent/sessions/\")) return parsePiSession;\n  return parseClaudeCodeJsonl;\n}\n\nfunction jobForFile(deviceId: string, full: string): ScanJob {\n  const parse = parserForFile(full);\n  return {\n    path: full,\n    parse: async (sink) => {\n      const r = await parse({ deviceId, sourceFile: full, onEvents: sink });\n      return { toolCalls: r.toolCalls ?? [], scriptContexts: r.scriptContexts ?? [] };\n    },\n  };\n}\n\n/** Sort jobs newest-first by mtime (arbitrary readdir order otherwise). Stats\n * run in parallel — cheap. */\nasync function orderJobsNewestFirst(jobs: ScanJob[]): Promise<ScanJob[]> {\n  return (\n    await Promise.all(\n      jobs.map(async (j) => ({\n        job: j,\n        mtimeMs: (await stat(j.path).catch(() => null))?.mtimeMs ?? 0,\n      })),\n    )\n  )\n    .sort((a, b) => b.mtimeMs - a.mtimeMs)\n    .map((x) => x.job);\n}\n\n/**\n * Shared parse → summarise → upload loop over an ordered job list. Holds at\n * most ~one batch of events in memory (the streaming sink applies backpressure\n * to the file read) and advances each file's cursor only after its events land\n * — so a mid-scan failure re-tries the same events next run (idempotent\n * server-side). Both {@link scanAll} and {@link scanSession} funnel through\n * here; their only differences are {@link RunScanOptions} (file cap +\n * force-read).\n */\nasync function runScanOverJobs(\n  ordered: ScanJob[],\n  deviceId: string,\n  opts: RunScanOptions,\n  cb: ScanCallbacks,\n): Promise<ScanResult> {\n  let morePending = false;\n\n  let filesScanned = 0;\n  let filesUnchanged = 0;\n  let batchesUploaded = 0;\n  let eventsUploaded = 0;\n  let segmentsUploaded = 0;\n  let batchesDropped = 0;\n\n  let buffer: RawEvent[] = [];\n  // Per-call tool invocations travelling with the events in `buffer`.\n  // A call always ships in the same batch as its emitting event so the\n  // server can resolve segment/session context in one pass.\n  let toolCallBuffer: ToolCallDraft[] = [];\n  // Files whose events are in the current buffer but whose cursor has\n  // NOT been advanced yet. Cursor advances only when the batch\n  // containing their events has been confirmed uploaded — so a\n  // mid-scan network failure means the next run re-parses the same\n  // files and tries again (idempotent from the daemon's side).\n  let pendingCursors: Array<{ path: string; cs: Awaited<ReturnType<typeof quickChecksum>> }> = [];\n  // Segments accumulated per session across the whole run. A big file\n  // can split a session across BATCH_MAX_EVENTS boundaries; the title\n  // for a session must be computed from every segment seen so far in\n  // this run, not just the current batch's tail — otherwise the later\n  // batch's (partial-view) title would overwrite the better one\n  // server-side (titles are last-write-wins per session).\n  const runSegmentsBySession = new Map<string, Segment[]>();\n\n  /** Ship one assembled batch and, on success, advance the buffered files'\n   * cursors. Shared by the normal (abstracts → /v1/ingest) and cloud (raw turns\n   * → /v1/ingest/raw) paths — `raw` picks the endpoint, `segmentCount` is 0 for\n   * the cloud path (the server builds the segments). */\n  async function commitBatch(\n    batch: IngestBatch,\n    o: { raw: boolean; segmentCount: number },\n  ): Promise<void> {\n    const eventCount = batch.events.length;\n    // These records are now in-flight.\n    cb.onUpload?.({ events: eventCount, segments: o.segmentCount });\n    const res = await uploadBatch(batch, { raw: o.raw });\n    if (!res.committed) {\n      // PERMANENT server reject (400/422 — an un-encodable batch the server will\n      // never accept). QUARANTINE it: advance these files' cursors PAST the poison\n      // batch so the newest-first scan isn't wedged behind it forever (one bad\n      // batch was blocking every newer file's events). A TRANSIENT failure would\n      // have thrown above instead — held + retried — so good data is never lost on\n      // a blip; only a genuinely-rejected batch is skipped, and loudly.\n      batchesDropped += 1;\n      console.error(\n        `dropped ${eventCount} event(s) / ${o.segmentCount} segment(s) — server rejected the batch (${res.reason}); skipping so newer data keeps flowing`,\n      );\n      cb.onDropped?.({ events: eventCount, segments: o.segmentCount, reason: res.reason });\n      for (const pc of pendingCursors) state.setCursor(pc.path, pc.cs);\n      pendingCursors = [];\n      buffer = [];\n      toolCallBuffer = [];\n      return;\n    }\n    batchesUploaded += 1;\n    eventsUploaded += res.accepted;\n    segmentsUploaded += o.segmentCount;\n    // Upload confirmed — persist cursors for the files whose events\n    // just landed. Batch upserts are server-side idempotent (segments\n    // keyed by segment_id, sessions keyed by device+tool+source_session_id)\n    // so even if we crash between here and the next scan, re-sending\n    // the same events is safe.\n    for (const pc of pendingCursors) state.setCursor(pc.path, pc.cs);\n    pendingCursors = [];\n    buffer = [];\n    toolCallBuffer = [];\n    cb.onUploaded?.({ events: res.accepted, segments: o.segmentCount });\n  }\n\n  async function flushBatch(): Promise<void> {\n    if (!buffer.length && !toolCallBuffer.length) return;\n    // Correct each event's repo identity to the AUTHORITATIVE git remote on\n    // disk BEFORE segmentation, so the `projects` hint (→ \"Spend by Repo\")\n    // keys on the real owner/repo instead of a path-guessed subdirectory such\n    // as `accounting/controllers`. Also normalise token-less events to zeroed\n    // TokenUsage — the ingest server rejects null tokens (see ZERO_TOKENS).\n    // This runs in EVERY mode: cloud ships these events (with corrected git) to\n    // /v1/ingest/raw, so the authoritative repo identity must be applied first.\n    const events = await resolveAuthoritativeGit(buffer.map(withNonNullTokens));\n\n    // ── Cloud mode: summarise server-side ────────────────────────────────\n    // No local model runs. Redact the turns fully on-device (the parser's\n    // regex floor + the on-device NER/PII pass; see prepareCloudRawEvents),\n    // then ship them to /v1/ingest/raw with NO local segments — modelstat's\n    // cloud summarises them. FAIL-CLOSED: if the NER redactor is unavailable\n    // we must not ship raw content with floor-only redaction, so we fall\n    // through to the normal path and ship LOCAL extractive abstracts (no raw\n    // egress) instead.\n    if (state.summarizerMode === \"cloud\") {\n      const cloudEvents = await prepareCloudRawEvents(events, toolCallBuffer);\n      if (cloudEvents) {\n        await commitBatch(\n          {\n            batch_id: batchId(),\n            device_id: deviceId,\n            daemon_version: DAEMON_VERSION,\n            events: cloudEvents,\n            segments: [],\n            // No local segments to attribute calls to — a null segment_id is\n            // valid wire; the server attaches them when it segments the turns.\n            tool_calls: attachSegmentIdsByMap(toolCallBuffer, new Map<string, string>()),\n          },\n          { raw: true, segmentCount: 0 },\n        );\n        return;\n      }\n      console.warn(\n        \"[modelstat] ⚠ cloud summariser HELD — the on-device NER/PII redactor \" +\n          \"(@huggingface/transformers) isn't available, so turns can't be scrubbed before \" +\n          \"leaving the machine. Shipping LOCAL extractive abstracts (no raw egress) instead. \" +\n          \"Install @huggingface/transformers to enable cloud mode.\",\n      );\n      // fall through to the normal (local extractive) path\n    }\n    // Shared pipeline produces one-or-more Segments per session:\n    // redact → segment (time + embedding boundaries) → summarise → tag.\n    // Adapter config is set once at process boot in cli.ts. Build first\n    // so the callbacks can report how many *segments* (not just events)\n    // are going up — that's the unit the tray surfaces.\n    const segments: Segment[] = await buildSegments(events, cb.onProgress);\n    // Title every session that has segments in THIS batch, using the\n    // full set of its segments seen this run. One short local-model\n    // call per session; deterministic fallback inside means a titler\n    // hiccup can't block the upload.\n    for (const seg of segments) {\n      const arr = runSegmentsBySession.get(seg.session_id) ?? [];\n      // Drop the 384-float `abstract_embedding` from the RUN-LONG accumulator:\n      // titling, metadata, and call-attribution below only read the abstract +\n      // ids, and this Map is held for the WHOLE scan. On a full re-scan (a\n      // PROCESSING_VERSION bump wipes cursors) of a power-user's months of\n      // history, retaining an embedding per segment grew the heap unbounded —\n      // the 8GB-OOM crash-loop. The wire `segments` array (shipped this batch)\n      // still carries the embedding; only this auxiliary copy sheds it.\n      arr.push(\n        seg.abstract_embedding === undefined ? seg : { ...seg, abstract_embedding: undefined },\n      );\n      runSegmentsBySession.set(seg.session_id, arr);\n    }\n    const titleInput: Segment[] = [];\n    for (const sessionId of new Set(segments.map((s) => s.session_id))) {\n      titleInput.push(...(runSegmentsBySession.get(sessionId) ?? []));\n    }\n    let sessionTitles: Record<string, string> = {};\n    try {\n      sessionTitles = await buildSessionTitles(titleInput);\n    } catch (e) {\n      // Titles are auxiliary — never sink a batch over them.\n      console.warn(\"session titling failed — shipping batch untitled:\", (e as Error).message);\n    }\n    // Per-session repo/PR/commit/issue metadata — the join layer between AI\n    // spend and shipped work. Uses the run-accumulated segments (full session\n    // view, like titles) for abstract scanning + this batch's events for git\n    // context. Auxiliary + best-effort: a detection hiccup never sinks a batch.\n    let sessionMetadata: Record<string, SessionMetadata> = {};\n    try {\n      sessionMetadata = await buildSessionMetadata(titleInput, events);\n    } catch (e) {\n      console.warn(\n        \"session metadata detection failed — shipping batch without it:\",\n        (e as Error).message,\n      );\n    }\n    // Attribute each buffered call to the segment covering its source\n    // event — resolved against EVERY segment seen this run for the\n    // call's session, not just this batch's. A file whose events\n    // straddle a BATCH_MAX_EVENTS flush ships its early events (and\n    // their segments) in an earlier batch, while its tool-call drafts\n    // buffer at parse-end and ride a later batch; matching only the\n    // current batch's segments would drop those straddling calls to\n    // segment_id null. runSegmentsBySession already accumulates these\n    // segments per session (for titling, populated just above), so\n    // reusing them costs no extra memory. A call whose event no segment\n    // covers (codex response_item anchors, slices that failed to\n    // summarise) still ships segment_id null — valid wire.\n    const callSegmentByEvent = new Map<string, string>();\n    for (const sessionId of new Set(toolCallBuffer.map((c) => c.session_id))) {\n      for (const seg of runSegmentsBySession.get(sessionId) ?? []) {\n        for (const id of seg.source_event_ids) callSegmentByEvent.set(id, seg.segment_id);\n      }\n    }\n    const batch: IngestBatch = {\n      batch_id: batchId(),\n      device_id: deviceId,\n      daemon_version: DAEMON_VERSION,\n      events,\n      segments,\n      tool_calls: attachSegmentIdsByMap(toolCallBuffer, callSegmentByEvent),\n      ...(Object.keys(sessionTitles).length ? { session_titles: sessionTitles } : {}),\n      ...(Object.keys(sessionMetadata).length ? { session_metadata: sessionMetadata } : {}),\n    };\n    await commitBatch(batch, { raw: false, segmentCount: segments.length });\n  }\n\n  // Streaming sink shared by every job: parsers call this with small\n  // chunks as they read, we flush whenever a full batch accumulates.\n  // The `await flushBatch()` inside applies backpressure all the way\n  // down to the file read — the parser doesn't read ahead while a\n  // batch is being summarised/uploaded.\n  const sink = async (events: RawEvent[]): Promise<void> => {\n    for (const e of events) {\n      buffer.push(e);\n      if (buffer.length >= BATCH_MAX_EVENTS) await flushBatch();\n    }\n    if (buffer.length > BATCH_BUFFER_HARD_CAP) {\n      throw new Error(\n        `scan event buffer exceeded ${BATCH_BUFFER_HARD_CAP} events — incremental batch flushing has regressed (see BATCH_BUFFER_HARD_CAP)`,\n      );\n    }\n  };\n  // Buffer a file's tool-call drafts once parsing finishes. Drafts are\n  // buffered here (not streamed with their events) on purpose: a draft's\n  // status/latency/result-size are filled in-place when its tool_result\n  // line is later paired, so it isn't final until the whole file is\n  // parsed. Segment attribution is resolved at flush time against the\n  // run-accumulated segments (see flushBatch), so a draft riding a later\n  // batch than its emitting event still keeps its segment_id — no\n  // same-batch affinity required.\n  const bufferToolCalls = async (calls: readonly ToolCallDraft[]): Promise<void> => {\n    for (const c of calls) {\n      if (toolCallBuffer.length >= BATCH_MAX_TOOL_CALLS) await flushBatch();\n      toolCallBuffer.push(c);\n    }\n  };\n\n  for (let i = 0; i < ordered.length; i++) {\n    const job = ordered[i]!;\n    cb.onFile?.(job.path, i, ordered.length);\n    const cur = state.getCursor(job.path);\n    const cs = await quickChecksum(job.path).catch(() => null);\n    // Incremental scans skip a file whose size+tail are unchanged since the\n    // last upload. The eager single-session path (forceReadAll) bypasses this\n    // so a session the daemon already processed still re-uploads — the cursor\n    // is still advanced below, keeping later incremental scans consistent.\n    if (!opts.forceReadAll && cs && cur && cur.size === cs.size && cur.tailHash === cs.tailHash) {\n      filesUnchanged += 1;\n      continue;\n    }\n    filesScanned += 1;\n    try {\n      // Events stream through `sink` (bounded memory); the file's per-call\n      // tool drafts come back at the end and join the current batch's\n      // tool-call buffer, alongside the events they were extracted from.\n      const r = await job.parse(sink);\n      // Summarise the script/bash FILES each command ran, on-device, into the\n      // drafts' redacted ToolAction.scripts. Best-effort + additive:\n      // failures leave the abstracts empty, never blocking the upload. The raw\n      // command + cwd it needs ride r.scriptContexts (local-only, never shipped).\n      try {\n        await enrichScripts(r.toolCalls, r.scriptContexts ?? []);\n      } catch (e) {\n        console.warn(\n          `  ! script-summary enrichment skipped for ${job.path}:`,\n          (e as Error).message,\n        );\n      }\n      await bufferToolCalls(r.toolCalls);\n      // Queue the cursor advance — it'll be applied by the next\n      // successful flushBatch(), not before. If we're offline / the\n      // ingest fails, the next scan retries the same events from the\n      // same cursor position.\n      if (cs) pendingCursors.push({ path: job.path, cs });\n    } catch (e) {\n      console.warn(`  ! parse failed for ${job.path}:`, (e as Error).message);\n    }\n    // Stop after the cap so memory + time per cycle stay bounded. The trailing\n    // flush below uploads what's buffered (advancing those files' cursors), and\n    // `morePending` tells the daemon to re-scan the next newest batch. A null\n    // cap (single-session force-scan) never breaks early — it's bounded work.\n    if (opts.maxFiles !== null && filesScanned >= opts.maxFiles) {\n      morePending = true;\n      break;\n    }\n  }\n  await flushBatch();\n\n  return {\n    filesScanned,\n    filesUnchanged,\n    batchesUploaded,\n    eventsUploaded,\n    segmentsUploaded,\n    batchesDropped,\n    morePending,\n  };\n}\n","/**\n * Self-healing reconcile — bidirectional anti-entropy (specs/self-healing-ingest.md).\n *\n * The server is authoritative for what's ingested; the local cursor is only a\n * fast-path that goes stale when the server loses data. So we reconcile against\n * the server with a digest tree keyed on EVENTS (the cheap, deterministic layer\n * both sides hold without the summariser):\n *\n *   1. total — one number. Server holds everything ⇒ done (O(1) steady state).\n *   2. per-day — drill only into days the server is short on.\n *   3. per-session — within a short day, find the exact sessions; invalidate just\n *      those files' cursors so the normal scan re-ships them. Idempotent.\n *\n * The local digest is built INCREMENTALLY: a per-file (mtime → day → session →\n * count) cache means only files that CHANGED since last pass are re-parsed, so a\n * device with months of history reconciles in O(changed files), and the cache is\n * GC'd to the current file set so on-disk size stays flat.\n */\nimport { stat } from \"node:fs/promises\";\nimport type { RawEvent } from \"@modelstat/core\";\nimport { fetchBackfillDays, fetchBackfillDaySessions } from \"./api.js\";\nimport { state } from \"./config.js\";\nimport { runtimeState } from \"./runtime-state.js\";\nimport { discoverJobs } from \"./scan.js\";\n\n/** day → session → event count. */\ntype PerDaySession = Record<string, Record<string, number>>;\n\n/**\n * Grace band so a server that DEDUPES a re-shipped session (its reported count\n * never reaches local) doesn't make us re-ship forever. Three guards, all\n * erring toward loss-PROOF — a small threshold + backoff, never suppression:\n *\n *   1. Settle window — skip days at/after this cutoff. The server ingests\n *      asynchronously, so \"today\" (and the last few hours) legitimately lags\n *      local; reconciling it would re-ship sessions that are merely in flight.\n *      We only act on calendar days STRICTLY OLDER than this, where a real\n *      deficit means genuine loss, not lag.\n *   2. Min deficit — ignore a per-(day,session) shortfall of ≤ this many events.\n *      Off-by-a-few counts come from benign skew (a tail event the server\n *      hasn't folded yet, an extractive-vs-model segment-count diff); re-shipping\n *      for them churns without ever converging.\n *   3. Per-session backoff — once we've re-shipped a (day,session) and the\n *      server is STILL short next pass, wait exponentially longer before trying\n *      again (cap MAX). A genuinely-missing session refills on the first attempt;\n *      a server-deduped one stops hammering after a couple of tries.\n */\nconst RESHIP_SETTLE_MS = 6 * 60 * 60_000; // 6h — events older than this should have settled server-side\nconst RESHIP_MIN_DEFICIT = 2; // ignore a shortfall of ≤2 events (benign skew)\nconst RESHIP_BACKOFF_BASE_MS = 30 * 60_000; // first retry no sooner than ~30min after a re-ship\nconst RESHIP_BACKOFF_MAX_MS = 24 * 60 * 60_000; // never wait longer than a day between retries\n\nexport interface ReconcileOutcome {\n  /** True when the server already holds everything local — no re-ship. */\n  inSync: boolean;\n  localEvents: number;\n  serverEvents: number;\n  /** Files re-parsed this pass (0 in steady state — everything cache-hit). */\n  filesParsed: number;\n  /** Divergent days drilled into. */\n  daysChecked: number;\n  /** Sessions the server was short on AND that cleared the grace band (eligible\n   * to re-ship this pass). */\n  sessionsShort: number;\n  /** Sessions short but HELD back this pass by the grace band (settle window,\n   * sub-threshold deficit, or backoff) — counted so a deferral is observable,\n   * not silent. */\n  sessionsDeferred: number;\n  /** Cursors invalidated so the next scan re-ships them. */\n  filesInvalidated: number;\n}\n\n/** UTC calendar day of an event timestamp — matches the server's `toDate(ts)`. */\nfunction utcDay(ts: string): string {\n  const d = new Date(ts);\n  return Number.isNaN(d.getTime()) ? \"\" : d.toISOString().slice(0, 10);\n}\n\n/**\n * Run one reconcile pass. `null` when the daemon isn't enrolled or the server\n * digest is unreachable (no-op; the next pass retries).\n */\nexport async function reconcileBackfill(\n  requestScan: (reason: string) => unknown,\n): Promise<ReconcileOutcome | null> {\n  const deviceId = state.deviceId;\n  if (!deviceId) return null;\n\n  // 1. Refresh the local digest cache incrementally — re-parse only files whose\n  //    mtime changed; reuse cached counts for everything else.\n  const jobs = await discoverJobs(deviceId);\n  const present = new Set(jobs.map((j) => j.path));\n  const cache = runtimeState.getReconcileCache();\n  let filesParsed = 0;\n  for (const job of jobs) {\n    const mtime = (await stat(job.path).catch(() => null))?.mtimeMs ?? 0;\n    const hit = cache[job.path];\n    if (hit && hit.mtime === mtime) continue; // unchanged — reuse cached counts\n    const perDaySession: PerDaySession = {};\n    try {\n      await job.parse(async (chunk: RawEvent[]) => {\n        for (const e of chunk) {\n          const bySession = (perDaySession[utcDay(e.ts)] ??= {});\n          bySession[e.session_id] = (bySession[e.session_id] ?? 0) + 1;\n        }\n      });\n      cache[job.path] = { mtime, perDaySession };\n      filesParsed += 1;\n    } catch (e) {\n      console.warn(`  ! reconcile parse failed for ${job.path}:`, (e as Error).message);\n    }\n  }\n  // GC: drop cache + cursor entries for files that no longer exist, so on-disk\n  // state tracks the CURRENT file set rather than everything ever seen.\n  for (const p of Object.keys(cache)) if (!present.has(p)) delete cache[p];\n  runtimeState.setReconcileCache(cache);\n  runtimeState.pruneCursors(present);\n\n  // 2. Roll the cache up → local per-day totals, per-(day,session) counts, and\n  //    the file(s) each (day,session) lives in (for precise re-ship).\n  const localDay = new Map<string, number>();\n  const localDaySession = new Map<string, Map<string, number>>();\n  const filesOf = new Map<string, Set<string>>(); // `${day}\\0${session}` → files\n  let localEvents = 0;\n  for (const [path, entry] of Object.entries(cache)) {\n    for (const [day, sessions] of Object.entries(entry.perDaySession)) {\n      let ds = localDaySession.get(day);\n      if (!ds) {\n        ds = new Map();\n        localDaySession.set(day, ds);\n      }\n      for (const [sid, n] of Object.entries(sessions)) {\n        localEvents += n;\n        localDay.set(day, (localDay.get(day) ?? 0) + n);\n        ds.set(sid, (ds.get(sid) ?? 0) + n);\n        const key = `${day}\\0${sid}`;\n        let fs = filesOf.get(key);\n        if (!fs) {\n          fs = new Set();\n          filesOf.set(key, fs);\n        }\n        fs.add(path);\n      }\n    }\n  }\n\n  // 3. Top of the tree: totals. The daemon only ADDS and the server digest is\n  //    device-scoped, so `server >= local` ⇒ nothing to push.\n  const serverDays = await fetchBackfillDays();\n  if (!serverDays) return null;\n  const base: ReconcileOutcome = {\n    inSync: true,\n    localEvents,\n    serverEvents: serverDays.total_events,\n    filesParsed,\n    daysChecked: 0,\n    sessionsShort: 0,\n    sessionsDeferred: 0,\n    filesInvalidated: 0,\n  };\n  if (localEvents <= serverDays.total_events) return base;\n\n  // Settle cutoff: only reconcile calendar days STRICTLY OLDER than this. The\n  // server ingests asynchronously, so recent days legitimately lag local — a\n  // shortfall there is in-flight data, not loss. `utcDay` of (now − settle).\n  const now = Date.now();\n  const cutoffDay = utcDay(new Date(now - RESHIP_SETTLE_MS).toISOString());\n\n  // 4. Drill only into days the server is short on AND old enough to have settled.\n  const serverDayMap = new Map(serverDays.days.map((d) => [d.day, d.events]));\n  const reship = runtimeState.getReshipState();\n  const seenKeys = new Set<string>(); // (day,session) keys observed this pass — for GC\n  const filesToReship = new Set<string>();\n  let sessionsShort = 0;\n  let sessionsDeferred = 0;\n  let daysChecked = 0;\n  for (const [day, localCount] of localDay) {\n    if (localCount <= (serverDayMap.get(day) ?? 0)) continue; // day in sync\n    if (day >= cutoffDay) {\n      // Too recent to trust the digest (still settling server-side) — defer the\n      // whole day to a later pass. Count its sessions as deferred so the\n      // deferral is observable; no per-session digest fetch needed.\n      sessionsDeferred += localDaySession.get(day)?.size ?? 0;\n      continue;\n    }\n    daysChecked += 1;\n    const serverSessions = await fetchBackfillDaySessions(day);\n    const serverHave = new Map(\n      (serverSessions?.sessions ?? []).map((s) => [s.session_id, s.events]),\n    );\n    for (const [sid, n] of localDaySession.get(day) ?? []) {\n      const key = `${day}\\0${sid}`;\n      seenKeys.add(key);\n      const deficit = n - (serverHave.get(sid) ?? 0);\n      if (deficit <= 0) {\n        // In sync — drop any stale backoff bookkeeping for it.\n        if (reship[key]) delete reship[key];\n        continue;\n      }\n      // Guard 2: ignore a tiny shortfall (benign skew, not loss).\n      if (deficit <= RESHIP_MIN_DEFICIT) {\n        sessionsDeferred += 1;\n        continue;\n      }\n      // Guard 3: exponential backoff once we've already re-shipped this\n      // (day,session) and the server is STILL short (i.e. it deduped). The\n      // first time we see a session short there's no record, so it re-ships\n      // immediately; subsequent passes wait 30min·2^(attempts-1) (capped 24h).\n      const rec = reship[key];\n      if (rec && rec.attempts > 0) {\n        const wait = Math.min(\n          RESHIP_BACKOFF_BASE_MS * 2 ** (rec.attempts - 1),\n          RESHIP_BACKOFF_MAX_MS,\n        );\n        if (now - rec.lastAt < wait) {\n          sessionsDeferred += 1;\n          continue; // still inside the backoff window\n        }\n      }\n      sessionsShort += 1;\n      reship[key] = { attempts: (rec?.attempts ?? 0) + 1, lastAt: now };\n      for (const f of filesOf.get(key) ?? []) filesToReship.add(f);\n    }\n  }\n  // GC: drop backoff records for (day,session) pairs we no longer see as short\n  // OR no longer have locally, so the map tracks the current short set, not\n  // every session ever re-shipped.\n  for (const key of Object.keys(reship)) {\n    if (!seenKeys.has(key)) delete reship[key];\n  }\n  runtimeState.setReshipState(reship);\n\n  if (filesToReship.size === 0) {\n    return { ...base, daysChecked, sessionsDeferred };\n  }\n  for (const f of filesToReship) runtimeState.clearCursor(f);\n  console.log(\n    `[modelstat] self-heal: server short ${sessionsShort} session(s) across ${daysChecked} day(s) ` +\n      `(${sessionsDeferred} deferred by grace band); re-shipping ${filesToReship.size} file(s) from local logs`,\n  );\n  await requestScan(\"self-heal\");\n  return {\n    ...base,\n    inSync: false,\n    daysChecked,\n    sessionsShort,\n    sessionsDeferred,\n    filesInvalidated: filesToReship.size,\n  };\n}\n","/**\n * Coalescing single-flight runner.\n *\n * Wraps an async task so that **at most one invocation runs at a time**\n * and overlapping requests collapse into a single follow-up run rather\n * than stacking up.\n *\n * Why this exists — it is the load-bearing bound on the daemon's memory.\n * The daemon (apps/daemon/src/daemon.ts) triggers `runScanCycle` from\n * three places: the startup boot, the chokidar file-watcher (debounced),\n * and a 5-minute backstop `setInterval`. None of those checked whether a\n * scan was already in progress. During a long backfill a single\n * `scanAll()` runs for *hours* — the per-segment Qwen summariser is the\n * hard throughput bottleneck and every scan funnels through one\n * serialized inference queue — so the backstop and watcher kept admitting\n * fresh, concurrent `scanAll()` runs faster than they could finish. Each\n * parked scan retains its history-sized `jobs` array plus its event\n * buffers for its entire (now very long) lifetime, so in-flight scan\n * state accumulated without limit until V8's old-space hit\n * `--max-old-space-size` and the process died with\n *   \"FATAL ERROR: Ineffective mark-compacts near heap limit\".\n *\n * Routing every trigger through one coalescing runner caps concurrent\n * scan state to exactly one `scanAll()`, which holds steady memory across\n * an unbounded backfill. A request that arrives mid-scan is not dropped:\n * exactly one more scan runs after the current one drains, so the final\n * scan always reflects the most recent on-disk state.\n *\n * Guarantees:\n *   - `task` never runs concurrently with itself.\n *   - If `trigger()` is called while `task` is running, exactly one more\n *     run happens after the current one completes. Multiple triggers\n *     during a run coalesce into that single follow-up; the most recent\n *     argument wins.\n *   - `task` errors are swallowed (the task owns its own error\n *     reporting): a throw never drops a queued follow-up and never\n *     escapes as an unhandled rejection from a `void trigger(...)` call.\n */\nexport interface CoalescingRunner<A> {\n  /**\n   * Request a run. Starts immediately if idle; otherwise records that\n   * one more run is needed once the active run finishes. Returns the\n   * promise for the currently-running chain (settles when the runner\n   * goes idle), so a caller that wants to await completion — e.g. the\n   * startup boot — can.\n   */\n  trigger: (arg: A) => Promise<void>;\n  /** True while a run is in progress. Exposed for tests / diagnostics. */\n  isRunning: () => boolean;\n  /** True while a follow-up run is queued behind the active one. */\n  isPending: () => boolean;\n  /**\n   * Resolve once the runner is idle — the active chain (plus any coalesced\n   * follow-up it picks up) has fully drained. Resolves immediately when idle.\n   * Used at shutdown to let an in-flight scan settle before tearing down the\n   * bundled summariser's Metal device (a scan mid-inference + a device free =\n   * the llama.cpp teardown abort). Never rejects — the chain swallows errors.\n   */\n  idle: () => Promise<void>;\n}\n\nexport function createCoalescingRunner<A>(\n  task: (arg: A) => Promise<void>,\n): CoalescingRunner<A> {\n  let running = false;\n  // The single coalesced follow-up request, if any. Only the most\n  // recent one is kept — that is the whole point of coalescing.\n  let next: { arg: A } | null = null;\n  let chain: Promise<void> = Promise.resolve();\n\n  function trigger(arg: A): Promise<void> {\n    if (running) {\n      // A scan is active — do NOT start a concurrent one. Remember that\n      // another pass is needed and which reason triggered it; the\n      // running chain will pick it up when it next checks.\n      next = { arg };\n      return chain;\n    }\n    running = true;\n    chain = (async () => {\n      let cur: A = arg;\n      try {\n        for (;;) {\n          try {\n            await task(cur);\n          } catch {\n            // task reports its own failures; swallow so a throw can't\n            // drop the coalesced follow-up below or orphan a rejection.\n          }\n          // No `await` between this check and clearing `running` in the\n          // finally block, so a trigger() cannot race into that gap:\n          // either it arrived during `await task(...)` (caught here) or\n          // it will observe `running === false` and start a fresh chain.\n          if (!next) break;\n          cur = next.arg;\n          next = null;\n        }\n      } finally {\n        running = false;\n      }\n    })();\n    return chain;\n  }\n\n  // Await the current chain to its end. `chain` is reassigned per fresh run, so\n  // awaiting the latest reference settles after the active run AND any follow-up\n  // it coalesces. `chain` never rejects (the loop swallows task errors), so this\n  // resolves cleanly even on a failing scan.\n  async function idle(): Promise<void> {\n    await chain;\n  }\n\n  return {\n    trigger,\n    isRunning: () => running,\n    isPending: () => next !== null,\n    idle,\n  };\n}\n","/**\n * Local processing-pipeline version — the marker that lets a new\n * daemon build force a re-scan of every previously-uploaded session.\n *\n * Why we need it: file cursors in `state.cursor` track \"I've uploaded\n * up to byte N of this JSONL\", so a normal restart only ships new\n * events. But when we change the pipeline itself (new summariser\n * model, different sampling, new redaction pass, new segment\n * boundary heuristics), every previously-uploaded segment is now\n * stale even though the underlying JSONL hasn't moved.\n *\n * The fix: bake a single integer into this file. On startup the\n * daemon compares it to the integer written into `state.cursor`'s\n * sibling field. If the compiled-in version is HIGHER than the\n * stored one, wipe every cursor so the next scan re-reads the world\n * from the start, runs every event through the current pipeline,\n * and ships fresh segments.\n *\n * **Bump this whenever the segment shape changes.** Example\n * triggers — DO bump:\n *   • Summariser model swap (e.g. Ollama → bundled Qwen3.5-4B in 0.0.27).\n *   • Summariser prompt change that materially shifts output.\n *   • Excerpt sampling strategy / size cap.\n *   • Segment boundary heuristic change.\n *   • PII redaction rules.\n *   • content_excerpt extraction in a parser (claude-code, codex, etc).\n *\n * Don't bump for:\n *   • Bugfixes that don't affect segment content.\n *   • Heartbeat / discovery / service-install changes.\n *   • Dashboard or backend-only changes.\n *\n * A re-scan REPLACES existing segments by segment_id in place — no\n * duplicates, no orphans. (Where the segment_id hash doesn't change\n * because the inputs didn't change, but the abstract does because the\n * summariser did.)\n */\n\n/** Current local processing-pipeline version. Bump when the\n * pipeline produces materially different segments for the same\n * input events.\n *\n * v1 — pre-versioning baseline (anything that hasn't recorded a\n *      version yet maps to v1).\n * v2 — bundled Qwen3.5-4B summariser, density-first prompt,\n *      char-bounded segments (SEGMENT_MAX_CONTENT_CHARS=12000),\n *      richer excerpt sampling (7×350 chars). Shipped 0.0.28.\n * v3 — client-side cognition pass (Mood + Mind tags appended to\n *      every abstract). The tags travel inside the abstract text, so\n *      they need no dedicated wire field. Shipped 0.0.35.\n * v4 — per-session titles (IngestBatch.session_titles) generated by\n *      the local titler from segment abstracts. Re-scan so every\n *      historical session gets a title, not just ones that change\n *      after the upgrade.\n * v5 — tool_call extraction. Parsers populate RawEvent.tool_calls\n *      (aggregate identity → count map) and emit per-call\n *      ToolCallWire records on IngestBatch.tool_calls. The populated\n *      maps feed turnSurface → segment-boundary embeddings, so\n *      boundaries (and therefore segment_ids) shift; the wipe forces\n *      a full re-parse so historical transcripts get tool_call rows\n *      plus the new `tool_calls` segment tags.\n * v6 — defense-in-depth redaction. The shipped `command_redacted` (and\n *      script summaries) now go through layers 2+3 — the on-device\n *      Privacy Filter (NER/PII) + the local-LLM secret backstop — not\n *      just the regex floor, and the floor's `env_secret` rule was fixed\n *      to catch bare `SECRET=`/`TOKEN=` names. Re-scan so historical\n *      transcripts are re-redacted from the raw logs through the full\n *      stack (the raw never left the device, so only the daemon can).\n * v7 — canonical project slugs. `resolveGitContext` now resolves the git\n *      remote from the MAIN repo for ephemeral `.claude` worktrees (deleted by\n *      parse time), instead of path-guessing a different slug than the repo's\n *      live sessions (`acme` vs `acme/acme`). Re-scan so every historical\n *      session re-resolves to its one canonical remote slug — only the daemon\n *      can, from the raw transcripts on disk.\n * v8 — on-device embedder + PII/NER redactor now actually ship. The daemon\n *      stages the bundled @huggingface/transformers runtime, so (a) the\n *      segmenter's turn embeddings are REAL (semantic cosine-distance\n *      boundaries) instead of the time-gap/max-turns fallback — segment\n *      boundaries, and therefore segment_ids, shift — and (b) redaction layer 2\n *      (the Privacy-Filter NER/PII model) engages on top of the regex floor +\n *      local-LLM backstop. Re-scan so every historical transcript is\n *      re-segmented and re-redacted through the full on-device stack (only the\n *      daemon can, from the raw on disk).\n * v9 — NER redaction model fix. v8's default `openai/privacy-filter` is NOT\n *      loadable by Transformers.js (unsupported `model_type`), so redaction\n *      layer 2 silently fell through to pass-through — it never actually ran.\n *      Switched to `Xenova/bert-base-NER` (q8), a supported architecture that\n *      loads on-device and redacts person/org/location entities. Re-scan so\n *      historical transcripts are re-redacted with the layer that finally works.\n * v10 — richer abstracts + behavioral signal (Insights feature). The summariser\n *      prompt now mandates the concrete action + object + target (repo/branch/\n *      service), and the abstract cap rose 240→400 chars, so abstracts read like\n *      \"Triggered a GitHub Actions release for acme/web\" instead of a vague\n *      one-liner. Each segment also carries a new privacy-preserving `behavior`\n *      signal (user_turns / correction_count / frustration — counts only, never\n *      raw text) for server-side prompt-friction detection. Re-scan so historical\n *      segments get the richer abstract + the behavior signal (only the daemon\n *      can, from the raw transcripts on disk).\n * v11 — user-intent distillation (Insights v2). Each segment now carries a\n *      `user_intent` distilled from the DEVELOPER'S MESSAGES ONLY (redacted,\n *      on-device): \"what did the user ask for / how did they direct the AI\" —\n *      the source the rule + skill insights mine instead of the agent's tool\n *      calls (which made every skill look like a git operation). Re-scan so\n *      historical segments gain user_intent — only the daemon can, from the raw\n *      messages on disk.\n * v12 — local-time temporal hints: each segment carries `time_of_day`\n *      (Morning/Midday/Evening/Night) + `cadence` (Weekday/Friday/Weekend),\n *      computed from the engineer's LOCAL wall-clock (only the daemon can — the\n *      server sees UTC). Feed the Time-of-Day + Cadence taxonomy dimensions.\n *      Re-scan so historical segments gain them.\n * v13 — cognition mood + posture hints: the cognition pass now also tags the\n *      working STANCE (posture — ship-it / cautious / questioning / easygoing)\n *      alongside mood, and the daemon ships the PRIMARY mood + posture as\n *      structured `mood`/`posture` hints (not just the abstract suffix) so the\n *      server's Mood + Posture taxonomy dimensions populate — real-data-only, a\n *      bucket per tag that actually occurred. Re-scan so historical segments\n *      gain them.\n * v14 — cognition MIND hint: the daemon now also ships the primary mental-mode\n *      tag (the cognition `meta` field — focused / scattered / in-flow / deliberate)\n *      as a structured `mind` hint, feeding the server's Mind taxonomy dimension\n *      (the cognitive-mode counterpart to Mood + Posture). Re-scan so historical\n *      segments gain it.\n * v15 — authoritative project slugs. The `projects` hint (→ the Workstreams /\n *      \"Spend by Repo\" dimension) now keys on the git remote read from `.git`\n *      on disk (`resolveAuthoritativeGit`, run before segmentation) instead of\n *      the parser's path guess, which mistook an in-repo `…/src/<a>/<b>` subtree\n *      for a repository (e.g. the subdirectory `accounting/controllers`).\n *      Re-scan so historical segments re-tag to their real owner/repo — only\n *      the daemon can, from the repos on disk.\n */\nexport const PROCESSING_VERSION = 15;\n\nexport interface ProcessingState {\n  processingVersion: number | null;\n  setProcessingVersion(v: number): void;\n  wipeCursors(): void;\n}\n\n/**\n * On startup: if the stored processing version is older than the\n * compiled-in one (or absent), wipe cursors and stamp the new\n * version. Returns a description of what happened so the caller can\n * surface it in startup logs.\n */\nexport function reconcileProcessingVersion(state: ProcessingState): {\n  changed: boolean;\n  from: number;\n  to: number;\n} {\n  const stored = state.processingVersion ?? 1;\n  if (stored >= PROCESSING_VERSION) {\n    return { changed: false, from: stored, to: PROCESSING_VERSION };\n  }\n  state.wipeCursors();\n  state.setProcessingVersion(PROCESSING_VERSION);\n  return { changed: true, from: stored, to: PROCESSING_VERSION };\n}\n","/**\n * The unified loader. One pipeline, one fallback ladder, reused by every\n * config kind on both Node and the browser.\n *\n *   loadRemoteConfig(kind, env):\n *     1. read the disk cache (re-validated)               ── cheap, offline-safe\n *     2. GET {api}/v1/config/{kind}                        ── the current payload\n *     3. validate the payload + version-gate vs the cache  ── ignore a stale/older one\n *     4. write-through to the cache, return the new value\n *\n *   FALLBACK LADDER (any failure — offline / schema-invalid / older-version):\n *   remote → disk (last good) → bundled default. Fail-closed: a failure\n *   never clobbers good state.\n *\n * Trust is the TLS connection to the modelstat origin; the client only\n * validates the payload's shape and version. `RemoteConfigStore` adds the\n * long-lived-daemon shape: seed from disk at startup (instant, no network),\n * then refresh on a timer, always serving the best value held in memory.\n */\n\nimport type { ConfigKind, ConfigSource, LoadResult, RemoteConfigEnv } from \"./types.js\";\n\ntype AnyConfigKind = ConfigKind<{ version: number }>;\n\nfunction getFetch(env: RemoteConfigEnv): typeof fetch {\n  return env.fetch ?? fetch;\n}\n\n/** GET + validate the current payload for a kind. Null on any failure. */\nasync function fetchConfig<T extends { version: number }>(\n  kind: ConfigKind<T>,\n  env: RemoteConfigEnv,\n): Promise<{ value: T; version: number } | null> {\n  const url = `${env.apiUrl.replace(/\\/+$/, \"\")}/v1/config/${encodeURIComponent(kind.kind)}`;\n  let body: unknown;\n  try {\n    const res = await getFetch(env)(url);\n    if (!res.ok) throw new Error(`status ${res.status}`);\n    body = await res.json();\n  } catch (e) {\n    env.logger?.warn?.(`[remote-config] ${kind.kind} fetch failed`, e);\n    return null;\n  }\n  const parsed = kind.schema.safeParse(body);\n  if (!parsed.success) {\n    env.logger?.warn?.(`[remote-config] ${kind.kind} payload schema invalid`);\n    return null;\n  }\n  return { value: parsed.data, version: parsed.data.version };\n}\n\n/**\n * Read the cache and RE-VALIDATE it against the kind schema. We never trust\n * bytes on disk just because we wrote them once — a torn or tampered file\n * is rejected exactly like a bad network response, and we fall through.\n */\nasync function readCachedConfig<T extends { version: number }>(\n  kind: ConfigKind<T>,\n  env: RemoteConfigEnv,\n): Promise<{ value: T; version: number } | null> {\n  if (!env.cache) return null;\n  let raw: unknown;\n  try {\n    raw = await env.cache.read(kind.kind);\n  } catch (e) {\n    env.logger?.warn?.(`[remote-config] ${kind.kind} cache read failed`, e);\n    return null;\n  }\n  if (raw == null) return null;\n  const parsed = kind.schema.safeParse(raw);\n  if (!parsed.success) {\n    env.logger?.warn?.(`[remote-config] ${kind.kind} disk cache rejected`);\n    return null;\n  }\n  return { value: parsed.data, version: parsed.data.version };\n}\n\nasync function writeCache(\n  kind: AnyConfigKind,\n  env: RemoteConfigEnv,\n  value: unknown,\n): Promise<void> {\n  if (!env.cache) return;\n  try {\n    await env.cache.write(kind.kind, value);\n  } catch (e) {\n    env.logger?.warn?.(`[remote-config] ${kind.kind} cache write failed`, e);\n  }\n}\n\n/**\n * One-shot load with the full ladder: try remote (version-gated against the\n * disk cache), else the last good disk cache, else the bundled default.\n * Always resolves to a usable value.\n */\nexport async function loadRemoteConfig<T extends { version: number }>(\n  kind: ConfigKind<T>,\n  env: RemoteConfigEnv,\n): Promise<LoadResult<T>> {\n  const cached = await readCachedConfig(kind, env);\n  const fetched = await fetchConfig(kind, env);\n\n  if (fetched && (!cached || fetched.version >= cached.version)) {\n    // Only touch the disk when the value actually moved forward.\n    if (!cached || fetched.version > cached.version) await writeCache(kind, env, fetched.value);\n    return result(kind.kind, fetched.value, fetched.version, \"remote\");\n  }\n  if (cached) return result(kind.kind, cached.value, cached.version, \"disk\");\n  return result(kind.kind, kind.bundledFallback, kind.bundledFallback.version, \"bundled\");\n}\n\nfunction result<T>(kind: string, value: T, version: number, source: ConfigSource): LoadResult<T> {\n  return { kind, value, version, source };\n}\n\ninterface StateEntry {\n  value: { version: number };\n  version: number;\n  source: ConfigSource;\n}\n\n/**\n * Long-lived in-memory registry over many kinds. Built for the daemon:\n * seed from disk at startup, expose an instant `get`, and `refresh` on a\n * timer. A failed refresh keeps the current value.\n */\nexport class RemoteConfigStore {\n  private readonly env: RemoteConfigEnv;\n  private readonly kinds: Map<string, AnyConfigKind>;\n  private readonly state = new Map<string, StateEntry>();\n\n  constructor(env: RemoteConfigEnv, kinds: readonly AnyConfigKind[]) {\n    this.env = env;\n    this.kinds = new Map(kinds.map((k) => [k.kind, k]));\n    // Seed every kind with its bundled fallback so `get` is total from the\n    // very first tick, before any disk read or network call.\n    for (const k of kinds) {\n      this.state.set(k.kind, {\n        value: k.bundledFallback,\n        version: k.bundledFallback.version,\n        source: \"bundled\",\n      });\n    }\n  }\n\n  /** Seed from the disk cache without touching the network — the instant,\n   * offline-safe startup path. Call once, then `refreshAll` in the\n   * background. Anything not on disk (or rejected) stays on its fallback. */\n  async initFromCache(): Promise<void> {\n    await Promise.all(\n      [...this.kinds.values()].map(async (k) => {\n        const cached = await readCachedConfig(k, this.env);\n        const current = this.state.get(k.kind);\n        if (cached && (!current || cached.version >= current.version)) {\n          this.state.set(k.kind, { value: cached.value, version: cached.version, source: \"disk\" });\n        }\n      }),\n    );\n  }\n\n  /** Fetch one kind, swapping it in only if strictly newer. Never throws\n   * and never downgrades the held value on failure. */\n  async refresh(kindName: string): Promise<void> {\n    const kind = this.kinds.get(kindName);\n    if (!kind) throw new Error(`unknown config kind: ${kindName}`);\n    const current = this.state.get(kindName);\n    const currentVersion = current?.version ?? kind.bundledFallback.version;\n\n    const fetched = await fetchConfig(kind, this.env);\n    if (!fetched) return;\n    if (fetched.version <= currentVersion) return; // version gate\n\n    await writeCache(kind, this.env, fetched.value);\n    this.state.set(kindName, { value: fetched.value, version: fetched.version, source: \"remote\" });\n  }\n\n  async refreshAll(): Promise<void> {\n    await Promise.all([...this.kinds.keys()].map((k) => this.refresh(k)));\n  }\n\n  /** The current best value for a kind. Total — falls back to bundled. */\n  get<T extends { version: number }>(kindName: string): T {\n    const entry = this.state.get(kindName);\n    if (!entry) throw new Error(`unknown config kind: ${kindName}`);\n    return entry.value as T;\n  }\n\n  /** Like `get`, but also reports the version + provenance. */\n  getResult<T extends { version: number }>(kindName: string): LoadResult<T> {\n    const entry = this.state.get(kindName);\n    if (!entry) throw new Error(`unknown config kind: ${kindName}`);\n    return result(kindName, entry.value as T, entry.version, entry.source);\n  }\n}\n","/**\n * The config wire contract.\n *\n * Each kind is served at `GET /v1/config/{kind}` as a plain JSON payload\n * carrying a monotonic `version`. Trust is the TLS connection to the\n * modelstat origin; the client validates the payload's shape (a per-kind\n * Zod schema) and version-gates against what it already holds. Per-kind\n * payload schemas extend `VersionedConfig`.\n */\n\nimport { z } from \"zod\";\n\nexport const VersionedConfig = z.object({\n  version: z.number().int().nonnegative(),\n});\nexport type VersionedConfig = z.infer<typeof VersionedConfig>;\n","/**\n * Shared interfaces for the loader. The host environment (Node daemon,\n * extension service worker, or a test) supplies a `RemoteConfigEnv`; the\n * loader stays free of any platform-specific code.\n */\n\nimport type { ZodType } from \"zod\";\n\n/** A minimal logger sink. Every method is optional and the package\n * defaults to silence, so a host opts in to whatever noise it wants. */\nexport interface Logger {\n  info?(msg: string, ...args: unknown[]): void;\n  warn?(msg: string, ...args: unknown[]): void;\n  error?(msg: string, ...args: unknown[]): void;\n}\n\n/**\n * One config kind: its name, its payload schema, and the value compiled\n * into the binary that is used when nothing better is available. The\n * payload must carry a numeric `version`.\n */\nexport interface ConfigKind<T extends { version: number }> {\n  kind: string;\n  schema: ZodType<T>;\n  bundledFallback: T;\n}\n\n/**\n * Pluggable persistence for the last good config payload, per kind. The\n * daemon backs this with disk (`./node.ts` — the piece the extension's\n * in-memory-only model lacks); a browser could back it with IndexedDB;\n * tests use the in-memory store. The stored value is the raw payload — the\n * loader re-validates it on read, so a torn or tampered file is simply\n * rejected and treated as \"no cache\".\n */\nexport interface CacheStore {\n  read(kind: string): Promise<unknown | null>;\n  write(kind: string, payload: unknown): Promise<void>;\n}\n\n/** Everything the loader needs from its host environment. */\nexport interface RemoteConfigEnv {\n  /** Base URL for the config API, e.g. `https://modelstat.ai`. */\n  apiUrl: string;\n  /** Injectable fetch; defaults to the global `fetch`. */\n  fetch?: typeof fetch;\n  /** Persistence for the last good payload; omit for memory-only operation. */\n  cache?: CacheStore;\n  logger?: Logger;\n}\n\n/** Where the currently-held value came from, best → worst. */\nexport type ConfigSource = \"remote\" | \"disk\" | \"bundled\";\n\nexport interface LoadResult<T> {\n  kind: string;\n  value: T;\n  version: number;\n  source: ConfigSource;\n}\n","/**\n * `@modelstat/remote-config` — the server-driven config loader.\n *\n * The spine of the server-driven daemon: fetch a config payload from the\n * modelstat origin over TLS, validate its shape, cache it to disk, and fall\n * back gracefully (memory → disk → bundled) on any failure. One mechanism\n * for every evolving config kind.\n *\n * This entry point is environment-agnostic (Node + browser). The Node disk\n * cache lives on the `./node` subpath so a browser bundle never pulls in\n * `node:fs`.\n */\n\nexport * from \"./loader.js\";\nexport * from \"./schema.js\";\nexport * from \"./types.js\";\n","/**\n * Node disk cache — the one piece the extension's in-memory model lacks.\n *\n * The extension's service worker reboots constantly, so it always\n * re-bootstraps from the bundled default; that is fine for a browser but\n * wrong for a long-lived daemon. A daemon that restarts while offline must\n * come back on the last config it fetched, not the shipped baseline. So we\n * persist each kind's payload to disk, next to identity.json.\n *\n * Layout (`~/.modelstat/config/`):\n *   {kind}.json   the last good config payload (human-readable JSON)\n *\n * Writes are atomic (tmp + rename), mirroring identity.ts and the daemon\n * status writer. The payload is re-validated on read by the loader, so a\n * torn, missing, or tampered file simply reads back as \"no cache\" and the\n * loader falls through — never a hard failure.\n */\n\nimport { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { CacheStore } from \"./types.js\";\n\nfunction defaultRoot(): string {\n  return join(homedir(), \".modelstat\", \"config\");\n}\n\n/** Kinds are compiled-in slugs, but this is the value that names a file,\n * so refuse anything that could escape the cache directory. */\nfunction safeKind(kind: string): string {\n  if (!/^[a-z0-9_-]{1,64}$/.test(kind)) throw new Error(`unsafe config kind: ${kind}`);\n  return kind;\n}\n\nexport interface NodeDiskCacheOptions {\n  /** Override the cache directory. Defaults to ~/.modelstat/config. */\n  dir?: string;\n}\n\nexport function createNodeDiskCache(opts: NodeDiskCacheOptions = {}): CacheStore {\n  const dir = opts.dir ?? defaultRoot();\n\n  async function writeAtomic(path: string, data: string): Promise<void> {\n    const tmp = `${path}.${process.pid}.tmp`;\n    await writeFile(tmp, data, { mode: 0o600 });\n    await rename(tmp, path);\n    try {\n      await chmod(path, 0o600);\n    } catch {\n      /* best effort — rename already preserved tmp's mode on most platforms */\n    }\n  }\n\n  return {\n    async read(kind: string): Promise<unknown | null> {\n      const k = safeKind(kind);\n      try {\n        const raw = await readFile(join(dir, `${k}.json`), \"utf8\");\n        return JSON.parse(raw);\n      } catch {\n        return null;\n      }\n    },\n\n    async write(kind: string, payload: unknown): Promise<void> {\n      const k = safeKind(kind);\n      await mkdir(dir, { recursive: true, mode: 0o700 });\n      await writeAtomic(join(dir, `${k}.json`), `${JSON.stringify(payload)}\\n`);\n    },\n  };\n}\n","/**\n * Wire the `policies` augment into the long-lived daemon. Loads the\n * `policies` config kind via `@modelstat/remote-config` (disk-cache-first,\n * additive-only) and applies the patterns to the in-process redaction floor.\n *\n * The floor itself is irreducible and compiled into the binary\n * (`@modelstat/core/redact`); this path can only ever ADD patterns over it. If\n * the network, the disk cache, and the bundled fallback all somehow produced\n * nothing, the floor still applies — fail-closed by construction. A malformed\n * payload, a stale bundle, or an offline boot all degrade to \"floor only\",\n * never to \"floor weakened\".\n */\n\nimport {\n  compilePolicyPatterns,\n  POLICIES_CONFIG_KIND,\n  type RedactionPolicyBundle,\n  setRemoteRedactionPatterns,\n} from \"@modelstat/core\";\nimport {\n  type ConfigKind,\n  type Logger,\n  type RemoteConfigEnv,\n  RemoteConfigStore,\n} from \"@modelstat/remote-config\";\nimport { createNodeDiskCache } from \"@modelstat/remote-config/node\";\n\nconst DEFAULT_REFRESH_MS = 15 * 60 * 1000;\n\nexport interface PolicyRefresherOptions {\n  /** API origin, e.g. `https://modelstat.ai`. */\n  apiUrl: string;\n  /** Injectable fetch (tests). Defaults to the global `fetch`. */\n  fetch?: typeof fetch;\n  /** Override the disk-cache dir (tests). Default `~/.modelstat/config`. */\n  cacheDir?: string;\n  /** Refresh cadence; default 15 min (matches the daemon's other timers). */\n  intervalMs?: number;\n  logger?: Logger;\n}\n\nexport interface PolicyRefresher {\n  /** Seed from disk (offline-safe) + apply, then kick a background refresh and\n   * start the periodic timer. */\n  start(): Promise<void>;\n  /** Fetch + verify + apply once. Never throws. */\n  refresh(): Promise<void>;\n  /** Stop the periodic timer. */\n  stop(): void;\n}\n\nconst policiesKind: ConfigKind<RedactionPolicyBundle> = POLICIES_CONFIG_KIND;\n\n/**\n * Build a refresher for the signed `policies` augment. Construct it once at\n * daemon startup (next to the heartbeat/discovery timers) and call `start()`.\n */\nexport function createPolicyRefresher(opts: PolicyRefresherOptions): PolicyRefresher {\n  const env: RemoteConfigEnv = {\n    apiUrl: opts.apiUrl,\n    cache: createNodeDiskCache(opts.cacheDir ? { dir: opts.cacheDir } : {}),\n    ...(opts.fetch ? { fetch: opts.fetch } : {}),\n    ...(opts.logger ? { logger: opts.logger } : {}),\n  };\n  const store = new RemoteConfigStore(env, [policiesKind]);\n  let timer: ReturnType<typeof setInterval> | null = null;\n\n  const apply = (): void => {\n    const bundle = store.get<RedactionPolicyBundle>(\"policies\");\n    setRemoteRedactionPatterns(compilePolicyPatterns(bundle));\n  };\n\n  const refresh = async (): Promise<void> => {\n    await store.refresh(\"policies\");\n    apply();\n  };\n\n  return {\n    async start(): Promise<void> {\n      await store.initFromCache(); // instant, offline-safe (disk → bundled)\n      apply();\n      void refresh().catch(() => {}); // first network refresh in the background\n      timer = setInterval(\n        () => void refresh().catch(() => {}),\n        opts.intervalMs ?? DEFAULT_REFRESH_MS,\n      );\n      timer.unref?.();\n    },\n    refresh,\n    stop(): void {\n      if (timer) clearInterval(timer);\n      timer = null;\n    },\n  };\n}\n","import { stat, lstat, readdir, realpath } from 'node:fs/promises';\nimport { Readable } from 'node:stream';\nimport { resolve as presolve, relative as prelative, join as pjoin, sep as psep } from 'node:path';\nexport const EntryTypes = {\n    FILE_TYPE: 'files',\n    DIR_TYPE: 'directories',\n    FILE_DIR_TYPE: 'files_directories',\n    EVERYTHING_TYPE: 'all',\n};\nconst defaultOptions = {\n    root: '.',\n    fileFilter: (_entryInfo) => true,\n    directoryFilter: (_entryInfo) => true,\n    type: EntryTypes.FILE_TYPE,\n    lstat: false,\n    depth: 2147483648,\n    alwaysStat: false,\n    highWaterMark: 4096,\n};\nObject.freeze(defaultOptions);\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst ALL_TYPES = [\n    EntryTypes.DIR_TYPE,\n    EntryTypes.EVERYTHING_TYPE,\n    EntryTypes.FILE_DIR_TYPE,\n    EntryTypes.FILE_TYPE,\n];\nconst DIR_TYPES = new Set([\n    EntryTypes.DIR_TYPE,\n    EntryTypes.EVERYTHING_TYPE,\n    EntryTypes.FILE_DIR_TYPE,\n]);\nconst FILE_TYPES = new Set([\n    EntryTypes.EVERYTHING_TYPE,\n    EntryTypes.FILE_DIR_TYPE,\n    EntryTypes.FILE_TYPE,\n]);\nconst isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);\nconst wantBigintFsStats = process.platform === 'win32';\nconst emptyFn = (_entryInfo) => true;\nconst normalizeFilter = (filter) => {\n    if (filter === undefined)\n        return emptyFn;\n    if (typeof filter === 'function')\n        return filter;\n    if (typeof filter === 'string') {\n        const fl = filter.trim();\n        return (entry) => entry.basename === fl;\n    }\n    if (Array.isArray(filter)) {\n        const trItems = filter.map((item) => item.trim());\n        return (entry) => trItems.some((f) => entry.basename === f);\n    }\n    return emptyFn;\n};\n/** Readable readdir stream, emitting new files as they're being listed. */\nexport class ReaddirpStream extends Readable {\n    constructor(options = {}) {\n        super({\n            objectMode: true,\n            autoDestroy: true,\n            highWaterMark: options.highWaterMark,\n        });\n        const opts = { ...defaultOptions, ...options };\n        const { root, type } = opts;\n        this._fileFilter = normalizeFilter(opts.fileFilter);\n        this._directoryFilter = normalizeFilter(opts.directoryFilter);\n        const statMethod = opts.lstat ? lstat : stat;\n        // Use bigint stats if it's windows and stat() supports options (node 10+).\n        if (wantBigintFsStats) {\n            this._stat = (path) => statMethod(path, { bigint: true });\n        }\n        else {\n            this._stat = statMethod;\n        }\n        this._maxDepth = opts.depth ?? defaultOptions.depth;\n        this._wantsDir = type ? DIR_TYPES.has(type) : false;\n        this._wantsFile = type ? FILE_TYPES.has(type) : false;\n        this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;\n        this._root = presolve(root);\n        this._isDirent = !opts.alwaysStat;\n        this._statsProp = this._isDirent ? 'dirent' : 'stats';\n        this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n        // Launch stream with one parent, the root dir.\n        this.parents = [this._exploreDir(root, 1)];\n        this.reading = false;\n        this.parent = undefined;\n    }\n    async _read(batch) {\n        if (this.reading)\n            return;\n        this.reading = true;\n        try {\n            while (!this.destroyed && batch > 0) {\n                const par = this.parent;\n                const fil = par && par.files;\n                if (fil && fil.length > 0) {\n                    const { path, depth } = par;\n                    const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));\n                    const awaited = await Promise.all(slice);\n                    for (const entry of awaited) {\n                        if (!entry)\n                            continue;\n                        if (this.destroyed)\n                            return;\n                        const entryType = await this._getEntryType(entry);\n                        if (entryType === 'directory' && this._directoryFilter(entry)) {\n                            if (depth <= this._maxDepth) {\n                                this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n                            }\n                            if (this._wantsDir) {\n                                this.push(entry);\n                                batch--;\n                            }\n                        }\n                        else if ((entryType === 'file' || this._includeAsFile(entry)) &&\n                            this._fileFilter(entry)) {\n                            if (this._wantsFile) {\n                                this.push(entry);\n                                batch--;\n                            }\n                        }\n                    }\n                }\n                else {\n                    const parent = this.parents.pop();\n                    if (!parent) {\n                        this.push(null);\n                        break;\n                    }\n                    this.parent = await parent;\n                    if (this.destroyed)\n                        return;\n                }\n            }\n        }\n        catch (error) {\n            this.destroy(error);\n        }\n        finally {\n            this.reading = false;\n        }\n    }\n    async _exploreDir(path, depth) {\n        let files;\n        try {\n            files = await readdir(path, this._rdOptions);\n        }\n        catch (error) {\n            this._onError(error);\n        }\n        return { files, depth, path };\n    }\n    async _formatEntry(dirent, path) {\n        let entry;\n        const basename = this._isDirent ? dirent.name : dirent;\n        try {\n            const fullPath = presolve(pjoin(path, basename));\n            entry = { path: prelative(this._root, fullPath), fullPath, basename };\n            entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n        }\n        catch (err) {\n            this._onError(err);\n            return;\n        }\n        return entry;\n    }\n    _onError(err) {\n        if (isNormalFlowError(err) && !this.destroyed) {\n            this.emit('warn', err);\n        }\n        else {\n            this.destroy(err);\n        }\n    }\n    async _getEntryType(entry) {\n        // entry may be undefined, because a warning or an error were emitted\n        // and the statsProp is undefined\n        if (!entry && this._statsProp in entry) {\n            return '';\n        }\n        const stats = entry[this._statsProp];\n        if (stats.isFile())\n            return 'file';\n        if (stats.isDirectory())\n            return 'directory';\n        if (stats && stats.isSymbolicLink()) {\n            const full = entry.fullPath;\n            try {\n                const entryRealPath = await realpath(full);\n                const entryRealPathStats = await lstat(entryRealPath);\n                if (entryRealPathStats.isFile()) {\n                    return 'file';\n                }\n                if (entryRealPathStats.isDirectory()) {\n                    const len = entryRealPath.length;\n                    if (full.startsWith(entryRealPath) && full.substr(len, 1) === psep) {\n                        const recursiveError = new Error(`Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`);\n                        // @ts-ignore\n                        recursiveError.code = RECURSIVE_ERROR_CODE;\n                        return this._onError(recursiveError);\n                    }\n                    return 'directory';\n                }\n            }\n            catch (error) {\n                this._onError(error);\n                return '';\n            }\n        }\n    }\n    _includeAsFile(entry) {\n        const stats = entry && entry[this._statsProp];\n        return stats && this._wantsEverything && !stats.isDirectory();\n    }\n}\n/**\n * Streaming version: Reads all files and directories in given root recursively.\n * Consumes ~constant small amount of RAM.\n * @param root Root directory\n * @param options Options to specify root (start directory), filters and recursion depth\n */\nexport function readdirp(root, options = {}) {\n    // @ts-ignore\n    let type = options.entryType || options.type;\n    if (type === 'both')\n        type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility\n    if (type)\n        options.type = type;\n    if (!root) {\n        throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n    }\n    else if (typeof root !== 'string') {\n        throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n    }\n    else if (type && !ALL_TYPES.includes(type)) {\n        throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n    }\n    options.root = root;\n    return new ReaddirpStream(options);\n}\n/**\n * Promise version: Reads all files and directories in given root recursively.\n * Compared to streaming version, will consume a lot of RAM e.g. when 1 million files are listed.\n * @returns array of paths and their entry infos\n */\nexport function readdirpPromise(root, options = {}) {\n    return new Promise((resolve, reject) => {\n        const files = [];\n        readdirp(root, options)\n            .on('data', (entry) => files.push(entry))\n            .on('end', () => resolve(files))\n            .on('error', (error) => reject(error));\n    });\n}\nexport default readdirp;\n","import { watchFile, unwatchFile, watch as fs_watch } from 'fs';\nimport { open, stat, lstat, realpath as fsrealpath } from 'fs/promises';\nimport * as sysPath from 'path';\nimport { type as osType } from 'os';\nexport const STR_DATA = 'data';\nexport const STR_END = 'end';\nexport const STR_CLOSE = 'close';\nexport const EMPTY_FN = () => { };\nexport const IDENTITY_FN = (val) => val;\nconst pl = process.platform;\nexport const isWindows = pl === 'win32';\nexport const isMacos = pl === 'darwin';\nexport const isLinux = pl === 'linux';\nexport const isFreeBSD = pl === 'freebsd';\nexport const isIBMi = osType() === 'OS400';\nexport const EVENTS = {\n    ALL: 'all',\n    READY: 'ready',\n    ADD: 'add',\n    CHANGE: 'change',\n    ADD_DIR: 'addDir',\n    UNLINK: 'unlink',\n    UNLINK_DIR: 'unlinkDir',\n    RAW: 'raw',\n    ERROR: 'error',\n};\nconst EV = EVENTS;\nconst THROTTLE_MODE_WATCH = 'watch';\nconst statMethods = { lstat, stat };\nconst KEY_LISTENERS = 'listeners';\nconst KEY_ERR = 'errHandlers';\nconst KEY_RAW = 'rawEmitters';\nconst HANDLER_KEYS = [KEY_LISTENERS, KEY_ERR, KEY_RAW];\n// prettier-ignore\nconst binaryExtensions = new Set([\n    '3dm', '3ds', '3g2', '3gp', '7z', 'a', 'aac', 'adp', 'afdesign', 'afphoto', 'afpub', 'ai',\n    'aif', 'aiff', 'alz', 'ape', 'apk', 'appimage', 'ar', 'arj', 'asf', 'au', 'avi',\n    'bak', 'baml', 'bh', 'bin', 'bk', 'bmp', 'btif', 'bz2', 'bzip2',\n    'cab', 'caf', 'cgm', 'class', 'cmx', 'cpio', 'cr2', 'cur', 'dat', 'dcm', 'deb', 'dex', 'djvu',\n    'dll', 'dmg', 'dng', 'doc', 'docm', 'docx', 'dot', 'dotm', 'dra', 'DS_Store', 'dsk', 'dts',\n    'dtshd', 'dvb', 'dwg', 'dxf',\n    'ecelp4800', 'ecelp7470', 'ecelp9600', 'egg', 'eol', 'eot', 'epub', 'exe',\n    'f4v', 'fbs', 'fh', 'fla', 'flac', 'flatpak', 'fli', 'flv', 'fpx', 'fst', 'fvt',\n    'g3', 'gh', 'gif', 'graffle', 'gz', 'gzip',\n    'h261', 'h263', 'h264', 'icns', 'ico', 'ief', 'img', 'ipa', 'iso',\n    'jar', 'jpeg', 'jpg', 'jpgv', 'jpm', 'jxr', 'key', 'ktx',\n    'lha', 'lib', 'lvp', 'lz', 'lzh', 'lzma', 'lzo',\n    'm3u', 'm4a', 'm4v', 'mar', 'mdi', 'mht', 'mid', 'midi', 'mj2', 'mka', 'mkv', 'mmr', 'mng',\n    'mobi', 'mov', 'movie', 'mp3',\n    'mp4', 'mp4a', 'mpeg', 'mpg', 'mpga', 'mxu',\n    'nef', 'npx', 'numbers', 'nupkg',\n    'o', 'odp', 'ods', 'odt', 'oga', 'ogg', 'ogv', 'otf', 'ott',\n    'pages', 'pbm', 'pcx', 'pdb', 'pdf', 'pea', 'pgm', 'pic', 'png', 'pnm', 'pot', 'potm',\n    'potx', 'ppa', 'ppam',\n    'ppm', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'psd', 'pya', 'pyc', 'pyo', 'pyv',\n    'qt',\n    'rar', 'ras', 'raw', 'resources', 'rgb', 'rip', 'rlc', 'rmf', 'rmvb', 'rpm', 'rtf', 'rz',\n    's3m', 's7z', 'scpt', 'sgi', 'shar', 'snap', 'sil', 'sketch', 'slk', 'smv', 'snk', 'so',\n    'stl', 'suo', 'sub', 'swf',\n    'tar', 'tbz', 'tbz2', 'tga', 'tgz', 'thmx', 'tif', 'tiff', 'tlz', 'ttc', 'ttf', 'txz',\n    'udf', 'uvh', 'uvi', 'uvm', 'uvp', 'uvs', 'uvu',\n    'viv', 'vob',\n    'war', 'wav', 'wax', 'wbmp', 'wdp', 'weba', 'webm', 'webp', 'whl', 'wim', 'wm', 'wma',\n    'wmv', 'wmx', 'woff', 'woff2', 'wrm', 'wvx',\n    'xbm', 'xif', 'xla', 'xlam', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'xm',\n    'xmind', 'xpi', 'xpm', 'xwd', 'xz',\n    'z', 'zip', 'zipx',\n]);\nconst isBinaryPath = (filePath) => binaryExtensions.has(sysPath.extname(filePath).slice(1).toLowerCase());\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n    if (val instanceof Set) {\n        val.forEach(fn);\n    }\n    else {\n        fn(val);\n    }\n};\nconst addAndConvert = (main, prop, item) => {\n    let container = main[prop];\n    if (!(container instanceof Set)) {\n        main[prop] = container = new Set([container]);\n    }\n    container.add(item);\n};\nconst clearItem = (cont) => (key) => {\n    const set = cont[key];\n    if (set instanceof Set) {\n        set.clear();\n    }\n    else {\n        delete cont[key];\n    }\n};\nconst delFromSet = (main, prop, item) => {\n    const container = main[prop];\n    if (container instanceof Set) {\n        container.delete(item);\n    }\n    else if (container === item) {\n        delete main[prop];\n    }\n};\nconst isEmptySet = (val) => (val instanceof Set ? val.size === 0 : !val);\nconst FsWatchInstances = new Map();\n/**\n * Instantiates the fs_watch interface\n * @param path to be watched\n * @param options to be passed to fs_watch\n * @param listener main event handler\n * @param errHandler emits info about errors\n * @param emitRaw emits raw event data\n * @returns {NativeFsWatcher}\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n    const handleEvent = (rawEvent, evPath) => {\n        listener(path);\n        emitRaw(rawEvent, evPath, { watchedPath: path });\n        // emit based on events occurring for files from a directory's watcher in\n        // case the file's watcher misses it (and rely on throttling to de-dupe)\n        if (evPath && path !== evPath) {\n            fsWatchBroadcast(sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath));\n        }\n    };\n    try {\n        return fs_watch(path, {\n            persistent: options.persistent,\n        }, handleEvent);\n    }\n    catch (error) {\n        errHandler(error);\n        return undefined;\n    }\n}\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param fullPath absolute path bound to fs_watch instance\n */\nconst fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {\n    const cont = FsWatchInstances.get(fullPath);\n    if (!cont)\n        return;\n    foreach(cont[listenerType], (listener) => {\n        listener(val1, val2, val3);\n    });\n};\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path\n * @param fullPath absolute path\n * @param options to be passed to fs_watch\n * @param handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n    const { listener, errHandler, rawEmitter } = handlers;\n    let cont = FsWatchInstances.get(fullPath);\n    let watcher;\n    if (!options.persistent) {\n        watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter);\n        if (!watcher)\n            return;\n        return watcher.close.bind(watcher);\n    }\n    if (cont) {\n        addAndConvert(cont, KEY_LISTENERS, listener);\n        addAndConvert(cont, KEY_ERR, errHandler);\n        addAndConvert(cont, KEY_RAW, rawEmitter);\n    }\n    else {\n        watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, // no need to use broadcast here\n        fsWatchBroadcast.bind(null, fullPath, KEY_RAW));\n        if (!watcher)\n            return;\n        watcher.on(EV.ERROR, async (error) => {\n            const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n            if (cont)\n                cont.watcherUnusable = true; // documented since Node 10.4.1\n            // Workaround for https://github.com/joyent/node/issues/4337\n            if (isWindows && error.code === 'EPERM') {\n                try {\n                    const fd = await open(path, 'r');\n                    await fd.close();\n                    broadcastErr(error);\n                }\n                catch (err) {\n                    // do nothing\n                }\n            }\n            else {\n                broadcastErr(error);\n            }\n        });\n        cont = {\n            listeners: listener,\n            errHandlers: errHandler,\n            rawEmitters: rawEmitter,\n            watcher,\n        };\n        FsWatchInstances.set(fullPath, cont);\n    }\n    // const index = cont.listeners.indexOf(listener);\n    // removes this instance's listeners and closes the underlying fs_watch\n    // instance if there are no more listeners left\n    return () => {\n        delFromSet(cont, KEY_LISTENERS, listener);\n        delFromSet(cont, KEY_ERR, errHandler);\n        delFromSet(cont, KEY_RAW, rawEmitter);\n        if (isEmptySet(cont.listeners)) {\n            // Check to protect against issue gh-730.\n            // if (cont.watcherUnusable) {\n            cont.watcher.close();\n            // }\n            FsWatchInstances.delete(fullPath);\n            HANDLER_KEYS.forEach(clearItem(cont));\n            // @ts-ignore\n            cont.watcher = undefined;\n            Object.freeze(cont);\n        }\n    };\n};\n// fs_watchFile helpers\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path to be watched\n * @param fullPath absolute path\n * @param options options to be passed to fs_watchFile\n * @param handlers container for event listener functions\n * @returns closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n    const { listener, rawEmitter } = handlers;\n    let cont = FsWatchFileInstances.get(fullPath);\n    // let listeners = new Set();\n    // let rawEmitters = new Set();\n    const copts = cont && cont.options;\n    if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n        // \"Upgrade\" the watcher to persistence or a quicker interval.\n        // This creates some unlikely edge case issues if the user mixes\n        // settings in a very weird way, but solving for those cases\n        // doesn't seem worthwhile for the added complexity.\n        // listeners = cont.listeners;\n        // rawEmitters = cont.rawEmitters;\n        unwatchFile(fullPath);\n        cont = undefined;\n    }\n    if (cont) {\n        addAndConvert(cont, KEY_LISTENERS, listener);\n        addAndConvert(cont, KEY_RAW, rawEmitter);\n    }\n    else {\n        // TODO\n        // listeners.add(listener);\n        // rawEmitters.add(rawEmitter);\n        cont = {\n            listeners: listener,\n            rawEmitters: rawEmitter,\n            options,\n            watcher: watchFile(fullPath, options, (curr, prev) => {\n                foreach(cont.rawEmitters, (rawEmitter) => {\n                    rawEmitter(EV.CHANGE, fullPath, { curr, prev });\n                });\n                const currmtime = curr.mtimeMs;\n                if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n                    foreach(cont.listeners, (listener) => listener(path, curr));\n                }\n            }),\n        };\n        FsWatchFileInstances.set(fullPath, cont);\n    }\n    // const index = cont.listeners.indexOf(listener);\n    // Removes this instance's listeners and closes the underlying fs_watchFile\n    // instance if there are no more listeners left.\n    return () => {\n        delFromSet(cont, KEY_LISTENERS, listener);\n        delFromSet(cont, KEY_RAW, rawEmitter);\n        if (isEmptySet(cont.listeners)) {\n            FsWatchFileInstances.delete(fullPath);\n            unwatchFile(fullPath);\n            cont.options = cont.watcher = undefined;\n            Object.freeze(cont);\n        }\n    };\n};\n/**\n * @mixin\n */\nexport class NodeFsHandler {\n    constructor(fsW) {\n        this.fsw = fsW;\n        this._boundHandleError = (error) => fsW._handleError(error);\n    }\n    /**\n     * Watch file for changes with fs_watchFile or fs_watch.\n     * @param path to file or dir\n     * @param listener on fs change\n     * @returns closer for the watcher instance\n     */\n    _watchWithNodeFs(path, listener) {\n        const opts = this.fsw.options;\n        const directory = sysPath.dirname(path);\n        const basename = sysPath.basename(path);\n        const parent = this.fsw._getWatchedDir(directory);\n        parent.add(basename);\n        const absolutePath = sysPath.resolve(path);\n        const options = {\n            persistent: opts.persistent,\n        };\n        if (!listener)\n            listener = EMPTY_FN;\n        let closer;\n        if (opts.usePolling) {\n            const enableBin = opts.interval !== opts.binaryInterval;\n            options.interval = enableBin && isBinaryPath(basename) ? opts.binaryInterval : opts.interval;\n            closer = setFsWatchFileListener(path, absolutePath, options, {\n                listener,\n                rawEmitter: this.fsw._emitRaw,\n            });\n        }\n        else {\n            closer = setFsWatchListener(path, absolutePath, options, {\n                listener,\n                errHandler: this._boundHandleError,\n                rawEmitter: this.fsw._emitRaw,\n            });\n        }\n        return closer;\n    }\n    /**\n     * Watch a file and emit add event if warranted.\n     * @returns closer for the watcher instance\n     */\n    _handleFile(file, stats, initialAdd) {\n        if (this.fsw.closed) {\n            return;\n        }\n        const dirname = sysPath.dirname(file);\n        const basename = sysPath.basename(file);\n        const parent = this.fsw._getWatchedDir(dirname);\n        // stats is always present\n        let prevStats = stats;\n        // if the file is already being watched, do nothing\n        if (parent.has(basename))\n            return;\n        const listener = async (path, newStats) => {\n            if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))\n                return;\n            if (!newStats || newStats.mtimeMs === 0) {\n                try {\n                    const newStats = await stat(file);\n                    if (this.fsw.closed)\n                        return;\n                    // Check that change event was not fired because of changed only accessTime.\n                    const at = newStats.atimeMs;\n                    const mt = newStats.mtimeMs;\n                    if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n                        this.fsw._emit(EV.CHANGE, file, newStats);\n                    }\n                    if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats.ino) {\n                        this.fsw._closeFile(path);\n                        prevStats = newStats;\n                        const closer = this._watchWithNodeFs(file, listener);\n                        if (closer)\n                            this.fsw._addPathCloser(path, closer);\n                    }\n                    else {\n                        prevStats = newStats;\n                    }\n                }\n                catch (error) {\n                    // Fix issues where mtime is null but file is still present\n                    this.fsw._remove(dirname, basename);\n                }\n                // add is about to be emitted if file not already tracked in parent\n            }\n            else if (parent.has(basename)) {\n                // Check that change event was not fired because of changed only accessTime.\n                const at = newStats.atimeMs;\n                const mt = newStats.mtimeMs;\n                if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n                    this.fsw._emit(EV.CHANGE, file, newStats);\n                }\n                prevStats = newStats;\n            }\n        };\n        // kick off the watcher\n        const closer = this._watchWithNodeFs(file, listener);\n        // emit an add event if we're supposed to\n        if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n            if (!this.fsw._throttle(EV.ADD, file, 0))\n                return;\n            this.fsw._emit(EV.ADD, file, stats);\n        }\n        return closer;\n    }\n    /**\n     * Handle symlinks encountered while reading a dir.\n     * @param entry returned by readdirp\n     * @param directory path of dir being read\n     * @param path of this item\n     * @param item basename of this item\n     * @returns true if no more processing is needed for this entry.\n     */\n    async _handleSymlink(entry, directory, path, item) {\n        if (this.fsw.closed) {\n            return;\n        }\n        const full = entry.fullPath;\n        const dir = this.fsw._getWatchedDir(directory);\n        if (!this.fsw.options.followSymlinks) {\n            // watch symlink directly (don't follow) and detect changes\n            this.fsw._incrReadyCount();\n            let linkPath;\n            try {\n                linkPath = await fsrealpath(path);\n            }\n            catch (e) {\n                this.fsw._emitReady();\n                return true;\n            }\n            if (this.fsw.closed)\n                return;\n            if (dir.has(item)) {\n                if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n                    this.fsw._symlinkPaths.set(full, linkPath);\n                    this.fsw._emit(EV.CHANGE, path, entry.stats);\n                }\n            }\n            else {\n                dir.add(item);\n                this.fsw._symlinkPaths.set(full, linkPath);\n                this.fsw._emit(EV.ADD, path, entry.stats);\n            }\n            this.fsw._emitReady();\n            return true;\n        }\n        // don't follow the same symlink more than once\n        if (this.fsw._symlinkPaths.has(full)) {\n            return true;\n        }\n        this.fsw._symlinkPaths.set(full, true);\n    }\n    _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n        // Normalize the directory name on Windows\n        directory = sysPath.join(directory, '');\n        throttler = this.fsw._throttle('readdir', directory, 1000);\n        if (!throttler)\n            return;\n        const previous = this.fsw._getWatchedDir(wh.path);\n        const current = new Set();\n        let stream = this.fsw._readdirp(directory, {\n            fileFilter: (entry) => wh.filterPath(entry),\n            directoryFilter: (entry) => wh.filterDir(entry),\n        });\n        if (!stream)\n            return;\n        stream\n            .on(STR_DATA, async (entry) => {\n            if (this.fsw.closed) {\n                stream = undefined;\n                return;\n            }\n            const item = entry.path;\n            let path = sysPath.join(directory, item);\n            current.add(item);\n            if (entry.stats.isSymbolicLink() &&\n                (await this._handleSymlink(entry, directory, path, item))) {\n                return;\n            }\n            if (this.fsw.closed) {\n                stream = undefined;\n                return;\n            }\n            // Files that present in current directory snapshot\n            // but absent in previous are added to watch list and\n            // emit `add` event.\n            if (item === target || (!target && !previous.has(item))) {\n                this.fsw._incrReadyCount();\n                // ensure relativeness of path is preserved in case of watcher reuse\n                path = sysPath.join(dir, sysPath.relative(dir, path));\n                this._addToNodeFs(path, initialAdd, wh, depth + 1);\n            }\n        })\n            .on(EV.ERROR, this._boundHandleError);\n        return new Promise((resolve, reject) => {\n            if (!stream)\n                return reject();\n            stream.once(STR_END, () => {\n                if (this.fsw.closed) {\n                    stream = undefined;\n                    return;\n                }\n                const wasThrottled = throttler ? throttler.clear() : false;\n                resolve(undefined);\n                // Files that absent in current directory snapshot\n                // but present in previous emit `remove` event\n                // and are removed from @watched[directory].\n                previous\n                    .getChildren()\n                    .filter((item) => {\n                    return item !== directory && !current.has(item);\n                })\n                    .forEach((item) => {\n                    this.fsw._remove(directory, item);\n                });\n                stream = undefined;\n                // one more time for any missed in case changes came in extremely quickly\n                if (wasThrottled)\n                    this._handleRead(directory, false, wh, target, dir, depth, throttler);\n            });\n        });\n    }\n    /**\n     * Read directory to add / remove files from `@watched` list and re-read it on change.\n     * @param dir fs path\n     * @param stats\n     * @param initialAdd\n     * @param depth relative to user-supplied path\n     * @param target child path targeted for watch\n     * @param wh Common watch helpers for this path\n     * @param realpath\n     * @returns closer for the watcher instance.\n     */\n    async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n        const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));\n        const tracked = parentDir.has(sysPath.basename(dir));\n        if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n            this.fsw._emit(EV.ADD_DIR, dir, stats);\n        }\n        // ensure dir is tracked (harmless if redundant)\n        parentDir.add(sysPath.basename(dir));\n        this.fsw._getWatchedDir(dir);\n        let throttler;\n        let closer;\n        const oDepth = this.fsw.options.depth;\n        if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n            if (!target) {\n                await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n                if (this.fsw.closed)\n                    return;\n            }\n            closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n                // if current directory is removed, do nothing\n                if (stats && stats.mtimeMs === 0)\n                    return;\n                this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n            });\n        }\n        return closer;\n    }\n    /**\n     * Handle added file, directory, or glob pattern.\n     * Delegates call to _handleFile / _handleDir after checks.\n     * @param path to file or ir\n     * @param initialAdd was the file added at watch instantiation?\n     * @param priorWh depth relative to user-supplied path\n     * @param depth Child path actually targeted for watch\n     * @param target Child path actually targeted for watch\n     */\n    async _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n        const ready = this.fsw._emitReady;\n        if (this.fsw._isIgnored(path) || this.fsw.closed) {\n            ready();\n            return false;\n        }\n        const wh = this.fsw._getWatchHelpers(path);\n        if (priorWh) {\n            wh.filterPath = (entry) => priorWh.filterPath(entry);\n            wh.filterDir = (entry) => priorWh.filterDir(entry);\n        }\n        // evaluate what is at the path we're being asked to watch\n        try {\n            const stats = await statMethods[wh.statMethod](wh.watchPath);\n            if (this.fsw.closed)\n                return;\n            if (this.fsw._isIgnored(wh.watchPath, stats)) {\n                ready();\n                return false;\n            }\n            const follow = this.fsw.options.followSymlinks;\n            let closer;\n            if (stats.isDirectory()) {\n                const absPath = sysPath.resolve(path);\n                const targetPath = follow ? await fsrealpath(path) : path;\n                if (this.fsw.closed)\n                    return;\n                closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n                if (this.fsw.closed)\n                    return;\n                // preserve this symlink's target path\n                if (absPath !== targetPath && targetPath !== undefined) {\n                    this.fsw._symlinkPaths.set(absPath, targetPath);\n                }\n            }\n            else if (stats.isSymbolicLink()) {\n                const targetPath = follow ? await fsrealpath(path) : path;\n                if (this.fsw.closed)\n                    return;\n                const parent = sysPath.dirname(wh.watchPath);\n                this.fsw._getWatchedDir(parent).add(wh.watchPath);\n                this.fsw._emit(EV.ADD, wh.watchPath, stats);\n                closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n                if (this.fsw.closed)\n                    return;\n                // preserve this symlink's target path\n                if (targetPath !== undefined) {\n                    this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);\n                }\n            }\n            else {\n                closer = this._handleFile(wh.watchPath, stats, initialAdd);\n            }\n            ready();\n            if (closer)\n                this.fsw._addPathCloser(path, closer);\n            return false;\n        }\n        catch (error) {\n            if (this.fsw._handleError(error)) {\n                ready();\n                return path;\n            }\n        }\n    }\n}\n","/*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) */\nimport { stat as statcb } from 'fs';\nimport { stat, readdir } from 'fs/promises';\nimport { EventEmitter } from 'events';\nimport * as sysPath from 'path';\nimport { readdirp } from 'readdirp';\nimport { NodeFsHandler, EVENTS as EV, isWindows, isIBMi, EMPTY_FN, STR_CLOSE, STR_END, } from './handler.js';\nconst SLASH = '/';\nconst SLASH_SLASH = '//';\nconst ONE_DOT = '.';\nconst TWO_DOTS = '..';\nconst STRING_TYPE = 'string';\nconst BACK_SLASH_RE = /\\\\/g;\nconst DOUBLE_SLASH_RE = /\\/\\//;\nconst DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nconst REPLACER_RE = /^\\.[/\\\\]/;\nfunction arrify(item) {\n    return Array.isArray(item) ? item : [item];\n}\nconst isMatcherObject = (matcher) => typeof matcher === 'object' && matcher !== null && !(matcher instanceof RegExp);\nfunction createPattern(matcher) {\n    if (typeof matcher === 'function')\n        return matcher;\n    if (typeof matcher === 'string')\n        return (string) => matcher === string;\n    if (matcher instanceof RegExp)\n        return (string) => matcher.test(string);\n    if (typeof matcher === 'object' && matcher !== null) {\n        return (string) => {\n            if (matcher.path === string)\n                return true;\n            if (matcher.recursive) {\n                const relative = sysPath.relative(matcher.path, string);\n                if (!relative) {\n                    return false;\n                }\n                return !relative.startsWith('..') && !sysPath.isAbsolute(relative);\n            }\n            return false;\n        };\n    }\n    return () => false;\n}\nfunction normalizePath(path) {\n    if (typeof path !== 'string')\n        throw new Error('string expected');\n    path = sysPath.normalize(path);\n    path = path.replace(/\\\\/g, '/');\n    let prepend = false;\n    if (path.startsWith('//'))\n        prepend = true;\n    const DOUBLE_SLASH_RE = /\\/\\//;\n    while (path.match(DOUBLE_SLASH_RE))\n        path = path.replace(DOUBLE_SLASH_RE, '/');\n    if (prepend)\n        path = '/' + path;\n    return path;\n}\nfunction matchPatterns(patterns, testString, stats) {\n    const path = normalizePath(testString);\n    for (let index = 0; index < patterns.length; index++) {\n        const pattern = patterns[index];\n        if (pattern(path, stats)) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction anymatch(matchers, testString) {\n    if (matchers == null) {\n        throw new TypeError('anymatch: specify first argument');\n    }\n    // Early cache for matchers.\n    const matchersArray = arrify(matchers);\n    const patterns = matchersArray.map((matcher) => createPattern(matcher));\n    if (testString == null) {\n        return (testString, stats) => {\n            return matchPatterns(patterns, testString, stats);\n        };\n    }\n    return matchPatterns(patterns, testString);\n}\nconst unifyPaths = (paths_) => {\n    const paths = arrify(paths_).flat();\n    if (!paths.every((p) => typeof p === STRING_TYPE)) {\n        throw new TypeError(`Non-string provided as watch path: ${paths}`);\n    }\n    return paths.map(normalizePathToUnix);\n};\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n//     because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n    let str = string.replace(BACK_SLASH_RE, SLASH);\n    let prepend = false;\n    if (str.startsWith(SLASH_SLASH)) {\n        prepend = true;\n    }\n    while (str.match(DOUBLE_SLASH_RE)) {\n        str = str.replace(DOUBLE_SLASH_RE, SLASH);\n    }\n    if (prepend) {\n        str = SLASH + str;\n    }\n    return str;\n};\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));\n// TODO: refactor\nconst normalizeIgnored = (cwd = '') => (path) => {\n    if (typeof path === 'string') {\n        return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));\n    }\n    else {\n        return path;\n    }\n};\nconst getAbsolutePath = (path, cwd) => {\n    if (sysPath.isAbsolute(path)) {\n        return path;\n    }\n    return sysPath.join(cwd, path);\n};\nconst EMPTY_SET = Object.freeze(new Set());\n/**\n * Directory entry.\n */\nclass DirEntry {\n    constructor(dir, removeWatcher) {\n        this.path = dir;\n        this._removeWatcher = removeWatcher;\n        this.items = new Set();\n    }\n    add(item) {\n        const { items } = this;\n        if (!items)\n            return;\n        if (item !== ONE_DOT && item !== TWO_DOTS)\n            items.add(item);\n    }\n    async remove(item) {\n        const { items } = this;\n        if (!items)\n            return;\n        items.delete(item);\n        if (items.size > 0)\n            return;\n        const dir = this.path;\n        try {\n            await readdir(dir);\n        }\n        catch (err) {\n            if (this._removeWatcher) {\n                this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));\n            }\n        }\n    }\n    has(item) {\n        const { items } = this;\n        if (!items)\n            return;\n        return items.has(item);\n    }\n    getChildren() {\n        const { items } = this;\n        if (!items)\n            return [];\n        return [...items.values()];\n    }\n    dispose() {\n        this.items.clear();\n        this.path = '';\n        this._removeWatcher = EMPTY_FN;\n        this.items = EMPTY_SET;\n        Object.freeze(this);\n    }\n}\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nexport class WatchHelper {\n    constructor(path, follow, fsw) {\n        this.fsw = fsw;\n        const watchPath = path;\n        this.path = path = path.replace(REPLACER_RE, '');\n        this.watchPath = watchPath;\n        this.fullWatchPath = sysPath.resolve(watchPath);\n        this.dirParts = [];\n        this.dirParts.forEach((parts) => {\n            if (parts.length > 1)\n                parts.pop();\n        });\n        this.followSymlinks = follow;\n        this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n    }\n    entryPath(entry) {\n        return sysPath.join(this.watchPath, sysPath.relative(this.watchPath, entry.fullPath));\n    }\n    filterPath(entry) {\n        const { stats } = entry;\n        if (stats && stats.isSymbolicLink())\n            return this.filterDir(entry);\n        const resolvedPath = this.entryPath(entry);\n        // TODO: what if stats is undefined? remove !\n        return this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats);\n    }\n    filterDir(entry) {\n        return this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n    }\n}\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n *     new FSWatcher()\n *       .add(directories)\n *       .on('add', path => log('File', path, 'was added'))\n */\nexport class FSWatcher extends EventEmitter {\n    // Not indenting methods for history sake; for now.\n    constructor(_opts = {}) {\n        super();\n        this.closed = false;\n        this._closers = new Map();\n        this._ignoredPaths = new Set();\n        this._throttled = new Map();\n        this._streams = new Set();\n        this._symlinkPaths = new Map();\n        this._watched = new Map();\n        this._pendingWrites = new Map();\n        this._pendingUnlinks = new Map();\n        this._readyCount = 0;\n        this._readyEmitted = false;\n        const awf = _opts.awaitWriteFinish;\n        const DEF_AWF = { stabilityThreshold: 2000, pollInterval: 100 };\n        const opts = {\n            // Defaults\n            persistent: true,\n            ignoreInitial: false,\n            ignorePermissionErrors: false,\n            interval: 100,\n            binaryInterval: 300,\n            followSymlinks: true,\n            usePolling: false,\n            // useAsync: false,\n            atomic: true, // NOTE: overwritten later (depends on usePolling)\n            ..._opts,\n            // Change format\n            ignored: _opts.ignored ? arrify(_opts.ignored) : arrify([]),\n            awaitWriteFinish: awf === true ? DEF_AWF : typeof awf === 'object' ? { ...DEF_AWF, ...awf } : false,\n        };\n        // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n        if (isIBMi)\n            opts.usePolling = true;\n        // Editor atomic write normalization enabled by default with fs.watch\n        if (opts.atomic === undefined)\n            opts.atomic = !opts.usePolling;\n        // opts.atomic = typeof _opts.atomic === 'number' ? _opts.atomic : 100;\n        // Global override. Useful for developers, who need to force polling for all\n        // instances of chokidar, regardless of usage / dependency depth\n        const envPoll = process.env.CHOKIDAR_USEPOLLING;\n        if (envPoll !== undefined) {\n            const envLower = envPoll.toLowerCase();\n            if (envLower === 'false' || envLower === '0')\n                opts.usePolling = false;\n            else if (envLower === 'true' || envLower === '1')\n                opts.usePolling = true;\n            else\n                opts.usePolling = !!envLower;\n        }\n        const envInterval = process.env.CHOKIDAR_INTERVAL;\n        if (envInterval)\n            opts.interval = Number.parseInt(envInterval, 10);\n        // This is done to emit ready only once, but each 'add' will increase that?\n        let readyCalls = 0;\n        this._emitReady = () => {\n            readyCalls++;\n            if (readyCalls >= this._readyCount) {\n                this._emitReady = EMPTY_FN;\n                this._readyEmitted = true;\n                // use process.nextTick to allow time for listener to be bound\n                process.nextTick(() => this.emit(EV.READY));\n            }\n        };\n        this._emitRaw = (...args) => this.emit(EV.RAW, ...args);\n        this._boundRemove = this._remove.bind(this);\n        this.options = opts;\n        this._nodeFsHandler = new NodeFsHandler(this);\n        // You’re frozen when your heart’s not open.\n        Object.freeze(opts);\n    }\n    _addIgnoredPath(matcher) {\n        if (isMatcherObject(matcher)) {\n            // return early if we already have a deeply equal matcher object\n            for (const ignored of this._ignoredPaths) {\n                if (isMatcherObject(ignored) &&\n                    ignored.path === matcher.path &&\n                    ignored.recursive === matcher.recursive) {\n                    return;\n                }\n            }\n        }\n        this._ignoredPaths.add(matcher);\n    }\n    _removeIgnoredPath(matcher) {\n        this._ignoredPaths.delete(matcher);\n        // now find any matcher objects with the matcher as path\n        if (typeof matcher === 'string') {\n            for (const ignored of this._ignoredPaths) {\n                // TODO (43081j): make this more efficient.\n                // probably just make a `this._ignoredDirectories` or some\n                // such thing.\n                if (isMatcherObject(ignored) && ignored.path === matcher) {\n                    this._ignoredPaths.delete(ignored);\n                }\n            }\n        }\n    }\n    // Public methods\n    /**\n     * Adds paths to be watched on an existing FSWatcher instance.\n     * @param paths_ file or file list. Other arguments are unused\n     */\n    add(paths_, _origAdd, _internal) {\n        const { cwd } = this.options;\n        this.closed = false;\n        this._closePromise = undefined;\n        let paths = unifyPaths(paths_);\n        if (cwd) {\n            paths = paths.map((path) => {\n                const absPath = getAbsolutePath(path, cwd);\n                // Check `path` instead of `absPath` because the cwd portion can't be a glob\n                return absPath;\n            });\n        }\n        paths.forEach((path) => {\n            this._removeIgnoredPath(path);\n        });\n        this._userIgnored = undefined;\n        if (!this._readyCount)\n            this._readyCount = 0;\n        this._readyCount += paths.length;\n        Promise.all(paths.map(async (path) => {\n            const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, undefined, 0, _origAdd);\n            if (res)\n                this._emitReady();\n            return res;\n        })).then((results) => {\n            if (this.closed)\n                return;\n            results.forEach((item) => {\n                if (item)\n                    this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));\n            });\n        });\n        return this;\n    }\n    /**\n     * Close watchers or start ignoring events from specified paths.\n     */\n    unwatch(paths_) {\n        if (this.closed)\n            return this;\n        const paths = unifyPaths(paths_);\n        const { cwd } = this.options;\n        paths.forEach((path) => {\n            // convert to absolute path unless relative path already matches\n            if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {\n                if (cwd)\n                    path = sysPath.join(cwd, path);\n                path = sysPath.resolve(path);\n            }\n            this._closePath(path);\n            this._addIgnoredPath(path);\n            if (this._watched.has(path)) {\n                this._addIgnoredPath({\n                    path,\n                    recursive: true,\n                });\n            }\n            // reset the cached userIgnored anymatch fn\n            // to make ignoredPaths changes effective\n            this._userIgnored = undefined;\n        });\n        return this;\n    }\n    /**\n     * Close watchers and remove all listeners from watched paths.\n     */\n    close() {\n        if (this._closePromise) {\n            return this._closePromise;\n        }\n        this.closed = true;\n        // Memory management.\n        this.removeAllListeners();\n        const closers = [];\n        this._closers.forEach((closerList) => closerList.forEach((closer) => {\n            const promise = closer();\n            if (promise instanceof Promise)\n                closers.push(promise);\n        }));\n        this._streams.forEach((stream) => stream.destroy());\n        this._userIgnored = undefined;\n        this._readyCount = 0;\n        this._readyEmitted = false;\n        this._watched.forEach((dirent) => dirent.dispose());\n        this._closers.clear();\n        this._watched.clear();\n        this._streams.clear();\n        this._symlinkPaths.clear();\n        this._throttled.clear();\n        this._closePromise = closers.length\n            ? Promise.all(closers).then(() => undefined)\n            : Promise.resolve();\n        return this._closePromise;\n    }\n    /**\n     * Expose list of watched paths\n     * @returns for chaining\n     */\n    getWatched() {\n        const watchList = {};\n        this._watched.forEach((entry, dir) => {\n            const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;\n            const index = key || ONE_DOT;\n            watchList[index] = entry.getChildren().sort();\n        });\n        return watchList;\n    }\n    emitWithAll(event, args) {\n        this.emit(event, ...args);\n        if (event !== EV.ERROR)\n            this.emit(EV.ALL, event, ...args);\n    }\n    // Common helpers\n    // --------------\n    /**\n     * Normalize and emit events.\n     * Calling _emit DOES NOT MEAN emit() would be called!\n     * @param event Type of event\n     * @param path File or directory path\n     * @param stats arguments to be passed with event\n     * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n     */\n    async _emit(event, path, stats) {\n        if (this.closed)\n            return;\n        const opts = this.options;\n        if (isWindows)\n            path = sysPath.normalize(path);\n        if (opts.cwd)\n            path = sysPath.relative(opts.cwd, path);\n        const args = [path];\n        if (stats != null)\n            args.push(stats);\n        const awf = opts.awaitWriteFinish;\n        let pw;\n        if (awf && (pw = this._pendingWrites.get(path))) {\n            pw.lastChange = new Date();\n            return this;\n        }\n        if (opts.atomic) {\n            if (event === EV.UNLINK) {\n                this._pendingUnlinks.set(path, [event, ...args]);\n                setTimeout(() => {\n                    this._pendingUnlinks.forEach((entry, path) => {\n                        this.emit(...entry);\n                        this.emit(EV.ALL, ...entry);\n                        this._pendingUnlinks.delete(path);\n                    });\n                }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n                return this;\n            }\n            if (event === EV.ADD && this._pendingUnlinks.has(path)) {\n                event = EV.CHANGE;\n                this._pendingUnlinks.delete(path);\n            }\n        }\n        if (awf && (event === EV.ADD || event === EV.CHANGE) && this._readyEmitted) {\n            const awfEmit = (err, stats) => {\n                if (err) {\n                    event = EV.ERROR;\n                    args[0] = err;\n                    this.emitWithAll(event, args);\n                }\n                else if (stats) {\n                    // if stats doesn't exist the file must have been deleted\n                    if (args.length > 1) {\n                        args[1] = stats;\n                    }\n                    else {\n                        args.push(stats);\n                    }\n                    this.emitWithAll(event, args);\n                }\n            };\n            this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n            return this;\n        }\n        if (event === EV.CHANGE) {\n            const isThrottled = !this._throttle(EV.CHANGE, path, 50);\n            if (isThrottled)\n                return this;\n        }\n        if (opts.alwaysStat &&\n            stats === undefined &&\n            (event === EV.ADD || event === EV.ADD_DIR || event === EV.CHANGE)) {\n            const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;\n            let stats;\n            try {\n                stats = await stat(fullPath);\n            }\n            catch (err) {\n                // do nothing\n            }\n            // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n            if (!stats || this.closed)\n                return;\n            args.push(stats);\n        }\n        this.emitWithAll(event, args);\n        return this;\n    }\n    /**\n     * Common handler for errors\n     * @returns The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n     */\n    _handleError(error) {\n        const code = error && error.code;\n        if (error &&\n            code !== 'ENOENT' &&\n            code !== 'ENOTDIR' &&\n            (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))) {\n            this.emit(EV.ERROR, error);\n        }\n        return error || this.closed;\n    }\n    /**\n     * Helper utility for throttling\n     * @param actionType type being throttled\n     * @param path being acted upon\n     * @param timeout duration of time to suppress duplicate actions\n     * @returns tracking object or false if action should be suppressed\n     */\n    _throttle(actionType, path, timeout) {\n        if (!this._throttled.has(actionType)) {\n            this._throttled.set(actionType, new Map());\n        }\n        const action = this._throttled.get(actionType);\n        if (!action)\n            throw new Error('invalid throttle');\n        const actionPath = action.get(path);\n        if (actionPath) {\n            actionPath.count++;\n            return false;\n        }\n        // eslint-disable-next-line prefer-const\n        let timeoutObject;\n        const clear = () => {\n            const item = action.get(path);\n            const count = item ? item.count : 0;\n            action.delete(path);\n            clearTimeout(timeoutObject);\n            if (item)\n                clearTimeout(item.timeoutObject);\n            return count;\n        };\n        timeoutObject = setTimeout(clear, timeout);\n        const thr = { timeoutObject, clear, count: 0 };\n        action.set(path, thr);\n        return thr;\n    }\n    _incrReadyCount() {\n        return this._readyCount++;\n    }\n    /**\n     * Awaits write operation to finish.\n     * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n     * @param path being acted upon\n     * @param threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n     * @param event\n     * @param awfEmit Callback to be called when ready for event to be emitted.\n     */\n    _awaitWriteFinish(path, threshold, event, awfEmit) {\n        const awf = this.options.awaitWriteFinish;\n        if (typeof awf !== 'object')\n            return;\n        const pollInterval = awf.pollInterval;\n        let timeoutHandler;\n        let fullPath = path;\n        if (this.options.cwd && !sysPath.isAbsolute(path)) {\n            fullPath = sysPath.join(this.options.cwd, path);\n        }\n        const now = new Date();\n        const writes = this._pendingWrites;\n        function awaitWriteFinishFn(prevStat) {\n            statcb(fullPath, (err, curStat) => {\n                if (err || !writes.has(path)) {\n                    if (err && err.code !== 'ENOENT')\n                        awfEmit(err);\n                    return;\n                }\n                const now = Number(new Date());\n                if (prevStat && curStat.size !== prevStat.size) {\n                    writes.get(path).lastChange = now;\n                }\n                const pw = writes.get(path);\n                const df = now - pw.lastChange;\n                if (df >= threshold) {\n                    writes.delete(path);\n                    awfEmit(undefined, curStat);\n                }\n                else {\n                    timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);\n                }\n            });\n        }\n        if (!writes.has(path)) {\n            writes.set(path, {\n                lastChange: now,\n                cancelWait: () => {\n                    writes.delete(path);\n                    clearTimeout(timeoutHandler);\n                    return event;\n                },\n            });\n            timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval);\n        }\n    }\n    /**\n     * Determines whether user has asked to ignore this path.\n     */\n    _isIgnored(path, stats) {\n        if (this.options.atomic && DOT_RE.test(path))\n            return true;\n        if (!this._userIgnored) {\n            const { cwd } = this.options;\n            const ign = this.options.ignored;\n            const ignored = (ign || []).map(normalizeIgnored(cwd));\n            const ignoredPaths = [...this._ignoredPaths];\n            const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];\n            this._userIgnored = anymatch(list, undefined);\n        }\n        return this._userIgnored(path, stats);\n    }\n    _isntIgnored(path, stat) {\n        return !this._isIgnored(path, stat);\n    }\n    /**\n     * Provides a set of common helpers and properties relating to symlink handling.\n     * @param path file or directory pattern being watched\n     */\n    _getWatchHelpers(path) {\n        return new WatchHelper(path, this.options.followSymlinks, this);\n    }\n    // Directory helpers\n    // -----------------\n    /**\n     * Provides directory tracking objects\n     * @param directory path of the directory\n     */\n    _getWatchedDir(directory) {\n        const dir = sysPath.resolve(directory);\n        if (!this._watched.has(dir))\n            this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n        return this._watched.get(dir);\n    }\n    // File helpers\n    // ------------\n    /**\n     * Check for read permissions: https://stackoverflow.com/a/11781404/1358405\n     */\n    _hasReadPermissions(stats) {\n        if (this.options.ignorePermissionErrors)\n            return true;\n        return Boolean(Number(stats.mode) & 0o400);\n    }\n    /**\n     * Handles emitting unlink events for\n     * files and directories, and via recursion, for\n     * files and directories within directories that are unlinked\n     * @param directory within which the following item is located\n     * @param item      base path of item/directory\n     */\n    _remove(directory, item, isDirectory) {\n        // if what is being deleted is a directory, get that directory's paths\n        // for recursive deleting and cleaning of watched object\n        // if it is not a directory, nestedDirectoryChildren will be empty array\n        const path = sysPath.join(directory, item);\n        const fullPath = sysPath.resolve(path);\n        isDirectory =\n            isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath);\n        // prevent duplicate handling in case of arriving here nearly simultaneously\n        // via multiple paths (such as _handleFile and _handleDir)\n        if (!this._throttle('remove', path, 100))\n            return;\n        // if the only watched file is removed, watch for its return\n        if (!isDirectory && this._watched.size === 1) {\n            this.add(directory, item, true);\n        }\n        // This will create a new entry in the watched object in either case\n        // so we got to do the directory check beforehand\n        const wp = this._getWatchedDir(path);\n        const nestedDirectoryChildren = wp.getChildren();\n        // Recursively remove children directories / files.\n        nestedDirectoryChildren.forEach((nested) => this._remove(path, nested));\n        // Check if item was on the watched list and remove it\n        const parent = this._getWatchedDir(directory);\n        const wasTracked = parent.has(item);\n        parent.remove(item);\n        // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n        // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n        // but never removed from the map in case the path was deleted.\n        // This leads to an incorrect state if the path was recreated:\n        // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n        if (this._symlinkPaths.has(fullPath)) {\n            this._symlinkPaths.delete(fullPath);\n        }\n        // If we wait for this file to be fully written, cancel the wait.\n        let relPath = path;\n        if (this.options.cwd)\n            relPath = sysPath.relative(this.options.cwd, path);\n        if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n            const event = this._pendingWrites.get(relPath).cancelWait();\n            if (event === EV.ADD)\n                return;\n        }\n        // The Entry will either be a directory that just got removed\n        // or a bogus entry to a file, in either case we have to remove it\n        this._watched.delete(path);\n        this._watched.delete(fullPath);\n        const eventName = isDirectory ? EV.UNLINK_DIR : EV.UNLINK;\n        if (wasTracked && !this._isIgnored(path))\n            this._emit(eventName, path);\n        // Avoid conflicts if we later create another file with the same name\n        this._closePath(path);\n    }\n    /**\n     * Closes all watchers for a path\n     */\n    _closePath(path) {\n        this._closeFile(path);\n        const dir = sysPath.dirname(path);\n        this._getWatchedDir(dir).remove(sysPath.basename(path));\n    }\n    /**\n     * Closes only file-specific watchers\n     */\n    _closeFile(path) {\n        const closers = this._closers.get(path);\n        if (!closers)\n            return;\n        closers.forEach((closer) => closer());\n        this._closers.delete(path);\n    }\n    _addPathCloser(path, closer) {\n        if (!closer)\n            return;\n        let list = this._closers.get(path);\n        if (!list) {\n            list = [];\n            this._closers.set(path, list);\n        }\n        list.push(closer);\n    }\n    _readdirp(root, opts) {\n        if (this.closed)\n            return;\n        const options = { type: EV.ALL, alwaysStat: true, lstat: true, ...opts, depth: 0 };\n        let stream = readdirp(root, options);\n        this._streams.add(stream);\n        stream.once(STR_CLOSE, () => {\n            stream = undefined;\n        });\n        stream.once(STR_END, () => {\n            if (stream) {\n                this._streams.delete(stream);\n                stream = undefined;\n            }\n        });\n        return stream;\n    }\n}\n/**\n * Instantiates watcher with paths to be tracked.\n * @param paths file / directory paths\n * @param options opts, such as `atomic`, `awaitWriteFinish`, `ignored`, and others\n * @returns an instance of FSWatcher for chaining.\n * @example\n * const watcher = watch('.').on('all', (event, path) => { console.log(event, path); });\n * watch('.', { atomic: true, awaitWriteFinish: true, ignored: (f, stats) => stats?.isFile() && !f.endsWith('.js') })\n */\nexport function watch(paths, options = {}) {\n    const watcher = new FSWatcher(options);\n    watcher.add(paths);\n    return watcher;\n}\nexport default { watch, FSWatcher };\n","/**\n * Long-running daemon. Runs after `npx modelstat@latest` succeeds (or\n * directly via `modelstat start` if already paired).\n *\n * Responsibilities:\n *   1. Heartbeat every 10s so the dashboard knows this device is online.\n *   2. Discover installed tools once at startup (quick).\n *   3. Watch local AI-tool data dirs with chokidar; debounced full\n *      re-scan runs `scanAll()` on every change.\n *   4. Track per-file cursors in `conf` so a restart picks up exactly\n *      where we left off — no re-upload, no gaps.\n *   5. When the backend is unreachable, keep working: the cursor only\n *      advances on successful upload, so pending events accumulate\n *      and drain automatically when connectivity returns.\n *   6. Report phase + progress + queue size via heartbeat at every\n *      stage so the dashboard shows precise activity.\n */\nimport { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { describeErrorWithCause } from \"@modelstat/daemon-core/logger\";\nimport type { DetectedIdentity, DetectedInstallation } from \"@modelstat/core\";\nimport { discover } from \"@modelstat/parsers\";\nimport { postHeartbeat } from \"./api.js\";\nimport { state } from \"./config.js\";\nimport { acquireDaemonLock, formatAge } from \"./lock.js\";\nimport { machineKey } from \"./machine-key.js\";\nimport { refreshSessionInsights } from \"./insights.js\";\nimport {\n  drainLocalQueue,\n  type LocalIngestReceiver,\n  localQueueDepth,\n  startLocalIngestReceiver,\n} from \"./receiver.js\";\nimport { reconcileBackfill } from \"./reconcile.js\";\nimport { runtimeState } from \"./runtime-state.js\";\nimport { scanAll, scanSession } from \"./scan.js\";\nimport { createCoalescingRunner } from \"./single-flight.js\";\nimport { autoUpdateEnabled, clearUpgradeMarker, maybeAutoUpdate } from \"./update.js\";\n\n// Substituted by tsup's `define` at build time (see tsup.config.ts).\n// Replaces an older runtime parent-walk for package.json that broke\n// once the bundle was copied to ~/.modelstat/bin/ (no sibling\n// package.json), making the daemon report \"daemon-unknown\" on every\n// upgrade. cli.ts and scan.ts use the same macro.\nconst DAEMON_VERSION: string =\n  typeof __MODELSTAT_VERSION__ === \"string\" ? __MODELSTAT_VERSION__ : \"daemon-dev\";\nconst HEARTBEAT_INTERVAL_MS = 10_000;\nconst SCAN_INTERVAL_MS = 5 * 60 * 1000; // backstop periodic scan\n/** Discovery now RIDES the heartbeat: the snapshot is attached only when it\n * changed, plus a periodic backstop so the server's installs/identities can't\n * go stale even if a probe momentarily misses something. */\nconst DISCOVERY_BACKSTOP_MS = 5 * 60 * 1000;\n// When the LLM recovers after a degraded run, re-scan to upgrade extractive\n// abstracts — but at most this often, so a flaky LLM (preflight passes, scans\n// fail) can't re-scan the whole history on every restart.\nconst SUMMARISER_RECOVERY_MIN_INTERVAL_MS = 6 * 60 * 60_000;\n\ntype Phase =\n  | \"starting\"\n  | \"discovering\"\n  | \"idle\"\n  | \"scanning\"\n  | \"processing\"\n  | \"uploading\"\n  | \"watching\"\n  | \"offline\"\n  | \"error\";\n\ninterface Heartbeat {\n  status: Phase;\n  message?: string | null;\n  progress_done?: number;\n  progress_total?: number;\n  queue_size?: number;\n  stats?: Record<string, number | string>;\n  last_event_at?: string | null;\n  daemon_version?: string;\n  /** Stable hardware machine key (see machine-key.ts). Sent so the\n   * server can backfill `devices.machine_id` onto an already-enrolled\n   * row that registered before machine_id existed — which is what lets\n   * machine-key dedupe protect legacy devices without a re-register. */\n  machine_id?: string;\n  /** Server release verdict for this daemon, set from the heartbeat response\n   * and mirrored to last-status.json for the tray/CLI. null ⇒ up to date. */\n  update?: { verdict: string; latest: string | null } | null;\n  /** Effective auto-update setting (env override or stored pref) — the tray\n   * reads this to render its checkbox. */\n  auto_update?: boolean;\n  /** Discovery snapshot — installs + signed-in accounts. FOLDED INTO the\n   * heartbeat (the standalone /v1/devices/discovery endpoint is gone). Attached\n   * only when the snapshot changed (or on the periodic backstop), so a steady\n   * state ships a tiny liveness body. */\n  installations?: DetectedInstallation[];\n  identities?: DetectedIdentity[];\n}\n\n/** Shared mutable state the heartbeat reporter reads. Each subsystem\n * (scanner, watcher, uploader) updates these; the reporter snapshots\n * them and sends via the heartbeat endpoint. */\nconst status = {\n  phase: \"starting\" as Phase,\n  message: null as string | null,\n  progressDone: 0,\n  progressTotal: 0,\n  queueSize: 0,\n  stats: {} as Record<string, number | string>,\n  lastEventAt: null as string | null,\n  update: null as { verdict: string; latest: string | null } | null,\n};\n\nexport function setPhase(phase: Phase, message?: string | null): void {\n  status.phase = phase;\n  status.message = message ?? null;\n  scheduleLocalFlush();\n}\n/** Update only the human-readable status line (phase unchanged). */\nexport function setMessage(message: string | null): void {\n  status.message = message;\n  scheduleLocalFlush();\n}\nexport function setProgress(done: number, total: number): void {\n  status.progressDone = done;\n  status.progressTotal = total;\n  scheduleLocalFlush();\n}\nexport function setQueue(n: number): void {\n  status.queueSize = n;\n  scheduleLocalFlush();\n}\nexport function bumpStat(key: string, delta: number): void {\n  const cur = Number(status.stats[key] ?? 0);\n  status.stats[key] = cur + delta;\n  scheduleLocalFlush();\n}\n/** Set a stat to an absolute value. Used for gauges like\n * `segments_sending` that go up then back to zero, where a running\n * delta would drift. */\nexport function setStat(key: string, value: number): void {\n  status.stats[key] = value;\n  scheduleLocalFlush();\n}\nexport function noteEventAt(iso: string): void {\n  status.lastEventAt = iso;\n  scheduleLocalFlush();\n}\n/** Record the server's release verdict (or clear it). Surfaced to the tray/CLI\n * via last-status.json; the action (auto-update / nudge) is in handleRelease. */\nfunction setUpdate(u: { verdict: string; latest: string | null } | null): void {\n  status.update = u;\n  scheduleLocalFlush();\n}\n\n/** Snapshot the shared mutable `status` into the wire/heartbeat shape.\n * Used by both the network heartbeat and the local-file mirror so the\n * two never drift. The local mirror keeps a `device_id` for the tray;\n * the wire body sent to the server omits it (it's in the URL path). */\nfunction snapshotBody(): Heartbeat & { device_id: string | null } {\n  return {\n    device_id: state.deviceId ?? null,\n    status: status.phase,\n    message: status.message,\n    progress_done: status.progressDone,\n    progress_total: status.progressTotal,\n    queue_size: status.queueSize,\n    stats: status.stats,\n    last_event_at: status.lastEventAt,\n    daemon_version: DAEMON_VERSION,\n    machine_id: machineKey(),\n    update: status.update,\n    auto_update: autoUpdateEnabled(),\n  };\n}\n\n/* ─── Discovery folded into the heartbeat ──────────────────────────────────\n * The standalone POST /v1/devices/discovery is gone server-side. The daemon\n * now attaches its installs/identities snapshot to the heartbeat:\n *   • on the FIRST heartbeat after boot,\n *   • whenever the snapshot CHANGES (hash differs), and\n *   • at most every DISCOVERY_BACKSTOP_MS as a backstop (so a momentarily-\n *     incomplete probe can't pin a stale snapshot on the server forever).\n * A discover() failure is best-effort: it must NEVER block liveness — the\n * heartbeat still goes out, just without the discovery arrays this tick. */\nlet lastDiscoveryHash: string | null = null;\nlet lastDiscoveryAttachedAt = 0;\n\nfunction hashDiscovery(d: { installations: DetectedInstallation[]; identities: DetectedIdentity[] }): string {\n  // Stable JSON over the parts that matter; cheap SHA-256 to detect change.\n  return createHash(\"sha256\").update(JSON.stringify({ i: d.installations, a: d.identities })).digest(\"hex\");\n}\n\n/**\n * Best-effort discovery snapshot for the heartbeat. Returns the\n * installations/identities arrays to attach, or `null` to send a bare liveness\n * heartbeat (unchanged snapshot, or a discover() failure). NEVER throws.\n */\nasync function discoverySnapshotForHeartbeat(): Promise<{\n  installations: DetectedInstallation[];\n  identities: DetectedIdentity[];\n} | null> {\n  let d: { installations: DetectedInstallation[]; identities: DetectedIdentity[] };\n  try {\n    d = await discover();\n  } catch (e) {\n    // Discovery is best-effort — a probe failure can't block liveness. Surface\n    // it on the status line but still send the heartbeat (caller attaches null).\n    setMessage(`discovery deferred: ${describeErrorWithCause(e)}`);\n    return null;\n  }\n  status.stats[\"installations_detected\"] = d.installations.length;\n  status.stats[\"identities_detected\"] = d.identities.length;\n  const hash = hashDiscovery(d);\n  const now = Date.now();\n  const changed = hash !== lastDiscoveryHash;\n  const backstopDue = now - lastDiscoveryAttachedAt >= DISCOVERY_BACKSTOP_MS;\n  if (!changed && !backstopDue) return null; // steady state — bare heartbeat\n  lastDiscoveryHash = hash;\n  lastDiscoveryAttachedAt = now;\n  return { installations: d.installations, identities: d.identities };\n}\n\n// Write last-status.json on every status change (coalesced), decoupled\n// from the 10s network heartbeat. The tray reads this file directly, so\n// without this the menu only ever moved once per heartbeat — and during\n// a long summarise pass (no heartbeat-relevant change) it looked frozen\n// for minutes even though work was happening.\nconst LOCAL_FLUSH_THROTTLE_MS = 400;\nlet localFlushTimer: NodeJS.Timeout | null = null;\nlet localFlushPending = false;\nfunction scheduleLocalFlush(): void {\n  if (localFlushTimer) {\n    // A write is on cooldown; remember to flush again when it lifts so\n    // the final state of a burst always lands.\n    localFlushPending = true;\n    return;\n  }\n  writeLocalStatus(snapshotBody()).catch(() => undefined); // leading edge\n  localFlushTimer = setTimeout(() => {\n    localFlushTimer = null;\n    if (localFlushPending) {\n      localFlushPending = false;\n      scheduleLocalFlush(); // trailing edge — capture latest state\n    }\n  }, LOCAL_FLUSH_THROTTLE_MS);\n  localFlushTimer.unref();\n}\n\n// Track the last verdict so a transition is logged once (heartbeat fires every\n// 10s); maybeAutoUpdate self-dedups the action per (verdict, target).\nlet lastVerdict = \"ok\";\nasync function handleRelease(rel?: { verdict?: string; latest?: string | null }): Promise<void> {\n  const verdict = rel?.verdict ?? \"ok\";\n  const latest = rel?.latest ?? null;\n  if (verdict === \"ok\") {\n    if (status.update) setUpdate(null);\n    lastVerdict = \"ok\";\n    return;\n  }\n  setUpdate({ verdict, latest });\n  if (verdict !== lastVerdict) {\n    // biome-ignore lint/suspicious/noConsole: one-line release transition for the logs\n    console.log(\n      `[modelstat] release ${verdict}: this daemon ${DAEMON_VERSION}, latest ${latest ?? \"?\"}`,\n    );\n  }\n  lastVerdict = verdict;\n  // On the auto-update path, quiesce (stop scans + drain + free Metal) BEFORE\n  // the install spawns, so the postinstall's SIGTERM finds us already off the\n  // device and the replacement daemon doesn't race two processes onto Metal.\n  const note = await maybeAutoUpdate(verdict, latest, quiesceSummariser);\n  if (note) {\n    // biome-ignore lint/suspicious/noConsole: one-time auto-update note for the logs\n    console.log(`[modelstat] ${note}`);\n  }\n}\n\nasync function sendHeartbeat(): Promise<void> {\n  const bearer = state.bearer;\n  const deviceId = state.deviceId;\n  if (!bearer || !deviceId) return; // pre-enrollment\n\n  // The local-mirror snapshot carries device_id for the tray; the WIRE body\n  // does NOT (device_id is in the URL path now), so strip it before sending.\n  const local = snapshotBody();\n  const { device_id: _omit, ...liveness } = local;\n\n  // Fold discovery into the heartbeat — attach the snapshot only when it changed\n  // (or on the periodic backstop). Best-effort: a discover() failure returns\n  // null and the bare liveness heartbeat still goes out.\n  const snap = await discoverySnapshotForHeartbeat();\n  const wireBody: Record<string, unknown> = { ...liveness };\n  if (snap) {\n    wireBody.installations = snap.installations;\n    wireBody.identities = snap.identities;\n  }\n\n  // Route through the shared device client: POST the path-style URL, get the\n  // SAME 401→recoverIdentity + 5xx-backoff handling as every other device call.\n  // postHeartbeat returns the unwrapped `.data` (or null on a non-recoverable\n  // failure / network blip — in which case the dashboard sees a stale heartbeat\n  // and the local phase flips via the scanner's catch on the next upload).\n  try {\n    const data = await postHeartbeat(deviceId, wireBody);\n    // The server returns our release verdict (ok / update_available /\n    // upgrade_required) — act on it (alert + auto-update).\n    if (data?.daemon_release) await handleRelease(data.daemon_release);\n  } catch {\n    // postHeartbeat already absorbs network/HTTP errors into null; a throw here\n    // would be unexpected — ignore so the next tick retries.\n  }\n\n  // Mirror the heartbeat to ~/.modelstat/last-status.json so the\n  // tray + CLI (`modelstat status`/`jobs`) can read fresh numbers\n  // without an authenticated round-trip to the server. This is now the\n  // SOLE source of local usage numbers: the old public\n  // /v1/device/:claim_code capability endpoint was removed server-side\n  // (it returns the SPA HTML now), so the snapshot's phase / queue /\n  // segment-upload stats are what `modelstat status --json` reports.\n  writeLocalStatus(local).catch(() => undefined);\n}\n\n/** Cap on ~/.modelstat/logs/{out,err}.log before boot-time rotation.\n * The 2026-06-11 incident left a 992 MB err.log (one identical warn\n * line repeated ~5M times during a full reprocess); nothing ever\n * trimmed it because launchd doesn't rotate StandardErrorPath. */\nconst LOG_MAX_BYTES = 64 * 1024 * 1024;\n/** How much of the oversized log's tail survives into `<name>.old.log`\n * — enough to keep the most recent crash stacks for forensics. */\nconst LOG_TAIL_KEEP_BYTES = 4 * 1024 * 1024;\n\n/**\n * Boot-time guard against runaway log files. Whoever supervises us —\n * launchd writing StandardErrorPath (O_APPEND) or the tray holding a\n * FileHandle — keeps the log fd OPEN across daemon restarts, so the\n * log must be truncated IN PLACE: renaming would detach the path from\n * the live fd and the supervisor would keep growing the renamed inode\n * forever. We copy the tail to `<name>.old.log` first so the last\n * crash isn't lost. Best-effort: any fs error leaves the log as-is.\n */\nasync function rotateRunawayLogs(): Promise<void> {\n  const { homedir } = await import(\"node:os\");\n  const { join } = await import(\"node:path\");\n  const { open, stat, truncate, writeFile } = await import(\"node:fs/promises\");\n  const dir = join(homedir(), \".modelstat\", \"logs\");\n  for (const name of [\"out.log\", \"err.log\"]) {\n    const p = join(dir, name);\n    try {\n      const st = await stat(p);\n      if (st.size <= LOG_MAX_BYTES) continue;\n      const keep = Math.min(LOG_TAIL_KEEP_BYTES, st.size);\n      const fh = await open(p, \"r\");\n      try {\n        const buf = Buffer.alloc(keep);\n        await fh.read(buf, 0, keep, st.size - keep);\n        await writeFile(p.replace(/\\.log$/, \".old.log\"), buf);\n      } finally {\n        await fh.close();\n      }\n      await truncate(p, 0);\n      // biome-ignore lint/suspicious/noConsole: one-line, post-rotation so it lands in the fresh log\n      console.log(\n        `[modelstat] rotated ${name}: was ${(st.size / 1024 / 1024).toFixed(0)} MB (> ${LOG_MAX_BYTES / 1024 / 1024} MB cap), tail kept in ${name.replace(/\\.log$/, \".old.log\")}`,\n      );\n    } catch {\n      /* best-effort — never block daemon boot on log hygiene */\n    }\n  }\n}\n\nlet lastStatusPath: string | null = null;\nasync function writeLocalStatus(snapshot: object): Promise<void> {\n  const { join } = await import(\"node:path\");\n  const { writeFile, mkdir, rename } = await import(\"node:fs/promises\");\n  const { modelstatHome } = await import(\"./paths.js\");\n  if (!lastStatusPath) {\n    const dir = modelstatHome();\n    try {\n      await mkdir(dir, { recursive: true });\n    } catch {\n      /* permission / fs error — silent; tray will fall back */\n    }\n    lastStatusPath = join(dir, \"last-status.json\");\n  }\n  const tmp = `${lastStatusPath}.tmp`;\n  try {\n    await writeFile(tmp, JSON.stringify({ ...snapshot, written_at: new Date().toISOString() }));\n    await rename(tmp, lastStatusPath);\n  } catch {\n    /* fs blip — next tick will retry */\n  }\n}\n\nasync function runScanCycle(reason: string): Promise<void> {\n  setPhase(\"scanning\", `Scanning local JSONL (${reason})`);\n  setProgress(0, 0);\n  try {\n    const r = await scanAll({\n      onFile(path, index, total) {\n        setProgress(index + 1, total);\n        setMessage(`Scanning ${index + 1}/${total}: ${basename(path)}`);\n      },\n      onProgress(p) {\n        // The summarise pass — the slow, previously-opaque phase. Keep\n        // the status line moving on every segment (and every session) so\n        // the tray shows continuous activity instead of a frozen number.\n        const sess = p.sessionTotal > 1 ? ` · session ${p.session}/${p.sessionTotal}` : \"\";\n        if (p.segment === 0) {\n          setPhase(\"processing\", `Analyzing${sess}`);\n        } else {\n          setPhase(\"processing\", `Summarising segment ${p.segment}/${p.segmentTotal}${sess}`);\n        }\n      },\n      onUpload({ segments }) {\n        // In-flight gauge: how many segments are being sent right now.\n        setPhase(\"uploading\", `Uploading ${segments} segments`);\n        setStat(\"segments_sending\", segments);\n      },\n      onUploaded({ events, segments }) {\n        bumpStat(\"events_uploaded\", events);\n        bumpStat(\"batches_uploaded\", 1);\n        // Persist the lifetime total and mirror it into the heartbeat\n        // so the tray's \"total sent\" survives restarts.\n        setStat(\"segments_sent\", state.bumpSegmentsSent(segments));\n        setStat(\"segments_sending\", 0);\n        status.lastEventAt = new Date().toISOString();\n      },\n      onDropped() {\n        // The server permanently rejected a batch (400/422) and the scanner\n        // quarantined it (logging the reason loudly) so newer data keeps flowing —\n        // surface the COUNT so the (rare) daemon-side data loss is visible in the\n        // tray, not silent. Don't flip phase: the daemon is healthy, it just\n        // skipped one un-encodable batch.\n        bumpStat(\"batches_dropped\", 1);\n        setStat(\"segments_sending\", 0);\n      },\n    });\n    bumpStat(\"files_scanned\", r.filesScanned);\n    bumpStat(\"files_unchanged\", r.filesUnchanged);\n    if (r.morePending) {\n      // The cycle hit its file cap with older history still to drain — re-scan\n      // promptly (newest-first, bounded per cycle) so a fresh device's backlog\n      // fills in over quick successive scans instead of one giant, OOM-prone,\n      // crash-looping pass.\n      setPhase(\"processing\", \"Catching up on history…\");\n      setTimeout(() => void requestScan(\"backfill\"), 250);\n    } else {\n      setPhase(\"watching\", \"Waiting for new events\");\n      setProgress(0, 0);\n    }\n  } catch (e) {\n    // Unwrap undici's \"fetch failed\" wrapper so the dashboard shows\n    // the actual cause (ECONNREFUSED, ENOTFOUND, certificate error,\n    // etc) — the original message alone was useless for debugging.\n    // A batch was in-flight when this threw, so clear the gauge.\n    setStat(\"segments_sending\", 0);\n    setPhase(\"offline\", `Upload failed: ${describeErrorWithCause(e)}`);\n  }\n}\n\n/**\n * Single entry point for every scan trigger (startup, file-watcher,\n * 5-min backstop). Coalescing single-flight: never runs two scans at\n * once, and collapses triggers that arrive mid-scan into exactly one\n * follow-up. This is what bounds the daemon's memory — see\n * single-flight.ts for why an unguarded `runScanCycle` OOMs the V8 heap\n * during long backfills.\n */\nconst scanRunner = createCoalescingRunner<string>(runScanCycle);\n// Set once we begin quiescing for a self-update (or shutdown). Once armed, no\n// new scan is admitted — the process is about to be replaced/killed and we must\n// not start fresh work on a Metal device we're about to free.\nlet quiescing = false;\nfunction requestScan(reason: string): Promise<void> {\n  if (quiescing) return Promise.resolve();\n  return scanRunner.trigger(reason);\n}\n\n/**\n * Make the process safe to kill: stop admitting new scans, let the in-flight\n * scan drain, then free the bundled summariser's Metal device. Called before a\n * self-update spawns `npm i -g` (so the to-be-killed daemon is already off the\n * device when its replacement initialises Metal) and reusable by shutdown.\n * Idempotent + best-effort: never throws.\n */\nasync function quiesceSummariser(): Promise<void> {\n  quiescing = true;\n  try {\n    await scanRunner.idle();\n  } catch {\n    /* idle() can't reject; never block on it */\n  }\n  try {\n    const { disposeLlama } = await import(\"@modelstat/daemon-core/node\");\n    await disposeLlama();\n  } catch {\n    /* best-effort */\n  }\n}\n\n/**\n * Eager single-session force-scan, invoked by the loopback control endpoint\n * (`POST /v1/control/scan` — see receiver.ts). A warm daemon already has the\n * summariser resident, so this lands a session you JUST finished in seconds,\n * then refreshes that session's server insights into the local cache the\n * statusline reads. Runs safely alongside the periodic file scan: the bundled\n * summariser serialises its own inference, and a force-scan still advances the\n * cursor so the next incremental `scanAll` stays consistent.\n *\n * The receiver already single-flights control scans, so this just does the\n * work + reports status; failures are surfaced to the caller (a `wait:true`\n * POST) but never crash the daemon.\n */\nasync function runEagerSessionScan(target: {\n  sessionIds?: string[];\n  file?: string;\n}): Promise<void> {\n  setPhase(\"scanning\", \"Eager scan (current session)\");\n  try {\n    const r = await scanSession(target, {\n      onProgress(p) {\n        if (p.segment === 0) setPhase(\"processing\", \"Analyzing current session\");\n        else setPhase(\"processing\", `Summarising segment ${p.segment}/${p.segmentTotal}`);\n      },\n      onUpload({ segments }) {\n        setPhase(\"uploading\", `Uploading ${segments} segments`);\n        setStat(\"segments_sending\", segments);\n      },\n      onUploaded({ events, segments }) {\n        bumpStat(\"events_uploaded\", events);\n        setStat(\"segments_sent\", state.bumpSegmentsSent(segments));\n        setStat(\"segments_sending\", 0);\n        status.lastEventAt = new Date().toISOString();\n      },\n    });\n    // Refresh the local insights cache for the scanned session(s) so the\n    // statusline shows fresh numbers. Prefer the explicit chain; otherwise the\n    // server resolves nothing useful, so only refresh when ids were given.\n    if (target.sessionIds && target.sessionIds.length > 0) {\n      await refreshSessionInsights(target.sessionIds);\n    }\n    setPhase(\"watching\", \"Waiting for new events\");\n    setMessage(\n      r.segmentsUploaded > 0\n        ? `Eager scan: ${r.segmentsUploaded} segments uploaded`\n        : \"Eager scan: nothing new\",\n    );\n  } catch (e) {\n    setStat(\"segments_sending\", 0);\n    setPhase(\"watching\", `Eager scan failed: ${describeErrorWithCause(e)}`);\n    throw e;\n  }\n}\n\nfunction basename(p: string): string {\n  return p.split(\"/\").pop() ?? p;\n}\n\n/** The main loop. Never returns unless blocked by an already-running\n * daemon (in which case returns 0 with a friendly \"already running\"\n * message and no side effects). */\n/** Best-effort: re-wire any newly-installed AI tools on startup, self-healing a\n * transient install-time `wire` miss (or a tool the user installed after\n * modelstat). `wire --heal` only touches clients we haven't wired before, so it\n * never re-adds an entry the user removed. Detached + fully swallowed — never\n * blocks or fails the daemon; a failed cold `npx` fetch just retries next start. */\nfunction healMcpWiring(): void {\n  try {\n    const child = spawn(\"npx\", [\"-y\", \"@modelstat/mcp\", \"wire\", \"--heal\"], {\n      stdio: \"ignore\",\n      detached: true,\n      windowsHide: true,\n    });\n    child.on(\"error\", () => {}); // npx absent/offline — ignore (retried next start)\n    child.unref();\n  } catch {\n    /* ignore */\n  }\n}\n\nexport async function runDaemon(opts: { force?: boolean } = {}): Promise<void> {\n  if (!state.bearer || !state.deviceId) {\n    throw new Error(\"not enrolled — run `npx modelstat@latest` first\");\n  }\n\n  // Singleton lock: bail out early if another daemon is already running\n  // under this home directory. Two daemons clobber each other's file\n  // cursors and send duplicate heartbeats that scramble Live Activity.\n  const lock = acquireDaemonLock({\n    daemonVersion: DAEMON_VERSION,\n    apiUrl: state.apiUrl,\n    force: opts.force === true,\n    // If a racing daemon out-renamed us for the lock (see lock.ts\n    // recheck), stand down with exit 0: our supervisor's next health\n    // check sees the winner and adopts it instead of respawning us.\n    onLockLost: (winner) => {\n      setPhase(\"offline\", `another daemon (pid ${winner.pid}) owns the lock — standing down`);\n      // biome-ignore lint/suspicious/noConsole: one-line, user-visible exit reason\n      console.log(\n        `[modelstat] another daemon (pid ${winner.pid}, started ${winner.startedAt}) won the lock race — this instance is standing down.`,\n      );\n      process.exit(0);\n    },\n  });\n  if (lock.kind === \"already_running\") {\n    // biome-ignore lint/suspicious/noConsole: user-visible CLI output\n    console.log(\n      `modelstat daemon is already running — PID ${lock.owner.pid}, started ${formatAge(\n        lock.ageSec,\n      )} ago, daemon ${lock.owner.daemonVersion}.`,\n    );\n    // biome-ignore lint/suspicious/noConsole: user-visible CLI output\n    console.log(\"  → to stop it:          kill \" + lock.owner.pid);\n    // biome-ignore lint/suspicious/noConsole: user-visible CLI output\n    console.log(\"  → to force-replace it: modelstat start --force\");\n    return;\n  }\n\n  setPhase(\"starting\", \"Booting\");\n  // We hold the singleton lock, so we ARE the live daemon now — any in-flight\n  // upgrade has landed (the postinstall stopped the old one and kickstarted us).\n  // Clear the upgrade marker so a future verdict isn't suppressed by a stale one.\n  clearUpgradeMarker();\n  // Trim runaway logs before anything else writes to them — a daemon\n  // that died spamming one warn line must not boot back up on top of a\n  // gigabyte-scale err.log.\n  await rotateRunawayLogs();\n  // Seed the lifetime \"segments sent\" tally from disk so the tray\n  // shows the running total from the first heartbeat, not 0 until the\n  // first upload of this run.\n  setStat(\"segments_sent\", state.segmentsSent);\n\n  // Self-heal MCP wiring in the background — picks up tools installed after\n  // modelstat, or recovers a transient install-time `wire` miss. Detached +\n  // best-effort; never blocks the boot below.\n  healMcpWiring();\n\n  // Start heartbeat ticker immediately\n  const hb = setInterval(() => void sendHeartbeat(), HEARTBEAT_INTERVAL_MS);\n  hb.unref();\n  void sendHeartbeat(); // prime\n\n  // Verify the summariser before producing segments. The daemon NO LONGER\n  // refuses to start when the LLM can't load — that left users with zero data.\n  // It degrades to the dependency-free extractive fallback (loud warning +\n  // degraded status line) and self-heals once the LLM is healthy again.\n  const wasDegraded = runtimeState.getSummariserDegraded();\n  try {\n    setPhase(\"starting\", \"Preflight: summariser\");\n    const { preflightSummariser } = await import(\"./pipeline.js\");\n    const { label, degraded } = await preflightSummariser();\n    if (degraded) {\n      // biome-ignore lint/suspicious/noConsole: loud degraded startup status\n      console.warn(`[modelstat] ⚠ summariser preflight DEGRADED — ${label}`);\n      setMessage(\n        \"summariser degraded: extractive fallback (LLM unavailable) — ingest continues, self-heals when the model loads\",\n      );\n    } else {\n      // biome-ignore lint/suspicious/noConsole: startup status\n      console.log(`[modelstat] summariser preflight ok: ${label}`);\n      // Self-heal: the LLM is healthy, but the LAST run shipped extractive\n      // abstracts → re-scan so they upgrade to model quality. Rate-gated so a\n      // flaky LLM can't re-scan the whole history on every restart.\n      if (wasDegraded) {\n        const since = Date.now() - runtimeState.getSummariserRecoveryAt();\n        if (since > SUMMARISER_RECOVERY_MIN_INTERVAL_MS) {\n          runtimeState.wipeCursors();\n          runtimeState.setSummariserRecoveryAt(Date.now());\n          // biome-ignore lint/suspicious/noConsole: recovery status\n          console.log(\n            \"[modelstat] summariser recovered — re-scanning so extractive fallback abstracts upgrade to model quality\",\n          );\n        }\n      }\n      runtimeState.setSummariserDegraded(false);\n    }\n  } catch (err) {\n    // The preflight no longer throws on a missing LLM (it degrades). A throw\n    // here is genuinely unexpected — log and CONTINUE rather than refuse to\n    // start; ingest availability is the priority.\n    // biome-ignore lint/suspicious/noConsole: unexpected-but-tolerated\n    console.warn(`[modelstat] summariser preflight error (continuing): ${(err as Error).message}`);\n    setMessage(`summariser preflight error (continuing): ${(err as Error).message}`);\n  }\n\n  // Local loopback ingest receiver — the server half of the SDKs'\n  // `local_daemon` mode (sdks/{node,python,rust} default to\n  // http://127.0.0.1:4319/v1/ingest). SDK captures land in a durable queue\n  // and drain through the SAME pipeline + uploader as file scans, under this\n  // device's secret — so the SDK ships no credentials and only redacted\n  // segment abstracts leave the machine. Best-effort: a busy port just\n  // disables this path (the file scan is the daemon's core duty).\n  const localIngest: LocalIngestReceiver | null = await startLocalIngestReceiver({\n    // Serve the loopback control endpoint so `modelstat sync --session` can\n    // warm this running daemon (summariser already loaded) instead of\n    // cold-spawning its own — and so the eager scan refreshes the local\n    // insights cache the statusline reads.\n    onControlScan: runEagerSessionScan,\n  });\n  const LOCAL_DRAIN_INTERVAL_MS = 5_000;\n  let localDrainTimer: NodeJS.Timeout | null = null;\n  if (localIngest) {\n    // Secondary backoff: the 5s timer fires steadily, but after a failed drain we\n    // SKIP an increasing number of ticks (capped) so a sustained backend outage\n    // isn't retried every 5s for hours. uploadBatch already backs off WITHIN an\n    // attempt; this spaces the attempts too (≈5s → up to ~30s while down). A\n    // success (or an empty queue, which doesn't throw) resets it immediately.\n    let drainFails = 0;\n    let drainSkip = 0;\n    const drainTick = async (): Promise<void> => {\n      if (drainSkip > 0) {\n        drainSkip--;\n        return;\n      }\n      try {\n        const { events } = await drainLocalQueue({\n          deviceId: state.deviceId as string,\n          daemonVersion: DAEMON_VERSION,\n        });\n        if (events > 0) bumpStat(\"sdk_events_uploaded\", events);\n        setStat(\"sdk_queue\", await localQueueDepth());\n        drainFails = 0;\n      } catch (e) {\n        // Backend unreachable: events stay durably queued and a later tick\n        // retries. Surface it without flipping the whole daemon to \"offline\"\n        // (the file-scan path owns that top-level signal).\n        drainFails = Math.min(drainFails + 1, 6);\n        drainSkip = drainFails;\n        setMessage(`SDK ingest upload deferred: ${describeErrorWithCause(e)}`);\n      }\n    };\n    localDrainTimer = setInterval(() => void drainTick(), LOCAL_DRAIN_INTERVAL_MS);\n    localDrainTimer.unref();\n  }\n\n  // Reconcile the local processing-pipeline version. If this build\n  // produces materially different segments than the one that wrote\n  // the on-disk cursors (e.g. summariser model swap, prompt change),\n  // wipe cursors so the next scan re-reads every JSONL from byte 0\n  // and re-summarises every session. A re-scan REPLACES stale segments\n  // by segment_id in place — no purge required for normal upgrades.\n  const { reconcileProcessingVersion } = await import(\"./processing-version.js\");\n  const pv = reconcileProcessingVersion(state);\n  if (pv.changed) {\n    // biome-ignore lint/suspicious/noConsole: one-time visible event\n    console.log(\n      `[modelstat] processing pipeline v${pv.from} → v${pv.to} — wiped file cursors so every session is re-processed by the new pipeline`,\n    );\n  }\n\n  // Discovery now rides the heartbeat (the primed heartbeat above already\n  // attaches the first snapshot, since lastDiscoveryHash starts null), so there\n  // is no separate startup discovery pass any more. Go straight to scanning.\n  await requestScan(\"startup\");\n\n  // Signed redaction-policy augment: fetch the additive `policies`\n  // config, verify its Ed25519 signature against the bundled key, and union the\n  // patterns over the local floor — refreshing on its own 15-min timer. Strictly\n  // fail-safe: the compiled-in floor always applies, a forged/stale bundle is\n  // rejected, and an offline boot degrades to floor-only. Never blocks startup.\n  try {\n    const { createPolicyRefresher } = await import(\"@modelstat/daemon-core/policies\");\n    await createPolicyRefresher({ apiUrl: state.apiUrl }).start();\n  } catch (err) {\n    setMessage(`policy refresh unavailable: ${(err as Error).message}`);\n  }\n\n  // Lazy-load chokidar to keep cold-start fast\n  const chokidar = (await import(\"chokidar\")).default;\n  const { homedir, platform } = await import(\"node:os\");\n  const { join } = await import(\"node:path\");\n  const home = homedir();\n  const dirs = [\n    join(home, \".claude/projects\"),\n    join(home, \".codex/sessions\"),\n    join(home, \".cursor/ai-tracking\"),\n    join(home, \".gemini\"),\n    ...(platform() === \"darwin\"\n      ? [\n          join(home, \"Library/Application Support/Cursor/User/workspaceStorage\"),\n          join(home, \"Library/Application Support/Claude\"),\n        ]\n      : [join(home, \".config/Cursor/User/workspaceStorage\")]),\n  ].filter((p) => existsSync(p) && statSync(p).isDirectory());\n\n  setPhase(\"watching\", `Watching ${dirs.length} directories`);\n\n  const watcher = chokidar.watch(dirs, {\n    persistent: true,\n    ignoreInitial: true,\n    depth: 10,\n    awaitWriteFinish: { stabilityThreshold: 500, pollInterval: 200 },\n  });\n\n  let scanTimer: NodeJS.Timeout | null = null;\n  const scheduleScan = (reason: string) => {\n    if (scanTimer) return; // debounce\n    scanTimer = setTimeout(() => {\n      scanTimer = null;\n      void requestScan(reason);\n    }, 1_000);\n  };\n\n  watcher\n    .on(\"add\", (p) => {\n      if (p.endsWith(\".jsonl\") || p.endsWith(\".db\")) scheduleScan(`add ${basename(p)}`);\n    })\n    .on(\"change\", (p) => {\n      if (p.endsWith(\".jsonl\") || p.endsWith(\".db\")) scheduleScan(`change ${basename(p)}`);\n    })\n    .on(\"error\", (e) => {\n      setMessage(`watcher error: ${(e as Error).message}`);\n    });\n\n  // Backstop: every 5min scan anyway (FSEvents can miss things). Routed\n  // through requestScan so it coalesces instead of stacking a second\n  // scan on top of one that's still running (the backfill OOM).\n  const backstop = setInterval(() => void requestScan(\"interval\"), SCAN_INTERVAL_MS);\n  backstop.unref();\n\n  // Re-discovery is no longer a standalone timer/POST: the heartbeat (every\n  // HEARTBEAT_INTERVAL_MS) re-runs discover() and attaches the snapshot only\n  // when it CHANGES (newly-added account / fresh install) or on the\n  // DISCOVERY_BACKSTOP_MS backstop — see discoverySnapshotForHeartbeat. So a\n  // user who signs into a second codex/gemini account still shows up on the\n  // dashboard within a heartbeat, without a separate discovery scheduler.\n\n  // Self-healing reconcile: periodically verify the server still holds what we\n  // shipped and re-ship precisely what it's missing (e.g. after a DB/raw-log\n  // wipe). Cheap when in sync — one digest fetch + a summariser-free parse tally;\n  // it only re-ships sessions the server is short on. The first pass runs shortly\n  // after startup so a wiped scope refills on its own without a restart.\n  const RECONCILE_INTERVAL_MS = 30 * 60_000;\n  const reconcileTimer = setInterval(\n    () => void reconcileBackfill(requestScan),\n    RECONCILE_INTERVAL_MS,\n  );\n  reconcileTimer.unref();\n  setTimeout(() => void reconcileBackfill(requestScan), 60_000).unref();\n\n  // Handle Ctrl-C / service restarts\n  let shuttingDown = false;\n  const shutdown = async (): Promise<void> => {\n    if (shuttingDown) return; // a second SIGTERM/SIGINT mustn't race the teardown\n    shuttingDown = true;\n    setPhase(\"offline\", \"Shutting down\");\n    await sendHeartbeat();\n    // Stop admitting new file events before we drain — otherwise the watcher\n    // could trigger a fresh scan while we're trying to quiesce.\n    await watcher.close();\n    if (localDrainTimer) clearInterval(localDrainTimer);\n    await localIngest?.close();\n    // Quiesce the scanner THEN free the summariser. A scan can be mid\n    // segment-inference right now; disposing the Metal device underneath a live\n    // llama context is exactly what aborted the process (`libc++abi … mutex lock\n    // failed` / GGML_ASSERT) on every launchd stop/restart and on auto-update.\n    // quiesceSummariser stops new scans, drains the in-flight one (idle()), then\n    // disposeLlama frees contexts + model + device (with its own ≤8s drain cap).\n    // No-op when the summariser was never loaded.\n    await quiesceSummariser();\n    process.exit(0);\n  };\n  process.on(\"SIGINT\", shutdown);\n  process.on(\"SIGTERM\", shutdown);\n\n  // Keep the process alive\n  await new Promise<void>(() => {});\n}\n","/**\n * Watch mode: keeps running, re-scans on filesystem changes.\n *\n * Uses chokidar to watch every known AI-tool data directory. On change\n * (new JSONL or append), runs `scanAll()` with cursors, so only delta\n * events are uploaded.\n */\nimport chokidar from \"chokidar\";\nimport { existsSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { scanAll } from \"./scan.js\";\n\n/** Cross-platform watch targets. Non-existent paths are silently\n * ignored by chokidar, but we also pre-filter so the startup log reads\n * nicely on a fresh machine. */\nfunction resolveWatchDirs(): string[] {\n  const home = homedir();\n  const xdgConfig = process.env.XDG_CONFIG_HOME ?? join(home, \".config\");\n  const xdgData = process.env.XDG_DATA_HOME ?? join(home, \".local/share\");\n\n  const candidates = [\n    // universal (default HOME-rooted CLI data dirs)\n    join(home, \".claude/projects\"),\n    join(home, \".codex/sessions\"),\n    join(home, \".cursor/ai-tracking\"),\n    join(home, \".gemini\"),\n    join(home, \".aider\"),\n\n    // XDG / Linux\n    join(xdgConfig, \"claude/projects\"),\n    join(xdgConfig, \"codex/sessions\"),\n    join(xdgConfig, \"Cursor/User/workspaceStorage\"),\n    join(xdgConfig, \"Code/User/workspaceStorage\"),\n    join(xdgConfig, \"Code - Insiders/User/workspaceStorage\"),\n    join(xdgData, \"claude/projects\"),\n\n    // macOS\n    ...(platform() === \"darwin\"\n      ? [\n          join(home, \"Library/Application Support/Cursor/User/workspaceStorage\"),\n          join(home, \"Library/Application Support/Claude\"),\n          join(home, \"Library/Application Support/Code/User/workspaceStorage\"),\n          join(home, \"Library/Application Support/Windsurf/User/workspaceStorage\"),\n          join(home, \"Library/Application Support/Zed\"),\n        ]\n      : []),\n  ];\n  return Array.from(new Set(candidates)).filter((p) => existsSync(p));\n}\n\nconst DIRS = resolveWatchDirs();\n\nlet scanning = false;\nlet pending = false;\nlet lastScan = 0;\n\nasync function safeScan(reason: string): Promise<void> {\n  if (scanning) {\n    pending = true;\n    return;\n  }\n  scanning = true;\n  try {\n    const now = Date.now();\n    if (now - lastScan < 3_000) return; // debounce\n    lastScan = now;\n    console.log(`[${new Date().toISOString()}] scan (${reason})`);\n    const r = await scanAll();\n    if (r.batchesUploaded || r.eventsUploaded) {\n      console.log(\n        `  → ${r.segmentsUploaded} segments · ${r.eventsUploaded} events in ${r.batchesUploaded} batches`,\n      );\n    }\n  } catch (e) {\n    console.warn(\"  ! scan failed:\", (e as Error).message);\n  } finally {\n    scanning = false;\n    if (pending) {\n      pending = false;\n      setTimeout(() => safeScan(\"pending\"), 500);\n    }\n  }\n}\n\nexport async function watchForever(): Promise<void> {\n  // Initial full scan\n  await safeScan(\"startup\");\n\n  const watcher = chokidar.watch(DIRS, {\n    persistent: true,\n    ignoreInitial: true,\n    depth: 10,\n    awaitWriteFinish: { stabilityThreshold: 500, pollInterval: 200 },\n  });\n\n  watcher\n    .on(\"add\", (p) => {\n      if (p.endsWith(\".jsonl\")) void safeScan(`add ${p}`);\n    })\n    .on(\"change\", (p) => {\n      if (p.endsWith(\".jsonl\")) void safeScan(`change ${p}`);\n    })\n    .on(\"error\", (e) => console.warn(\"watcher error:\", e));\n\n  // Also run every 5 minutes as a backstop.\n  setInterval(() => void safeScan(\"interval\"), 5 * 60 * 1000);\n\n  console.log(`watching: ${DIRS.join(\", \")}`);\n  // Keep alive forever — the service manager handles restart.\n  await new Promise<void>(() => {});\n}\n","/**\n * `modelstat statusline` — the always-on surface for Feature 1 (live\n * per-session insights). Claude Code runs this on every render, piping a JSON\n * status object to stdin; we print ONE compact line at the bottom of the\n * prompt.\n *\n * Two layers:\n *   1. Tokens — read straight from Claude Code's `context_window` (instant, no\n *      dependency on modelstat at all).\n *   2. modelstat — the effective $ assigned + taxonomy nodes detected for this\n *      session, read from the LOCAL insights cache\n *      (~/.modelstat/sessions/<session_id>.json) that the daemon refreshes\n *      after an eager scan. When the cache says `analyzing` (or isn't there\n *      yet) we show a quiet \"analyzing…\" so the line still renders.\n *\n * HARD CONSTRAINTS (a statusline that blocks or throws wedges the prompt):\n *   - NEVER block: cache reads are synchronous + tiny; we never await the\n *     network. The eager scan that populates the cache is kicked elsewhere\n *     (the `/stat` plugin / `modelstat sync --session`), not here.\n *   - NEVER throw: every parse is defensive and the CLI wrapper swallows\n *     errors, printing a minimal line instead.\n */\nimport { readCachedInsightsSync, type SessionInsights } from \"./insights.js\";\n\n/** The subset of Claude Code's statusLine stdin payload we read. Everything is\n * optional — fields come and go by session state (no repo, pre-first-call\n * context window, etc.), so we treat the whole thing as best-effort. The\n * authoritative schema is Claude Code's; we stay loose so a field rename\n * upstream degrades gracefully instead of crashing. */\nexport interface StatuslineInput {\n  session_id?: string;\n  cwd?: string;\n  model?: { id?: string; display_name?: string };\n  workspace?: {\n    current_dir?: string;\n    project_dir?: string;\n    repo?: { host?: string; owner?: string; name?: string };\n  };\n  context_window?: {\n    total_input_tokens?: number;\n    total_output_tokens?: number;\n    context_window_size?: number;\n    used_percentage?: number | null;\n    current_usage?: {\n      input_tokens?: number;\n      output_tokens?: number;\n      cache_creation_input_tokens?: number;\n      cache_read_input_tokens?: number;\n    } | null;\n  };\n  cost?: { total_cost_usd?: number };\n}\n\n// ── ANSI (kept tiny + self-contained; no dependency) ──────────────────\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\nconst CYAN = \"\\x1b[36m\";\nconst GREEN = \"\\x1b[32m\";\nconst SEP = `${DIM} · ${RESET}`;\n\n/** Compact a token count: 1234 → \"1.2k\", 1_200_000 → \"1.2M\". */\nexport function formatTokens(n: number): string {\n  if (!Number.isFinite(n) || n <= 0) return \"0\";\n  if (n < 1000) return String(Math.round(n));\n  if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\n  return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\n/** Format an effective-cost value (the server sends an exact decimal string;\n * tolerate a number too). Returns null when there's nothing meaningful. */\nexport function formatCost(cost: string | number | null | undefined): string | null {\n  if (cost === null || cost === undefined) return null;\n  const n = typeof cost === \"number\" ? cost : Number(cost);\n  if (!Number.isFinite(n) || n <= 0) return null;\n  // Sub-cent spend still matters when attributing — show 4dp under a cent.\n  return n < 0.01 ? `$${n.toFixed(4)}` : `$${n.toFixed(2)}`;\n}\n\n/** Total context-window tokens for this turn, from Claude Code's own counters.\n * Prefer the explicit totals; fall back to summing current usage. */\nfunction contextTokens(cw: StatuslineInput[\"context_window\"]): number {\n  if (!cw) return 0;\n  const totals = (cw.total_input_tokens ?? 0) + (cw.total_output_tokens ?? 0);\n  if (totals > 0) return totals;\n  const u = cw.current_usage;\n  if (!u) return 0;\n  return (\n    (u.input_tokens ?? 0) +\n    (u.output_tokens ?? 0) +\n    (u.cache_creation_input_tokens ?? 0) +\n    (u.cache_read_input_tokens ?? 0)\n  );\n}\n\n/** Render up to `max` taxonomy chips (emoji + name), comma-joined. */\nfunction renderTaxonomy(insights: SessionInsights, max = 3): string {\n  const nodes = insights.taxonomy_nodes ?? [];\n  if (nodes.length === 0) return \"\";\n  const chips = nodes.slice(0, max).map((n) => {\n    const emoji = n.emoji ? `${n.emoji} ` : \"\";\n    return `${emoji}${n.name}`;\n  });\n  const extra = nodes.length > max ? ` +${nodes.length - max}` : \"\";\n  return chips.join(\", \") + extra;\n}\n\n/**\n * Build the one-line statusline string (no trailing newline). Pure — takes the\n * parsed stdin payload + the (optional) cached insights, returns the text. The\n * CLI wrapper handles reading stdin + the cache + printing.\n *\n * Shape: `<tokens> tok · <$ effective> · <taxonomy chips>` with a leading\n * `modelstat` marker. Missing pieces are simply omitted; while the server is\n * still enriching we show `analyzing…` in place of the $ / chips.\n */\nexport function renderStatusline(\n  input: StatuslineInput,\n  insights: SessionInsights | null,\n): string {\n  const parts: string[] = [];\n\n  // 1. Tokens — instant, from Claude Code's context window.\n  const tok = contextTokens(input.context_window);\n  if (tok > 0) parts.push(`${CYAN}${formatTokens(tok)}${RESET}${DIM} tok${RESET}`);\n\n  // 2. modelstat layer — effective $ + taxonomy from the local cache.\n  if (insights && insights.status !== \"not_ingested\") {\n    const cost = formatCost(insights.cost_usd);\n    if (cost) parts.push(`${GREEN}${cost}${RESET}`);\n    const tax = renderTaxonomy(insights);\n    if (tax) {\n      parts.push(`${DIM}${tax}${RESET}`);\n    } else if (insights.status === \"analyzing\") {\n      parts.push(`${DIM}analyzing…${RESET}`);\n    }\n  } else if (insights?.status === \"analyzing\") {\n    parts.push(`${DIM}analyzing…${RESET}`);\n  }\n\n  const body = parts.join(SEP);\n  // The marker keeps the line recognisable when composed after another tool's\n  // statusline segment (the installer can chain ours onto an existing one).\n  return body ? `${DIM}modelstat${RESET} ${body}` : `${DIM}modelstat${RESET}`;\n}\n\n/** Read all of stdin as text (Claude Code pipes the JSON status object). Caps\n * the read so a misbehaving caller can't make us buffer unbounded. */\nasync function readStdin(): Promise<string> {\n  const chunks: Buffer[] = [];\n  let size = 0;\n  for await (const chunk of process.stdin) {\n    size += (chunk as Buffer).length;\n    if (size > 1024 * 1024) break; // 1 MB is far more than any status payload\n    chunks.push(chunk as Buffer);\n  }\n  return Buffer.concat(chunks).toString(\"utf8\");\n}\n\n/**\n * CLI entry — `modelstat statusline`. Reads stdin, looks up the local insights\n * cache for the reported session, prints the one-liner. Never blocks on the\n * network and never throws: any failure degrades to a minimal `modelstat`\n * marker so the prompt still renders.\n */\nexport async function runStatusline(): Promise<void> {\n  let input: StatuslineInput = {};\n  try {\n    const raw = await readStdin();\n    if (raw.trim()) input = JSON.parse(raw) as StatuslineInput;\n  } catch {\n    // Unreadable / non-JSON stdin → render from nothing.\n  }\n  const insights = input.session_id ? readCachedInsightsSync(input.session_id) : null;\n  process.stdout.write(renderStatusline(input, insights));\n}\n","/**\n * modelstat CLI: `connect`, `discover`, `sync`, `watch`, `status`, `jobs`.\n *\n * The bundled build (tsup → dist/cli.cjs) adds a `#!/usr/bin/env node`\n * shebang at pack time — keep this source shebang-free so we don't emit\n * two of them.\n */\nimport { spawn } from \"node:child_process\";\nimport { platform } from \"node:os\";\nimport { createInterface } from \"node:readline\";\nimport { DeviceMeUnauthorized, fetchDeviceMe, recoverIdentity, selfRegister } from \"./api.js\";\nimport { state } from \"./config.js\";\nimport { backupIdentity, hasIdentityFile, identityPath } from \"./identity.js\";\nimport { buildFingerprint, intendedDeviceUuid, machineKeySource } from \"./machine-key.js\";\nimport { parseSummarizerMode, type SummarizerMode } from \"./runtime-state.js\";\nimport {\n  bundledTrayAppPath,\n  installService,\n  installTrayApp,\n  installTrayAutostart,\n  logsDir,\n  refreshTrayIfInstalled,\n  removeTrayApp,\n  serviceStatus,\n  setupRuntime,\n  trayStatus,\n  uninstallService,\n  uninstallTrayAutostart,\n} from \"./service.js\";\nimport { daemonHealth } from \"./supervise.js\";\nimport {\n  autoUpdateEnabled,\n  autoUpdatePinnedByEnv,\n  runUpgrade,\n  setStoredAutoUpdate,\n  storedAutoUpdate,\n} from \"./update.js\";\n\n/** Yes/no prompt over stdin. Returns `defaultYes` if stdin isn't a\n * TTY or the user just hits Enter. Lowercased \"y\"/\"yes\" counts as\n * yes, \"n\"/\"no\" as no; anything else falls back to `defaultYes`. */\nasync function confirmPrompt(question: string, defaultYes: boolean): Promise<boolean> {\n  if (process.stdin.isTTY !== true) return defaultYes;\n  const rl = createInterface({ input: process.stdin, output: process.stdout });\n  try {\n    const raw: string = await new Promise((resolve) => rl.question(question, resolve));\n    const ans = raw.trim().toLowerCase();\n    if (ans === \"\") return defaultYes;\n    if (ans === \"y\" || ans === \"yes\") return true;\n    if (ans === \"n\" || ans === \"no\") return false;\n    return defaultYes;\n  } finally {\n    rl.close();\n  }\n}\n\n/** Free-text prompt over stdin. Returns `def` if stdin isn't a TTY or the user\n * just hits Enter. */\nasync function textPrompt(question: string, def = \"\"): Promise<string> {\n  if (process.stdin.isTTY !== true) return def;\n  const rl = createInterface({ input: process.stdin, output: process.stdout });\n  try {\n    const raw: string = await new Promise((resolve) => rl.question(question, resolve));\n    const ans = raw.trim();\n    return ans === \"\" ? def : ans;\n  } finally {\n    rl.close();\n  }\n}\n\n/**\n * Per-mode copy for the install chooser + `modelstat mode`. Each mode states\n * its RESOURCE profile (what it costs THIS machine) and its PRIVACY profile\n * (what leaves, and to where). Redaction runs on-device in EVERY mode — only\n * the summarisation LOCATION differs — so the privacy lines describe the\n * already-cleaned payload. The `local` resource line is the explicit\n * RAM/battery warning a tester asked us to surface up front.\n */\nconst MODE_INFO: Record<SummarizerMode, { label: string; resource: string; privacy: string }> = {\n  cloud: {\n    label: \"Cloud (default) — modelstat's servers summarise\",\n    resource: \"no local model; negligible RAM, CPU and battery on this machine\",\n    privacy: \"your cleaned, redacted turns are uploaded and summarised server-side\",\n  },\n  local: {\n    label: \"Local — a bundled model summarises on THIS machine\",\n    resource:\n      \"⚠ downloads a ~2.7 GB model (Qwen3-4B) and uses ~4 GB RAM plus extra battery/CPU while summarising\",\n    privacy: \"only a ≤240-char abstract is uploaded; the raw turns never leave this machine\",\n  },\n  \"self-hosted\": {\n    label: \"Self-hosted — your org's own AI endpoint summarises\",\n    resource: \"no local model here; summarisation runs on the endpoint you configure\",\n    privacy:\n      \"only the abstract reaches modelstat; the cleaned excerpts go to your own endpoint (URL + model)\",\n  },\n};\n\n/** Interactive menu (Cloud pre-selected) → a {@link SummarizerMode}. Only\n * called when stdin is a TTY; returns the default on empty input. Each option\n * lists its resource cost and privacy profile so the choice is informed. */\nasync function promptForMode(current: SummarizerMode): Promise<SummarizerMode> {\n  const def = current;\n  const opt = (n: string, m: SummarizerMode): string =>\n    `  ${n}) ${MODE_INFO[m].label}\\n` +\n    `       resource: ${MODE_INFO[m].resource}\\n` +\n    `       privacy:  ${MODE_INFO[m].privacy}\\n`;\n  process.stdout.write(\n    \"\\nHow should modelstat summarise your sessions?\\n\" +\n      \"Redaction (secrets + names/PII) ALWAYS runs on your machine first — only the\\n\" +\n      \"summarisation LOCATION below changes.\\n\\n\" +\n      opt(\"1\", \"cloud\") +\n      opt(\"2\", \"local\") +\n      opt(\"3\", \"self-hosted\") +\n      \"\\n\",\n  );\n  const raw = await textPrompt(`Choose 1-3 or a name [${def}]: `, def);\n  const byNumber: Record<string, SummarizerMode> = {\n    \"1\": \"cloud\",\n    \"2\": \"local\",\n    \"3\": \"self-hosted\",\n  };\n  return byNumber[raw.trim()] ?? parseSummarizerMode(raw) ?? def;\n}\n\n/**\n * Resolve the summariser mode for an install / `modelstat mode` run and persist\n * it (plus the self-hosted endpoint when applicable). Precedence:\n *   1. explicit `requested` (a --mode flag / positional arg),\n *   2. an interactive menu (TTY only, Cloud pre-selected),\n *   3. the current persisted mode, unchanged.\n * For self-hosted it resolves the endpoint from --url/--model, else the\n * MODELSTAT_LLM_* env, else an interactive prompt, and validates the URL —\n * throwing (so the caller can surface it) when it can't get a valid endpoint.\n * Returns the chosen mode.\n */\nasync function resolveAndPersistMode(input: {\n  requested?: string;\n  url?: string;\n  model?: string;\n  interactive: boolean;\n}): Promise<SummarizerMode> {\n  let mode: SummarizerMode;\n  if (input.requested !== undefined && input.requested !== \"\") {\n    const parsed = parseSummarizerMode(input.requested);\n    if (!parsed) {\n      throw new Error(`unknown mode \"${input.requested}\" — expected cloud, local, or self-hosted`);\n    }\n    mode = parsed;\n  } else if (input.interactive) {\n    mode = await promptForMode(state.summarizerMode);\n  } else {\n    // Non-interactive with nothing requested: fresh installs default to cloud;\n    // an existing choice is left as-is.\n    mode = state.summarizerMode;\n  }\n\n  if (mode === \"self-hosted\") {\n    // URL + model: flags → env → interactive prompt.\n    let url = input.url ?? process.env.MODELSTAT_LLM_BASE_URL?.trim() ?? \"\";\n    let model = input.model ?? process.env.MODELSTAT_LLM_MODEL?.trim() ?? \"\";\n    if (!url && input.interactive) {\n      url = await textPrompt(\n        \"  Self-hosted summariser URL (OpenAI-compatible, e.g. https://llm.acme.internal/v1): \",\n      );\n    }\n    if (!model && input.interactive) {\n      model = await textPrompt(\"  Model id (e.g. qwen2.5-7b-instruct): \");\n    }\n    if (!url) throw new Error(\"self-hosted mode needs a summariser URL (--url <URL>)\");\n    if (!model) throw new Error(\"self-hosted mode needs a model id (--model <ID>)\");\n    // Reuse the daemon-core validator so `modelstat mode` rejects a bad URL the\n    // same way the pipeline would (http/https only).\n    const { validateSummarizerUrl } = await import(\"@modelstat/daemon-core/node\");\n    validateSummarizerUrl(url, \"summariser URL\"); // throws on invalid\n    state.setSelfHosted(url, model);\n  } else {\n    // Leaving self-hosted — clear the stored endpoint so a stale URL can't\n    // linger and resurface if the user flips back without re-entering it.\n    state.setSelfHosted(\"\", \"\");\n  }\n  state.setSummarizerMode(mode);\n  return mode;\n}\n\n/** Best-effort open a URL in the user's default browser. Returns true\n * if we successfully spawned an opener, false otherwise (the caller\n * should then fall back to printing the URL). */\nfunction tryOpenBrowser(url: string): boolean {\n  const p = platform();\n  const cmd = p === \"darwin\" ? \"open\" : p === \"win32\" ? \"cmd\" : \"xdg-open\";\n  const args = p === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n  try {\n    const child = spawn(cmd, args, {\n      stdio: \"ignore\",\n      detached: true,\n    });\n    child.unref();\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Wire the modelstat MCP into every local AI tool, by shelling out to the\n * single source of truth — `npx -y @modelstat/mcp wire`, the exact same\n * entry point install.sh / install.ps1 call. This is what lets a bare\n * `npx modelstat@latest` (no curl installer) configure Claude Code / Cursor\n * / Codex / VS Code / Zed / Windsurf, so the user can *ask* about the usage\n * the daemon is now streaming. Best-effort + idempotent: a missing `npx`, a\n * non-zero exit, or a hang (120s cap) never blocks onboarding.\n *\n * In `--json` mode wire's human report is swallowed (it would corrupt the\n * NDJSON stream) and the caller emits a structured event instead; otherwise\n * wire prints its own per-tool report under our step line, like install.sh.\n */\nfunction wireMcpTools(json: boolean): Promise<{ ok: boolean; error?: string }> {\n  return new Promise((resolve) => {\n    let child: ReturnType<typeof spawn>;\n    try {\n      child = spawn(\"npx\", [\"-y\", \"@modelstat/mcp\", \"wire\"], {\n        stdio: json ? [\"ignore\", \"ignore\", \"pipe\"] : \"inherit\",\n        timeout: 120_000,\n      });\n    } catch (e) {\n      resolve({ ok: false, error: (e as Error).message });\n      return;\n    }\n    let stderr = \"\";\n    child.stderr?.on(\"data\", (b: Buffer) => {\n      stderr += String(b);\n    });\n    child.on(\"error\", (e: Error) => resolve({ ok: false, error: e.message }));\n    child.on(\"close\", (code: number | null, signal: NodeJS.Signals | null) => {\n      if (code === 0) resolve({ ok: true });\n      else\n        resolve({\n          ok: false,\n          error: stderr.trim() || (signal ? `killed (${signal})` : `exit ${code}`),\n        });\n    });\n  });\n}\n\n/** Substituted by tsup's `define` (see tsup.config.ts) — a string\n * literal like \"daemon-0.0.33\" in the bundle. Falls back to \"daemon-dev\"\n * when run unbundled (tsx / tests), where the define isn't applied. */\nconst DAEMON_VERSION =\n  typeof __MODELSTAT_VERSION__ === \"string\" ? __MODELSTAT_VERSION__ : \"daemon-dev\";\n\n/** First value after `--flag` (supports `--flag v` and `--flag=v`), or\n * undefined. */\nfunction flagValue(args: readonly string[], flag: string): string | undefined {\n  for (let i = 0; i < args.length; i++) {\n    const a = args[i]!;\n    if (a === flag) return args[i + 1];\n    if (a.startsWith(`${flag}=`)) return a.slice(flag.length + 1);\n  }\n  return undefined;\n}\n\n/** Every value of a repeatable `--flag` (e.g. `--session a --session b`). */\nfunction flagValues(args: readonly string[], flag: string): string[] {\n  const out: string[] = [];\n  for (let i = 0; i < args.length; i++) {\n    const a = args[i]!;\n    if (a === flag) {\n      const v = args[i + 1];\n      if (v !== undefined && !v.startsWith(\"--\")) out.push(v);\n    } else if (a.startsWith(`${flag}=`)) {\n      out.push(a.slice(flag.length + 1));\n    }\n  }\n  return out;\n}\n\n/** Numeric value of `--flag`, or undefined when absent / non-numeric. */\nfunction numericFlag(args: readonly string[], flag: string): number | undefined {\n  const raw = flagValue(args, flag);\n  if (raw === undefined) return undefined;\n  const n = Number(raw);\n  return Number.isFinite(n) ? n : undefined;\n}\n\n/** No human present: an explicit CI runner, or NO terminal on any std stream.\n *\n * We check stdin/stdout/stderr — a human is present if *any* is a TTY — and\n * deliberately do NOT key on stdin alone. The official `curl … | sh` installer\n * (and any piped-stdin run) leaves stdin a pipe while stdout/stderr stay the\n * user's terminal; a stdin-only check wrongly flagged that human as CI and\n * refused to register them. Truly headless CI has no TTY on any stream (and\n * usually sets `CI`), so it's still blocked. */\nfunction isNonInteractive(): boolean {\n  if (process.env.CI) return true;\n  return !(\n    process.stdin.isTTY === true ||\n    process.stdout.isTTY === true ||\n    process.stderr.isTTY === true\n  );\n}\n\n/** True when an env var is set to a truthy value (`1`/`true`/`yes`). */\nfunction envFlag(name: string): boolean {\n  const v = process.env[name]?.trim().toLowerCase();\n  return v === \"1\" || v === \"true\" || v === \"yes\";\n}\n\n/** Explicit \"yes, really register against prod headlessly\" opt-in. */\nfunction prodRegisterOptIn(): boolean {\n  return envFlag(\"MODELSTAT_ALLOW_PROD_REGISTER\");\n}\n\n/**\n * Register this device through the ONE register door, POST /v1/tokens: derive a\n * machine-stable device_uuid + fingerprint, POST them, and cache the returned\n * device_secret (ds_live_…) + claim handle in the local identity file.\n *\n * After this returns, an UNCLAIMED device can heartbeat (which folds in\n * discovery) and poll its own state; the operator visits `claim_url`, signs in,\n * and attaches it to an org. A device the server recognises by machine_id comes\n * back already CLAIMED with a fresh secret (re_registered) — no duplicate row,\n * no dead claim link.\n */\nasync function cmdSelfRegister(): Promise<void> {\n  // Device UUID resolution, in order of preference:\n  //   1. A UUID already in identity.json — keep it, never churn an\n  //      existing enrollment (this is what stops a re-register from\n  //      orphaning the device the user already claimed).\n  //   2. Otherwise derive it deterministically from this machine's\n  //      stable hardware key. A fresh install (or one whose\n  //      ~/.modelstat was wiped) thus lands on the SAME UUID the\n  //      machine had before — the server dedupes it back to the\n  //      existing row instead of creating a duplicate device.\n  const deviceUuid = state.deviceUuid ?? intendedDeviceUuid();\n  const derived = !state.deviceUuid;\n\n  // Guard: never silently create a NEW device on PRODUCTION from a\n  // non-interactive / CI environment. Ephemeral CI + cloud sandbox runners\n  // were self-registering against prod and piling up unclaimed device rows\n  // (and pinging ops Slack). This only blocks a *fresh* enrollment with the\n  // unoverridden prod default — an already-enrolled device re-registering\n  // (a claimed user's installed service) is never touched, and interactive\n  // `npx modelstat@latest` onboarding is unaffected.\n  if (derived && state.isProdDefaultApi && isNonInteractive() && !prodRegisterOptIn()) {\n    process.stderr.write(\n      \"modelstat: refusing to self-register a new device against production from a\\n\" +\n        \"non-interactive/CI environment (no claim is possible here anyway). Either:\\n\" +\n        \"  • point at your own backend:  DAEMON_API_URL=https://your-host   (CI/e2e)\\n\" +\n        \"  • explicitly opt in:          MODELSTAT_ALLOW_PROD_REGISTER=1\\n\" +\n        \"  • or run it interactively:    npx modelstat@latest\\n\",\n    );\n    process.exit(2);\n  }\n\n  // ONE fingerprint, shared with the heartbeat — see buildFingerprint().\n  // `fingerprint.machine_id` is the server's dedupe anchor; it MUST be\n  // byte-identical on register + heartbeat, so both read the same source.\n  const fingerprint = buildFingerprint();\n\n  if (derived) {\n    process.stdout.write(\n      `  \\x1b[2mdevice id derived from machine key (${machineKeySource()}): ${deviceUuid.slice(0, 8)}…\\x1b[0m\\n`,\n    );\n  }\n  process.stdout.write(`  \\x1b[2m→ POST ${state.apiUrl}/v1/tokens\\x1b[0m\\n`);\n\n  const res = await selfRegister({\n    device_uuid: deviceUuid,\n    fingerprint,\n  });\n\n  // Seed the canonical identity file atomically. Single write\n  // (not five separate setters) so the file is never half-populated\n  // if the process dies mid-sequence. The device_secret is stored verbatim\n  // (ds_live_…) and sent as the Bearer — no client-side format assumptions.\n  state.saveFreshIdentity({\n    deviceUuid: res.device_uuid,\n    deviceId: res.device_id,\n    bearerToken: res.device_secret,\n    claimCode: res.claim_code,\n    claimUrl: res.claim_url,\n  });\n\n  process.stdout.write(\n    `  \\x1b[32m✓\\x1b[0m ${res.re_registered ? \"re-registered\" : \"registered\"}  device_id=${res.device_id}\\n`,\n  );\n  process.stdout.write(\n    `  \\x1b[32m✓\\x1b[0m secret      ${res.secret_prefix}…  (hashed on server, never re-sent)\\n`,\n  );\n  if (res.status === \"claimed\") {\n    // Already attached to an account — there is NO live claim code/URL to print\n    // (the server returns null), so don't dangle a dead link. Point at the\n    // dashboard instead.\n    process.stdout.write(\n      `  \\x1b[32m✓\\x1b[0m already claimed${res.user_id ? ` by user_id=${res.user_id}` : \"\"} — open ${state.apiUrl.replace(/\\/$/, \"\")}/dashboard\\n`,\n    );\n  } else if (res.claim_code) {\n    process.stdout.write(`  \\x1b[32m✓\\x1b[0m claim code  ${res.claim_code}\\n`);\n  }\n}\n\n/** Poll the server until the device shows up as claimed (or the operator\n * Ctrl-Cs). Quietly returns once the device has a user_id. */\nasync function cmdAwaitClaim(): Promise<void> {\n  const secret = state.bearer;\n  if (!secret) {\n    console.error(\"not registered — run `modelstat self-register` first\");\n    process.exit(1);\n  }\n  const url = state.claimUrl ?? \"(visit your dashboard)\";\n  console.log(`waiting for human to claim this device:\\n    ${url}\\n`);\n  while (true) {\n    let me;\n    try {\n      // Always read the CURRENT bearer — recoverIdentity() below may rotate it.\n      me = await fetchDeviceMe(state.bearer ?? secret);\n    } catch (e) {\n      if (e instanceof DeviceMeUnauthorized) {\n        // The server no longer accepts our bearer (revoked / row deleted). The\n        // OLD code logged \"poll failed\" and re-polled the dead secret every 5s —\n        // a busy-loop that could never recover. Recover the identity by\n        // machine-stable re-register (recoverIdentity self-rate-limits with its\n        // own exponential backoff so a truly-deleted row can't hot-loop), then\n        // poll the fresh bearer.\n        const recovered = await recoverIdentity();\n        console.error(\n          recovered\n            ? \"re-registered after the server rejected our credentials — resuming claim wait\"\n            : \"couldn't re-register yet (server rejecting registration) — backing off\",\n        );\n        // recoverIdentity already backed off internally on failure; add a small\n        // floor so a same-tick success still paces the next poll.\n        await new Promise((r) => setTimeout(r, recovered ? 2000 : 5000));\n        continue;\n      }\n      console.error(`poll failed: ${(e as Error).message}`);\n      await new Promise((r) => setTimeout(r, 5000));\n      continue;\n    }\n    if (me.status === \"claimed\") {\n      console.log(`✓ claimed by user_id=${me.user_id}`);\n      return;\n    }\n    process.stdout.write(\".\");\n    await new Promise((r) => setTimeout(r, 2000));\n  }\n}\n\ninterface ConnectOpts {\n  json: boolean;\n  noBrowser: boolean;\n  /** Force a fresh self-register even if an identity file already\n   * exists. Existing identity is backed up to identity.json.bak-<ts>.\n   * Non-interactive shortcut equivalent to answering \"n\" to the reuse\n   * prompt. */\n  fresh: boolean;\n  /** Skip all interactive prompts. Default when stdin is not a TTY\n   * (e.g. tray-launched daemon). With `--yes` the behavior is:\n   * reuse identity if present, else self-register. */\n  yes: boolean;\n  /** Summariser mode from `--mode <cloud|local|self-hosted>`. When set, skips\n   * the interactive chooser. */\n  mode?: string;\n  /** Self-hosted endpoint from `--url` / `--model` (used with `--mode self-hosted`). */\n  selfHostedUrl?: string;\n  selfHostedModel?: string;\n}\n\n/** Emit one NDJSON event to stdout. Only active when --json is set.\n * Schema v1: every event has `v`, `ts`, `event`, plus event-specific\n * fields. Renaming or removing fields is a breaking change; adding is\n * not. See integrations/harness-skills/modelstat-connect/README.md. */\nfunction emitEvent(opts: ConnectOpts, event: string, fields: Record<string, unknown> = {}): void {\n  if (!opts.json) return;\n  process.stdout.write(`${JSON.stringify({ v: 1, ts: Date.now(), event, ...fields })}\\n`);\n}\n\n/**\n * Renders live progress for the on-device macOS tray compile.\n *\n * `bundledTrayAppPath` calls `onLine` once per line of SwiftPM output —\n * but ONLY when it actually has to build (a prebuilt .app short-circuits\n * with zero lines). So the UI lazily \"begins\" on the first line: it prints\n * a one-time heads-up, starts a 1s elapsed ticker (TTY only), and surfaces\n * each SwiftPM phase line (\"[2/3] Compiling…\", \"Linking\", \"Build complete!\")\n * as dim detail. `finish()` stops the ticker and returns the elapsed ms\n * (or null if no build ran). In `--json` mode it emits structured\n * tray_build_started / _progress / _done events instead of ANSI.\n */\nfunction createTrayBuildUi(opts: ConnectOpts): {\n  onLine: (line: string) => void;\n  finish: () => number | null;\n} {\n  const isTty = !opts.json && process.stdout.isTTY === true;\n  let startedAt: number | null = null;\n  let ticker: ReturnType<typeof setInterval> | null = null;\n\n  const paintTicker = (): void => {\n    if (startedAt === null) return;\n    const s = Math.round((Date.now() - startedAt) / 1000);\n    process.stdout.write(`\\r  \\x1b[2m⏳ compiling menu-bar tray from source… ${s}s\\x1b[0m\\x1b[K`);\n  };\n\n  const begin = (): void => {\n    if (startedAt !== null) return;\n    startedAt = Date.now();\n    emitEvent(opts, \"tray_build_started\", {});\n    if (!opts.json) {\n      process.stdout.write(\n        \"  \\x1b[2mno prebuilt tray found — compiling a small Swift app locally \" +\n          \"(first run only, ~1 min)\\x1b[0m\\n\",\n      );\n    }\n    if (isTty) {\n      paintTicker();\n      ticker = setInterval(paintTicker, 1000);\n      ticker.unref?.();\n    }\n  };\n\n  return {\n    onLine: (line: string): void => {\n      begin();\n      emitEvent(opts, \"tray_build_progress\", { line });\n      if (isTty) {\n        // Commit this phase line above the ticker, which repaints on its\n        // next tick (\\r returns to col 0, \\x1b[K clears the ticker text).\n        process.stdout.write(`\\r\\x1b[K  \\x1b[2m${line}\\x1b[0m\\n`);\n      } else if (!opts.json) {\n        process.stdout.write(`  ${line}\\n`);\n      }\n    },\n    finish: (): number | null => {\n      if (ticker) {\n        clearInterval(ticker);\n        ticker = null;\n      }\n      if (isTty && startedAt !== null) process.stdout.write(\"\\r\\x1b[K\");\n      const elapsed = startedAt === null ? null : Date.now() - startedAt;\n      if (elapsed !== null) emitEvent(opts, \"tray_build_done\", { elapsed_ms: elapsed });\n      return elapsed;\n    },\n  };\n}\n\n/**\n * `modelstat connect` — the primary onboarding command.\n *\n * We talk loudly through every step. Silence on `npx modelstat@latest\n * connect` is the worst UX regression we've hit — the user is staring\n * at a blank terminal wondering if they just hung their shell.\n *\n * Steps (each prints a live progress line):\n *   1. Derive (or reuse) a machine-stable device identity.\n *   2. POST /v1/tokens → get device_secret (ds_live_…) + claim_code.\n *   3. Install the macOS tray + background service (launchd/systemd).\n *   4. Print the dashboard / claim URL and try to open it in a browser.\n *\n * For an UNCLAIMED device the claim_code IS the capability — the user visits\n * /device/:claim_code, signs in, and clicks \"Claim this device\". An already\n * CLAIMED device has no live claim handle, so the banner points at the\n * dashboard instead of a dead claim link.\n */\nasync function cmdConnect(opts: ConnectOpts): Promise<void> {\n  const step = (msg: string) => {\n    if (opts.json) return;\n    process.stdout.write(`\\x1b[1;36m▸\\x1b[0m ${msg}\\n`);\n  };\n  const ok = (msg: string) => {\n    if (opts.json) return;\n    process.stdout.write(`  \\x1b[32m✓\\x1b[0m ${msg}\\n`);\n  };\n  const warn = (msg: string) => {\n    if (opts.json) return;\n    process.stdout.write(`  \\x1b[33m⚠\\x1b[0m ${msg}\\n`);\n  };\n\n  // ── 1. Self-register (or re-use existing identity) ─────────────\n  //\n  // Identity lives at ~/.modelstat/identity.json. Reinstalling the\n  // CLI, relaunching the tray, or wiping the `conf` file does NOT\n  // wipe this file — so `modelstat connect` twice on the same\n  // machine resumes the existing enrollment instead of minting a\n  // new device row.\n  //\n  // Re-registering is now CONVERGENT, not destructive: clearing the\n  // in-memory bearer drops deviceUuid back to null, so cmdSelfRegister\n  // re-derives the SAME deterministic UUID from the machine key and\n  // sends machine_id — the server dedupes both back onto the existing\n  // device row. So even `--fresh` and a credentials-rejected recovery\n  // land on the same device instead of orphaning it into a duplicate.\n  // (We still back the old file up first, purely for forensics.)\n  const wipeAndSelfRegister = async (reason: string): Promise<void> => {\n    warn(`${reason} — re-registering this device`);\n    const bak = backupIdentity();\n    if (bak) warn(`old identity moved to ${bak}`);\n    state.setBearer(null);\n    await cmdSelfRegister();\n  };\n\n  if (opts.fresh && hasIdentityFile()) {\n    // Explicit re-register. Recovers/rotates onto the SAME device\n    // (deterministic UUID); use MODELSTAT_DEVICE_SALT to intentionally\n    // split a machine into a second logical device.\n    step(\"`--fresh` passed — re-registering this device\");\n    await wipeAndSelfRegister(\"forced fresh start\");\n  } else if (!state.deviceUuid || !state.bearer || !state.deviceId) {\n    step(\"Registering this device with modelstat.ai\");\n    await cmdSelfRegister();\n  } else {\n    // Have a local identity — confirm it's still valid server-side.\n    step(\"Re-using existing device identity\");\n    ok(`device ${state.deviceId}`);\n    ok(`identity file ${identityPath()}`);\n    try {\n      const me = await fetchDeviceMe(state.bearer);\n      if (me.claim_code && me.claim_code !== state.claimCode) {\n        state.setClaimCode(me.claim_code);\n        ok(`claim code refreshed from server`);\n      }\n      if (me.claim_url && me.claim_url !== state.claimUrl) {\n        state.setClaimUrl(me.claim_url);\n      }\n    } catch (e) {\n      if (e instanceof DeviceMeUnauthorized) {\n        // Server doesn't recognise the bearer any more. Ask before\n        // overwriting — we don't want a stray 401 during network\n        // weirdness to silently wipe a user's identity.\n        const interactive = !opts.yes && process.stdin.isTTY === true;\n        if (interactive) {\n          const prompt =\n            \"cached credentials no longer accepted by the server. \" +\n            \"Re-register this device? [Y/n] \";\n          const answer = await confirmPrompt(prompt, true);\n          if (!answer) {\n            warn(\"keeping existing identity; connect aborted\");\n            return;\n          }\n        }\n        await wipeAndSelfRegister(\"cached credentials no longer valid\");\n      } else {\n        warn(`couldn't refresh device state: ${(e as Error).message}`);\n      }\n    }\n  }\n\n  // Determine whether this device is already attached to an account. A claimed\n  // device has NO live claim code/URL (the server returns null), so the final\n  // banner must point at the dashboard rather than dangle a dead claim link.\n  // Best-effort: a failed probe (offline) falls back to the unclaimed banner.\n  let claimed = false;\n  if (state.bearer) {\n    try {\n      const me = await fetchDeviceMe(state.bearer);\n      claimed = me.status === \"claimed\";\n    } catch {\n      /* offline / transient — assume unclaimed for banner purposes */\n    }\n  }\n\n  const apiBase = state.apiUrl.replace(/\\/$/, \"\");\n  const dashboardUrl = `${apiBase}/dashboard`;\n  const claimCode = state.claimCode ?? \"(unknown)\";\n  const claimUrl = claimed ? dashboardUrl : (state.claimUrl ?? `${apiBase}/device/${claimCode}`);\n  const agentUrl = `${apiBase}/device/${claimCode}/agent`;\n  emitEvent(opts, \"registered\", {\n    device_uuid: state.deviceUuid,\n    device_id: state.deviceId,\n    claimed,\n    claim_code: claimed ? null : claimCode,\n    claim_url: claimUrl,\n    agent_url: agentUrl,\n  });\n\n  // ── 2. macOS menu-bar tray (best-effort) ──────────────────────\n  // When no prebuilt .app ships, we compile the tray from source on the\n  // user's machine — a cold `swift build` is ~1 min. The build UI streams\n  // live progress (heads-up + elapsed ticker + SwiftPM phase lines) so\n  // that minute doesn't read as a frozen terminal.\n  if (platform() === \"darwin\") {\n    step(\"Installing menu-bar tray (macOS)\");\n    const buildUi = createTrayBuildUi(opts);\n    try {\n      const src = await bundledTrayAppPath({ onLine: buildUi.onLine });\n      const buildMs = buildUi.finish();\n      if (src) {\n        if (buildMs !== null) ok(`tray compiled from source in ${Math.round(buildMs / 1000)}s`);\n        const out = installTrayApp(src);\n        if (out) {\n          emitEvent(opts, \"tray_installed\", {\n            path: out.installedAt,\n            ...(buildMs !== null ? { build_ms: buildMs } : {}),\n          });\n          ok(`tray at ${out.installedAt}`);\n          // Install the tray's own launchd agent and start it now. This\n          // shows the icon immediately AND, via RunAtLoad + KeepAlive,\n          // brings it back on every login and restarts it if it crashes —\n          // without the tray having to register itself as a Login Item.\n          // Best-effort: the daemon is already running headless, so a\n          // failure here costs only the menu-bar icon, not the pipeline.\n          const trayAgent = installTrayAutostart();\n          emitEvent(opts, \"tray_autostart_installed\", { ok: trayAgent !== null });\n          if (trayAgent) ok(\"menu-bar icon launched (and set to start at login)\");\n        }\n      } else {\n        emitEvent(opts, \"tray_not_bundled\", {});\n        warn(\"no bundled tray — skipping (install Xcode CLI tools and re-run to get the icon)\");\n      }\n    } catch (e) {\n      buildUi.finish();\n      emitEvent(opts, \"tray_install_failed\", { error: (e as Error).message });\n      warn(`tray install skipped: ${(e as Error).message}`);\n    }\n  }\n\n  // ── 2.5 Summariser mode (Cloud pre-selected) ───────────────────\n  // Where each session gets summarised. Redaction ALWAYS runs on this machine\n  // first; only the summarisation LOCATION differs. Chosen interactively on a\n  // TTY (Cloud pre-selected), or via --mode / MODELSTAT_SUMMARIZER_MODE for\n  // scripted installs; a non-interactive install with no choice defaults to\n  // cloud — so it never downloads the local model. Changeable later with\n  // `modelstat mode`.\n  step(\"Choosing where sessions get summarised (redaction stays on your machine)\");\n  try {\n    await resolveAndPersistMode({\n      requested: opts.mode,\n      url: opts.selfHostedUrl,\n      model: opts.selfHostedModel,\n      interactive: !opts.yes && !opts.json && process.stdin.isTTY === true,\n    });\n  } catch (e) {\n    warn(`mode selection failed: ${(e as Error).message}`);\n    warn(\"falling back to cloud summarisation (change later with `modelstat mode`)\");\n    state.setSummarizerMode(\"cloud\");\n    state.setSelfHosted(\"\", \"\");\n  }\n  // The EFFECTIVE mode the daemon will run (honours MODELSTAT_SUMMARIZER_MODE).\n  const mode = state.summarizerMode;\n  if (state.summarizerModeIsEnvOverridden) {\n    warn(`MODELSTAT_SUMMARIZER_MODE is set — running \"${mode}\" regardless of the stored choice`);\n  }\n  ok(\n    mode === \"self-hosted\"\n      ? `summariser mode: self-hosted (${state.selfHosted.url})`\n      : `summariser mode: ${mode}`,\n  );\n  emitEvent(opts, \"summarizer_mode\", {\n    mode,\n    ...(mode === \"self-hosted\" ? { url: state.selfHosted.url, model: state.selfHosted.model } : {}),\n  });\n\n  // ── 3. Local summariser model (local mode only) ────────────────\n  // Only local mode runs the bundled model, so only local downloads it —\n  // cloud/self-hosted skip the ~2.7 GB pull entirely. In local mode we pull it\n  // BEFORE installing the service so the daemon's first preflight succeeds and\n  // real abstracts stream immediately on boot; if the npm postinstall already\n  // pulled it, this returns instantly.\n  let modelReady = false;\n  if (mode === \"local\") {\n    step(\"Preparing local summariser (downloads on first run)\");\n    try {\n      const { ensureLlamaModel, defaultLlamaConfig } = await import(\"@modelstat/daemon-core/node\");\n      await ensureLlamaModel(defaultLlamaConfig());\n      modelReady = true;\n      emitEvent(opts, \"summariser_model_ready\", {});\n      ok(\"summariser model on disk\");\n    } catch (e) {\n      emitEvent(opts, \"summariser_model_failed\", {\n        error: (e as Error).message,\n      });\n      warn(`couldn't prepare summariser model: ${(e as Error).message}`);\n      warn(\"the background service will retry the download on its first scan\");\n    }\n  } else {\n    emitEvent(opts, \"summariser_model_skipped\", { mode });\n    ok(\n      mode === \"cloud\"\n        ? \"cloud mode — modelstat summarises server-side (no local model to download)\"\n        : \"self-hosted mode — your endpoint summarises (no local model to download)\",\n    );\n  }\n\n  // ── 4. Background service (install OR refresh-and-restart) ────\n  // Idempotent: a fresh install creates the launchd plist / systemd\n  // unit; a re-run on an already-installed machine refreshes the\n  // bundle copy at ~/.modelstat/bin/modelstat.mjs and bounces the\n  // service so the new code loads. The user always sees \"service\n  // installed and running\" by the end.\n  step(\"Installing/refreshing background service so the daemon survives reboots\");\n  let serviceOk = false;\n  try {\n    const svc = installService();\n    serviceOk = true;\n    emitEvent(opts, \"service_installed\", {\n      path: svc.path,\n      logs: svc.logs,\n      summariser_ready: modelReady,\n    });\n    ok(`${platform() === \"darwin\" ? \"launchd\" : \"systemd --user\"}: ${svc.path}`);\n  } catch (e) {\n    emitEvent(opts, \"service_install_failed\", { error: (e as Error).message });\n    warn(`couldn't install service: ${(e as Error).message}`);\n    warn(\"the daemon will not run in the background — re-run after fixing the issue\");\n  }\n\n  // ── 4.5 Claude Code statusline (opt-out via MODELSTAT_NO_STATUSLINE) ──\n  // A Claude Code plugin can't register the main statusLine, so the installer\n  // is the mechanism: auto-write `modelstat statusline` into the user's\n  // ~/.claude/settings.json so the live per-session line (tokens · $ ·\n  // taxonomy) shows at the bottom of every turn. Idempotent + composes with an\n  // existing statusLine (stashes + restores it). Set MODELSTAT_NO_STATUSLINE=1\n  // to skip entirely.\n  if (!envFlag(\"MODELSTAT_NO_STATUSLINE\")) {\n    step(\"Enabling the Claude Code statusline (live tokens · $ · taxonomy)\");\n    try {\n      const { installStatusline, claudeSettingsPath } = await import(\"./claude-settings.js\");\n      const r = installStatusline();\n      if (r.kind === \"installed\") {\n        emitEvent(opts, \"statusline_installed\", { preserved: r.preserved });\n        ok(\n          r.preserved\n            ? `statusline enabled in ${claudeSettingsPath()} (your previous one was preserved)`\n            : `statusline enabled in ${claudeSettingsPath()}`,\n        );\n      } else if (r.kind === \"already\") {\n        emitEvent(opts, \"statusline_already\", {});\n        ok(\"statusline already enabled\");\n      } else {\n        emitEvent(opts, \"statusline_failed\", { error: r.message });\n        warn(`couldn't enable the statusline: ${r.message}`);\n      }\n    } catch (e) {\n      emitEvent(opts, \"statusline_failed\", { error: (e as Error).message });\n      warn(`couldn't enable the statusline: ${(e as Error).message}`);\n    }\n  }\n\n  // ── 5. Detect local AI installs + signed-in accounts ──────────\n  // Discovery now RIDES the daemon's heartbeat (the standalone\n  // /v1/devices/discovery endpoint is gone), so the just-installed service\n  // will upsert the snapshot on its first heartbeat within seconds. We still\n  // run discover() locally here — purely so the success banner can show the\n  // real count and the user gets immediate confirmation — but we no longer\n  // POST it from the CLI.\n  step(\"Detecting installed AI tools and signed-in accounts\");\n  let discovered: { installations: number; identities: number } | null = null;\n  if (state.deviceId) {\n    try {\n      const { discover } = await import(\"@modelstat/parsers\");\n      const d = await discover();\n      discovered = {\n        installations: d.installations.length,\n        identities: d.identities.length,\n      };\n      emitEvent(opts, \"discovered\", discovered);\n      ok(`${discovered.installations} installs · ${discovered.identities} accounts`);\n    } catch (e) {\n      emitEvent(opts, \"discovery_failed\", { error: (e as Error).message });\n      warn(`couldn't detect accounts: ${(e as Error).message}`);\n    }\n  }\n\n  // ── 6. Wire the modelstat MCP into your local AI tools ────────\n  // The daemon is now streaming usage; wiring the MCP lets the user *ask*\n  // about it from inside Claude Code / Cursor / Codex / VS Code / Zed /\n  // Windsurf. We shell out to the single source of truth —\n  // `npx -y @modelstat/mcp wire`, the same entry point install.sh /\n  // install.ps1 call — so a bare `npx modelstat@latest` (no curl installer)\n  // configures every detected tool too. Best-effort + idempotent; opt out\n  // with MODELSTAT_NO_WIRE=1 (managed fleets that own their MCP config).\n  let mcpWired = false;\n  if (process.env.MODELSTAT_NO_WIRE) {\n    emitEvent(opts, \"mcp_wire_skipped\", { reason: \"MODELSTAT_NO_WIRE\" });\n  } else {\n    step(\"Wiring the modelstat MCP into your AI tools\");\n    const w = await wireMcpTools(opts.json);\n    mcpWired = w.ok;\n    if (w.ok) {\n      emitEvent(opts, \"mcp_wired\", {});\n    } else {\n      emitEvent(opts, \"mcp_wire_failed\", { error: w.error });\n      warn(`MCP wiring skipped — run \\`npx -y @modelstat/mcp wire\\` later (${w.error})`);\n    }\n  }\n\n  if (!opts.json) {\n    const tray = trayStatus();\n    const line = \"━\".repeat(60);\n    console.log();\n    console.log(line);\n    console.log(`  ✓ Device registered — streaming your AI usage to modelstat.`);\n    console.log();\n    console.log(\n      `    service : \\x1b[${serviceOk ? \"32\" : \"33\"}m${serviceOk ? \"installed\" : \"foreground\"}\\x1b[0m`,\n    );\n    if (discovered) {\n      console.log(\n        `    detected: \\x1b[32m${discovered.installations} installs · ${discovered.identities} accounts\\x1b[0m`,\n      );\n    }\n    if (platform() === \"darwin\") {\n      console.log(\n        `    tray    : \\x1b[${tray.installed ? \"32\" : \"2\"}m${tray.installed ? \"menu-bar icon ready\" : \"not installed\"}\\x1b[0m`,\n      );\n    }\n    console.log();\n    console.log(claimed ? `  Open your dashboard:` : `  Open your dashboard (no sign-up needed):`);\n    console.log(`    \\x1b[1;36m${claimUrl}\\x1b[0m`);\n    console.log();\n    console.log(`  Live numbers from this terminal:`);\n    console.log(\n      `    \\x1b[2mmodelstat status\\x1b[0m  # pairing, service + sessions · tokens · cost`,\n    );\n    console.log(`    \\x1b[2mmodelstat jobs\\x1b[0m    # pipeline queue + recent activity`);\n    console.log(\n      `    \\x1b[2mmodelstat mode\\x1b[0m    # where sessions summarise (cloud/local/self-hosted)`,\n    );\n    console.log();\n    console.log(`  Agent-friendly (for LLMs / MCPs):`);\n    console.log(`    \\x1b[2m${agentUrl}\\x1b[0m`);\n    if (mcpWired) {\n      console.log(\n        `    \\x1b[32m✓\\x1b[0m \\x1b[2mMCP wired into your AI tools — ask them about your spend directly\\x1b[0m`,\n      );\n    }\n    if (!claimed) {\n      console.log();\n      console.log(`  Claim this device so it keeps analyzing past the free tier:`);\n      console.log(`    \\x1b[2m${claimUrl}/claim\\x1b[0m`);\n    }\n    console.log(line);\n    console.log();\n  }\n\n  // Try to open the claim URL in the user's browser so the tab is\n  // already pointing at their data when they alt-tab away from the CLI.\n  if (!opts.noBrowser) {\n    const opened = tryOpenBrowser(claimUrl);\n    emitEvent(opts, \"browser_open_attempted\", { opened });\n  }\n\n  emitEvent(opts, \"done\", { claim_url: claimUrl, agent_url: agentUrl, mcp_wired: mcpWired });\n\n  if (serviceOk) {\n    return; // exit cleanly\n  }\n\n  if (opts.json) {\n    // In JSON mode, don't drop into a blocking daemon — callers (skills)\n    // expect a deterministic exit.\n    return;\n  }\n\n  // No service support → run in the foreground so the user at least\n  // gets data flowing.\n  console.log(\"  Service install not supported on this platform — running in foreground.\");\n  console.log(\"  Press Ctrl-C to stop.\");\n  console.log();\n  const { runDaemon } = await import(\"./daemon.js\");\n  await runDaemon();\n}\n\nasync function cmdDiscover(): Promise<void> {\n  // One-shot diagnostic enumeration of local installs + signed-in accounts.\n  // Discovery is REPORTED to the server only via the daemon's heartbeat now (the\n  // standalone /v1/devices/discovery endpoint is gone), so this command just\n  // prints what the heartbeat would attach — it doesn't POST anything itself.\n  const { discover } = await import(\"@modelstat/parsers\");\n  const out = await discover();\n  console.log(`→ ${out.installations.length} installations, ${out.identities.length} identities`);\n  console.log(\n    \"(the running daemon reports this to the server on its next heartbeat — `modelstat discover` is read-only)\",\n  );\n}\n\nasync function cmdSync(rest: readonly string[]): Promise<void> {\n  // Force-ingest specific sessions NOW — the manual / headless sibling of the\n  // Claude Desktop extension's eager scan (both go through the daemon's loopback\n  // control endpoint). The installed daemon already ingests every session\n  // automatically; reach for this only when you need ONE session right now.\n  const sessionIds = flagValues(rest, \"--session\");\n  const file = flagValue(rest, \"--file\");\n  if (sessionIds.length === 0 && !file) {\n    console.error(\n      \"usage: modelstat sync --session <id> [--session <id> …] [--file <path>] [--wait]\",\n    );\n    console.error(\n      \"  (the background daemon ingests everything on its own; use sync to force one session now)\",\n    );\n    process.exit(1);\n  }\n  return cmdSyncSession({\n    sessionIds,\n    file,\n    wait: rest.includes(\"--wait\"),\n    port: numericFlag(rest, \"--port\"),\n  });\n}\n\n/**\n * Eager single-session scan — the fast path behind the `/stat` plugin and the\n * statusline's freshness. Tries a RUNNING daemon first (its summariser is\n * already resident, so the session lands in seconds via the loopback control\n * endpoint); only if no daemon is listening does it cold-load the summariser\n * and scan in-process. Refreshes the local insights cache either way (the\n * daemon does it on the control path; the standalone path does it here).\n */\nasync function cmdSyncSession(opts: {\n  sessionIds: string[];\n  file?: string;\n  wait: boolean;\n  port?: number;\n}): Promise<void> {\n  const { postControlScan } = await import(\"./api.js\");\n  const target = {\n    ...(opts.sessionIds.length ? { session_ids: opts.sessionIds } : {}),\n    ...(opts.file ? { file: opts.file } : {}),\n  };\n  const outcome = await postControlScan({ ...target, wait: opts.wait }, { port: opts.port });\n  if (outcome.kind === \"ok\") {\n    console.log(\n      opts.wait\n        ? \"✓ daemon force-scanned the session\"\n        : \"✓ asked the running daemon to force-scan the session\",\n    );\n    return;\n  }\n  if (outcome.kind === \"error\") {\n    console.error(`✗ daemon control scan failed (${outcome.status}): ${outcome.message}`);\n    process.exit(1);\n  }\n\n  // No daemon listening — cold-scan in-process. Slower (loads the summariser)\n  // but works without an installed/running daemon.\n  console.log(\"no running daemon on the control port — scanning in-process…\");\n  const { preflightSummariser } = await import(\"./pipeline.js\");\n  const { label, degraded } = await preflightSummariser();\n  console.log(\n    degraded\n      ? `[modelstat] ⚠ summariser DEGRADED — ${label}; extractive fallback, ingest continues`\n      : `[modelstat] summariser preflight ok: ${label}`,\n  );\n  const { scanSession } = await import(\"./scan.js\");\n  const r = await scanSession({\n    ...(opts.sessionIds.length ? { sessionIds: opts.sessionIds } : {}),\n    ...(opts.file ? { file: opts.file } : {}),\n  });\n  console.log(\n    `Done: ${r.filesScanned} files scanned, ${r.batchesUploaded} batches, ${r.segmentsUploaded} segments, ${r.eventsUploaded} events uploaded`,\n  );\n  // Refresh the local insights cache the statusline reads (the daemon does\n  // this on the control path; here we do it for the standalone scan).\n  if (opts.sessionIds.length > 0) {\n    const { refreshSessionInsights } = await import(\"./insights.js\");\n    await refreshSessionInsights(opts.sessionIds);\n  }\n  try {\n    const { disposeLlama } = await import(\"@modelstat/daemon-core/node\");\n    await disposeLlama();\n  } catch {\n    /* best-effort */\n  }\n}\n\n/**\n * Manual force re-scan: wipe every file cursor + bump the local\n * processing-version stamp so the next scan re-reads all JSONLs\n * from byte 0 and re-summarises every session. Same effect as\n * shipping a new processing-version, just user-triggered (e.g. when\n * upstream changed something the daemon doesn't know about, or when\n * the user wants to backfill old sessions for a freshly-claimed\n * device).\n */\nasync function cmdReset(): Promise<void> {\n  const { PROCESSING_VERSION } = await import(\"./processing-version.js\");\n  state.wipeCursors();\n  state.setProcessingVersion(PROCESSING_VERSION);\n  console.log(\n    `[modelstat] cursors reset — the daemon's next scan cycle will re-read every JSONL from the start and re-summarise every session at processing version v${PROCESSING_VERSION}.`,\n  );\n  console.log(\"  If the daemon is running, kick it now with: modelstat stop && modelstat start\");\n}\n\nasync function cmdWatch(): Promise<void> {\n  const { watchForever } = await import(\"./watch.js\");\n  await watchForever();\n}\n\nasync function cmdStart(rest: string[]): Promise<void> {\n  // Name the long-running daemon \"modelstat agent\" so `ps`/`top` (and Linux\n  // GUI monitors, via /proc/<pid>/comm) show it instead of a bare \"node\".\n  // On macOS the Activity Monitor name instead comes from the launcher\n  // binary's filename — see ensureDaemonLauncher() in service.ts.\n  process.title = \"modelstat agent\";\n  if (!state.bearer || !state.deviceId) {\n    console.error(\"not paired yet. Run `modelstat` first.\");\n    process.exit(1);\n  }\n  const force = rest.includes(\"--force\") || rest.includes(\"-f\");\n  const { runDaemon } = await import(\"./daemon.js\");\n  await runDaemon({ force });\n}\n\nasync function cmdStop(): Promise<void> {\n  try {\n    uninstallService();\n    console.log(\"✓ service stopped and uninstalled\");\n    // Remove the menu-bar tray too: its launchd agent, the running tray\n    // process, and the installed .app bundle. Best-effort and macOS-only\n    // (both are no-ops elsewhere) — a tray hiccup must not fail uninstall.\n    try {\n      uninstallTrayAutostart();\n      removeTrayApp();\n      console.log(\"✓ menu-bar tray removed\");\n    } catch (e) {\n      console.log(`  (couldn't fully remove the tray: ${(e as Error).message})`);\n    }\n    // Remove our Claude Code statusLine (restoring any one we composed over).\n    // Best-effort: a settings hiccup must not fail the uninstall.\n    try {\n      const { removeStatusline } = await import(\"./claude-settings.js\");\n      const r = removeStatusline();\n      if (r.kind === \"removed\") {\n        console.log(\n          r.restored\n            ? \"✓ statusline removed (your previous statusLine was restored)\"\n            : \"✓ statusline removed from Claude Code settings\",\n        );\n      } else if (r.kind === \"error\") {\n        console.log(`  (couldn't remove the statusline: ${r.message})`);\n      }\n    } catch (e) {\n      console.log(`  (couldn't remove the statusline: ${(e as Error).message})`);\n    }\n    console.log(`  Your device pairing is still in ${state.storePath}`);\n    console.log(\"  Run `modelstat` again to re-enable.\");\n  } catch (err) {\n    console.error(`✗ ${(err as Error).message}`);\n    process.exit(1);\n  }\n}\n\n// One command for \"how's my daemon, and what has it tracked?\" — local\n// pairing + service state, then the live usage summary (sessions · tokens ·\n// cost). `--json` returns the whole object; the tray polls `status --json` and\n// decodes claimed / device / claim_url / dashboard / local from it.\nasync function cmdStatus(args: readonly string[] = []): Promise<void> {\n  const asJson = args.includes(\"--json\");\n  const s = serviceStatus();\n  const paired = !!state.bearer && !!state.deviceId;\n  const local = await readLocalStatus();\n  const dashboard = `${state.apiUrl.replace(/\\/$/, \"\")}/dashboard`;\n\n  // Usage NUMBERS are driven entirely off the daemon's LOCAL heartbeat snapshot\n  // (~/.modelstat/last-status.json, written by daemon.ts every status change)\n  // plus a dashboard pointer for the authoritative numbers. The old\n  // claim-code capability endpoint (/v1/device/:claim) was removed server-side —\n  // it now returns the SPA HTML, so there's nothing to fetch for usage here.\n  // (The tray's claimed/device/claim_url fields ARE refreshed from the authed\n  // /v1/devices/me below, in the --json branch.)\n  const stats = (local?.stats as Record<string, number | string> | undefined) ?? {};\n\n  if (asJson) {\n    // The tray decodes `claimed` / `device` / `claim_url` / `claim_code` from\n    // this JSON to drive the dropdown: the claimed-vs-unclaimed UI, the device\n    // hostname line (\"unknown\" when this is missing — the bug this restores),\n    // and the \"Copy claim URL\" item. These USED to come from the public\n    // claim-code device-view (removed server-side — it now returns SPA HTML);\n    // the authed `GET /v1/devices/me` is its replacement. Best-effort: on any\n    // failure (offline / transient / revoked secret) we fall back to the\n    // locally-cached identity so the menu still shows the real hostname + claim\n    // link. We do NOT recover the identity here — a status poll must stay\n    // side-effect-free; the heartbeat loop owns 401 recovery.\n    const fp = buildFingerprint();\n    const device = {\n      hostname: typeof fp.hostname === \"string\" ? fp.hostname : null,\n      os_family: typeof fp.os_family === \"string\" ? fp.os_family : null,\n      daemon_status: (local?.status as string | undefined) ?? null,\n    };\n    // `userEmail` is set only once /devices/me has reported the device claimed,\n    // so it's a safe offline proxy for claimed-ness when the fetch below fails.\n    let claimed = !!state.userEmail;\n    let claimUrl = state.claimUrl;\n    let claimCode = state.claimCode;\n    if (paired) {\n      try {\n        const me = await fetchDeviceMe(state.bearer ?? \"\");\n        claimed = me.status === \"claimed\";\n        claimUrl = me.claim_url ?? claimUrl;\n        claimCode = me.claim_code ?? claimCode;\n        if (me.daemon_status) device.daemon_status = me.daemon_status;\n      } catch {\n        // offline / transient / revoked — keep the cached fallbacks above.\n      }\n    }\n    process.stdout.write(\n      `${JSON.stringify({\n        paired,\n        claimed,\n        dashboard,\n        device,\n        claim_url: claimUrl,\n        claim_code: claimCode,\n        local,\n        service: { running: s.running, hint: s.hint },\n        pairing: paired\n          ? {\n              paired: true,\n              user: state.userEmail ?? null,\n              device: state.deviceId,\n              uuid: state.deviceUuid ?? null,\n            }\n          : { paired: false },\n        auto_update: { enabled: autoUpdateEnabled(), pinned_by_env: autoUpdatePinnedByEnv() },\n        // Active summariser mode (the tray reads this to show + switch it).\n        // Mirrors `modelstat mode --json`: endpoint fields only for self-hosted.\n        summarizer: {\n          mode: state.summarizerMode,\n          ...(state.summarizerMode === \"self-hosted\" ? state.selfHosted : {}),\n          env_override: state.summarizerModeIsEnvOverridden,\n        },\n        api: state.apiUrl,\n        logs: logsDir(),\n        state: state.storePath,\n      })}\\n`,\n    );\n    return;\n  }\n\n  // ── local: pairing + service ──────────────────────────────────────\n  console.log(`paired:  ${paired ? \"yes\" : \"no\"}`);\n  if (paired) {\n    console.log(`  user:    ${state.userEmail ?? \"(unknown)\"}`);\n    console.log(`  device:  ${state.deviceId}`);\n    console.log(`  uuid:    ${state.deviceUuid ?? \"(not self-registered)\"}`);\n  }\n  console.log(`service: ${s.running ? \"running\" : \"stopped\"}  (${s.hint})`);\n  console.log(`logs:    ${logsDir()}`);\n  console.log(`state:   ${state.storePath}`);\n  console.log(`api:     ${state.apiUrl}`);\n  const sm = state.summarizerMode;\n  const smEndpoint =\n    sm === \"self-hosted\" && state.selfHosted.url ? ` (${state.selfHosted.url})` : \"\";\n  const smEnv = state.summarizerModeIsEnvOverridden ? \" (env override)\" : \"\";\n  console.log(`summariser: ${sm}${smEndpoint}${smEnv} — change with \\`modelstat mode\\``);\n  console.log(\n    `auto-update: ${autoUpdateEnabled() ? \"on\" : \"off\"}${autoUpdatePinnedByEnv() ? \" (pinned by env)\" : \"\"}`,\n  );\n  const upd = local?.update as { verdict?: string; latest?: string | null } | null | undefined;\n  if (upd?.verdict && upd.verdict !== \"ok\") {\n    const what = upd.verdict === \"upgrade_required\" ? \"REQUIRED\" : \"available\";\n    console.log(`update:  ${what} — latest ${upd.latest ?? \"?\"} (run \\`modelstat upgrade\\`)`);\n  }\n\n  // ── live usage: from the local heartbeat snapshot + dashboard pointer ──\n  console.log(\"\");\n  if (!paired) {\n    console.log(\"usage:   not paired yet — run `npx modelstat@latest`\");\n    return;\n  }\n  console.log(\"usage:   full numbers in your dashboard:\");\n  console.log(`  ${dashboard}`);\n  if (local) {\n    const phase = local.status as string | undefined;\n    const message = local.message as string | null | undefined;\n    if (phase) console.log(`  phase: ${phase}${message ? ` — ${message}` : \"\"}`);\n    for (const [k, v] of Object.entries(stats)) console.log(`  ${k}: ${v}`);\n  } else {\n    console.log(\"  (no local heartbeat yet — is the daemon running?)\");\n  }\n}\n\n/** Show or change the daemon auto-update setting: on | off | toggle | status. */\nfunction cmdAutoUpdate(args: readonly string[]): void {\n  const sub = (args[0] ?? \"\").toLowerCase();\n  if (sub === \"on\" || sub === \"enable\") {\n    setStoredAutoUpdate(true);\n  } else if (sub === \"off\" || sub === \"disable\") {\n    setStoredAutoUpdate(false);\n  } else if (sub === \"toggle\") {\n    setStoredAutoUpdate(!storedAutoUpdate());\n  } else if (sub !== \"\" && sub !== \"status\") {\n    console.log(\"usage: modelstat autoupdate [on|off|toggle|status]\");\n    return;\n  }\n  console.log(`auto-update: ${autoUpdateEnabled() ? \"on\" : \"off\"}`);\n  if (autoUpdatePinnedByEnv()) {\n    console.log(\"  (pinned by MODELSTAT_AUTO_UPDATE env — the stored toggle is ignored)\");\n  }\n}\n\n/** Manually upgrade to the latest published version now (ignores the\n * auto-update setting). The tray's \"Update now\" item shells this. */\nfunction cmdUpgrade(): void {\n  console.log(\"upgrading modelstat to the latest published version…\");\n  const r = runUpgrade();\n  if (r.started) {\n    console.log(\n      \"  started `npm install -g modelstat@latest` — the service restarts on the new build.\",\n    );\n  } else {\n    console.log(`  couldn't start the upgrade: ${r.reason}`);\n    console.log(\"  upgrade manually: npm install -g modelstat@latest\");\n  }\n}\n\n/** Best-effort read of the daemon's heartbeat mirror. Returns the\n * parsed object or null if the file isn't there / can't be parsed. */\nasync function readLocalStatus(): Promise<Record<string, unknown> | null> {\n  try {\n    const { readFile } = await import(\"node:fs/promises\");\n    const { homePath } = await import(\"./paths.js\");\n    const p = homePath(\"last-status.json\");\n    const txt = await readFile(p, \"utf8\");\n    return JSON.parse(txt) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\n/** Background-pipeline view. The authoritative job queue + ledger live in the\n * dashboard (the old claim-code capability endpoints were removed server-side —\n * they now return the SPA HTML). Locally we surface the daemon's own pipeline\n * activity from its heartbeat snapshot (phase + queue depth + upload stats) and\n * point at the dashboard for the full picture. */\nasync function cmdJobs(args: readonly string[]): Promise<void> {\n  const asJson = args.includes(\"--json\");\n  const paired = !!state.bearer && !!state.deviceId;\n  const dashboard = `${state.apiUrl.replace(/\\/$/, \"\")}/dashboard/jobs`;\n  if (!paired) {\n    if (asJson) {\n      process.stdout.write(`${JSON.stringify({ paired: false, reason: \"not_paired\" })}\\n`);\n    } else {\n      console.log(\"not paired yet — run `npx modelstat@latest` first\");\n    }\n    return;\n  }\n  const local = await readLocalStatus();\n  const stats = (local?.stats as Record<string, number | string> | undefined) ?? {};\n  const phase = (local?.status as string | undefined) ?? null;\n  const queue = Number(local?.queue_size ?? 0);\n  if (asJson) {\n    process.stdout.write(\n      `${JSON.stringify({ paired: true, dashboard, phase, queue_size: queue, stats })}\\n`,\n    );\n    return;\n  }\n  console.log(\"jobs:    full job queue + ledger in your dashboard:\");\n  console.log(`  ${dashboard}`);\n  console.log(\"\");\n  console.log(\"local pipeline (this device):\");\n  if (local) {\n    const message = local.message as string | null | undefined;\n    if (phase) console.log(`  phase: ${phase}${message ? ` — ${message}` : \"\"}`);\n    console.log(`  queue: ${queue}`);\n    for (const [k, v] of Object.entries(stats)) console.log(`  ${k}: ${v}`);\n  } else {\n    console.log(\"  (no local heartbeat yet — is the daemon running?)\");\n  }\n}\n\n/** Print the resolved state file + log paths as JSON. Read by the\n * @modelstat/mcp server (and any other tool) to locate the shared\n * state file without re-implementing Conf's path algorithm — so\n * brew-installed and npm-installed CLIs always point at the same\n * state, and MCP just shells out to `modelstat paths --json`. */\nfunction cmdPaths(args: readonly string[]): void {\n  // intended_uuid is what THIS machine would self-register as today\n  // (derived from the hardware key). It should equal device_uuid for a\n  // healthy enrollment; a mismatch means the stored identity predates\n  // the deterministic scheme (still fine — it's reused as-is, and\n  // machine_id dedupe covers it server-side).\n  const intended = intendedDeviceUuid();\n  const data = {\n    state: state.storePath,\n    identity: identityPath(),\n    logs: logsDir(),\n    api: state.apiUrl,\n    paired: !!state.bearer && !!state.deviceId,\n    device_id: state.deviceId ?? \"(none)\",\n    device_uuid: state.deviceUuid ?? \"(none)\",\n    intended_uuid: intended,\n    machine_key_source: machineKeySource(),\n  };\n  if (args.includes(\"--json\")) {\n    process.stdout.write(`${JSON.stringify(data)}\\n`);\n    return;\n  }\n  for (const [k, v] of Object.entries(data)) {\n    console.log(`${k.padEnd(8)} ${String(v)}`);\n  }\n}\n\n/** Print the device token (bearer) for hosted-MCP / API setups. Bare token\n * on stdout so `$(npx -y modelstat@latest token)` substitutes cleanly; the\n * handle-with-care note goes to stderr. */\nfunction cmdToken(args: readonly string[]): void {\n  if (!state.bearer) {\n    console.error(\"not paired — run `npx modelstat@latest` first\");\n    process.exit(1);\n  }\n  if (args.includes(\"--json\")) {\n    process.stdout.write(`${JSON.stringify({ token: state.bearer, api: state.apiUrl })}\\n`);\n    return;\n  }\n  process.stdout.write(`${state.bearer}\\n`);\n  if (process.stderr.isTTY) {\n    console.error(\"(device token — treat it like a password; rotate via the dashboard if leaked)\");\n  }\n}\n\n/**\n * `modelstat mode [cloud|local|self-hosted]` — show or change where sessions\n * get summarised (redaction always stays on-device). With no argument it prints\n * the current mode; with one it persists the new mode (prompting for /\n * validating a self-hosted endpoint), pulls the local model when switching TO\n * local, and refreshes the background service so the running daemon reloads.\n */\nasync function cmdMode(argv: readonly string[]): Promise<void> {\n  const json = argv.includes(\"--json\");\n  // A bare positional (not a --flag) is the mode; --mode is also accepted.\n  const positional = argv.find((a) => !a.startsWith(\"-\"));\n  const requested = flagValue(argv, \"--mode\") ?? positional;\n\n  // No argument → report the current mode + endpoint.\n  if (!requested) {\n    const mode = state.summarizerMode;\n    if (json) {\n      process.stdout.write(\n        `${JSON.stringify({\n          mode,\n          ...(mode === \"self-hosted\" ? state.selfHosted : {}),\n          env_override: state.summarizerModeIsEnvOverridden,\n        })}\\n`,\n      );\n      return;\n    }\n    console.log(`summariser mode: ${mode}`);\n    console.log(`  ${MODE_INFO[mode].label}`);\n    console.log(`  resource: ${MODE_INFO[mode].resource}`);\n    console.log(`  privacy:  ${MODE_INFO[mode].privacy}`);\n    if (mode === \"self-hosted\") {\n      const sh = state.selfHosted;\n      console.log(`  endpoint: ${sh.url || \"(unset)\"}   model: ${sh.model || \"(unset)\"}`);\n    }\n    if (state.summarizerModeIsEnvOverridden) {\n      console.log(\"  note: MODELSTAT_SUMMARIZER_MODE is set and overrides the stored value.\");\n    }\n    console.log(\"change it: modelstat mode <cloud|local|self-hosted> [--url <URL> --model <ID>]\");\n    return;\n  }\n\n  let mode: SummarizerMode;\n  try {\n    mode = await resolveAndPersistMode({\n      requested,\n      url: flagValue(argv, \"--url\"),\n      model: flagValue(argv, \"--model\"),\n      interactive: !json && process.stdin.isTTY === true,\n    });\n  } catch (e) {\n    console.error(`couldn't set mode: ${(e as Error).message}`);\n    process.exit(1);\n    return;\n  }\n  console.log(`✓ summariser mode set to ${mode}`);\n  if (state.summarizerModeIsEnvOverridden) {\n    console.warn(\n      `⚠ MODELSTAT_SUMMARIZER_MODE is set — the daemon will use \"${state.summarizerMode}\" until you unset it`,\n    );\n  }\n\n  // Switching TO local needs the model — pull it now so the next scan is\n  // instant (best-effort; otherwise the daemon downloads it lazily on first scan).\n  if (mode === \"local\") {\n    try {\n      const { ensureLlamaModel, defaultLlamaConfig } = await import(\"@modelstat/daemon-core/node\");\n      console.log(\"preparing local summariser model (downloads on first use)…\");\n      await ensureLlamaModel(defaultLlamaConfig());\n      console.log(\"✓ summariser model on disk\");\n    } catch (e) {\n      console.warn(\n        `couldn't pre-download the model (${(e as Error).message}); it downloads on first scan`,\n      );\n    }\n  }\n\n  // Re-stage the native runtime for the new mode + bounce the service so the\n  // running daemon reloads. Only when there's an installed daemon to refresh.\n  if (state.bearer) {\n    try {\n      const svc = installService();\n      console.log(`✓ background service refreshed (${svc.path})`);\n    } catch (e) {\n      console.warn(\n        `couldn't refresh the service (${(e as Error).message}) — restart it by re-running \\`modelstat\\``,\n      );\n    }\n  } else {\n    console.log(\"run `modelstat` to install the background service with this mode.\");\n  }\n}\n\nfunction parseConnectOpts(argv: readonly string[]): ConnectOpts {\n  return {\n    json: argv.includes(\"--json\"),\n    noBrowser: argv.includes(\"--no-browser\"),\n    fresh: argv.includes(\"--fresh\"),\n    yes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n    mode: flagValue(argv, \"--mode\"),\n    selfHostedUrl: flagValue(argv, \"--url\"),\n    selfHostedModel: flagValue(argv, \"--model\"),\n  };\n}\n\nasync function main(): Promise<void> {\n  const cmd = process.argv[2];\n  const rest = process.argv.slice(3);\n  switch (cmd) {\n    case undefined:\n    case \"connect\":\n      // Default action — install or upgrade. Registers the device if\n      // it isn't already, installs the launchd / systemd service,\n      // ensures it's running, and exits cleanly. Idempotent: a re-run\n      // refreshes the bundle copy and bounces the service so the new\n      // code loads. Users do NOT see the foreground daemon — that's\n      // an internal entry point used by the service supervisor only.\n      // `connect` stays as a hidden alias so older docs and shell\n      // history keep working.\n      return cmdConnect(parseConnectOpts(rest));\n    case \"remove\":\n    case \"uninstall\":\n    case \"stop\":\n      // Stop and remove the background service. Doesn't touch the\n      // pairing identity at ~/.modelstat/identity.json, so a later\n      // re-run picks the same device row up rather than minting a\n      // new one. Pass --fresh on the next run to mint anew.\n      return cmdStop();\n    case \"reinstall\":\n      // Same as the default action, but explicit — mostly here for\n      // discoverability. `npx modelstat@latest` already does the\n      // right thing on a re-run.\n      return cmdConnect(parseConnectOpts(rest));\n\n    // ── Internal / service entry point ─────────────────────────\n    case \"_daemon\":\n    case \"start\":\n      // Foreground daemon. The launchd plist + systemd unit invoke\n      // this. Not advertised in --help; users get to background work\n      // via the default install flow above.\n      return cmdStart(rest);\n    case \"_setup-runtime\": {\n      // Internal: copy the bundle to ~/.modelstat/bin AND stage the\n      // native summariser runtime beside it, so the install is\n      // self-contained (npm-only, no Ollama). Run straight from the\n      // freshly-unpacked npm tree by the install pipeline. No-op-safe.\n      const dest = setupRuntime();\n      console.log(`✓ runtime staged at ${dest}`);\n      return;\n    }\n    case \"_install-service\": {\n      // Internal: stage the bundle + native runtime AND (re)install the managed\n      // launchd/systemd service in ONE idempotent step (installService does\n      // both — see service.ts). The result is an ALWAYS-ON daemon (RunAtLoad +\n      // KeepAlive on macOS, Restart=always on Linux) running the freshly-staged\n      // bundle — NOT a detached hand-spawned process. The upgrade postinstall\n      // calls this so every upgrade leaves a properly-managed service, and a\n      // previously hand-spawned daemon gets converted to a managed one.\n      const svc = installService();\n      console.log(`✓ managed background service installed + started (${svc.path})`);\n      // If a menu-bar tray was already installed, refresh it to this\n      // version and re-arm its autostart agent so an auto-update / upgrade\n      // leaves the NEW tray running. No-op when no tray was installed.\n      if (refreshTrayIfInstalled()) console.log(\"✓ menu-bar tray refreshed to this version\");\n      return;\n    }\n    case \"_daemon-health\": {\n      // Internal: one-line JSON verdict for supervisors (the macOS\n      // tray) deciding whether to adopt the live daemon, spawn a\n      // fresh one, or force-replace a wedged one — see supervise.ts.\n      // Never throws: a broken probe must not strand the supervisor,\n      // so any failure degrades to \"spawn\".\n      try {\n        console.log(JSON.stringify(daemonHealth({ myDaemonVersion: DAEMON_VERSION })));\n      } catch (e) {\n        console.log(JSON.stringify({ decision: \"spawn\", error: (e as Error).message }));\n      }\n      return;\n    }\n\n    // ── Diagnostics / dev one-shots ────────────────────────────\n    case \"status\":\n      return cmdStatus(rest);\n    case \"jobs\":\n      return cmdJobs(rest);\n    case \"paths\":\n      cmdPaths(rest);\n      return;\n    case \"token\":\n      cmdToken(rest);\n      return;\n    case \"mode\":\n      // Show or change where sessions get summarised: cloud | local |\n      // self-hosted (redaction always stays on-device). See cmdMode.\n      return cmdMode(rest);\n    case \"discover\":\n      return cmdDiscover();\n    case \"sync\":\n      return cmdSync(rest);\n    case \"statusline\": {\n      // Claude Code's always-on status line. Reads its stdin JSON, prints one\n      // compact line from the LOCAL insights cache — never blocks, never hits\n      // the network, never throws (a crashing statusline wedges the prompt).\n      // Dynamically imported so the common CLI paths don't pay for it.\n      const { runStatusline } = await import(\"./statusline.js\");\n      await runStatusline();\n      return;\n    }\n    case \"reset\":\n      return cmdReset();\n    case \"watch\":\n      return cmdWatch();\n    case \"self-register\":\n      return cmdSelfRegister();\n    case \"await-claim\":\n      return cmdAwaitClaim();\n    case \"upgrade\":\n      // Upgrade to the latest version now (ignores the auto-update setting).\n      cmdUpgrade();\n      return;\n    case \"autoupdate\":\n      // Show or change the auto-update setting: on | off | toggle | status.\n      cmdAutoUpdate(rest);\n      return;\n    default:\n      console.log(\"usage:\");\n      console.log(\n        \"  npx modelstat@latest                — install or upgrade. Registers the device, installs the background service, wires the MCP into your AI tools, exits.\",\n      );\n      console.log(\n        \"                                        flags: --json, --no-browser, --fresh, -y, --mode <cloud|local|self-hosted> [--url --model]\",\n      );\n      console.log(\n        \"  npx modelstat@latest remove         — stop and uninstall the background service. Keeps your identity.\",\n      );\n      console.log(\n        \"  npx modelstat@latest reinstall      — alias for the default. Useful when you want to be explicit.\",\n      );\n      console.log();\n      console.log(\"Diagnostics:\");\n      console.log(\n        \"  npx modelstat@latest status         — pairing, service + live usage: sessions · tokens · cost (--json)\",\n      );\n      console.log(\"  npx modelstat@latest upgrade        — update to the latest version now\");\n      console.log(\"  npx modelstat@latest autoupdate     — show/set auto-update: on|off|toggle\");\n      console.log(\n        \"  npx modelstat@latest jobs           — pipeline queue + recent processing ledger (--json)\",\n      );\n      console.log(\n        \"  npx modelstat@latest paths          — print state file + log dir + api URL (--json)\",\n      );\n      console.log(\n        \"  npx modelstat@latest token          — print the device token for hosted MCP / API access (--json)\",\n      );\n      console.log(\n        \"  npx modelstat@latest mode           — show/set where sessions summarise: cloud|local|self-hosted\",\n      );\n      console.log(\n        \"  modelstat statusline                — Claude Code status line (reads stdin JSON; auto-enabled on install)\",\n      );\n      console.log();\n      console.log(\"Dev / one-shots:\");\n      console.log(\n        \"  npx modelstat@latest sync --session <id>  — force-ingest ONE session now (--file <path>, --wait)\",\n      );\n      console.log(\n        \"  npx modelstat@latest reset          — reset file cursors so the daemon re-reads & re-summarises everything\",\n      );\n      console.log(\n        \"  npx modelstat@latest watch          — foreground watcher (chokidar + periodic backstop; no service)\",\n      );\n      console.log(\"  npx modelstat@latest discover       — one-shot report of installs/identities\");\n      console.log();\n      console.log(\n        \"Internal (called by launchd/systemd, not by humans): _daemon, start, self-register, await-claim\",\n      );\n      process.exit(1);\n  }\n}\n\nmain().catch((e) => {\n  console.error(e);\n  process.exit(1);\n});\n","/**\n * Install/uninstall the modelstat daemon as a background service.\n *\n * macOS → launchd user agent at ~/Library/LaunchAgents/ai.modelstat.daemon.plist\n * Linux → systemd --user unit at ~/.config/systemd/user/modelstat.service\n *\n * We copy the running CLI bundle to a stable path (~/.modelstat/bin) so\n * the service survives npx cache cleanups and `npm uninstall -g`.\n * Logs go to ~/.modelstat/logs/{out,err}.log. launchd/systemd don't\n * rotate these; the daemon truncates any log over LOG_MAX_BYTES at\n * boot (tail preserved in <name>.old.log) — see rotateRunawayLogs in\n * daemon.ts.\n */\nimport { spawn, spawnSync } from \"node:child_process\";\nimport {\n  chmodSync,\n  copyFileSync,\n  existsSync,\n  linkSync,\n  mkdirSync,\n  readFileSync,\n  realpathSync,\n  unlinkSync,\n  writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { homedir, platform, userInfo } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { state } from \"./config.js\";\n\nexport const SERVICE_LABEL = \"ai.modelstat.daemon\";\nexport const SYSTEMD_UNIT = \"modelstat\"; // → modelstat.service\n// The tray gets its OWN launchd agent, separate from the daemon's, so the\n// menu-bar icon is brought back on every login by launchd — not by the tray\n// trying to register itself as a Login Item while it happens to be running\n// (the old chicken-and-egg trap that left it dead after any reboot/crash).\nexport const TRAY_SERVICE_LABEL = \"ai.modelstat.tray\";\n\nfunction home(): string {\n  return homedir();\n}\nfunction stateDir(): string {\n  return join(home(), \".modelstat\");\n}\nfunction binDir(): string {\n  return join(stateDir(), \"bin\");\n}\nfunction logDir(): string {\n  return join(stateDir(), \"logs\");\n}\nfunction installedCliPath(): string {\n  return join(binDir(), \"modelstat.mjs\");\n}\n\n/** Locate the currently-running CLI script. */\nfunction runningCliPath(): string {\n  // When tsup-bundled, import.meta.url is the dist/cli.mjs. When running\n  // via tsx in dev, it's the TypeScript source. Either way, this is the\n  // file to copy.\n  return fileURLToPath(import.meta.url).replace(/service\\.(mjs|js|ts)$/, \"cli.mjs\");\n}\n\n/** Copy the bundle to ~/.modelstat/bin so the service has a stable target. */\nfunction installBundle(): string {\n  mkdirSync(binDir(), { recursive: true });\n  mkdirSync(logDir(), { recursive: true });\n  const src = runningCliPath();\n  const dest = installedCliPath();\n  if (!existsSync(src)) {\n    throw new Error(\n      `Can't find the CLI bundle to install from (${src}). Are you running a local dev build?`,\n    );\n  }\n  copyFileSync(src, dest);\n  // Lay the native summariser runtime down beside the bundle so the\n  // copied, dependency-free `~/.modelstat/bin/modelstat.mjs` can load\n  // it with nothing but npm in the picture — no Ollama, no system\n  // libs, no separate build step. Sourced from the package we're\n  // running from RIGHT NOW (connect/upgrade always run straight out of\n  // the npm install that has these deps), so it can't miss the way the\n  // postinstall hook does for npx-prewarm / manual-copy installs.\n  installNativeRuntime(src);\n  return dest;\n}\n\n/** Public, side-effect-only entry point for `modelstat _setup-runtime`\n * — copies the bundle + stages the native summariser runtime without\n * touching launchd/systemd or the user's identity. Lets the install\n * pipeline (and tests) wire a self-contained `~/.modelstat/bin` in one\n * step. Returns the installed bundle path. */\nexport function setupRuntime(): string {\n  return installBundle();\n}\n\n/** Pinned fallbacks if we can't read the version from the source tree (kept in\n * sync with each package's range in apps/daemon/package.json + daemon-core). */\nconst NODE_LLAMA_CPP_FALLBACK_VERSION = \"3.18.1\";\nconst HF_TRANSFORMERS_FALLBACK_VERSION = \"3.8.1\";\n\n/** Read a package's installed version from the tree we're running out of, so the\n * staged self-contained copy matches exactly what this bundle was built and\n * tested against. package.json may be hidden behind an `exports` map, so resolve\n * the main entry and walk up to the owning directory. Returns null if it isn't\n * resolvable (e.g. we're running from the already-orphaned bundle). */\nfunction sourcePkgVersion(sourceCli: string, pkgName: string): string | null {\n  try {\n    const req = createRequire(sourceCli);\n    let d = dirname(realpathSync(req.resolve(pkgName)));\n    for (let i = 0; i < 10; i++) {\n      const pj = join(d, \"package.json\");\n      if (existsSync(pj)) {\n        const p = JSON.parse(readFileSync(pj, \"utf8\")) as {\n          name?: string;\n          version?: string;\n        };\n        if (p.name === pkgName && p.version) return p.version;\n      }\n      const up = dirname(d);\n      if (up === d) break;\n      d = up;\n    }\n  } catch {\n    /* not resolvable from here */\n  }\n  return null;\n}\n\n/** The version of a package already staged in `~/.modelstat/bin/node_modules`,\n * or null if it isn't there. */\nfunction stagedVersion(pkgName: string): string | null {\n  try {\n    const pj = join(binDir(), \"node_modules\", ...pkgName.split(\"/\"), \"package.json\");\n    return (JSON.parse(readFileSync(pj, \"utf8\")) as { version?: string }).version ?? null;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Stage native runtimes the dependency-free bundle imports into\n * `~/.modelstat/bin/node_modules/` with ONE `npm install` of every `name@version`\n * spec, so the bundle can `import()` them with nothing but npm in the picture —\n * no Ollama, no system libraries, no separate native build.\n *\n * CRITICAL — a SINGLE install, not one-per-package: these are installed with\n * `--no-save`, and `npm install` PRUNES extraneous packages. Two separate\n * `npm install --no-save` calls into the same prefix therefore remove the FIRST\n * package (\"added 1, removed 1\") — which silently deleted node-llama-cpp when\n * @huggingface/transformers was staged and dropped the daemon to the extractive\n * fallback. Installing every spec together keeps them all.\n *\n * Why npm and not a file copy: these ship large per-platform prebuilt binary\n * closures (node-llama-cpp's `@node-llama-cpp/<plat>`, transformers'\n * `onnxruntime-node`); `npm install` resolves the closure + the right platform\n * binary for us. Never throws — returns false on failure so the caller decides\n * what's load-bearing.\n */\nfunction stageNativePkgs(specs: string[]): boolean {\n  const dest = binDir();\n  mkdirSync(dest, { recursive: true });\n  // When this runs from the npm-UPGRADE path it's nested inside\n  // `npm install -g modelstat`'s postinstall, so npm's own config leaks in as\n  // `npm_config_*` env vars — notably `npm_config_global=true` and the global\n  // `npm_config_prefix`. Left alone, the nested install would treat `--prefix`\n  // as a GLOBAL root and drop packages in `<dest>/lib/node_modules` instead of\n  // `<dest>/node_modules`, where the bundle's walk-up can't find them. Force a\n  // LOCAL install (`--global=false`) and scrub the two leaking vars; keep the\n  // rest (registry, cache, proxy, auth) so corporate mirrors still work.\n  const childEnv = { ...process.env };\n  delete childEnv.npm_config_global;\n  delete childEnv.npm_config_prefix;\n  // This step used to be a silent black box: seconds with a warm cache, but a\n  // multi-minute (apparently-frozen) network download on a cold one. Announce it.\n  process.stderr.write(`  · staging native runtime (${specs.join(\", \")})…\\n`);\n  const r = spawnSync(\n    \"npm\",\n    [\n      \"install\",\n      \"--prefix\",\n      dest,\n      \"--global=false\",\n      \"--no-save\",\n      \"--omit=dev\",\n      \"--no-audit\",\n      \"--no-fund\",\n      // Prefer the npm cache the current install already populated — an offline\n      // ~3s copy instead of a redundant network re-fetch. Only a genuine cache\n      // miss touches the network, and a capped per-request timeout makes that\n      // fail fast (the daemon re-stages on its next preflight) rather than hang.\n      \"--prefer-offline\",\n      \"--fetch-timeout=60000\",\n      \"--loglevel=error\",\n      ...specs,\n    ],\n    { encoding: \"utf8\", stdio: \"pipe\", env: childEnv },\n  );\n  if (r.status !== 0) {\n    process.stderr.write(\n      `[modelstat] npm couldn't stage [${specs.join(\", \")}] into ~/.modelstat/bin:\\n${(r.stderr || r.stdout || \"\").trim()}\\n`,\n    );\n    return false;\n  }\n  return true;\n}\n\n/**\n * Stage the native runtimes the bundle imports into `~/.modelstat/bin`. Runs\n * from inside `installBundle()` on every `connect` / service refresh, straight\n * out of the freshly-unpacked npm tree where npm is on PATH.\n *\n * @huggingface/transformers (the embedder + on-device PII/NER redactor) is\n * staged in EVERY mode — redaction/embeddings stay on-device regardless of\n * where summarisation happens. node-llama-cpp (the local summariser, ~big\n * native binary + the ~2.7 GB model it then pulls) is staged ONLY in `local`\n * mode: cloud and self-hosted summarise elsewhere, so skipping it is what keeps\n * them off the native-runtime footprint.\n *\n * When both are needed they go in ONE install (see stageNativePkgs — separate\n * `--no-save` installs prune each other). If a combined local-mode install\n * fails (e.g. transformers' onnxruntime binary), retry with just node-llama-cpp\n * so a transformers hiccup can never cost us the summariser. Best-effort: never\n * throws; skips the (network) install when every package is already staged.\n */\nfunction installNativeRuntime(sourceCli: string): string[] {\n  const local = state.summarizerMode === \"local\";\n  const transformers = {\n    name: \"@huggingface/transformers\",\n    version:\n      sourcePkgVersion(sourceCli, \"@huggingface/transformers\") ?? HF_TRANSFORMERS_FALLBACK_VERSION,\n  };\n  const llama = {\n    name: \"node-llama-cpp\",\n    version: sourcePkgVersion(sourceCli, \"node-llama-cpp\") ?? NODE_LLAMA_CPP_FALLBACK_VERSION,\n  };\n  // node-llama-cpp only in local mode; transformers always.\n  const pkgs = local ? [llama, transformers] : [transformers];\n  // Every package already staged at the right version → nothing to do.\n  if (pkgs.every((p) => stagedVersion(p.name) === p.version)) {\n    return pkgs.map((p) => `${p.name}@${p.version} (cached)`);\n  }\n  const specs = pkgs.map((p) => `${p.name}@${p.version}`);\n  if (stageNativePkgs(specs)) return specs;\n  if (local) {\n    // Combined install failed — ensure at least the CRITICAL summariser runtime\n    // is staged (the embedder/redactor degrades to server-side embed + regex/LLM).\n    process.stderr.write(\n      \"[modelstat] retrying with just the summariser runtime; the embedder/redactor will fall back…\\n\",\n    );\n    const llamaSpec = `node-llama-cpp@${llama.version}`;\n    if (stageNativePkgs([llamaSpec])) return [llamaSpec];\n    process.stderr.write(\n      `[modelstat] couldn't stage the summariser runtime (${llamaSpec}); the daemon uses the extractive fallback until this is resolved.\\n`,\n    );\n  } else {\n    // Cloud/self-hosted: no local summariser to fall back on. A transformers\n    // miss just degrades on-device NER/embeddings (cloud fail-closes to local\n    // extractive; self-hosted keeps its remote model).\n    process.stderr.write(\n      \"[modelstat] couldn't stage @huggingface/transformers; on-device NER/embeddings degrade until this is resolved.\\n\",\n    );\n  }\n  return [];\n}\n\n/** Best-effort: absolute path to the node binary we'd invoke. */\nfunction nodeBinary(): string {\n  return process.execPath;\n}\n\n/**\n * The daemon launches through a link named exactly this so macOS Activity\n * Monitor labels the process \"modelstat agent\" instead of a bare \"node\".\n * macOS derives a process's display name from the FILENAME of the running\n * binary (the kernel's p_comm), NOT from Node's process.title — so the only\n * way to rename it in the GUI is to run it from a nicely-named file. Kept at\n * 15 chars (≤ the 16-char p_comm cap) so it never truncates. process.title\n * (set in cli.ts cmdStart) covers `ps`/`top`; this covers the GUI. Must stay\n * in sync with the tray's spawnDaemon() in apps/tray-mac (main.swift).\n */\nexport const DAEMON_LAUNCHER_NAME = \"modelstat agent\";\n\nfunction daemonLauncherPath(): string {\n  return join(binDir(), DAEMON_LAUNCHER_NAME);\n}\n\n/**\n * Ensure ~/.modelstat/bin/\"modelstat agent\" links to the node binary we\n * launch the daemon with, and return the path to launch through.\n *\n * A hardlink costs zero extra disk and keeps node's code signature intact\n * (identical bytes). We re-point it on every install so a node upgrade\n * (which gives node a new inode) is picked up — otherwise the link would\n * keep executing the OLD node forever. Unlinking a file that a running\n * daemon is still executing is safe on Unix: the inode survives until that\n * process exits.\n *\n * macOS only — it's the one platform where process.title can't rename the\n * process for the GUI. On Linux, process.title updates /proc/<pid>/comm, so\n * top/htop/System Monitor already read \"modelstat agent\" with no link.\n *\n * Falls back to a full copy when the link can't be made (node on another\n * volume → EXDEV), then to the bare node path if even that fails: a cosmetic\n * name is never worth a daemon that won't start.\n *\n * @param node binary to link to; injectable for tests.\n */\nexport function ensureDaemonLauncher(node: string = nodeBinary()): string {\n  if (platform() !== \"darwin\") return node;\n  const launcher = daemonLauncherPath();\n  // Already launching through the named link — relinking would unlink our\n  // own running binary and then fail to find a source. Nothing to do.\n  if (node === launcher) return launcher;\n  try {\n    mkdirSync(binDir(), { recursive: true });\n    if (existsSync(launcher)) unlinkSync(launcher);\n    linkSync(node, launcher);\n    return launcher;\n  } catch {\n    try {\n      copyFileSync(node, launcher);\n      chmodSync(launcher, 0o755);\n      return launcher;\n    } catch {\n      return node;\n    }\n  }\n}\n\n/* ─── macOS ────────────────────────────────────────────────────────── */\n\nfunction plistPath(): string {\n  return join(home(), \"Library\", \"LaunchAgents\", `${SERVICE_LABEL}.plist`);\n}\n\n/**\n * Look for the menu-bar tray app. Returns the path to the launchable\n * binary inside the bundle, or null if the tray isn't installed. We\n * check ~/Applications first (user-local install, what we write in\n * installTrayApp()), then /Applications (system-wide DMG drag).\n * If found, the launchd plist launches the tray, which in turn spawns\n * `modelstat start` as a subprocess so the user gets the menu-bar\n * status icon AND the pipeline in one managed process.\n */\nfunction locateTrayExecutable(): string | null {\n  const candidates = [\n    join(home(), \"Applications\", \"ModelstatTray.app\", \"Contents\", \"MacOS\", \"modelstat-tray\"),\n    \"/Applications/ModelstatTray.app/Contents/MacOS/modelstat-tray\",\n  ];\n  for (const p of candidates) {\n    if (existsSync(p)) return p;\n  }\n  return null;\n}\n\n/**\n * Pure launchd plist body for the daemon agent: `launcher` runs the bundled\n * CLI's `start`. Split out from writePlist (which does the filesystem + link\n * side effects) so the launch contract is unit-testable.\n */\nexport function daemonPlistContents(launcher: string, cliPath: string): string {\n  const programArgs = [\n    `    <string>${launcher}</string>`,\n    `    <string>${cliPath}</string>`,\n    `    <string>start</string>`,\n  ].join(\"\\n\");\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>Label</key><string>${SERVICE_LABEL}</string>\n  <key>ProgramArguments</key>\n  <array>\n${programArgs}\n  </array>\n  <key>RunAtLoad</key><true/>\n  <key>KeepAlive</key>\n  <dict><key>SuccessfulExit</key><false/></dict>\n  <key>ThrottleInterval</key><integer>30</integer>\n  <key>StandardOutPath</key><string>${join(logDir(), \"out.log\")}</string>\n  <key>StandardErrorPath</key><string>${join(logDir(), \"err.log\")}</string>\n  <key>EnvironmentVariables</key>\n  <dict>\n    <key>PATH</key><string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin</string>\n    <!-- Heap headroom for the startup scan of a large transcript backlog.\n         Node's default old-space ceiling (~4 GB) OOM-crashed the daemon on\n         big histories; raise it well below typical RAM. -->\n    <key>NODE_OPTIONS</key><string>--max-old-space-size=8192</string>\n  </dict>\n  <key>WorkingDirectory</key><string>${home()}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction writePlist(cliPath: string): string {\n  const p = plistPath();\n  mkdirSync(dirname(p), { recursive: true });\n  // This agent runs the headless daemon directly. The menu-bar tray has its\n  // OWN launchd agent (installTrayAutostart) — keeping them separate means\n  // the pipeline stays up even if the GUI tray is quit, and each is\n  // supervised independently. The daemon needs no GUI and self-heals via\n  // RunAtLoad + KeepAlive. It launches through ensureDaemonLauncher() so the\n  // process shows as \"modelstat agent\" in Activity Monitor, not \"node\".\n  const plist = daemonPlistContents(ensureDaemonLauncher(), cliPath);\n  writeFileSync(p, plist, { mode: 0o644 });\n  return p;\n}\n\nfunction launchctl(args: string[]): { ok: boolean; out: string; err: string } {\n  const r = spawnSync(\"launchctl\", args, { encoding: \"utf8\" });\n  return { ok: r.status === 0, out: r.stdout ?? \"\", err: r.stderr ?? \"\" };\n}\n\nfunction macInstall(): void {\n  const cliPath = installBundle();\n  const plist = writePlist(cliPath);\n  const uid = userInfo().uid;\n  const target = `gui/${uid}/${SERVICE_LABEL}`;\n  // Idempotent: unload the previous instance, then load + start the fresh one.\n  launchctl([\"bootout\", target]);\n  const boot = launchctl([\"bootstrap\", `gui/${uid}`, plist]);\n  if (!boot.ok) {\n    throw new Error(`launchctl bootstrap failed: ${boot.err.trim()}`);\n  }\n  launchctl([\"kickstart\", \"-k\", target]);\n}\n\nfunction macUninstall(): void {\n  const uid = userInfo().uid;\n  const target = `gui/${uid}/${SERVICE_LABEL}`;\n  launchctl([\"bootout\", target]);\n  const plist = plistPath();\n  if (existsSync(plist)) {\n    try {\n      unlinkSync(plist);\n    } catch {\n      /* ignore */\n    }\n  }\n}\n\nfunction macStatus(): { running: boolean; hint: string } {\n  const uid = userInfo().uid;\n  const r = launchctl([\"print\", `gui/${uid}/${SERVICE_LABEL}`]);\n  return { running: r.ok, hint: r.ok ? \"launchd managed\" : \"not installed\" };\n}\n\n/* ─── Linux (systemd --user) ───────────────────────────────────────── */\n\nfunction systemdUnitPath(): string {\n  const xdg = process.env.XDG_CONFIG_HOME ?? join(home(), \".config\");\n  return join(xdg, \"systemd\", \"user\", `${SYSTEMD_UNIT}.service`);\n}\n\nfunction writeSystemdUnit(cliPath: string): string {\n  const unitPath = systemdUnitPath();\n  mkdirSync(dirname(unitPath), { recursive: true });\n  const unit = `[Unit]\nDescription=modelstat daemon\nDocumentation=https://modelstat.ai\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\n# Heap headroom for the startup scan of a large transcript backlog —\n# Node's default ~4 GB old-space ceiling OOM-crashed the daemon on big\n# histories.\nEnvironment=NODE_OPTIONS=--max-old-space-size=8192\nExecStart=${nodeBinary()} ${cliPath} start\nRestart=always\nRestartSec=10\n# Don't restart-storm if the service is persistently unreachable.\nStartLimitIntervalSec=300\nStartLimitBurst=10\nStandardOutput=append:${join(logDir(), \"out.log\")}\nStandardError=append:${join(logDir(), \"err.log\")}\n\n[Install]\nWantedBy=default.target\n`;\n  writeFileSync(unitPath, unit, { mode: 0o644 });\n  return unitPath;\n}\n\nfunction systemctl(args: string[]): { ok: boolean; out: string; err: string } {\n  const r = spawnSync(\"systemctl\", [\"--user\", ...args], { encoding: \"utf8\" });\n  return { ok: r.status === 0, out: r.stdout ?? \"\", err: r.stderr ?? \"\" };\n}\n\nfunction linuxInstall(): void {\n  const cliPath = installBundle();\n  writeSystemdUnit(cliPath);\n  // Reload so systemd picks up changes on reinstall.\n  systemctl([\"daemon-reload\"]);\n  const en = systemctl([\"enable\", \"--now\", `${SYSTEMD_UNIT}.service`]);\n  if (!en.ok) {\n    throw new Error(`systemctl enable failed: ${en.err.trim()}`);\n  }\n  // If already running, restart so it picks up the fresh bundle.\n  systemctl([\"restart\", `${SYSTEMD_UNIT}.service`]);\n}\n\nfunction linuxUninstall(): void {\n  systemctl([\"disable\", \"--now\", `${SYSTEMD_UNIT}.service`]);\n  const unit = systemdUnitPath();\n  if (existsSync(unit)) {\n    try {\n      unlinkSync(unit);\n    } catch {\n      /* ignore */\n    }\n  }\n  systemctl([\"daemon-reload\"]);\n}\n\nfunction linuxStatus(): { running: boolean; hint: string } {\n  const r = systemctl([\"is-active\", `${SYSTEMD_UNIT}.service`]);\n  const active = r.out.trim() === \"active\";\n  return { running: active, hint: active ? \"systemd managed\" : \"not running\" };\n}\n\n/* ─── Public API ──────────────────────────────────────────────────── */\n\nexport function installService(): { path: string; logs: string } {\n  const p = platform();\n  if (p === \"darwin\") {\n    macInstall();\n    return { path: plistPath(), logs: logDir() };\n  }\n  if (p === \"linux\") {\n    linuxInstall();\n    return { path: systemdUnitPath(), logs: logDir() };\n  }\n  throw new Error(\n    `Service installation isn't supported on ${p}. Run 'modelstat start' manually to keep the daemon running.`,\n  );\n}\n\nexport function uninstallService(): void {\n  const p = platform();\n  if (p === \"darwin\") return macUninstall();\n  if (p === \"linux\") return linuxUninstall();\n  throw new Error(`Service uninstall isn't supported on ${p}.`);\n}\n\nexport function serviceStatus(): { running: boolean; hint: string } {\n  const p = platform();\n  if (p === \"darwin\") return macStatus();\n  if (p === \"linux\") return linuxStatus();\n  return { running: false, hint: `unsupported platform (${p})` };\n}\n\nexport function logsDir(): string {\n  return logDir();\n}\n\nexport function absoluteBundlePath(): string {\n  return installedCliPath();\n}\n\n/**\n * Copy a built ModelstatTray.app bundle to ~/Applications. The daemon's\n * launchd agent runs the headless daemon; the tray gets its OWN launchd\n * agent (installTrayAutostart) that execs this bundle's binary. Used by\n * `npx modelstat@latest` on macOS when a source .app is available (the\n * npm package ships one, and the installer build-compiles one if Swift\n * is on $PATH).\n *\n * The copy is rsync-like (subprocess: `cp -R`). We blow away any prior\n * install so a stale build doesn't silently linger — the bundle is\n * tiny (<2 MB) and idempotent install is worth more than a few ms.\n *\n * Returns { installedAt } on success, null if the source doesn't\n * exist so callers can degrade to the headless daemon path.\n */\nexport function installTrayApp(sourceAppPath: string): { installedAt: string } | null {\n  if (platform() !== \"darwin\") return null;\n  if (!existsSync(sourceAppPath)) return null;\n  const dest = join(home(), \"Applications\", \"ModelstatTray.app\");\n  mkdirSync(dirname(dest), { recursive: true });\n  // Remove any prior install so we don't leave stale Info.plist / binary\n  // combinations. `rm -rf` via spawnSync keeps the implementation off\n  // the async fs API for simplicity — the CLI is short-lived.\n  spawnSync(\"rm\", [\"-rf\", dest]);\n  const r = spawnSync(\"cp\", [\"-R\", sourceAppPath, dest], { encoding: \"utf8\" });\n  if (r.status !== 0) {\n    throw new Error(`cp ModelstatTray.app failed: ${r.stderr?.trim() || `exit ${r.status}`}`);\n  }\n  // Guarantee the inner binary is executable. `pnpm pack` normalises file\n  // modes in the published tarball and only keeps the exec bit on declared\n  // `bin` entries, so the prebuilt vendor/ModelstatTray.app binary ships as\n  // -rw-r--r-- — and `cp -R` faithfully copies that. launchd then fails to\n  // exec it and quits with EX_CONFIG (78). chmod here makes the install\n  // correct regardless of which path produced the bundle (prebuilt tarball\n  // or on-device `build-app.sh`, which already chmod +x's its output).\n  chmodSync(join(dest, \"Contents\", \"MacOS\", \"modelstat-tray\"), 0o755);\n  return { installedAt: dest };\n}\n\n/* ─── macOS tray autostart (its own launchd agent) ────────────────────\n *\n * The tray gets a launchd user agent SEPARATE from the daemon's. Unlike\n * the daemon agent (which runs a headless `node … start`), this one execs\n * the tray's GUI binary directly — which works from a user agent in the\n * gui/<uid> domain: the menu-bar icon comes up and launchd supervises it.\n *\n * KeepAlive={SuccessfulExit:false} is the whole trick for telling a crash\n * apart from the user quitting, with no marker files:\n *   · user picks Quit       → NSApp.terminate exits 0 → launchd leaves it\n *                             dead (no instant-relaunch fight); it returns\n *                             on the next login via RunAtLoad.\n *   · crash (non-zero/signal) → launchd relaunches it.\n *   · login-race duplicate   → the tray's process-table single-instance\n *                             guard exits 0 → treated as a clean exit, so\n *                             launchd doesn't fight it either.\n * This mirrors the daemon agent's KeepAlive (see writePlist).\n */\n\nexport function trayPlistPath(): string {\n  return join(home(), \"Library\", \"LaunchAgents\", `${TRAY_SERVICE_LABEL}.plist`);\n}\n\n/**\n * Render the tray agent's launchd plist XML. Pure (no I/O) and exported so\n * the load-bearing contract is unit-testable without invoking launchctl:\n * the agent execs THIS binary, RunAtLoad brings it back at login, and\n * KeepAlive={SuccessfulExit:false} restarts a crash but not a clean quit.\n */\nexport function trayPlistContents(trayBinary: string): string {\n  // The tray shells out to `/usr/bin/env node …` to run the CLI. launchd\n  // agents start with a bare PATH (/usr/bin:/bin:/usr/sbin:/sbin), so unless\n  // we extend it `node` isn't found and the tray hangs on \"Loading…\". Put the\n  // EXACT node that ran this installer first (process.execPath's dir) — the\n  // same node the daemon agent is pinned to — so it resolves regardless of\n  // where node lives (nvm, keg-only Homebrew, /usr/local). Keep the common\n  // Homebrew/local bins as fallbacks.\n  const nodeDir = dirname(nodeBinary());\n  const trayPath = `${nodeDir}:/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin`;\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>Label</key><string>${TRAY_SERVICE_LABEL}</string>\n  <key>ProgramArguments</key>\n  <array>\n    <string>${trayBinary}</string>\n  </array>\n  <key>RunAtLoad</key><true/>\n  <key>KeepAlive</key>\n  <dict><key>SuccessfulExit</key><false/></dict>\n  <key>ThrottleInterval</key><integer>10</integer>\n  <key>StandardOutPath</key><string>${join(logDir(), \"tray-out.log\")}</string>\n  <key>StandardErrorPath</key><string>${join(logDir(), \"tray-err.log\")}</string>\n  <key>EnvironmentVariables</key>\n  <dict>\n    <key>PATH</key><string>${trayPath}</string>\n  </dict>\n  <key>WorkingDirectory</key><string>${home()}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction writeTrayPlist(trayBinary: string): string {\n  const p = trayPlistPath();\n  mkdirSync(dirname(p), { recursive: true });\n  writeFileSync(p, trayPlistContents(trayBinary), { mode: 0o644 });\n  return p;\n}\n\n/** Kill any running tray process so the launchd agent's own instance\n *  becomes the sole (and supervised) one — e.g. if a copy was launched by\n *  hand from Finder. Matches the full bundle path to avoid unrelated\n *  processes. */\nfunction killStrayTray(): void {\n  spawnSync(\"pkill\", [\"-f\", \"ModelstatTray.app/Contents/MacOS/modelstat-tray\"]);\n}\n\n/**\n * Install the tray's launchd agent so the menu-bar icon starts at login,\n * comes back after a reboot, and is restarted if it crashes — and start it\n * immediately. Best-effort: returns the plist path on success, or null on\n * non-macOS / when no tray binary is installed (callers degrade to the\n * headless daemon path). Mirrors macInstall().\n *\n * We kill any pre-existing tray process first so the agent's own kickstart\n * instance wins the single-instance race and is the one launchd supervises.\n */\nexport function installTrayAutostart(): { path: string } | null {\n  if (platform() !== \"darwin\") return null;\n  const trayBinary = locateTrayExecutable();\n  if (!trayBinary) return null;\n  mkdirSync(logDir(), { recursive: true });\n  const plist = writeTrayPlist(trayBinary);\n  const uid = userInfo().uid;\n  const target = `gui/${uid}/${TRAY_SERVICE_LABEL}`;\n  killStrayTray();\n  // Idempotent: drop any previous instance, then load + start.\n  launchctl([\"bootout\", target]);\n  launchctl([\"bootstrap\", `gui/${uid}`, plist]);\n  launchctl([\"kickstart\", \"-k\", target]);\n  return { path: plist };\n}\n\n/**\n * Remove the tray's launchd agent and stop the tray. Boots the agent out\n * (which stops the supervised instance), deletes the plist, and kills any\n * stray tray process so `npx modelstat remove` actually makes the icon go\n * away. No-op on non-macOS.\n */\nexport function uninstallTrayAutostart(): void {\n  if (platform() !== \"darwin\") return;\n  const uid = userInfo().uid;\n  launchctl([\"bootout\", `gui/${uid}/${TRAY_SERVICE_LABEL}`]);\n  const plist = trayPlistPath();\n  if (existsSync(plist)) {\n    try {\n      unlinkSync(plist);\n    } catch {\n      /* ignore */\n    }\n  }\n  killStrayTray();\n}\n\n/**\n * Remove the installed tray .app bundle from ~/Applications. Called on\n * uninstall so nothing is left behind. No-op on non-macOS or if absent.\n */\nexport function removeTrayApp(): void {\n  if (platform() !== \"darwin\") return;\n  const dest = join(home(), \"Applications\", \"ModelstatTray.app\");\n  if (existsSync(dest)) spawnSync(\"rm\", [\"-rf\", dest]);\n}\n\n/** True if a tray .app is currently installed in ~/Applications. */\nexport function trayInstalled(): boolean {\n  return locateTrayExecutable() !== null;\n}\n\n/**\n * On upgrade, refresh an ALREADY-installed tray to the bundle shipped with\n * THIS package and re-arm its autostart agent, so the NEW tray version ends\n * up running. Called from `_install-service` (the auto-update / npm-update\n * refresh step). Only touches things if a tray was already installed — it\n * won't add a tray to a machine that never had one — and only uses a\n * PREBUILT bundle, so a background upgrade never blocks on a Swift compile.\n * No-op on non-macOS. Best-effort: returns true if it refreshed + re-armed.\n */\nexport function refreshTrayIfInstalled(): boolean {\n  if (platform() !== \"darwin\") return false;\n  if (!trayInstalled()) return false;\n  const src = prebuiltTrayAppPath();\n  if (!src) return false;\n  installTrayApp(src);\n  return installTrayAutostart() !== null;\n}\n\n/** Progress sink for an on-device tray build. `onLine` receives each\n *  complete line of `build-app.sh` / SwiftPM output as it streams, so\n *  the caller can surface granular progress (a cold `swift build` of the\n *  tray is ~1 min and would otherwise look like a frozen terminal). */\nexport interface TrayBuildProgress {\n  onLine?: (line: string) => void;\n}\n\n/**\n * Resolve a built-or-buildable ModelstatTray.app bundled with this CLI\n * package. Strategy (in order):\n *   1. Any pre-built `.app` sitting at the usual candidate paths —\n *      CI publishes one when codesigning is configured. This returns\n *      instantly and never invokes the progress sink.\n *   2. Swift sources shipped in `vendor/tray-mac/` (the default for\n *      the npm tarball); if found and `swift` is on $PATH, we invoke\n *      `build-app.sh` to produce the bundle on the user's machine,\n *      streaming compiler output line-by-line to `progress.onLine`.\n *\n * Async because path (2) is a cold compile that blocks for ~30–60s; we\n * stream it rather than buffering so onboarding shows live progress.\n * Returns null if we can't produce a bundle — callers degrade to the\n * headless launchd path.\n */\n/** The already-built `.app` candidates (no compile): the CI-bundled\n *  vendor copy, then the local dev build output. Returns the first that\n *  exists, or null. Split out so the upgrade refresh can find a prebuilt\n *  bundle WITHOUT ever triggering a `swift build`. */\nfunction prebuiltTrayAppPath(): string | null {\n  const here = dirname(fileURLToPath(import.meta.url));\n  const candidates = [\n    // Pre-built .app — CI with codesigning drops one here.\n    join(here, \"..\", \"vendor\", \"ModelstatTray.app\"),\n    // Local dev layout: apps/daemon/src/service.ts → ../../tray-mac/build/ModelstatTray.app\n    join(here, \"..\", \"..\", \"tray-mac\", \"build\", \"ModelstatTray.app\"),\n  ];\n  for (const c of candidates) {\n    if (existsSync(c)) return c;\n  }\n  return null;\n}\n\nexport async function bundledTrayAppPath(progress?: TrayBuildProgress): Promise<string | null> {\n  if (platform() !== \"darwin\") return null;\n  const prebuilt = prebuiltTrayAppPath();\n  if (prebuilt) return prebuilt;\n  const here = dirname(fileURLToPath(import.meta.url));\n  // Sources path — build locally if we can.\n  const sourceDirs = [join(here, \"..\", \"vendor\", \"tray-mac\"), join(here, \"..\", \"..\", \"tray-mac\")];\n  for (const src of sourceDirs) {\n    const build = join(src, \"build-app.sh\");\n    if (!existsSync(build)) continue;\n    if (!hasSwift()) return null;\n    const code = await runTrayBuild(src, build, progress);\n    if (code === 0) {\n      const app = join(src, \"build\", \"ModelstatTray.app\");\n      if (existsSync(app)) return app;\n    }\n    // Fall through to try the next candidate; failures surface as the\n    // streamed compiler output the caller already printed.\n  }\n  return null;\n}\n\n/**\n * Stateful line-splitter: feed it arbitrary stdout/stderr chunks and it\n * calls `onLine` once per complete line, regardless of how the OS\n * happened to slice the stream into chunks. `flush()` emits any trailing\n * partial line (e.g. a final \"Build complete!\" with no newline).\n * Exported so the streaming contract is unit-tested without spawning swift.\n */\nexport function createLineSplitter(onLine: (line: string) => void): {\n  push: (chunk: string) => void;\n  flush: () => void;\n} {\n  let buf = \"\";\n  return {\n    push(chunk: string): void {\n      buf += chunk;\n      for (;;) {\n        const nl = buf.indexOf(\"\\n\");\n        if (nl === -1) break;\n        const line = buf.slice(0, nl).trimEnd();\n        buf = buf.slice(nl + 1);\n        if (line) onLine(line);\n      }\n    },\n    flush(): void {\n      const line = buf.trim();\n      buf = \"\";\n      if (line) onLine(line);\n    },\n  };\n}\n\n/** Spawn build-app.sh, streaming merged stdout+stderr to `progress.onLine`\n *  line-by-line. Resolves with the child's exit code (null on spawn error). */\nfunction runTrayBuild(\n  cwd: string,\n  buildScript: string,\n  progress?: TrayBuildProgress,\n): Promise<number | null> {\n  return new Promise((resolve) => {\n    const child = spawn(\"bash\", [buildScript], { cwd });\n    const splitter = createLineSplitter((line) => progress?.onLine?.(line));\n    const pump = (chunk: Buffer): void => splitter.push(chunk.toString(\"utf8\"));\n    child.stdout?.on(\"data\", pump);\n    child.stderr?.on(\"data\", pump);\n    child.on(\"error\", () => resolve(null));\n    child.on(\"close\", (code) => {\n      splitter.flush();\n      resolve(code);\n    });\n  });\n}\n\nfunction hasSwift(): boolean {\n  const r = spawnSync(\"swift\", [\"--version\"], { encoding: \"utf8\" });\n  return r.status === 0;\n}\n\nexport function trayStatus(): { installed: boolean; path: string | null } {\n  if (platform() !== \"darwin\") return { installed: false, path: null };\n  const exe = locateTrayExecutable();\n  return exe\n    ? { installed: true, path: exe.replace(/\\/Contents\\/MacOS\\/modelstat-tray$/, \"\") }\n    : { installed: false, path: null };\n}\n","/**\n * Daemon supervision policy — how an external supervisor (the macOS\n * tray, or anything else that keeps `modelstat start` alive) decides\n * what to do about the daemon singleton.\n *\n * Why this exists: the tray used to spawn `modelstat start --force`\n * unconditionally, and --force SIGTERMs whatever live daemon owns the\n * lock (lock.ts). When two tray instances briefly coexist — a\n * `launchctl kickstart -k` racing a reinstall, or KeepAlive respawn\n * overlap — each tray's daemon force-killed the other's in a loop,\n * and the music stopped with ZERO daemons running: a tray killed by\n * launchd never restarts its child, and the surviving tray's child\n * had just been SIGTERMed by the dying tray's last respawn. Observed\n * live 2026-06-12 ~17:26 — the daemon stayed down for over an hour\n * while its tray kept running.\n *\n * The policy here replaces blind --force with a three-way decision,\n * computed from two artifacts the daemon already maintains:\n *   - ~/.modelstat/daemon.lock        — { pid, startedAt, ... }\n *   - ~/.modelstat/last-status.json   — heartbeat mirror, `written_at`\n *                                       refreshed at least every ~10 s\n *\n *   adopt   — a live daemon owns the lock and is heartbeating (or is\n *             too young to judge). Leave it alone. THIS is what breaks\n *             the murder loop: a supervisor whose child was replaced\n *             backs off instead of counter-killing.\n *   spawn   — nobody owns the lock (none, or owner pid is dead).\n *             Plain `modelstat start`; lock.ts already treats a\n *             dead-owner lock as stale, no --force needed.\n *   replace — a live owner exists but hasn't heartbeat for\n *             STATUS_FRESH_MS and isn't a fresh boot: it's wedged.\n *             `modelstat start --force` takes it over.\n *\n * The tray consumes this via `modelstat _daemon-health` (cli.ts),\n * which prints the DaemonHealth JSON; the decision logic lives here,\n * in TypeScript, so it's unit-testable (`node --import tsx --test`)\n * — the Swift side stays a thin \"run command, switch on decision\".\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { isProcessAlive, type LockMeta, readDaemonLock } from \"./lock.js\";\nimport { homePath } from \"./paths.js\";\n\n/** Owner is \"healthy\" while its heartbeat mirror is younger than this.\n * The daemon rewrites last-status.json on every heartbeat (10 s) and\n * on every status change, so 120 s = 12 missed heartbeats — wedged,\n * not busy. (Model load and long summarise passes keep the event loop\n * alive; heartbeats fire throughout.) */\nexport const STATUS_FRESH_MS = 120_000;\n\n/** A lock younger than this is a daemon still booting (node startup,\n * imports, first status write). Adopt it even if the status mirror is\n * stale — the stale file belongs to a previous instance. This is the\n * window that lets a replacement daemon survive the dying supervisor's\n * final respawn check instead of being counter-killed. */\nexport const BOOT_GRACE_MS = 90_000;\n\nexport type SuperviseDecision = \"adopt\" | \"spawn\" | \"replace\";\n\nexport interface DaemonHealth {\n  decision: SuperviseDecision;\n  lock: LockMeta | null;\n  ownerAlive: boolean;\n  /** ms since the lock was written; null when unparseable. */\n  lockAgeMs: number | null;\n  /** ms since last-status.json was written; null when missing/unparseable. */\n  statusAgeMs: number | null;\n}\n\n/** Pure decision over already-gathered facts — the unit-testable core. */\nexport function decideSupervision(input: {\n  lock: LockMeta | null;\n  ownerAlive: boolean;\n  lockAgeMs: number | null;\n  statusAgeMs: number | null;\n  /** The probing CLI's own compiled-in daemon version. When set and the\n   * live owner's lock carries a DIFFERENT version, the owner is\n   * replaced even though it's healthy: after an upgrade re-stages the\n   * bundle, the old-version daemon would otherwise be adopted forever\n   * — it survives launchd's group kill (observed 2026-06-12: a\n   * kickstart left the old daemon running and the new tray adopted\n   * it), heartbeats happily, and never picks up the new code. */\n  myDaemonVersion?: string;\n  statusFreshMs?: number;\n  bootGraceMs?: number;\n}): SuperviseDecision {\n  const fresh = input.statusFreshMs ?? STATUS_FRESH_MS;\n  const grace = input.bootGraceMs ?? BOOT_GRACE_MS;\n  if (!input.lock || !input.ownerAlive) return \"spawn\";\n  if (\n    input.myDaemonVersion &&\n    input.lock.daemonVersion !== \"unknown\" &&\n    input.lock.daemonVersion !== input.myDaemonVersion\n  ) {\n    return \"replace\";\n  }\n  if (input.statusAgeMs !== null && input.statusAgeMs <= fresh) return \"adopt\";\n  // Live owner, stale (or missing) heartbeat. A fresh boot hasn't had\n  // the chance to write one — give it the grace window. An unparseable\n  // lock age counts as NOT young: we can't vouch for it.\n  if (input.lockAgeMs !== null && input.lockAgeMs <= grace) return \"adopt\";\n  return \"replace\";\n}\n\n/** Gather the facts from disk and decide. All inputs injectable for\n * tests; production callers use the defaults. */\nexport function daemonHealth(\n  opts: {\n    lockPath?: string;\n    statusPath?: string;\n    now?: number;\n    pidAlive?: (pid: number) => boolean;\n    /** See decideSupervision.myDaemonVersion. cli.ts passes its\n     * compiled-in DAEMON_VERSION so an upgraded bundle replaces a\n     * still-running old-version daemon. */\n    myDaemonVersion?: string;\n  } = {},\n): DaemonHealth {\n  const now = opts.now ?? Date.now();\n  const pidAlive = opts.pidAlive ?? isProcessAlive;\n  const statusPath = opts.statusPath ?? homePath(\"last-status.json\");\n\n  const lock = opts.lockPath === undefined ? readDaemonLock() : readDaemonLock(opts.lockPath);\n  const ownerAlive = lock !== null && pidAlive(lock.pid);\n  const lockAgeMs = lock ? ageMs(lock.startedAt, now) : null;\n\n  let statusAgeMs: number | null = null;\n  try {\n    const raw = readFileSync(statusPath, \"utf8\");\n    const writtenAt = (JSON.parse(raw) as { written_at?: string }).written_at;\n    statusAgeMs = writtenAt ? ageMs(writtenAt, now) : null;\n  } catch {\n    statusAgeMs = null;\n  }\n\n  return {\n    decision: decideSupervision({\n      lock,\n      ownerAlive,\n      lockAgeMs,\n      statusAgeMs,\n      myDaemonVersion: opts.myDaemonVersion,\n    }),\n    lock,\n    ownerAlive,\n    lockAgeMs,\n    statusAgeMs,\n  };\n}\n\nfunction ageMs(iso: string, now: number): number | null {\n  const t = Date.parse(iso);\n  if (Number.isNaN(t)) return null;\n  return Math.max(0, now - t);\n}\n"],"mappings":"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AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;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AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAA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","names":["status","body","delay","idx","state","stream","request","err","util","request","EventEmitter","resolve","err","util","hostname","session","require_constants","Buffer","Buffer","require_constants","result","module","result","result","keys","require_util","performance","request","isAborted","result","entry","state","result","resolve","util","chunk","result","value","util","exports","delay","request","resolve","pipeline","util","result","request","state","hostname","headers","resolve","util","connect","request","resolve","hostname","err","queue","client","pending","resolve","util","origin","util","pool","result","dispatcher","util","origin","util","result","Buffer","EventEmitter","Buffer","request","status","URL","resolve","socket","origin","protocol","opts","hostname","state","Readable","util","resolve","consume","state","Readable","util","request","resolve","self","util","res","opaque","resolve","Readable","util","body","pipeline","util","resolve","util","resolve","mockDispatch","result","delay","persist","replyParameters","newMockDispatch","promisify","store","result","promisify","persist","result","pending","crypto","writeFile","readFile","mkdir","dirname","resolve","setTimeout","clearTimeout","request","self","request","require_global","util","hostname","state","store","result","util","store","result","EventEmitter","store","key","entries","entry","require_cache","Readable","util","result","isStale","handleResult","headers","store","opts","pipeline","result","state","util","opts","store","util","util","isAborted","status","state","require_request","util","request","window","crypto","result","metadata","isAborted","Readable","pipeline","fetch","request","status","resolve","require_util","require_cache","request","cache","request","cache","require_constants","require_util","require_constants","require_util","randomFillSync","buffer","crypto","request","body","node","queue","result","result","require_util","pipeline","util","fetch","fs","crypto","result","path","relative","join","mkdirSync","readFileSync","renameSync","writeFileSync","existsSync","init_config","loadDotenv","chmodSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","hostname","join","delay","sleep","logger","result","init_config","existsSync","mkdirSync","readFileSync","renameSync","unlinkSync","writeFileSync","join","spawn","spawnSync","mkdirSync","readFileSync","renameSync","writeFileSync","platform","dirname","sourceEventId","batchId","util","objectUtil","status","errorUtil","errorMap","r","result","ctx","status","issues","elements","processed","ZodFirstPartyTypeKind","init_session_metadata","init_session_metadata","existsSync","rmSync","writeFileSync","homedir","dirname","join","resolve","Readable","rename","scriptSummarizer","init_session_metadata","status","resolve","loadPromise","mkdirSync","readFileSync","renameSync","writeFileSync","homedir","dirname","join","init_types","dirname","resolve","existsSync","cache","execFile","promisify","pexec","execFile","promisify","pexec","createHash","sourceEventId","createHash","existsSync","dirname","join","cached","init_types","createReadStream","createInterface","open","init_types","initSqlJs","H","fs","readFileSync","initSqlJs","result","createReadStream","createInterface","extractExcerpt","collectRefText","excerpt","refs","init_types","execFile","existsSync","homedir","platform","join","resolve","promisify","pexec","fs","init_src","init_types","readFileSync","mkdir","delay","sleep","import_undici","init_config","init_ids","init_ids","adapters","prev","init_session_metadata","importModule","cached","loadPromise","loadFailedPermanently","loadAttempts","warnedUnavailable","warnedInferenceError","loadPipeline","cache","init_src","buildSessionMetadata","buildSessionTitles","existsSync","redact","init_pipeline","init_src","init_config","homedir","resolve","home","logger","init_pipeline","init_src","init_ids","basename","init_src","stat","homedir","join","DAEMON_VERSION","buildSessionTitles","buildSessionMetadata","init_src","init_config","init_pipeline","stat","requestScan","cache","fs","init_config","state","cached","init_types","init_src","init_types","mkdir","rename","writeFile","homedir","join","writeAtomic","init_node","store","init_policies","init_src","init_node","stat","readdir","basename","stat","lstat","main","rawEmitter","listener","basename","dirname","newStats","closer","resolve","realpath","stats","stat","readdir","sysPath","relative","DOUBLE_SLASH_RE","testString","init_esm","path","stats","now","spawn","createHash","existsSync","statSync","DAEMON_VERSION","homedir","join","open","stat","writeFile","mkdir","rename","modelstatHome","basename","disposeLlama","preflightSummariser","reconcileProcessingVersion","createPolicyRefresher","platform","home","init_src","init_config","existsSync","homedir","platform","join","home","init_esm","init_config","spawn","platform","createInterface","init_config","spawnSync","chmodSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","platform","dirname","join","fileURLToPath","platform","existsSync","join","mkdirSync","dirname","spawnSync","chmodSync","writeFileSync","here","fileURLToPath","resolve","readFileSync","createInterface","resolve","validateSummarizerUrl","platform","spawn","DAEMON_VERSION","ensureLlamaModel","defaultLlamaConfig","installStatusline","claudeSettingsPath","discover","runDaemon","postControlScan","preflightSummariser","scanSession","refreshSessionInsights","disposeLlama","PROCESSING_VERSION","watchForever","removeStatusline","readFile","homePath","queue","mode","runStatusline"]}