{"version":3,"sources":["../src/behavioral/analysis.ts","../src/behavioral/scoring.ts","../src/behavioral/index.ts","../src/automation.ts","../src/webgpu.ts","../src/checks.ts","../src/asyncChecks.ts","../src/userAgent.ts","../src/detectInstantClient.ts","../src/server/timezone.ts","../src/server/tls.ts","../src/server/analysis.ts","../src/server/geoip.ts","../src/server/ipLists.ts","../src/server/enrich.ts","../src/server/scoring.ts","../src/version.ts"],"names":["process","platformContradictsUserAgent","DEFAULT_SCORE_THRESHOLD","createSignal","lookup","tail","groups","path","fileURLToPath","fs"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  BehavioralSamples,\n  BehavioralSignal,\n  ClickSample,\n  ConfidenceLevel,\n  KeySample,\n  MouseSample,\n  ScrollSample,\n  TouchSample,\n} from \"./types.js\";\n\n/**\n * Behavioral heuristic tuning constants.\n *\n * These thresholds are empirical and chosen to balance detection of obvious\n * automation against common false positives (touch devices, high-DPI mice,\n * human variance, window re-entry, OS key repeat, etc.).\n *\n * They are intentionally not exposed as runtime options for the main API to\n * keep the surface small and the behavior predictable. Power users can copy\n * the analysis functions if they need to tune.\n */\n\n/** How far back a mouse move or touch still explains a click */\nconst CLICK_ORIGIN_WINDOW_MS = 2_000;\n\n/** Cursor jumps only count as teleports when they happen quickly — a large\n * gap means the pointer likely left and re-entered the window. */\nconst TELEPORT_MAX_ELAPSED_MS = 100;\n\n/** Very fast teleport (implausible human reaction + distance). */\nconst TELEPORT_FAST_ELAPSED_MS = 20;\nconst TELEPORT_FAST_DISTANCE_PX = 200;\nconst TELEPORT_ANY_DISTANCE_PX = 600;\n\n// Linearity is checked over every sliding sub-window as well as the whole\n// trace, so a scripted burst can't hide inside replayed human noise by sitting\n// at an off-grid offset.\nconst MOUSE_LINEAR_WINDOW = 14;\nconst SCROLL_LINEAR_WINDOW = 8;\n\n/** Minimum samples required before we consider a trace for linearity. */\nconst MIN_MOUSE_FOR_LINEAR = 6;\nconst MIN_TOUCH_MOVES_FOR_LINEAR = 6;\nconst MIN_TAPS_FOR_LINEAR = 5;\nconst MIN_MOUSE_FOR_ZERO_DELTAS = 51;\nconst MIN_SCROLL_FOR_LINEAR = 4;\nconst MIN_KEYS_FOR_LINEAR = 5;\n\n/** Coefficient of variation cutoffs for \"too uniform\". Lower = more robotic. */\nconst MOUSE_CV_SPEED_MAX = 0.08;\nconst SCROLL_CV_DELTA_MAX = 0.1;\nconst SCROLL_CV_INTERVAL_MAX = 0.12;\nconst TYPING_CV_INTERVAL_MAX = 0.08;\n\n/** Max perpendicular deviation (pixels) allowed for a \"straight\" mouse line. */\nconst MOUSE_MAX_LINE_DEVIATION = 4;\n\n/** Typing faster than this average interval (ms) is considered superhuman. */\nconst TYPING_SUPERHUMAN_INTERVAL_MS = 25;\n\n/** Tap rhythm cutoffs, mirroring the typing ones — a finger is no steadier. */\nconst TAP_CV_INTERVAL_MAX = 0.08;\nconst TAP_SUPERHUMAN_INTERVAL_MS = 25;\n\n/**\n * Returns true if the whole trace, or any contiguous `window`-length slice of\n * it, satisfies `isLinear`. Sliding by one guarantees a linear run of at least\n * `window` samples is caught regardless of where it starts.\n */\nfunction anyLinearWindow<T>(\n  samples: T[],\n  window: number,\n  isLinear: (segment: T[]) => boolean,\n): boolean {\n  if (samples.length <= window) {\n    return isLinear(samples);\n  }\n\n  for (let start = 0; start + window <= samples.length; start += 1) {\n    if (isLinear(samples.slice(start, start + window))) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction mean(values: number[]): number {\n  return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction coefficientOfVariation(values: number[]): number {\n  const average = mean(values);\n  if (average === 0) {\n    return 0;\n  }\n\n  const variance =\n    values.reduce((sum, value) => sum + (value - average) ** 2, 0) /\n    values.length;\n\n  return Math.sqrt(variance) / Math.abs(average);\n}\n\n/** Anything with a position and a timestamp — a mouse move or a touch move. */\ninterface PointSample {\n  x: number;\n  y: number;\n  t: number;\n}\n\nfunction maxLineDeviation(points: PointSample[]): number {\n  const start = points[0];\n  const end = points[points.length - 1];\n  const lineLength = Math.hypot(end.x - start.x, end.y - start.y);\n\n  if (lineLength === 0) {\n    return 0;\n  }\n\n  let maxDeviation = 0;\n\n  for (const point of points) {\n    const area = Math.abs(\n      (end.x - start.x) * (start.y - point.y) -\n        (start.x - point.x) * (end.y - start.y),\n    );\n    maxDeviation = Math.max(maxDeviation, area / lineLength);\n  }\n\n  return maxDeviation;\n}\n\nfunction createSignal(\n  id: string,\n  description: string,\n  triggered: boolean,\n  weight: number,\n  confidence: ConfidenceLevel,\n): BehavioralSignal {\n  return {\n    id,\n    description,\n    triggered,\n    weight,\n    confidence,\n    score: triggered ? weight : 0,\n  };\n}\n\nfunction isLinearPointerSegment(points: PointSample[]): boolean {\n  const speeds: number[] = [];\n\n  for (let index = 1; index < points.length; index += 1) {\n    const previous = points[index - 1];\n    const current = points[index];\n    const elapsed = current.t - previous.t;\n\n    if (elapsed <= 0) {\n      continue;\n    }\n\n    speeds.push(\n      Math.hypot(current.x - previous.x, current.y - previous.y) / elapsed,\n    );\n  }\n\n  if (speeds.length < 5) {\n    return false;\n  }\n\n  return coefficientOfVariation(speeds) < MOUSE_CV_SPEED_MAX && maxLineDeviation(points) < MOUSE_MAX_LINE_DEVIATION;\n}\n\n/**\n * Mouse path is a near-perfect line traversed at near-constant speed.\n * @internal\n */\nexport function hasLinearMouseMovement(mouseMoves: MouseSample[]): boolean {\n  if (mouseMoves.length < MIN_MOUSE_FOR_LINEAR) {\n    return false;\n  }\n\n  return anyLinearWindow(mouseMoves, MOUSE_LINEAR_WINDOW, isLinearPointerSegment);\n}\n\n/** More than 50 mouse events all report zero browser-provided movement deltas. */\nexport function hasZeroMouseMovementDeltas(mouseMoves: MouseSample[]): boolean {\n  return mouseMoves.length >= MIN_MOUSE_FOR_ZERO_DELTAS &&\n    mouseMoves.every(\n      (event) => event.movementX === 0 && event.movementY === 0,\n    );\n}\n\n/**\n * Cursor covered an implausible distance between closely-spaced events.\n * @internal\n */\nfunction hasTeleport(points: PointSample[]): boolean {\n  for (let index = 1; index < points.length; index += 1) {\n    const previous = points[index - 1];\n    const current = points[index];\n    const elapsed = current.t - previous.t;\n\n    if (elapsed > TELEPORT_MAX_ELAPSED_MS) {\n      continue;\n    }\n\n    const distance = Math.hypot(current.x - previous.x, current.y - previous.y);\n\n    if (elapsed <= TELEPORT_FAST_ELAPSED_MS && distance > TELEPORT_FAST_DISTANCE_PX) {\n      return true;\n    }\n\n    if (distance > TELEPORT_ANY_DISTANCE_PX) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function hasTeleportMouse(mouseMoves: MouseSample[]): boolean {\n  return hasTeleport(mouseMoves);\n}\n\n/**\n * Trusted clicks with `detail === 0` come from keyboard activation\n * (Enter/Space on a control) — not from a pointer. Untrusted clicks never\n * get this exemption: synthetic events also default to `detail: 0`.\n */\nfunction isPointerClick(click: ClickSample): boolean {\n  return !(click.isTrusted && click.detail === 0);\n}\n\ninterface InputCoordinateSample {\n  pageX?: number;\n  pageY?: number;\n  screenX?: number;\n  screenY?: number;\n  isFullscreen?: boolean;\n  isTrusted: boolean;\n}\n\nfunction hasLeakedInputCoordinates(sample: InputCoordinateSample): boolean {\n  return (\n    sample.isTrusted &&\n    sample.isFullscreen === false &&\n    typeof sample.pageX === \"number\" &&\n    typeof sample.pageY === \"number\" &&\n    typeof sample.screenX === \"number\" &&\n    typeof sample.screenY === \"number\" &&\n    sample.pageX === sample.screenX &&\n    sample.pageY === sample.screenY\n  );\n}\n\n/**\n * Repeated trusted pointer events expose CDP Input's page/screen coordinate\n * equality. Fullscreen and keyboard-activated clicks are excluded.\n * @internal\n */\nexport function hasCdpInputCoordinateLeak(\n  mouseMoves: MouseSample[],\n  clicks: ClickSample[],\n): boolean {\n  const leaked = [\n    ...mouseMoves,\n    ...clicks.filter(isPointerClick),\n  ].filter(hasLeakedInputCoordinates);\n  const distinctPositions = new Set(\n    leaked.map((sample) => `${sample.pageX},${sample.pageY}`),\n  );\n  return distinctPositions.size >= 2;\n}\n\nfunction hasRecentSample(\n  samples: Array<{ t: number }>,\n  at: number,\n  windowMs: number,\n): boolean {\n  return samples.some((sample) => sample.t >= at - windowMs && sample.t <= at);\n}\n\n/**\n * A pointer click landed with no mouse or touch activity in the preceding 2s.\n * @internal\n */\nexport function hasClickWithoutMouseMovement(\n  mouseMoves: MouseSample[],\n  clicks: ClickSample[],\n  touches: TouchSample[] = [],\n): boolean {\n  return clicks.some(\n    (click) =>\n      isPointerClick(click) &&\n      !hasRecentSample(mouseMoves, click.t, CLICK_ORIGIN_WINDOW_MS) &&\n      !hasRecentSample(touches, click.t, CLICK_ORIGIN_WINDOW_MS),\n  );\n}\n\n/**\n * Pointer clicks were recorded in a session with zero mouse or touch events.\n * @internal\n */\nexport function hasNoMouseActivity(\n  mouseMoves: MouseSample[],\n  clicks: ClickSample[],\n  touches: TouchSample[] = [],\n): boolean {\n  return (\n    clicks.some(isPointerClick) &&\n    mouseMoves.length === 0 &&\n    touches.length === 0\n  );\n}\n\nfunction isLinearScrollSegment(scrollEvents: ScrollSample[]): boolean {\n  const deltas = scrollEvents.map((event) => Math.abs(event.deltaY));\n  const intervals: number[] = [];\n\n  for (let index = 1; index < scrollEvents.length; index += 1) {\n    intervals.push(scrollEvents[index].t - scrollEvents[index - 1].t);\n  }\n\n  return (\n    coefficientOfVariation(deltas) < SCROLL_CV_DELTA_MAX &&\n    coefficientOfVariation(intervals) < SCROLL_CV_INTERVAL_MAX\n  );\n}\n\n/**\n * Scroll deltas and inter-event timing are too uniform to be a human hand.\n * @internal\n */\nexport function hasLinearScroll(scrollEvents: ScrollSample[]): boolean {\n  if (scrollEvents.length < MIN_SCROLL_FOR_LINEAR) {\n    return false;\n  }\n\n  return anyLinearWindow(scrollEvents, SCROLL_LINEAR_WINDOW, isLinearScrollSegment);\n}\n\n/**\n * Keystroke rhythm is metronome-uniform or faster than humanly possible.\n * @internal\n */\nexport function hasLinearTyping(keyPresses: KeySample[]): boolean {\n  // OS key auto-repeat is perfectly uniform and fast — only analyze\n  // deliberate keystrokes.\n  const deliberate = keyPresses.filter((key) => !key.repeat);\n\n  if (deliberate.length < MIN_KEYS_FOR_LINEAR) {\n    return false;\n  }\n\n  const intervals: number[] = [];\n\n  for (let index = 1; index < deliberate.length; index += 1) {\n    intervals.push(deliberate[index].t - deliberate[index - 1].t);\n  }\n\n  const intervalUniformity = coefficientOfVariation(intervals);\n  const averageInterval = mean(intervals);\n\n  return intervalUniformity < TYPING_CV_INTERVAL_MAX || averageInterval < TYPING_SUPERHUMAN_INTERVAL_MS;\n}\n\n/** Samples without `kind` predate gesture analysis and were all contacts. */\nfunction isTouchContact(touch: TouchSample): boolean {\n  return touch.kind !== \"move\";\n}\n\nfunction isLocatedTouch(\n  touch: TouchSample,\n): touch is TouchSample & PointSample {\n  return typeof touch.x === \"number\" && typeof touch.y === \"number\";\n}\n\n/**\n * Splits a touch stream into individual gestures. Each new contact starts a\n * fresh one, so a finger lifting and landing elsewhere — or a second finger\n * joining — never reads as one continuous path.\n */\nfunction splitTouchGestures(touches: TouchSample[]): PointSample[][] {\n  const gestures: PointSample[][] = [];\n  let current: PointSample[] = [];\n\n  for (const touch of touches) {\n    if (isTouchContact(touch)) {\n      if (current.length > 0) {\n        gestures.push(current);\n      }\n      current = [];\n    }\n    if (isLocatedTouch(touch)) {\n      current.push(touch);\n    }\n  }\n\n  if (current.length > 0) {\n    gestures.push(current);\n  }\n\n  return gestures;\n}\n\n/**\n * A swipe traced a near-perfect line at near-constant speed. Real fingers\n * arc and vary; a dispatched touch sequence interpolates.\n * @internal\n */\nexport function hasLinearTouchMovement(touches: TouchSample[] = []): boolean {\n  return splitTouchGestures(touches).some(\n    (gesture) =>\n      gesture.length >= MIN_TOUCH_MOVES_FOR_LINEAR &&\n      anyLinearWindow(gesture, MOUSE_LINEAR_WINDOW, isLinearPointerSegment),\n  );\n}\n\n/**\n * A contact point jumped an implausible distance mid-gesture.\n * @internal\n */\nexport function hasTeleportTouch(touches: TouchSample[] = []): boolean {\n  return splitTouchGestures(touches).some(hasTeleport);\n}\n\n/**\n * Taps land on a metronome, or faster than a finger can lift and fall.\n * @internal\n */\nexport function hasLinearTapRhythm(touches: TouchSample[] = []): boolean {\n  const contacts = touches.filter(isTouchContact);\n\n  if (contacts.length < MIN_TAPS_FOR_LINEAR) {\n    return false;\n  }\n\n  const intervals: number[] = [];\n  for (let index = 1; index < contacts.length; index += 1) {\n    intervals.push(contacts[index].t - contacts[index - 1].t);\n  }\n\n  return (\n    coefficientOfVariation(intervals) < TAP_CV_INTERVAL_MAX ||\n    mean(intervals) < TAP_SUPERHUMAN_INTERVAL_MS\n  );\n}\n\n/**\n * Any observed event was script-dispatched (`isTrusted === false`).\n * @internal\n */\nexport function hasSyntheticEvents(samples: BehavioralSamples): boolean {\n  const events = [\n    ...samples.mouseMoves,\n    ...samples.scrolls,\n    ...samples.keyPresses,\n    ...samples.clicks,\n    ...(samples.touches ?? []),\n  ];\n\n  return events.some((event) => !event.isTrusted);\n}\n\n/**\n * Evaluates every behavioral heuristic and returns the weighted signal list.\n * @internal\n */\nexport function buildBehavioralSignals(samples: BehavioralSamples): BehavioralSignal[] {\n  const touches = samples.touches ?? [];\n\n  return [\n    createSignal(\n      \"no-mouse-activity\",\n      \"Clicks were recorded without any mouse or touch activity\",\n      hasNoMouseActivity(samples.mouseMoves, samples.clicks, touches),\n      0.2,\n      \"low\",\n    ),\n    createSignal(\n      \"click-without-mouse-movement\",\n      \"At least one click had no recent mouse or touch activity\",\n      hasClickWithoutMouseMovement(samples.mouseMoves, samples.clicks, touches),\n      0.35,\n      \"high\",\n    ),\n    createSignal(\n      \"linear-mouse-movement\",\n      \"Mouse path is unusually straight with uniform speed\",\n      hasLinearMouseMovement(samples.mouseMoves),\n      0.25,\n      \"medium\",\n    ),\n    createSignal(\n      \"zero-mouse-movement-deltas\",\n      \"More than 50 mouse events all reported zero movement deltas\",\n      hasZeroMouseMovementDeltas(samples.mouseMoves),\n      0.3,\n      \"medium\",\n    ),\n    createSignal(\n      \"cdp-input-coordinate-leak\",\n      \"Repeated trusted pointer events exposed identical page and screen coordinates\",\n      hasCdpInputCoordinateLeak(samples.mouseMoves, samples.clicks),\n      0.2,\n      \"low\",\n    ),\n    createSignal(\n      \"teleport-mouse\",\n      \"Mouse position jumped implausibly between events\",\n      hasTeleportMouse(samples.mouseMoves),\n      0.4,\n      \"high\",\n    ),\n    createSignal(\n      \"linear-touch-movement\",\n      \"Swipe path is unusually straight with uniform speed\",\n      hasLinearTouchMovement(touches),\n      0.25,\n      \"medium\",\n    ),\n    createSignal(\n      \"teleport-touch\",\n      \"Touch point jumped implausibly mid-gesture\",\n      hasTeleportTouch(touches),\n      0.4,\n      \"high\",\n    ),\n    createSignal(\n      \"linear-tap-rhythm\",\n      \"Tap intervals are robotic or superhuman\",\n      hasLinearTapRhythm(touches),\n      0.3,\n      \"medium\",\n    ),\n    createSignal(\n      \"linear-scroll\",\n      \"Scroll deltas and timing are overly uniform\",\n      hasLinearScroll(samples.scrolls),\n      0.3,\n      \"medium\",\n    ),\n    createSignal(\n      \"linear-typing\",\n      \"Typing intervals are robotic or superhuman\",\n      hasLinearTyping(samples.keyPresses),\n      0.35,\n      \"high\",\n    ),\n    createSignal(\n      \"synthetic-events\",\n      \"Observed pointer or keyboard events were not trusted\",\n      hasSyntheticEvents(samples),\n      0.5,\n      \"high\",\n    ),\n  ];\n}\n","import { buildBehavioralSignals } from \"./analysis.js\";\nimport type {\n  BehavioralClientResult,\n  BehavioralSampleCounts,\n  BehavioralSamples,\n  BehavioralSignal,\n  ConfidenceLevel,\n} from \"./types.js\";\n\n/**\n * Combines triggered signal weights into one score:\n * `1 - Π(1 - weightᵢ)` — independent-probability union, so extra signals\n * always raise the score but never past 1.\n * @internal\n */\nexport function aggregateSuspicionScore(signals: BehavioralSignal[]): number {\n  const triggered = signals.filter((signal) => signal.triggered);\n\n  if (triggered.length === 0) {\n    return 0;\n  }\n\n  let score = 1;\n\n  for (const signal of triggered) {\n    score *= 1 - signal.weight;\n  }\n\n  return 1 - score;\n}\n\n/**\n * Confidence in the verdict based on sample volume and high-confidence signal hits.\n * @internal\n */\nexport function resolveConfidence(\n  signals: BehavioralSignal[],\n  sampleCounts: BehavioralSampleCounts,\n  suspicionScore: number,\n): ConfidenceLevel {\n  const totalSamples =\n    sampleCounts.mouseMoves +\n    sampleCounts.scrolls +\n    sampleCounts.keyPresses +\n    sampleCounts.clicks +\n    sampleCounts.touches;\n  const triggeredHigh = signals.filter(\n    (signal) => signal.triggered && signal.confidence === \"high\",\n  ).length;\n\n  if (totalSamples < 5) {\n    return \"low\";\n  }\n\n  if (triggeredHigh >= 2 || suspicionScore >= 0.75) {\n    return \"high\";\n  }\n\n  if (suspicionScore >= 0.4 || totalSamples >= 20) {\n    return \"medium\";\n  }\n\n  return \"low\";\n}\n\n/**\n * Counts how many events in the samples were not trusted (script-generated).\n * @internal\n */\nexport function countSyntheticEvents(samples: BehavioralSamples): number {\n  return [\n    ...samples.mouseMoves,\n    ...samples.scrolls,\n    ...samples.keyPresses,\n    ...samples.clicks,\n    ...(samples.touches ?? []),\n  ].filter((event) => !event.isTrusted).length;\n}\n\n/**\n * Scores a set of recorded interaction samples without running a detector —\n * useful for analyzing samples collected elsewhere (e.g. beaconed to a server).\n */\nexport function analyzeBehavioralSamples(\n  samples: BehavioralSamples,\n  scoreThreshold = 0.55,\n): BehavioralClientResult {\n  const signals = buildBehavioralSignals(samples);\n  const suspicionScore = aggregateSuspicionScore(signals);\n  const sampleCounts: BehavioralSampleCounts = {\n    mouseMoves: samples.mouseMoves.length,\n    scrolls: samples.scrolls.length,\n    keyPresses: samples.keyPresses.length,\n    clicks: samples.clicks.length,\n    touches: samples.touches?.length ?? 0,\n    syntheticEvents: countSyntheticEvents(samples),\n  };\n  const confidence = resolveConfidence(signals, sampleCounts, suspicionScore);\n\n  return {\n    suspicionScore,\n    confidence,\n    signals,\n    sampleCounts,\n    observationMs: samples.observationMs,\n    isLegitClient: suspicionScore < scoreThreshold,\n  };\n}\n","import { analyzeBehavioralSamples } from \"./scoring.js\";\nimport type {\n  BehavioralClientDetector,\n  BehavioralClientResult,\n  BehavioralDetectorOptions,\n  BehavioralSamples,\n  ClickSample,\n  ExtendedWindow,\n  KeySample,\n  MouseSample,\n  ScrollSample,\n  TouchSample,\n} from \"./types.js\";\n\nconst DEFAULT_MIN_OBSERVATION_MS = 3_000;\nconst DEFAULT_SCORE_THRESHOLD = 0.55;\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_SAMPLE_WINDOW_MS = 60_000;\n\ntype Listener = {\n  target: EventTarget;\n  type: string;\n  handler: EventListener;\n};\n\n/** Drops samples older than `cutoff` from the front of a time-ordered stream. */\nfunction pruneStream(stream: Array<{ t: number }>, cutoff: number): void {\n  let firstFresh = 0;\n  while (firstFresh < stream.length && stream[firstFresh].t < cutoff) {\n    firstFresh += 1;\n  }\n  if (firstFresh > 0) {\n    stream.splice(0, firstFresh);\n  }\n}\n\nfunction createEmptySamples(observationMs = 0): Required<BehavioralSamples> {\n  return {\n    mouseMoves: [],\n    scrolls: [],\n    keyPresses: [],\n    clicks: [],\n    touches: [],\n    observationMs,\n  };\n}\n\n/**\n * Creates a detector that observes mouse, wheel, keyboard, click, and touch\n * events on `options.context` (defaults to `globalThis`) and scores how\n * robotic the interaction looks.\n *\n * Call `observe(ms)` for a one-shot observation, or `start()`/`stop()` +\n * `getResult()` to manage the window yourself. Pass `onUpdate` to receive\n * periodic results while observing.\n *\n * @example\n * const result = await createBehavioralClientDetector({ context: window }).observe(10_000);\n * if (!result.isLegitClient) challenge();\n */\nexport function createBehavioralClientDetector(\n  options: BehavioralDetectorOptions = {},\n): BehavioralClientDetector {\n  const context = options.context ?? (globalThis as unknown as ExtendedWindow);\n  const minObservationMs = options.minObservationMs ?? DEFAULT_MIN_OBSERVATION_MS;\n  const scoreThreshold = options.scoreThreshold ?? DEFAULT_SCORE_THRESHOLD;\n  const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n  const sampleWindowMs = options.sampleWindowMs ?? DEFAULT_SAMPLE_WINDOW_MS;\n\n  let samples = createEmptySamples();\n  let startedAt: number | undefined;\n  let listeners: Listener[] = [];\n  let pollTimer: ReturnType<typeof setInterval> | undefined;\n  let isActive = false;\n  let observeTimer: ReturnType<typeof setTimeout> | undefined;\n  let observeResolve: ((result: BehavioralClientResult) => void) | undefined;\n\n  const pruneRetainedSamples = (now = Date.now()): void => {\n    if (!Number.isFinite(sampleWindowMs)) {\n      return;\n    }\n\n    const cutoff = now - sampleWindowMs;\n    pruneStream(samples.mouseMoves, cutoff);\n    pruneStream(samples.scrolls, cutoff);\n    pruneStream(samples.keyPresses, cutoff);\n    pruneStream(samples.clicks, cutoff);\n    pruneStream(samples.touches, cutoff);\n  };\n\n  const record = <T extends { t: number }>(stream: T[], sample: T): void => {\n    stream.push(sample);\n    pruneRetainedSamples(sample.t);\n  };\n\n  const getObservationMs = (): number => {\n    if (startedAt === undefined) {\n      return samples.observationMs;\n    }\n\n    return samples.observationMs + (Date.now() - startedAt);\n  };\n\n  const evaluate = (): BehavioralClientResult => {\n    if (isActive) {\n      pruneRetainedSamples();\n    }\n\n    return analyzeBehavioralSamples(\n      {\n        ...samples,\n        observationMs: getObservationMs(),\n      },\n      scoreThreshold,\n    );\n  };\n\n  const addListener = (\n    target: EventTarget,\n    type: string,\n    handler: EventListener,\n  ): void => {\n    target.addEventListener(type, handler, { passive: true });\n    listeners.push({ target, type, handler });\n  };\n\n  const onMouseMove = (event: Event): void => {\n    const mouseEvent = event as MouseEvent;\n    record<MouseSample>(samples.mouseMoves, {\n      x: mouseEvent.clientX,\n      y: mouseEvent.clientY,\n      movementX: mouseEvent.movementX,\n      movementY: mouseEvent.movementY,\n      pageX: mouseEvent.pageX,\n      pageY: mouseEvent.pageY,\n      screenX: mouseEvent.screenX,\n      screenY: mouseEvent.screenY,\n      isFullscreen: context.outerHeight - context.innerHeight <= 1,\n      t: Date.now(),\n      isTrusted: mouseEvent.isTrusted,\n    });\n  };\n\n  const onWheel = (event: Event): void => {\n    const wheelEvent = event as WheelEvent;\n    record<ScrollSample>(samples.scrolls, {\n      deltaY: wheelEvent.deltaY,\n      t: Date.now(),\n      isTrusted: wheelEvent.isTrusted,\n    });\n  };\n\n  const onKeyDown = (event: Event): void => {\n    const keyboardEvent = event as KeyboardEvent;\n    record<KeySample>(samples.keyPresses, {\n      t: Date.now(),\n      isTrusted: keyboardEvent.isTrusted,\n      repeat: keyboardEvent.repeat,\n    });\n  };\n\n  const onClick = (event: Event): void => {\n    const mouseEvent = event as MouseEvent;\n    record<ClickSample>(samples.clicks, {\n      x: mouseEvent.clientX,\n      y: mouseEvent.clientY,\n      t: Date.now(),\n      isTrusted: mouseEvent.isTrusted,\n      detail: mouseEvent.detail,\n      pageX: mouseEvent.pageX,\n      pageY: mouseEvent.pageY,\n      screenX: mouseEvent.screenX,\n      screenY: mouseEvent.screenY,\n      isFullscreen: context.outerHeight - context.innerHeight <= 1,\n    });\n  };\n\n  /**\n   * Every touch is recorded, so tap-driven clicks stay exempt and untrusted\n   * events still count as synthetic. Coordinates are attached only for\n   * single-finger activity: pinch and rotate interleave contacts from several\n   * fingers, which would read as one point jumping between them. Samples\n   * without coordinates are skipped by the gesture heuristics.\n   */\n  const recordTouch = (event: Event, kind: \"start\" | \"move\"): void => {\n    const touchEvent = event as TouchEvent;\n    const point =\n      touchEvent.touches?.length === 1\n        ? touchEvent.changedTouches?.[0]\n        : undefined;\n    record<TouchSample>(samples.touches, {\n      t: Date.now(),\n      isTrusted: touchEvent.isTrusted,\n      kind,\n      ...(point ? { x: point.clientX, y: point.clientY } : {}),\n    });\n  };\n\n  const onTouchStart = (event: Event): void => {\n    recordTouch(event, \"start\");\n  };\n\n  const onTouchMove = (event: Event): void => {\n    recordTouch(event, \"move\");\n  };\n\n  const start = (): void => {\n    if (isActive) {\n      return;\n    }\n\n    isActive = true;\n    startedAt = Date.now();\n    addListener(context, \"mousemove\", onMouseMove);\n    addListener(context, \"wheel\", onWheel);\n    addListener(context, \"keydown\", onKeyDown);\n    addListener(context, \"click\", onClick);\n    addListener(context, \"touchstart\", onTouchStart);\n    addListener(context, \"touchmove\", onTouchMove);\n\n    if (options.onUpdate) {\n      pollTimer = setInterval(() => {\n        options.onUpdate?.(evaluate());\n      }, pollIntervalMs);\n    }\n  };\n\n  const settleObservation = (): void => {\n    if (!observeResolve) {\n      return;\n    }\n\n    const resolve = observeResolve;\n    observeResolve = undefined;\n\n    if (observeTimer !== undefined) {\n      clearTimeout(observeTimer);\n      observeTimer = undefined;\n    }\n\n    resolve(evaluate());\n  };\n\n  const stop = (): void => {\n    if (!isActive) {\n      return;\n    }\n\n    pruneRetainedSamples();\n    isActive = false;\n    samples.observationMs = getObservationMs();\n    startedAt = undefined;\n\n    for (const listener of listeners) {\n      listener.target.removeEventListener(listener.type, listener.handler);\n    }\n\n    listeners = [];\n\n    if (pollTimer) {\n      clearInterval(pollTimer);\n      pollTimer = undefined;\n    }\n\n    settleObservation();\n  };\n\n  const reset = (): void => {\n    stop();\n    samples = createEmptySamples();\n    startedAt = undefined;\n  };\n\n  const getResult = (): BehavioralClientResult => evaluate();\n\n  const observe = (\n    durationMs = minObservationMs,\n  ): Promise<BehavioralClientResult> => {\n    if (observeResolve) {\n      return Promise.reject(\n        new Error(\n          \"createBehavioralClientDetector: an observation is already in progress\",\n        ),\n      );\n    }\n\n    start();\n\n    return new Promise<BehavioralClientResult>((resolve) => {\n      observeResolve = resolve;\n      observeTimer = setTimeout(stop, durationMs);\n    });\n  };\n\n  return {\n    start,\n    stop,\n    reset,\n    getResult,\n    observe,\n  };\n}\n\nexport {\n  aggregateSuspicionScore,\n  analyzeBehavioralSamples,\n  resolveConfidence,\n} from \"./scoring.js\";\nexport {\n  buildBehavioralSignals,\n  hasCdpInputCoordinateLeak,\n  hasClickWithoutMouseMovement,\n  hasLinearMouseMovement,\n  hasLinearScroll,\n  hasLinearTapRhythm,\n  hasLinearTouchMovement,\n  hasLinearTyping,\n  hasNoMouseActivity,\n  hasSyntheticEvents,\n  hasTeleportMouse,\n  hasTeleportTouch,\n  hasZeroMouseMovementDeltas,\n} from \"./analysis.js\";\n","export type AutomationConfidence = \"high\" | \"medium\" | \"low\";\n\nexport type AutomationKind =\n  | \"unknown\"\n  | \"browser-automation\"\n  | \"playwright\"\n  | \"patchright\"\n  | \"puppeteer\"\n  | \"selenium\"\n  | \"phantomjs\"\n  | \"nightmare\"\n  | \"curl\"\n  | \"python\"\n  | \"go\"\n  | \"java\";\n\n/** Best-effort attribution. Stealth tools can only be identified probabilistically. */\nexport interface AutomationAssessment {\n  /** Whether automation evidence was found; independent of enforcement threshold. */\n  isAutomated: boolean;\n  /** Most likely supported family, or `unknown` for unattributed/unsupported identities. */\n  kind: AutomationKind;\n  confidence: AutomationConfidence;\n  /** Human-readable facts used for attribution (not every scoring signal). */\n  evidence: string[];\n  /** Other plausible families when the available fingerprints overlap. */\n  alternatives: AutomationKind[];\n}\n\nexport function createAutomationAssessment(\n  isAutomated: boolean,\n  kind: AutomationKind,\n  confidence: AutomationConfidence,\n  evidence: string[],\n  alternatives: AutomationKind[] = [],\n): AutomationAssessment {\n  return { isAutomated, kind, confidence, evidence, alternatives };\n}\n","import type { ExtendedWindow } from \"./types.js\";\n\n/** Chrome, Edge, and other Chromium-based browsers */\nexport function isChromiumBrowser(context: ExtendedWindow): boolean {\n  const userAgent = context.navigator.userAgent;\n  return userAgent.includes(\"Chrome/\") || userAgent.includes(\"Edg/\");\n}\n\n/**\n * Checks WebGPU `shader-f16` support on Chromium browsers.\n * Real Chrome/Edge 113+ clients typically expose this feature; bots often do not.\n *\n * @see https://scrapfly.io/web-scraping-tools/gpu-fingerprint/webgpu/shader-f16\n */\nexport async function checkShaderF16Support(\n  context: ExtendedWindow,\n): Promise<boolean> {\n  if (!isChromiumBrowser(context)) {\n    return true;\n  }\n\n  const gpu = context.navigator.gpu;\n  if (!gpu) {\n    return false;\n  }\n\n  try {\n    const adapter = await gpu.requestAdapter();\n    if (!adapter) {\n      return false;\n    }\n\n    return adapter.features.has(\"shader-f16\");\n  } catch {\n    return false;\n  }\n}\n","import type { ExtendedWindow } from \"./types.js\";\nimport { isChromiumBrowser } from \"./webgpu.js\";\n\nconst SOFTWARE_RENDERER_PATTERNS = [\n  /swiftshader/i,\n  /llvmpipe/i,\n  /mesa offscreen/i,\n  /software renderer/i,\n];\n\n/**\n * GPU strings that only exist on one platform. A renderer that names a\n * graphics backend the claimed OS cannot run is a spoofed WebGL identity.\n */\nconst GPU_PLATFORM_RULES: Array<{ renderer: RegExp; platform: RegExp }> = [\n  { renderer: /Direct3D|\\bD3D(?:9|11|12)\\b/i, platform: /Windows|Win64|WOW64/i },\n  {\n    renderer: /Metal Renderer|Apple GPU|Apple M\\d/i,\n    platform: /Macintosh|Mac OS X|iPhone|iPad|iPod/i,\n  },\n  { renderer: /Adreno|Mali-|PowerVR Rogue/i, platform: /Android/i },\n];\n\n/** `navigator.deviceMemory` is quantised to powers of two by every engine. */\nconst ALLOWED_DEVICE_MEMORY = [0.25, 0.5, 1, 2, 4, 8, 16, 32, 64];\n\n/**\n * How far a canvas channel may drift before it counts as rewritten. Colour\n * management on wide-gamut displays moves values by a step, and the per-origin\n * noise that browser fingerprint protection injects — Opera, Brave, and\n * privacy extensions all do it, intermittently — perturbs the low bits. Neither\n * belongs to a bot, so the band is wide enough to clear both while a stubbed or\n * constant-returning canvas still lands far outside it.\n */\nconst CANVAS_CHANNEL_TOLERANCE = 8;\n\n/** Colour depths real display pipelines report; anything else is fabricated. */\nconst ALLOWED_COLOR_DEPTHS = [8, 15, 16, 24, 30, 32, 48];\n\n/**\n * Chromium appends a GREASE brand — a deliberately varied nonsense entry such\n * as `\"Not/A)Brand\"` — to every `userAgentData.brands` list so that servers\n * cannot hardcode the set. The punctuation between the words is arbitrary by\n * design, so match the words rather than any one spelling.\n */\nconst GREASE_BRAND_PATTERN = /not[^a-z0-9]*a[^a-z0-9]*brand/i;\n\n/** Navigator properties every engine exposes as prototype accessors. */\nconst NAVIGATOR_ACCESSOR_PROPERTIES = [\n  \"webdriver\",\n  \"hardwareConcurrency\",\n  \"languages\",\n  \"plugins\",\n] as const;\n\nconst PLAYWRIGHT_KEY_PATTERNS = [\n  /^__playwright(?:__binding__)?$/,\n  /^__pw(?:InitScripts|_manual)$/,\n];\n\nconst PUPPETEER_KEY_PATTERNS = [\n  /^__puppeteer_evaluation_script__$/,\n];\n\nconst CHROMEDRIVER_KEY_PATTERNS = [\n  /^cdc_[a-zA-Z0-9]{10,}_(?:Array|JSON|Object|Promise|Proxy|Symbol|Window)$/,\n  /^\\$cdc_[a-zA-Z0-9]{10,}_$/,\n  /^\\$chrome_asyncScriptInfo$/,\n  /^_WEBDRIVER_ELEM_CACHE$/,\n];\n\nconst LEGACY_AUTOMATION_KEY_PATTERNS = [\n  /^_Selenium_IDE_Recorder$/,\n  /^_selenium$/,\n  /^calledSelenium$/,\n  /^webdriver$/,\n  /^__webdriverFunc$/,\n  /^__lastWatir(?:Alert|Confirm|Prompt)$/,\n  /^ChromeDriverw$/,\n  /^awesomium$/,\n  /^RunPerfTest$/,\n  /^CefSharp$/,\n  /^fmget_targets$/,\n  /^geb$/,\n  /^nightmare$/,\n  /^__phantomas$/,\n  /^wdioElectron$/,\n];\n\nconst LEGACY_DOCUMENT_KEY_PATTERNS = [\n  /^driver-evaluate$/,\n  /^webdriver-evaluate$/,\n  /^webdriverCommand$/,\n  /^webdriver-evaluate-response$/,\n  /^webdriver$/,\n  /^_Selenium_IDE_Recorder$/,\n  /^_selenium$/,\n  /^calledSelenium$/,\n  /^__webdriverFunc$/,\n  /^__lastWatir(?:Alert|Confirm|Prompt)$/,\n  /^ChromeDriverw$/,\n  /^__selenium_evaluate$/,\n  /^selenium-evaluate$/,\n  /^__selenium_unwrapped$/,\n  /^__webdriver_script_(?:fn|func|function)$/,\n  /^__driver_evaluate$/,\n  /^__webdriver_evaluate$/,\n  /^__fxdriver_evaluate$/,\n  /^__driver_unwrapped$/,\n  /^__webdriver_unwrapped$/,\n  /^__fxdriver_unwrapped$/,\n  /^__\\$webdriverAsyncExecutor$/,\n];\n\nconst AUTOMATION_STACK_PATTERN = /(?:pptr:|UtilityScript\\.)/i;\nconst PLAYWRIGHT_BINDING_SOURCE_PATTERN =\n  /exposeBindingHandle supports a single argument/;\nconst PUPPETEER_BINDING_SOURCE_PATTERN = /This is the Puppeteer binding/;\nconst SANNYSOFT_DOCUMENT_CACHE_KEY_PATTERN = /\\$[a-z]dc_/;\n\nfunction hasMatchingKey(target: object, patterns: RegExp[]): boolean {\n  for (const key of Object.getOwnPropertyNames(target)) {\n    for (const pattern of patterns) {\n      if (pattern.test(key)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction hasMatchingTruthyKey(target: object, patterns: RegExp[]): boolean {\n  for (const key of Object.getOwnPropertyNames(target)) {\n    if (\n      patterns.some((pattern) => pattern.test(key)) &&\n      Boolean(getPropertySafely(target, key))\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/** Reads a potentially page-defined property without letting its getter abort detection. */\nexport function getPropertySafely(\n  target: object,\n  property: PropertyKey,\n): unknown {\n  try {\n    return Reflect.get(target, property);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction hasFunctionSourceMarker(\n  context: ExtendedWindow,\n  pattern: RegExp,\n): boolean {\n  let toString: unknown;\n  try {\n    toString =\n      context.Function?.prototype.toString ?? Function.prototype.toString;\n  } catch {\n    return false;\n  }\n  if (typeof toString !== \"function\") {\n    return false;\n  }\n  for (const key of Object.getOwnPropertyNames(context)) {\n    const value = Object.getOwnPropertyDescriptor(context, key)?.value;\n    if (typeof value === \"function\") {\n      try {\n        if (pattern.test(toString.call(value))) {\n          return true;\n        }\n      } catch {\n        continue;\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction hasInstalledExposedFunction(target: object): boolean {\n  return Object.getOwnPropertyNames(target).some((key) => {\n    const value = Object.getOwnPropertyDescriptor(target, key)?.value as\n      | (Function & { __installed?: unknown })\n      | undefined;\n    if (typeof value !== \"function\") {\n      return false;\n    }\n    try {\n      return value.__installed === true;\n    } catch {\n      return false;\n    }\n  });\n}\n\nfunction hasPrefixedFunction(target: object, pattern: RegExp): boolean {\n  return Object.getOwnPropertyNames(target).some((key) =>\n    pattern.test(key) &&\n    typeof Object.getOwnPropertyDescriptor(target, key)?.value === \"function\"\n  );\n}\n\nfunction hasAutomationDocumentAttribute(context: ExtendedWindow): boolean {\n  try {\n    const root = context.document.documentElement;\n    return Boolean(\n      root?.hasAttribute &&\n        [\"selenium\", \"webdriver\", \"driver\"].some((attribute) =>\n          root.hasAttribute(attribute),\n        ),\n    );\n  } catch {\n    return false;\n  }\n}\n\n/** Exact Selenium/WebDriver markers exposed on `document`. */\nexport function isSeleniumDocumentArtifacts(context: ExtendedWindow): boolean {\n  return hasMatchingTruthyKey(context.document, LEGACY_DOCUMENT_KEY_PATTERNS);\n}\n\nfunction hasSannysoftDocumentCache(context: ExtendedWindow): boolean {\n  for (const key in context.document) {\n    if (!SANNYSOFT_DOCUMENT_CACHE_KEY_PATTERN.test(key)) {\n      continue;\n    }\n    const value = getPropertySafely(context.document, key);\n    if (\n      ((typeof value === \"object\" && value !== null) ||\n        typeof value === \"function\") &&\n      Boolean(getPropertySafely(value, \"cache_\"))\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/** Renamed ChromeDriver constructor aliases left on the global object. */\nfunction hasRenamedChromeDriverGlobals(context: ExtendedWindow): boolean {\n  const constructors = [\n    [\"Array\", getPropertySafely(context, \"Array\")],\n    [\"Promise\", getPropertySafely(context, \"Promise\")],\n    [\"Symbol\", getPropertySafely(context, \"Symbol\")],\n  ] as const;\n  if (constructors.some(([, constructor]) => constructor === undefined)) {\n    return false;\n  }\n\n  const aliases = new Set<unknown>();\n  for (const key of Object.getOwnPropertyNames(context)) {\n    const descriptor = Object.getOwnPropertyDescriptor(context, key);\n    if (!descriptor || !(\"value\" in descriptor)) {\n      continue;\n    }\n    for (const [canonicalName, constructor] of constructors) {\n      if (key !== canonicalName && descriptor.value === constructor) {\n        aliases.add(constructor);\n      }\n    }\n  }\n\n  return aliases.size === constructors.length;\n}\n\n/** Renamed Selenium element cache identified by its structural method triplet. */\nfunction hasRenamedChromeDriverDocumentCache(\n  context: ExtendedWindow,\n): boolean {\n  for (const key of Object.getOwnPropertyNames(context.document)) {\n    const descriptor = Object.getOwnPropertyDescriptor(context.document, key);\n    if (!descriptor || !(\"value\" in descriptor)) {\n      continue;\n    }\n    const value = descriptor.value as unknown;\n    if (\n      (typeof value !== \"object\" || value === null) &&\n      typeof value !== \"function\"\n    ) {\n      continue;\n    }\n    try {\n      const cache = Object.getOwnPropertyDescriptor(value, \"cache_\");\n      const prototype = Object.getPrototypeOf(value) as object | null;\n      if (\n        !cache ||\n        !(\"value\" in cache) ||\n        cache.value === undefined ||\n        !prototype\n      ) {\n        continue;\n      }\n      const actualNames = Object.getOwnPropertyNames(prototype).sort();\n      const expectedNames = [\n        \"isNodeReachable_\",\n        \"retrieveItem\",\n        \"storeItem\",\n      ];\n      if (\n        actualNames.length === expectedNames.length &&\n        actualNames.every((name, index) => name === expectedNames[index])\n      ) {\n        return true;\n      }\n    } catch {\n      continue;\n    }\n  }\n\n  return false;\n}\n\n/** Chromium UA without the browser-provided `window.chrome` object */\nexport function isMissingChromeObject(context: ExtendedWindow): boolean {\n  if (!isChromiumBrowser(context)) {\n    return false;\n  }\n\n  // `chrome.runtime` is an extension API and is not guaranteed to be exposed\n  // to ordinary web pages. Only the absence of the browser marker itself is\n  // suspicious; requiring `runtime` makes legitimate Chromium look automated.\n  return getPropertySafely(context, \"chrome\") === undefined;\n}\n\n/** Whether a WebGL context can be created without letting a blocked API abort detection. */\nexport function hasWebGlContext(context: ExtendedWindow): boolean {\n  try {\n    return Boolean(context.document.createElement(\"canvas\").getContext(\"webgl\"));\n  } catch {\n    return false;\n  }\n}\n\n/** Reads the unmasked WebGL vendor/renderer pair, or `null` when unavailable. */\nexport function readWebGlIdentity(\n  context: ExtendedWindow,\n): { vendor: string; renderer: string } | null {\n  try {\n    const canvas = context.document.createElement(\"canvas\");\n    const gl =\n      canvas.getContext(\"webgl\") ??\n      canvas.getContext(\"experimental-webgl\" as \"webgl\");\n\n    if (!gl) {\n      return null;\n    }\n\n    const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n    if (!debugInfo) {\n      return null;\n    }\n\n    const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n    if (typeof renderer !== \"string\") {\n      return null;\n    }\n\n    const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n    return { vendor: typeof vendor === \"string\" ? vendor : \"\", renderer };\n  } catch {\n    return null;\n  }\n}\n\n/** WebGL reports a software renderer such as SwiftShader or llvmpipe */\nexport function isSoftwareRenderer(context: ExtendedWindow): boolean {\n  const identity = readWebGlIdentity(context);\n  if (!identity) {\n    return false;\n  }\n\n  return SOFTWARE_RENDERER_PATTERNS.some((pattern) =>\n    pattern.test(identity.renderer),\n  );\n}\n\n/**\n * The WebGL renderer names a graphics backend the User-Agent's platform\n * cannot provide — Direct3D off Windows, Metal off Apple, Adreno off Android.\n */\nexport function isGpuPlatformMismatch(context: ExtendedWindow): boolean {\n  const identity = readWebGlIdentity(context);\n  if (!identity) {\n    return false;\n  }\n\n  const userAgent = context.navigator.userAgent;\n  const gpu = `${identity.vendor} ${identity.renderer}`;\n  return GPU_PLATFORM_RULES.some(\n    (rule) => rule.renderer.test(gpu) && !rule.platform.test(userAgent),\n  );\n}\n\n/** Window has no browser chrome and sits at the origin — common in headless automation */\nexport function isSuspiciousWindowDimensions(context: ExtendedWindow): boolean {\n  if (context.outerWidth === 0 && context.outerHeight === 0) {\n    return true;\n  }\n\n  const noBrowserChrome =\n    context.outerWidth === context.innerWidth &&\n    context.outerHeight === context.innerHeight;\n  const zeroScreenOffset =\n    context.screenX === 0 &&\n    context.screenY === 0 &&\n    context.outerWidth > 800;\n\n  return noBrowserChrome && zeroScreenOffset;\n}\n\n/** Desktop Chromium with an empty plugin list */\nexport function isEmptyPlugins(context: ExtendedWindow): boolean {\n  if (!isChromiumBrowser(context)) {\n    return false;\n  }\n\n  // Mobile Chrome exposes no plugins by design, so an empty list there is\n  // normal, not suspicious — only desktop Chromium ships the fixed PDF set.\n  if (/Mobi|Android/i.test(context.navigator.userAgent)) {\n    return false;\n  }\n\n  return context.navigator.plugins.length === 0;\n}\n\n/** Legacy automation and embedded-runtime artifacts, excluding exact frameworks. */\nexport function isLegacyAutomationArtifacts(context: ExtendedWindow): boolean {\n  const processValue = getPropertySafely(context, \"process\");\n  const process =\n    (typeof processValue === \"object\" && processValue !== null) ||\n    typeof processValue === \"function\"\n      ? processValue\n      : undefined;\n  const versions = process\n    ? getPropertySafely(process, \"versions\")\n    : undefined;\n  const hasElectronVersion =\n    ((typeof versions === \"object\" && versions !== null) ||\n      typeof versions === \"function\") &&\n    getPropertySafely(versions, \"electron\") !== undefined;\n  const isElectron =\n    (process && getPropertySafely(process, \"type\") === \"renderer\") ||\n    hasElectronVersion ||\n    /(?:Electron|SlimerJS)/i.test(\n      `${context.navigator.userAgent} ${context.navigator.appVersion ?? \"\"}`,\n    );\n  let isSequentum = false;\n  try {\n    isSequentum = /Sequentum/i.test(String(context.external ?? \"\"));\n  } catch {\n    isSequentum = false;\n  }\n\n  return (\n    isElectron ||\n    isSequentum ||\n    hasMatchingTruthyKey(context, LEGACY_AUTOMATION_KEY_PATTERNS) ||\n    isSeleniumDocumentArtifacts(context) ||\n    hasInstalledExposedFunction(context) ||\n    hasAutomationDocumentAttribute(context)\n  );\n}\n\n/** Known automation framework/runtime artifacts on `window` / `document` */\nexport function isAutomationArtifacts(context: ExtendedWindow): boolean {\n  return isPlaywright(context) ||\n    isPuppeteer(context) ||\n    isChromeDriver(context) ||\n    isLegacyAutomationArtifacts(context);\n}\n\n/** Playwright bindings or init-script registries leaked into the page realm. */\nexport function isPlaywright(context: ExtendedWindow): boolean {\n  return (\n    hasMatchingKey(context, PLAYWRIGHT_KEY_PATTERNS) ||\n    hasFunctionSourceMarker(context, PLAYWRIGHT_BINDING_SOURCE_PATTERN)\n  );\n}\n\n/** Puppeteer evaluation helpers leaked into the page realm. */\nexport function isPuppeteer(context: ExtendedWindow): boolean {\n  return (\n    hasMatchingKey(context, PUPPETEER_KEY_PATTERNS) ||\n    hasPrefixedFunction(context, /^puppeteer_/) ||\n    hasFunctionSourceMarker(context, PUPPETEER_BINDING_SOURCE_PATTERN)\n  );\n}\n\n/** ChromeDriver/Selenium `cdc_` and element-cache artifacts. */\nexport function isChromeDriver(context: ExtendedWindow): boolean {\n  return (\n    hasMatchingKey(context, CHROMEDRIVER_KEY_PATTERNS) ||\n    hasMatchingKey(context.document, CHROMEDRIVER_KEY_PATTERNS) ||\n    hasSannysoftDocumentCache(context) ||\n    hasRenamedChromeDriverGlobals(context) ||\n    hasRenamedChromeDriverDocumentCache(context)\n  );\n}\n\n/** UA major version or mobile/platform claim conflicts with User-Agent Client Hints. */\nexport function isUserAgentDataMismatch(context: ExtendedWindow): boolean {\n  const data = context.navigator.userAgentData;\n  if (!data) {\n    return false;\n  }\n\n  const userAgent = context.navigator.userAgent;\n  const chromeMajor = userAgent.match(/(?:Chrome|Chromium)\\/(\\d+)/)?.[1];\n  const brandMajors = data.brands\n    .filter((brand) => /^(?:Chromium|Google Chrome)$/i.test(brand.brand))\n    .map((brand) => brand.version.match(/^\\d+/)?.[0])\n    .filter((version): version is string => version !== undefined);\n\n  if (\n    chromeMajor &&\n    brandMajors.length > 0 &&\n    brandMajors.some((version) => version !== chromeMajor)\n  ) {\n    return true;\n  }\n\n  const uaIsMobile = /Mobi/i.test(userAgent);\n  if (typeof data.mobile === \"boolean\" && data.mobile !== uaIsMobile) {\n    return true;\n  }\n\n  if (data.platform) {\n    if (/Android/i.test(userAgent) && !/Android/i.test(data.platform)) {\n      return true;\n    }\n    if (/CrOS/i.test(userAgent) && !/Chrome OS/i.test(data.platform)) {\n      return true;\n    }\n    if (\n      /Linux/i.test(userAgent) &&\n      !/Android|CrOS/i.test(userAgent) &&\n      !/Linux/i.test(data.platform)\n    ) {\n      return true;\n    }\n    if (/Windows/i.test(userAgent) && !/Windows/i.test(data.platform)) {\n      return true;\n    }\n    if (\n      /(Macintosh|Mac OS X)/i.test(userAgent) &&\n      !/macOS/i.test(data.platform)\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/** `navigator.language` disagrees with the first entry in `navigator.languages`. */\nexport function isLanguageInconsistent(context: ExtendedWindow): boolean {\n  const { language, languages } = context.navigator;\n  if (!languages) {\n    return false;\n  }\n  if (languages.length === 0) {\n    return true;\n  }\n  if (!language) {\n    return false;\n  }\n\n  return languages[0]?.toLowerCase() !== language.toLowerCase();\n}\n\n/** Plugin and MIME-type arrays were patched independently and no longer agree. */\nexport function isPluginMimeTypeInconsistent(context: ExtendedWindow): boolean {\n  if (!context.navigator.plugins || !context.navigator.mimeTypes) {\n    return false;\n  }\n\n  const pluginCount = context.navigator.plugins.length;\n  const mimeTypeCount = context.navigator.mimeTypes.length;\n  return (pluginCount === 0) !== (mimeTypeCount === 0);\n}\n\nfunction findPropertyDescriptor(\n  value: object,\n  property: PropertyKey,\n): PropertyDescriptor | undefined {\n  const visited = new Set<object>();\n  let depth = 0;\n  for (\n    let target: object | null = value;\n    target !== null && depth < 32;\n    target = Object.getPrototypeOf(target) as object | null\n  ) {\n    if (visited.has(target)) {\n      return undefined;\n    }\n    visited.add(target);\n    depth += 1;\n    const descriptor = Object.getOwnPropertyDescriptor(target, property);\n    if (descriptor) {\n      return descriptor;\n    }\n  }\n\n  return undefined;\n}\n\nfunction isNativeFunction(value: unknown, toString: (this: Function) => string): boolean {\n  if (typeof value !== \"function\") {\n    return false;\n  }\n\n  try {\n    return /\\{\\s*\\[native code\\]\\s*\\}/.test(toString.call(value));\n  } catch {\n    return false;\n  }\n}\n\n/** Core functions or Navigator getters no longer have browser-native source. */\nexport function isNativeFunctionTampered(context: ExtendedWindow): boolean {\n  const functionConstructor = getPropertySafely(context, \"Function\") as\n    | FunctionConstructor\n    | undefined;\n  if (!functionConstructor) {\n    return false;\n  }\n\n  let bind: unknown;\n  let toString: unknown;\n  try {\n    ({ bind, toString } = functionConstructor.prototype);\n  } catch {\n    return true;\n  }\n  if (typeof toString !== \"function\") {\n    return true;\n  }\n  const functionToString = toString as (this: Function) => string;\n  if (\n    !isNativeFunction(toString, functionToString) ||\n    !isNativeFunction(bind, functionToString)\n  ) {\n    return true;\n  }\n\n  const isNativeNavigator =\n    Object.prototype.toString.call(context.navigator) === \"[object Navigator]\";\n\n  for (const property of NAVIGATOR_ACCESSOR_PROPERTIES) {\n    const descriptor = findPropertyDescriptor(context.navigator, property);\n    if (!descriptor) {\n      continue;\n    }\n    // Engines expose these as prototype accessors. A plain data property means\n    // something re-defined it with `Object.defineProperty(..., { value })`.\n    if (!descriptor.get) {\n      if (isNativeNavigator) {\n        return true;\n      }\n      continue;\n    }\n    if (!isNativeFunction(descriptor.get, functionToString)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction platformContradictsUserAgent(platform: string, userAgent: string): boolean {\n  if (/Android/i.test(userAgent)) {\n    return !/Android|Linux/i.test(platform);\n  }\n  if (/CrOS/i.test(userAgent)) {\n    return !/CrOS|Linux/i.test(platform);\n  }\n  if (/Windows/i.test(userAgent)) {\n    return !/Win/i.test(platform);\n  }\n  if (/(?:iPhone|iPad|iPod)/i.test(userAgent)) {\n    return !/(?:iPhone|iPad|iPod|Mac)/i.test(platform);\n  }\n  if (/(?:Macintosh|Mac OS X)/i.test(userAgent)) {\n    return !/Mac/i.test(platform);\n  }\n  if (/Linux/i.test(userAgent)) {\n    return !/Linux/i.test(platform);\n  }\n\n  return false;\n}\n\n/** Legacy Navigator identity claims contradict the User-Agent or touch support. */\nexport function isNavigatorIdentityInconsistent(context: ExtendedWindow): boolean {\n  const navigator = context.navigator;\n  const userAgent = navigator.userAgent;\n  const vendor = navigator.vendor;\n\n  if (\n    (/\\b(?:Chrome|Chromium|Edg)\\//i.test(userAgent) &&\n      vendor !== undefined &&\n      vendor !== \"Google Inc.\") ||\n    (/\\bFirefox\\//i.test(userAgent) && Boolean(vendor)) ||\n    (/\\bVersion\\/[^ ]+.*Safari\\//i.test(userAgent) &&\n      vendor !== undefined &&\n      vendor !== \"Apple Computer, Inc.\")\n  ) {\n    return true;\n  }\n\n  if (navigator.platform && platformContradictsUserAgent(navigator.platform, userAgent)) {\n    return true;\n  }\n\n  if (\n    navigator.productSub !== undefined &&\n    /\\b(?:Chrome|Chromium|Edg|Version\\/[^ ]+.*Safari)\\//i.test(userAgent) &&\n    navigator.productSub !== \"20030107\"\n  ) {\n    return true;\n  }\n\n  // `oscpu` is Gecko-only, and Gecko keeps it in step with the User-Agent.\n  // Anywhere else it is a leftover from a partially rewritten identity.\n  const oscpu = navigator.oscpu;\n  if (typeof oscpu === \"string\" && oscpu) {\n    if (!/\\bFirefox\\//i.test(userAgent)) {\n      return true;\n    }\n    if (platformContradictsUserAgent(oscpu, userAgent)) {\n      return true;\n    }\n  }\n\n  return /(?:Mobi|Android|iPhone|iPad)/i.test(userAgent) &&\n    navigator.maxTouchPoints !== undefined &&\n    navigator.maxTouchPoints === 0;\n}\n\n/**\n * `userAgentData.brands` omits Chromium's GREASE entry.\n *\n * Every Chromium build injects one, so a list without it was assembled by hand\n * — the signature of Client Hints set through an automation override rather\n * than produced by the browser.\n */\nexport function isMissingGreaseBrand(context: ExtendedWindow): boolean {\n  const brands = context.navigator.userAgentData?.brands;\n  if (!brands || brands.length === 0) {\n    return false;\n  }\n\n  return !brands.some((brand) => GREASE_BRAND_PATTERN.test(brand.brand));\n}\n\n/** PluginArray/MimeTypeArray objects or entries do not use native prototypes. */\nexport function isPluginArrayInconsistent(context: ExtendedWindow): boolean {\n  const { plugins, mimeTypes } = context.navigator;\n  if (!plugins || !mimeTypes) {\n    return false;\n  }\n\n  if (context.PluginArray && !(plugins instanceof context.PluginArray)) {\n    return true;\n  }\n  if (context.MimeTypeArray && !(mimeTypes instanceof context.MimeTypeArray)) {\n    return true;\n  }\n\n  if (context.Plugin) {\n    for (let index = 0; index < plugins.length; index += 1) {\n      if (!(plugins[index] instanceof context.Plugin)) {\n        return true;\n      }\n    }\n  }\n  try {\n    const firstPlugin = plugins[0];\n    if (\n      firstPlugin &&\n      firstPlugin.toString() !== \"[object Plugin]\"\n    ) {\n      return true;\n    }\n  } catch {\n    return true;\n  }\n  if (context.MimeType) {\n    for (let index = 0; index < mimeTypes.length; index += 1) {\n      if (!(mimeTypes[index] instanceof context.MimeType)) {\n        return true;\n      }\n    }\n  }\n\n  if (plugins.length > 0 && typeof plugins.item === \"function\") {\n    try {\n      // Native `PluginArray.item()` takes an `unsigned long`, so 2³² wraps to\n      // index 0. Array-backed fakes return `undefined` instead.\n      if (plugins.item(4294967296) !== plugins[0]) {\n        return true;\n      }\n      // Real MIME entries link back to the plugin that enables them.\n      const mimeType = plugins[0]?.[0];\n      if (mimeType && mimeType.enabledPlugin !== plugins[0]) {\n        return true;\n      }\n    } catch {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/** Navigator values a second realm reports, for identity comparison. */\nexport interface RealmNavigatorSnapshot {\n  userAgent?: string;\n  platform?: string;\n}\n\n/** Operating-system family a User-Agent describes, or `null` when unclear. */\nfunction getOsFamily(userAgent: string | undefined): string | null {\n  if (!userAgent) {\n    return null;\n  }\n  if (/Android/i.test(userAgent)) {\n    return \"android\";\n  }\n  if (/(?:iPhone|iPad|iPod)/i.test(userAgent)) {\n    return \"ios\";\n  }\n  if (/CrOS/i.test(userAgent)) {\n    return \"cros\";\n  }\n  if (/Windows|Win64|Win32|WOW64/i.test(userAgent)) {\n    return \"windows\";\n  }\n  if (/(?:Macintosh|Mac OS X|MacIntel)/i.test(userAgent)) {\n    return \"macos\";\n  }\n  if (/Linux|X11/i.test(userAgent)) {\n    return \"linux\";\n  }\n\n  return null;\n}\n\n\n\n/** Both values are known and disagree. */\nfunction contradicts<T>(main: T | null, other: T | null): boolean {\n  return main !== null && other !== null && main !== other;\n}\n\n\n/** Counts Navigator values that differ between the main realm and another one. */\n/**\n * The two realms describe different operating systems.\n *\n * This is the only Navigator disagreement between realms with no legitimate\n * cause. Everything softer turned out to be something a stock browser does:\n * fingerprint protection normalises the locale in the document but not in a\n * worker, and rewrites User-Agent and platform strings unevenly, so locale and\n * raw-string comparisons flag real people. Browser version is out for the same\n * reason — User-Agent reduction and per-site compatibility overrides apply to\n * the document only. `hardwareConcurrency` is not compared at all.\n *\n * What survives is the case that matters most in practice: a spoofing\n * framework claiming Windows to the page while the worker reports the Linux\n * host it actually runs on.\n */\nexport function hasRealmPersonaMismatch(\n  main: RealmNavigatorSnapshot,\n  other: RealmNavigatorSnapshot,\n): boolean {\n  return (\n    contradicts(getOsFamily(main.userAgent), getOsFamily(other.userAgent)) ||\n    contradicts(getOsFamily(main.platform), getOsFamily(other.platform))\n  );\n}\n\n/**\n * A fresh same-origin iframe hands back the page's own realm, or disagrees\n * with it about `navigator.webdriver`.\n *\n * Only signals that page and extension content cannot produce are used. An\n * `about:blank` frame is the one realm every content script reaches — ad\n * blockers, privacy tools, and the extensions Chromium forks ship built in all\n * inject there — so anything that injected code could define or proxy is out:\n *\n * - Navigator values are not compared here at all. That is exactly what\n *   fingerprint protection rewrites inconsistently between realms, and\n *   `isWorkerInconsistent` already covers persona spoofing from a worker,\n *   which content scripts do not touch.\n * - `self.get` is not probed, since injected code can define it.\n * - Shared timer functions are not treated as evidence, since a tool that\n *   neuters iframes can proxy them onto the parent's.\n *\n * What remains cannot happen in a real browser: a frame whose `window` or\n * `navigator` *is* the page's object is a stealth patch returning the parent\n * realm, and `webdriver` is set by the browser itself, so the two realms only\n * disagree when a patch reached one and not the other.\n */\nexport function isIframeInconsistent(context: ExtendedWindow): boolean {\n  const parent = context.document.documentElement ?? context.document.body;\n  if (!parent?.appendChild) {\n    return false;\n  }\n\n  const iframe = context.document.createElement(\"iframe\");\n  let inconsistent = false;\n  try {\n    iframe.style.display = \"none\";\n    parent.appendChild(iframe);\n    const frame = iframe.contentWindow;\n    if (frame) {\n      const main = context.navigator;\n      const child = frame.navigator;\n\n      const isParentRealm = frame === context || child === main;\n      const hasWebDriverDrift =\n        Boolean(main.webdriver) !== Boolean(child.webdriver);\n\n      inconsistent = isParentRealm || hasWebDriverDrift;\n    }\n  } catch {\n    inconsistent = false;\n  }\n  iframe.remove();\n  return inconsistent;\n}\n\n/** Error stacks contain automation-specific source URLs or injected frames. */\nexport function isErrorStackAutomation(context: ExtendedWindow): boolean {\n  if (!context.Error) {\n    return false;\n  }\n\n  try {\n    return AUTOMATION_STACK_PATTERN.test(new context.Error().stack ?? \"\");\n  } catch {\n    return false;\n  }\n}\n\n/** Screen/viewport matches common untouched automation defaults. */\nexport function isDefaultAutomationViewport(context: ExtendedWindow): boolean {\n  const dimensions = [\n    [context.screen.width, context.screen.height],\n    [context.innerWidth, context.innerHeight],\n  ];\n\n  return dimensions.some(\n    ([width, height]) =>\n      (width === 800 && height === 600) ||\n      (width === 1280 && height === 720),\n  );\n}\n\n/** Spoofed or implausible CPU/device-memory combinations. */\nexport function isSuspiciousHardware(context: ExtendedWindow): boolean {\n  const cores = context.navigator.hardwareConcurrency;\n  const memory = context.navigator.deviceMemory;\n\n  // Engines round `deviceMemory` to a power of two, so an off-grid value was\n  // fabricated. Large values are legitimate — real workstations report 32.\n  if (typeof memory === \"number\" && !ALLOWED_DEVICE_MEMORY.includes(memory)) {\n    return true;\n  }\n\n  if (typeof cores !== \"number\") {\n    return false;\n  }\n\n  return (\n    !Number.isInteger(cores) ||\n    cores < 1 ||\n    cores > 128 ||\n    (cores > 32 && typeof memory === \"number\" && memory <= 2)\n  );\n}\n\n/** Network Information reports the zero-RTT default common in headless contexts. */\nexport function isZeroConnectionRtt(context: ExtendedWindow): boolean {\n  const connection = context.navigator.connection;\n  return !/Android/i.test(context.navigator.userAgent) && connection?.rtt === 0;\n}\n\n/** A deterministic 1px canvas write was modified on readback. */\nexport function isCanvasTampered(context: ExtendedWindow): boolean {\n  try {\n    const canvas = context.document.createElement(\"canvas\");\n    canvas.width = 1;\n    canvas.height = 1;\n    const canvasContext = canvas.getContext(\"2d\");\n    if (!canvasContext) {\n      return false;\n    }\n\n    canvasContext.clearRect(0, 0, 1, 1);\n    canvasContext.fillStyle = \"#112233\";\n    canvasContext.fillRect(0, 0, 1, 1);\n    const [red, green, blue, alpha] = canvasContext.getImageData(0, 0, 1, 1).data;\n    const expected = [17, 34, 51, 255];\n    // Colour management on wide-gamut and HDR displays shifts readback by a\n    // step or two, so only a deviation larger than that counts as rewritten.\n    return [red, green, blue, alpha].some(\n      (channel, index) =>\n        typeof channel !== \"number\" ||\n        Math.abs(channel - expected[index]!) > CANVAS_CHANNEL_TOLERANCE,\n    );\n  } catch {\n    return false;\n  }\n}\n\nconst CANVAS_PROBE_WIDTH = 64;\nconst CANVAS_PROBE_HEIGHT = 24;\n\n/**\n * Renders a fixed 2D scene and reads its pixels back, or `null` if unavailable.\n *\n * Deliberately reads pixels rather than `toDataURL()`. PNG encoding is not\n * byte-stable — Chromium hands back different encodings of identical pixels on\n * repeated calls — so comparing the encoded strings would flag stock browsers.\n */\nfunction renderCanvasProbe(\n  context: ExtendedWindow,\n): ArrayLike<number> | null {\n  try {\n    const canvas = context.document.createElement(\"canvas\");\n    canvas.width = CANVAS_PROBE_WIDTH;\n    canvas.height = CANVAS_PROBE_HEIGHT;\n    const canvasContext = canvas.getContext(\"2d\");\n    if (!canvasContext) {\n      return null;\n    }\n\n    // Text and translucent overlap are what fingerprint scripts hash, so they\n    // are what noise injectors perturb. A flat fill alone would not move.\n    canvasContext.textBaseline = \"top\";\n    canvasContext.font = \"14px 'Arial'\";\n    canvasContext.fillStyle = \"#f60\";\n    canvasContext.fillRect(0, 0, 44, 12);\n    canvasContext.fillStyle = \"#069\";\n    canvasContext.fillText(\"bot,signal\", 2, 2);\n    canvasContext.fillStyle = \"rgba(102, 204, 0, 0.7)\";\n    canvasContext.fillText(\"bot,signal\", 4, 6);\n    const { data } = canvasContext.getImageData(\n      0,\n      0,\n      CANVAS_PROBE_WIDTH,\n      CANVAS_PROBE_HEIGHT,\n    );\n\n    return data.length > 0 ? data : null;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Canvas rasterisation changes between two identical renders.\n *\n * Drawing is deterministic within a session on every real engine, and the\n * fingerprint protection that ships in browsers — Brave's farbling, Firefox in\n * resistFingerprinting mode — derives its noise from a per-session, per-origin\n * seed, so it too returns the same pixels twice. Only a spoofer that\n * re-randomises on every call disagrees with itself.\n */\nexport function isCanvasNoiseInjected(context: ExtendedWindow): boolean {\n  const first = renderCanvasProbe(context);\n  if (first === null) {\n    return false;\n  }\n  const second = renderCanvasProbe(context);\n  if (second === null || second.length !== first.length) {\n    return false;\n  }\n\n  for (let index = 0; index < first.length; index += 1) {\n    if (first[index] !== second[index]) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * The IANA time zone `Intl` resolves disagrees with `Date`'s UTC offset.\n *\n * Both read the same host setting, so they cannot legitimately diverge. Tools\n * that relocate a browser by patching one of the two — a `Date.getTimezoneOffset`\n * override, or a CDP timezone override applied to only one realm — split them.\n */\nexport function isTimezoneInconsistent(context: ExtendedWindow): boolean {\n  const intl = context.Intl ?? Intl;\n  const dateConstructor = context.Date ?? Date;\n\n  try {\n    const zone = intl.DateTimeFormat().resolvedOptions().timeZone;\n    if (!zone) {\n      return false;\n    }\n\n    const now = new dateConstructor();\n    const reportedOffset = -now.getTimezoneOffset();\n    if (!Number.isFinite(reportedOffset)) {\n      return false;\n    }\n\n    const parts = new intl.DateTimeFormat(\"en-US\", {\n      timeZone: zone,\n      hourCycle: \"h23\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n    }).formatToParts(now);\n    const field = (type: string): number =>\n      Number(parts.find((part) => part.type === type)?.value);\n\n    // Reading the wall clock of the named zone as if it were UTC turns the\n    // difference from the real instant into that zone's offset.\n    const asUtc = dateConstructor.UTC(\n      field(\"year\"),\n      field(\"month\") - 1,\n      field(\"day\"),\n      field(\"hour\"),\n      field(\"minute\"),\n      field(\"second\"),\n    );\n    if (!Number.isFinite(asUtc)) {\n      return false;\n    }\n\n    // `formatToParts` has no milliseconds, so compare against a truncated instant.\n    const zoneOffset = Math.round(\n      (asUtc - Math.floor(now.getTime() / 1000) * 1000) / 60000,\n    );\n\n    return Math.abs(zoneOffset - reportedOffset) > 1;\n  } catch {\n    return false;\n  }\n}\n\ntype BrowserEngine = \"chromium\" | \"gecko\" | \"webkit\";\n\n/** The engine the User-Agent implies, or `null` when it names no known browser. */\nfunction getClaimedEngine(userAgent: string): BrowserEngine | null {\n  // iOS puts every browser on WebKit regardless of the brand in the UA.\n  if (/(?:iPhone|iPad|iPod)/i.test(userAgent)) {\n    return \"webkit\";\n  }\n  if (/\\b(?:Chrome|Chromium|Edg|OPR|SamsungBrowser)\\//i.test(userAgent)) {\n    return \"chromium\";\n  }\n  if (/\\bFirefox\\//i.test(userAgent)) {\n    return \"gecko\";\n  }\n  if (/\\bVersion\\/[^ ]+.*Safari\\//i.test(userAgent)) {\n    return \"webkit\";\n  }\n\n  return null;\n}\n\n/**\n * The JavaScript engine contradicts the browser the User-Agent claims.\n *\n * `eval.toString().length` is 33 in V8 (single-line native source) and 37 in\n * SpiderMonkey and JavaScriptCore, and `InternalError` exists only in\n * SpiderMonkey — neither is touched by User-Agent spoofing.\n */\nexport function isEngineInconsistent(context: ExtendedWindow): boolean {\n  const engine = getClaimedEngine(context.navigator.userAgent);\n  if (!engine) {\n    return false;\n  }\n\n  const hasSpiderMonkeyGlobals =\n    getPropertySafely(context, \"InternalError\") !== undefined ||\n    getPropertySafely(context, \"mozInnerScreenX\") !== undefined;\n  if (hasSpiderMonkeyGlobals !== (engine === \"gecko\")) {\n    return true;\n  }\n\n  const evaluate = getPropertySafely(context, \"eval\");\n  if (typeof evaluate !== \"function\") {\n    return false;\n  }\n\n  let evalLength: number;\n  try {\n    evalLength = evaluate.toString().length;\n  } catch {\n    return false;\n  }\n\n  // Only the two known native shapes attribute an engine; anything else is a\n  // wrapped `eval`, which isNativeFunctionTampered already covers.\n  if (evalLength === 33) {\n    return engine !== \"chromium\";\n  }\n  if (evalLength === 37) {\n    return engine === \"chromium\";\n  }\n\n  return false;\n}\n\n/**\n * CSS media queries contradict the values `navigator`/`screen` report.\n * Stealth patches override the JS getters but not the CSS engine behind them.\n */\nexport function isMediaQueryInconsistent(context: ExtendedWindow): boolean {\n  const matchMedia = context.matchMedia;\n  if (typeof matchMedia !== \"function\") {\n    return false;\n  }\n\n  const matches = (query: string): boolean | null => {\n    try {\n      return matchMedia.call(context, query).matches;\n    } catch {\n      return null;\n    }\n  };\n\n  // Only `resolution` is compared. `screen.colorDepth` against the CSS `color`\n  // query looked equivalent but is not: Opera 133 on a 10-bit display reports\n  // colorDepth 24 while CSS reports 10 bits per channel, so any mapping\n  // between them flags a stock browser.\n\n  // Bail out on engines that do not support resolution queries at all.\n  if (matches(\"(min-resolution: 0dppx)\") !== true) {\n    return false;\n  }\n\n  const ratio = context.devicePixelRatio;\n  if (typeof ratio !== \"number\" || !Number.isFinite(ratio) || ratio <= 0) {\n    return false;\n  }\n\n  // Page zoom and fractional HiDPI scaling make the ratio a long float, so the\n  // window scales with it instead of being a fixed epsilon.\n  const tolerance = Math.max(ratio * 0.02, 0.02);\n  return (\n    matches(`(min-resolution: ${ratio - tolerance}dppx)`) === false ||\n    matches(`(max-resolution: ${ratio + tolerance}dppx)`) === false\n  );\n}\n\n/** `screen` reports geometry no display pipeline can produce. */\nexport function isScreenGeometryInconsistent(context: ExtendedWindow): boolean {\n  const screen = context.screen;\n  const { width, height, availWidth, availHeight, colorDepth, pixelDepth } =\n    screen;\n\n  if (typeof width !== \"number\" || typeof height !== \"number\") {\n    return false;\n  }\n  if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n    return true;\n  }\n  // The available area is carved out of the screen, so it can never exceed it.\n  if (typeof availWidth === \"number\" && availWidth > width) {\n    return true;\n  }\n  if (typeof availHeight === \"number\" && availHeight > height) {\n    return true;\n  }\n  if (typeof colorDepth === \"number\") {\n    if (!ALLOWED_COLOR_DEPTHS.includes(colorDepth)) {\n      return true;\n    }\n    if (typeof pixelDepth === \"number\" && pixelDepth !== colorDepth) {\n      return true;\n    }\n  }\n\n  const ratio = context.devicePixelRatio;\n  return typeof ratio === \"number\" && (ratio <= 0 || ratio > 8);\n}\n\n/**\n * A Chromium build without H.264 — the bundled Chromium that Playwright and\n * unbranded automation images ship, as opposed to Google Chrome.\n */\nexport function isMissingProprietaryCodecs(context: ExtendedWindow): boolean {\n  if (!isChromiumBrowser(context)) {\n    return false;\n  }\n\n  try {\n    const video = context.document.createElement(\"video\");\n    if (typeof video.canPlayType !== \"function\") {\n      return false;\n    }\n    return video.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') === \"\";\n  } catch {\n    return false;\n  }\n}\n\n/** `navigator.webdriver` was patched (own property) or deleted from the prototype */\nexport function isSuspiciousWebDriverDescriptor(\n  context: ExtendedWindow,\n): boolean {\n  const navigator = context.navigator;\n\n  // Genuine browsers define the getter on Navigator.prototype — an own\n  // property means an automation framework redefined it.\n  if (Object.prototype.hasOwnProperty.call(navigator, \"webdriver\")) {\n    return true;\n  }\n\n  if (!isChromiumBrowser(context)) {\n    return false;\n  }\n\n  const isNativeNavigator =\n    Object.prototype.toString.call(navigator) === \"[object Navigator]\";\n\n  // Stealth patches sometimes delete the descriptor outright; a Chromium\n  // navigator without `webdriver` anywhere on its prototype chain is tampered.\n  for (\n    let prototype = Object.getPrototypeOf(navigator);\n    prototype !== null;\n    prototype = Object.getPrototypeOf(prototype)\n  ) {\n    const descriptor = Object.getOwnPropertyDescriptor(prototype, \"webdriver\");\n    if (descriptor) {\n      return isNativeNavigator &&\n        (typeof descriptor.get !== \"function\" ||\n          descriptor.set !== undefined ||\n          descriptor.enumerable !== true ||\n          descriptor.configurable !== true);\n    }\n  }\n\n  return true;\n}\n","import { hasRealmPersonaMismatch, readWebGlIdentity } from \"./checks.js\";\nimport type { ExtendedWindow } from \"./types.js\";\nimport { isChromiumBrowser } from \"./webgpu.js\";\n\n// Capture the detector realm's timers once: a caller-supplied context can\n// replace its timer methods with no-ops, which must not strand async detection.\nconst scheduleDetectorTask = globalThis.setTimeout.bind(globalThis);\nconst cancelDetectorTask = globalThis.clearTimeout.bind(globalThis);\n\n/**\n * Voices that ship only with Apple's speech synthesiser. Two or more of these\n * on a machine claiming another operating system means the platform is spoofed;\n * one alone could be a third-party voice pack borrowing a common first name.\n */\nconst APPLE_ONLY_VOICES = new Set([\n  \"Alex\",\n  \"Daniel\",\n  \"Fiona\",\n  \"Fred\",\n  \"Karen\",\n  \"Kyoko\",\n  \"Lekha\",\n  \"Moira\",\n  \"Rishi\",\n  \"Samantha\",\n  \"Sin-ji\",\n  \"Tessa\",\n  \"Ting-Ting\",\n  \"Victoria\",\n  \"Yuna\",\n]);\n\n/** How long to wait for `voiceschanged` before giving up on the voice list. */\nconst VOICE_LIST_TIMEOUT_MS = 300;\n\nfunction bestEffort(action: () => void): void {\n  try {\n    action();\n  } catch {}\n}\n\nexport interface WorkerChecks {\n  isWorkerInconsistent: boolean | null;\n  /** Added after the original public shape; optional for producer compatibility. */\n  isWebDriverInWorker?: boolean | null;\n  /** Added after the original public shape; optional for producer compatibility. */\n  isWorkerWebGLInconsistent?: boolean | null;\n  isCdpDetectedInWorker: boolean | null;\n}\n\ninterface WorkerNavigatorSnapshot {\n  userAgent: string;\n  platform: string;\n  webdriver?: unknown;\n  webGlVendor?: unknown;\n  webGlRenderer?: unknown;\n  cdpDetected: boolean;\n}\n\nconst EMPTY_WORKER_CHECKS: WorkerChecks = {\n  isWorkerInconsistent: null,\n  isWebDriverInWorker: null,\n  isWorkerWebGLInconsistent: null,\n  isCdpDetectedInWorker: null,\n};\n\nconst WORKER_SOURCE = `\n  const error = new Error();\n  let cdpDetected = false;\n  Object.defineProperty(error, \"stack\", {\n    get() {\n      cdpDetected = true;\n      return \"\";\n    },\n  });\n  console.debug(error);\n  let webGlVendor = null;\n  let webGlRenderer = null;\n  try {\n    if (typeof OffscreenCanvas === \"function\") {\n      const canvas = new OffscreenCanvas(1, 1);\n      const gl = canvas.getContext(\"webgl\");\n      const debugInfo = gl && gl.getExtension(\"WEBGL_debug_renderer_info\");\n      if (gl && debugInfo) {\n        const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n        const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n        webGlVendor = typeof vendor === \"string\" ? vendor : null;\n        webGlRenderer = typeof renderer === \"string\" ? renderer : null;\n      }\n    }\n  } catch {}\n  setTimeout(() => {\n    self.postMessage({\n      userAgent: navigator.userAgent,\n      platform: navigator.platform,\n      webdriver: navigator.webdriver,\n      webGlVendor,\n      webGlRenderer,\n      cdpDetected,\n    });\n  }, 0);\n`;\n\nfunction platformContradictsUserAgent(platform: string, userAgent: string): boolean {\n  if (/Android/i.test(userAgent)) {\n    return !/Android/i.test(platform);\n  }\n  if (/CrOS/i.test(userAgent)) {\n    return !/Chrome OS/i.test(platform);\n  }\n  if (/Windows/i.test(userAgent)) {\n    return !/Windows/i.test(platform);\n  }\n  if (/(?:Macintosh|Mac OS X)/i.test(userAgent)) {\n    return !/macOS/i.test(platform);\n  }\n  if (/Linux/i.test(userAgent)) {\n    return !/Linux/i.test(platform);\n  }\n\n  return false;\n}\n\n/** Detects the CDP Runtime serialization side effect used by Chromium automation. */\nexport async function checkCdpRuntime(\n  context: ExtendedWindow,\n): Promise<boolean | null> {\n  if (\n    !isChromiumBrowser(context) ||\n    typeof context.console?.debug !== \"function\"\n  ) {\n    return null;\n  }\n\n  let accessed = false;\n  const error = new Error();\n  Object.defineProperty(error, \"stack\", {\n    get() {\n      accessed = true;\n      return \"\";\n    },\n  });\n\n  try {\n    context.console.debug(error);\n    await new Promise<void>((resolve) => {\n      scheduleDetectorTask(resolve, 0);\n    });\n    return accessed;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Desktop Chromium that enumerates no media devices at all. Headless Chrome\n * ships without audio or video endpoints; a real desktop reports at least one.\n */\nexport async function checkMediaDevices(\n  context: ExtendedWindow,\n): Promise<boolean | null> {\n  const mediaDevices = context.navigator.mediaDevices;\n  if (\n    !isChromiumBrowser(context) ||\n    /Mobi|Android/i.test(context.navigator.userAgent) ||\n    typeof mediaDevices?.enumerateDevices !== \"function\"\n  ) {\n    return null;\n  }\n\n  try {\n    const devices = await mediaDevices.enumerateDevices();\n    return devices.length === 0;\n  } catch {\n    return null;\n  }\n}\n\n/** Resolves once the voice list is populated, or after a short timeout. */\nasync function readVoices(\n  synthesis: SpeechSynthesis,\n): Promise<SpeechSynthesisVoice[]> {\n  const voices = synthesis.getVoices();\n  if (voices.length > 0 || typeof synthesis.addEventListener !== \"function\") {\n    return voices;\n  }\n\n  // Chromium populates the list asynchronously on the first call.\n  await new Promise<void>((resolve) => {\n    const deadline = scheduleDetectorTask(resolve, VOICE_LIST_TIMEOUT_MS);\n    synthesis.addEventListener(\n      \"voiceschanged\",\n      () => {\n        bestEffort(() => cancelDetectorTask(deadline));\n        resolve();\n      },\n      { once: true },\n    );\n  });\n\n  return synthesis.getVoices();\n}\n\n/**\n * The installed speech voices contradict the platform the client claims.\n *\n * The voice list comes from the operating system and from the browser vendor's\n * own bundle, neither of which a User-Agent rewrite reaches. Anti-detect\n * browsers ship dedicated voice-table spoofing precisely because of this.\n */\nexport async function checkSpeechVoices(\n  context: ExtendedWindow,\n): Promise<boolean | null> {\n  const synthesis = context.speechSynthesis;\n  if (!synthesis || typeof synthesis.getVoices !== \"function\") {\n    return null;\n  }\n\n  let voices: SpeechSynthesisVoice[];\n  try {\n    voices = await readVoices(synthesis);\n  } catch {\n    return null;\n  }\n  if (voices.length === 0) {\n    return null;\n  }\n\n  const names = voices.map((voice) => voice.name);\n  const userAgent = context.navigator.userAgent;\n\n  if (!/(?:Macintosh|Mac OS X|iPhone|iPad|iPod)/i.test(userAgent)) {\n    const appleVoices = names.filter((name) => APPLE_ONLY_VOICES.has(name));\n    if (appleVoices.length >= 2) {\n      return true;\n    }\n  }\n\n  // Google's own voices come from a component that ships in branded Chrome and\n  // not in the open-source Chromium builds automation runs. Only Windows and\n  // macOS are judged: a Linux desktop can legitimately expose nothing but the\n  // local speech-dispatcher voices.\n  const claimsGoogleChrome = context.navigator.userAgentData?.brands.some(\n    (brand) => /^Google Chrome$/i.test(brand.brand),\n  );\n\n  return Boolean(\n    claimsGoogleChrome &&\n      /(?:Windows|Macintosh|Mac OS X)/i.test(userAgent) &&\n      !names.some((name) => name.startsWith(\"Google \")),\n  );\n}\n\n/** Notification.permission disagrees with navigator.permissions.query(). */\nexport async function checkNotificationPermissionConsistency(\n  context: ExtendedWindow,\n): Promise<boolean | null> {\n  const permissions = context.navigator.permissions;\n  const notification = context.Notification;\n  if (!permissions?.query || !notification) {\n    return null;\n  }\n\n  try {\n    const permission = await permissions.query({ name: \"notifications\" });\n    const expectedState: PermissionState =\n      notification.permission === \"default\"\n        ? \"prompt\"\n        : notification.permission;\n    return permission.state !== expectedState;\n  } catch {\n    return null;\n  }\n}\n\n/** High-entropy UA-CH version, mobile, or platform values contradict the UA. */\nexport async function checkHighEntropyUserAgentData(\n  context: ExtendedWindow,\n): Promise<boolean | null> {\n  const data = context.navigator.userAgentData;\n  const getHighEntropyValues = data?.getHighEntropyValues;\n  if (!data || !getHighEntropyValues) {\n    return null;\n  }\n\n  try {\n    const values = await getHighEntropyValues.call(data, [\n      \"fullVersionList\",\n      \"platform\",\n      \"platformVersion\",\n      \"architecture\",\n      \"bitness\",\n      \"model\",\n      \"formFactors\",\n    ]);\n    const userAgent = context.navigator.userAgent;\n    const uaMajor = userAgent.match(/(?:Chrome|Chromium)\\/(\\d+)/)?.[1];\n    const fullVersionMajors = values.fullVersionList\n      ?.filter((brand) => /^(?:Chromium|Google Chrome)$/i.test(brand.brand))\n      .map((brand) => brand.version.match(/^\\d+/)?.[0])\n      .filter((version): version is string => version !== undefined);\n\n    if (\n      uaMajor &&\n      fullVersionMajors &&\n      fullVersionMajors.length > 0 &&\n      fullVersionMajors.some((version) => version !== uaMajor)\n    ) {\n      return true;\n    }\n\n    if (\n      typeof values.mobile === \"boolean\" &&\n      values.mobile !== /Mobi/i.test(userAgent)\n    ) {\n      return true;\n    }\n\n    return Boolean(\n      values.platform &&\n        platformContradictsUserAgent(values.platform, userAgent),\n    );\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Worker and document describe different operating systems. Only the OS is\n * compared: everything softer is something fingerprint protection legitimately\n * rewrites in the document without rewriting it in the worker.\n */\nfunction compareWorkerSnapshot(\n  context: ExtendedWindow,\n  snapshot: WorkerNavigatorSnapshot,\n): boolean {\n  return hasRealmPersonaMismatch(context.navigator, snapshot);\n}\n\n/** Compares WebGL only when both realms expose complete unmasked identities. */\nfunction compareWorkerWebGl(\n  context: ExtendedWindow,\n  snapshot: WorkerNavigatorSnapshot,\n): boolean | null {\n  const main = readWebGlIdentity(context);\n  if (\n    !main?.vendor ||\n    !main.renderer ||\n    typeof snapshot.webGlVendor !== \"string\" ||\n    !snapshot.webGlVendor ||\n    typeof snapshot.webGlRenderer !== \"string\" ||\n    !snapshot.webGlRenderer\n  ) {\n    return null;\n  }\n\n  return (\n    snapshot.webGlVendor !== main.vendor ||\n    snapshot.webGlRenderer !== main.renderer\n  );\n}\n\n/** Compares Navigator values and the CDP side effect in a dedicated worker. */\nexport async function checkWorkerConsistency(\n  context: ExtendedWindow,\n): Promise<WorkerChecks> {\n  let workerConstructor: typeof Worker | undefined;\n  let blobConstructor: typeof Blob | undefined;\n  let urlConstructor: typeof URL | undefined;\n  let createObjectUrl: typeof URL.createObjectURL | undefined;\n  let revokeObjectUrl: typeof URL.revokeObjectURL | undefined;\n  try {\n    workerConstructor = context.Worker;\n    blobConstructor = context.Blob;\n    urlConstructor = context.URL;\n    createObjectUrl = urlConstructor?.createObjectURL;\n    revokeObjectUrl = urlConstructor?.revokeObjectURL;\n  } catch {\n    return EMPTY_WORKER_CHECKS;\n  }\n  if (\n    !workerConstructor ||\n    !blobConstructor ||\n    !urlConstructor ||\n    typeof createObjectUrl !== \"function\"\n  ) {\n    return EMPTY_WORKER_CHECKS;\n  }\n\n  let objectUrl: string;\n  try {\n    const blob = new blobConstructor([WORKER_SOURCE], {\n      type: \"text/javascript\",\n    });\n    objectUrl = createObjectUrl.call(urlConstructor, blob);\n  } catch {\n    return EMPTY_WORKER_CHECKS;\n  }\n\n  let worker: Worker;\n  try {\n    worker = new workerConstructor(objectUrl);\n  } catch {\n    bestEffort(() => {\n      revokeObjectUrl?.call(urlConstructor, objectUrl);\n    });\n    return EMPTY_WORKER_CHECKS;\n  }\n\n  return new Promise((resolve) => {\n    let settled = false;\n    let deadline: ReturnType<typeof scheduleDetectorTask> | undefined;\n    const finish = (result: WorkerChecks) => {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      bestEffort(() => cancelDetectorTask(deadline));\n      bestEffort(() => {\n        worker.onmessage = null;\n      });\n      bestEffort(() => {\n        worker.onerror = null;\n      });\n      bestEffort(() => {\n        worker.terminate();\n      });\n      bestEffort(() => {\n        revokeObjectUrl?.call(urlConstructor, objectUrl);\n      });\n      resolve(result);\n    };\n    try {\n      deadline = scheduleDetectorTask(\n        () => finish(EMPTY_WORKER_CHECKS),\n        500,\n      );\n      worker.onmessage = (event: MessageEvent<WorkerNavigatorSnapshot>) => {\n        try {\n          const snapshot = event.data;\n          if (!snapshot || typeof snapshot !== \"object\") {\n            finish(EMPTY_WORKER_CHECKS);\n            return;\n          }\n          finish({\n            isWorkerInconsistent: compareWorkerSnapshot(context, snapshot),\n            isWebDriverInWorker:\n              snapshot.webdriver === true\n                ? true\n                : snapshot.webdriver === false\n                  ? false\n                  : null,\n            isWorkerWebGLInconsistent: compareWorkerWebGl(context, snapshot),\n            isCdpDetectedInWorker:\n              isChromiumBrowser(context) &&\n              typeof snapshot.cdpDetected === \"boolean\"\n                ? snapshot.cdpDetected\n                : null,\n          });\n        } catch {\n          finish(EMPTY_WORKER_CHECKS);\n        }\n      };\n      worker.onerror = () => finish(EMPTY_WORKER_CHECKS);\n    } catch {\n      finish(EMPTY_WORKER_CHECKS);\n    }\n  });\n}\n","export type ScriptingUserAgentKind = \"curl\" | \"python\" | \"go\" | \"java\";\n\nconst SCRIPTING_USER_AGENT_PATTERNS: Array<{\n  kind: ScriptingUserAgentKind;\n  pattern: RegExp;\n}> = [\n  {\n    kind: \"curl\",\n    pattern: /(?:^|[\\s;(])curl\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"python\",\n    pattern:\n      /(?:^|[\\s;(])(?:python-requests|urllib3|python-urllib|aiohttp|httpx)\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"go\",\n    pattern: /(?:^|[\\s;(])Go-http-client\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"java\",\n    pattern:\n      /(?:^|[\\s;(])(?:Java|Java-http-client|Apache-HttpClient|okhttp)\\/\\d+(?:[._]\\d+)*(?=$|[\\s;)])/i,\n  },\n];\n\nexport type BotUserAgentKind =\n  | \"crawler\"\n  | \"http-client\"\n  | \"browser-automation\"\n  | \"playwright\"\n  | \"puppeteer\"\n  | \"selenium\"\n  | \"phantomjs\";\n\nconst BOT_USER_AGENT_PATTERNS: Array<{\n  kind: BotUserAgentKind;\n  pattern: RegExp;\n}> = [\n  {\n    kind: \"crawler\",\n    pattern:\n      /(?:^|[\\s;(])(?:Googlebot(?:-[A-Za-z]+)?|Google-InspectionTool|GoogleOther(?:-[A-Za-z]+)?|bingbot|Baiduspider|YandexBot|DuckDuckBot|Applebot|PetalBot|AhrefsBot|SemrushBot|GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Amazonbot|Bytespider|CCBot|PerplexityBot|YouBot|facebookexternalhit|Twitterbot)\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"crawler\",\n    pattern:\n      /(?:^|[\\s;(])(?:AdsBot-Google(?:-Mobile)?|GoogleOther(?:-[A-Za-z]+)?)(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"http-client\",\n    pattern: /(?:^|[\\s;(])Wget\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"browser-automation\",\n    pattern: /(?:^|[\\s;(])HeadlessChrome\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"playwright\",\n    pattern: /(?:^|[\\s;(])Playwright\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"puppeteer\",\n    pattern: /(?:^|[\\s;(])Puppeteer\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"selenium\",\n    pattern: /(?:^|[\\s;(])Selenium\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n  {\n    kind: \"phantomjs\",\n    pattern: /(?:^|[\\s;(])(?:PhantomJS|SlimerJS)\\/\\d+(?:\\.\\d+)*(?=$|[\\s;)])/i,\n  },\n];\n\n/** Scripting HTTP client claimed by a well-formed User-Agent product token. */\nexport function getScriptingUserAgentKind(\n  userAgent: string,\n): ScriptingUserAgentKind | null {\n  return (\n    SCRIPTING_USER_AGENT_PATTERNS.find(({ pattern }) => pattern.test(userAgent))\n      ?.kind ?? null\n  );\n}\n\n/** Conservative known crawler, HTTP client, or browser-automation UA token. */\nexport function isBotUserAgent(userAgent: string | undefined): boolean {\n  return getBotUserAgentKind(userAgent) !== null;\n}\n\n/** Family claimed by a conservative bot or automation product token. */\nexport function getBotUserAgentKind(\n  userAgent: string | undefined,\n): BotUserAgentKind | null {\n  if (!userAgent) {\n    return null;\n  }\n\n  return (\n    BOT_USER_AGENT_PATTERNS.find(({ pattern }) => pattern.test(userAgent))\n      ?.kind ?? null\n  );\n}\n","import {\n  createAutomationAssessment,\n  type AutomationAssessment,\n  type AutomationKind,\n} from \"./automation.js\";\nimport {\n  checkCdpRuntime,\n  checkHighEntropyUserAgentData,\n  checkMediaDevices,\n  checkNotificationPermissionConsistency,\n  checkSpeechVoices,\n  checkWorkerConsistency,\n} from \"./asyncChecks.js\";\nimport {\n  getPropertySafely,\n  hasWebGlContext,\n  isCanvasNoiseInjected,\n  isCanvasTampered,\n  isChromeDriver,\n  isDefaultAutomationViewport,\n  isEmptyPlugins,\n  isEngineInconsistent,\n  isErrorStackAutomation,\n  isGpuPlatformMismatch,\n  isIframeInconsistent,\n  isLanguageInconsistent,\n  isLegacyAutomationArtifacts,\n  isMediaQueryInconsistent,\n  isMissingChromeObject,\n  isMissingGreaseBrand,\n  isMissingProprietaryCodecs,\n  isNativeFunctionTampered,\n  isNavigatorIdentityInconsistent,\n  isPlaywright,\n  isPluginArrayInconsistent,\n  isPluginMimeTypeInconsistent,\n  isPuppeteer,\n  isScreenGeometryInconsistent,\n  isSoftwareRenderer,\n  isSeleniumDocumentArtifacts,\n  isSuspiciousHardware,\n  isSuspiciousWebDriverDescriptor,\n  isSuspiciousWindowDimensions,\n  isTimezoneInconsistent,\n  isUserAgentDataMismatch,\n  isZeroConnectionRtt,\n} from \"./checks.js\";\nimport type {\n  ExtendedWindow,\n  InstantAsyncChecks,\n  InstantClientAsyncResult,\n  InstantClientResult,\n  InstantConfidenceLevel,\n  InstantDetectorOptions,\n  InstantSignal,\n  InstantSignalChecks,\n} from \"./types.js\";\nimport {\n  getBotUserAgentKind,\n  getScriptingUserAgentKind,\n  isBotUserAgent,\n} from \"./userAgent.js\";\nimport { checkShaderF16Support, isChromiumBrowser } from \"./webgpu.js\";\n\nconst DEFAULT_SCORE_THRESHOLD = 0.5;\n\n/**\n * Minimum \"modern\" browser versions. Bump these as the baseline moves —\n * anything below is flagged (softly) as an outdated or spoofed build.\n */\nconst MODERN_BROWSER_FLOORS = {\n  chrome: 121,\n  firefox: 128,\n  safari: 16.4,\n} as const;\n\ntype BooleanChecks = Omit<\n  InstantClientResult,\n  | \"isChromium\"\n  | \"suspicionScore\"\n  | \"confidence\"\n  | \"signals\"\n  | \"isLegitClient\"\n  | \"automation\"\n>;\n\ninterface InstantSignalSpec {\n  id: keyof BooleanChecks;\n  description: string;\n  weight: number;\n  confidence: InstantConfidenceLevel;\n  /** Positive-health flags (valid UA, WebGL, modern) trigger when the value is `false` */\n  triggerWhenFalse?: boolean;\n}\n\n/**\n * Weighted instant checks. Definitive automation markers weigh 0.9–1.0 and\n * block on their own; ambiguous checks that also fire on legitimate clients\n * (in-app browsers, F11 fullscreen, GPU-less VMs, older builds) weigh 0.25–0.45\n * so they only cross the default 0.5 threshold in combination.\n */\nconst INSTANT_SIGNAL_SPECS: InstantSignalSpec[] = [\n  { id: \"isWebDriver\", description: \"navigator.webdriver is set\", weight: 1, confidence: \"high\" },\n  { id: \"isPlaywright\", description: \"Playwright bindings or init-script artifacts present\", weight: 1, confidence: \"high\" },\n  { id: \"isPuppeteer\", description: \"Puppeteer bindings or evaluation artifacts present\", weight: 1, confidence: \"high\" },\n  { id: \"isChromeDriver\", description: \"ChromeDriver or WebDriver cache artifacts present\", weight: 1, confidence: \"high\" },\n  { id: \"isAutomationArtifacts\", description: \"Framework, legacy automation, or embedded-runtime artifacts present\", weight: 0.35, confidence: \"low\" },\n  { id: \"isSelenium\", description: \"Selenium markers on document\", weight: 1, confidence: \"high\" },\n  { id: \"isPhantomJS\", description: \"PhantomJS globals present\", weight: 1, confidence: \"high\" },\n  { id: \"isNightmare\", description: \"Nightmare.js marker present\", weight: 1, confidence: \"high\" },\n  { id: \"isDomAutomation\", description: \"DOM automation controller globals present\", weight: 1, confidence: \"high\" },\n  { id: \"isHeadless\", description: \"HeadlessChrome user agent/appVersion or webdriver flag\", weight: 0.9, confidence: \"high\" },\n  { id: \"isSuspiciousWebDriverDescriptor\", description: \"navigator.webdriver descriptor was tampered with\", weight: 0.9, confidence: \"high\" },\n  { id: \"isSuspiciousResolution\", description: \"Screen smaller than any real device\", weight: 0.7, confidence: \"medium\" },\n  { id: \"isUserAgentValid\", description: \"User agent is malformed or identifies a known bot, scripting, or automation client\", weight: 0.7, confidence: \"high\", triggerWhenFalse: true },\n  { id: \"isSoftwareRenderer\", description: \"WebGL uses a software renderer (SwiftShader/llvmpipe)\", weight: 0.6, confidence: \"medium\" },\n  { id: \"isUserAgentDataMismatch\", description: \"User-Agent conflicts with Client Hints\", weight: 0.65, confidence: \"high\" },\n  { id: \"isNativeFunctionTampered\", description: \"Native browser functions or Navigator getters were patched\", weight: 0.8, confidence: \"high\" },\n  { id: \"isNavigatorIdentityInconsistent\", description: \"Navigator vendor/platform/product/touch claims conflict with the User-Agent\", weight: 0.65, confidence: \"high\" },\n  { id: \"isPluginArrayInconsistent\", description: \"Plugin or MIME-type arrays have non-native prototypes\", weight: 0.65, confidence: \"high\" },\n  { id: \"isIframeInconsistent\", description: \"A fresh iframe hands back the page's own realm, or disagrees about navigator.webdriver\", weight: 0.8, confidence: \"high\" },\n  { id: \"isErrorStackAutomation\", description: \"Error stack contains an automation source marker\", weight: 0.85, confidence: \"high\" },\n  { id: \"isEngineInconsistent\", description: \"JavaScript engine identity conflicts with the browser the User-Agent claims\", weight: 0.8, confidence: \"high\" },\n  { id: \"isGpuPlatformMismatch\", description: \"WebGL renderer names a graphics backend the claimed platform cannot run\", weight: 0.6, confidence: \"high\" },\n  { id: \"isMediaQueryInconsistent\", description: \"The CSS resolution query contradicts the reported devicePixelRatio\", weight: 0.5, confidence: \"medium\" },\n  { id: \"isLanguageInconsistent\", description: \"Navigator language values are inconsistent\", weight: 0.45, confidence: \"medium\" },\n  { id: \"isScreenGeometryInconsistent\", description: \"Screen reports impossible geometry or colour depth\", weight: 0.45, confidence: \"medium\" },\n  { id: \"isTimezoneInconsistent\", description: \"The resolved IANA time zone contradicts the UTC offset Date reports\", weight: 0.5, confidence: \"medium\" },\n  { id: \"isMissingProprietaryCodecs\", description: \"Chromium build without H.264 support (unbranded automation build)\", weight: 0.4, confidence: \"low\" },\n  { id: \"isMissingGreaseBrand\", description: \"Client Hints brands omit the GREASE entry every Chromium build injects\", weight: 0.4, confidence: \"medium\" },\n  { id: \"isCanvasNoiseInjected\", description: \"Two identical canvas renders read back differently\", weight: 0.35, confidence: \"medium\" },\n  { id: \"isPluginMimeTypeInconsistent\", description: \"Plugin and MIME-type arrays are inconsistent\", weight: 0.45, confidence: \"medium\" },\n  { id: \"isMissingChromeObject\", description: \"Chromium user agent without window.chrome\", weight: 0.35, confidence: \"low\" },\n  { id: \"isWebGLSupported\", description: \"No WebGL context available\", weight: 0.35, confidence: \"low\", triggerWhenFalse: true },\n  { id: \"isSuspiciousWindowDimensions\", description: \"Window has zero outer size or no browser chrome at the screen origin\", weight: 0.3, confidence: \"low\" },\n  { id: \"isModern\", description: \"Browser build is below the modern baseline\", weight: 0.3, confidence: \"low\", triggerWhenFalse: true },\n  { id: \"isEmptyPlugins\", description: \"Desktop Chromium with an empty plugin list\", weight: 0.25, confidence: \"low\" },\n  { id: \"isSuspiciousHardware\", description: \"CPU and device-memory values are implausible or contradictory\", weight: 0.3, confidence: \"low\" },\n  { id: \"isZeroConnectionRtt\", description: \"Network Information reports a zero RTT outside Android\", weight: 0.2, confidence: \"low\" },\n  { id: \"isDefaultAutomationViewport\", description: \"Screen or viewport matches a common automation default\", weight: 0.2, confidence: \"low\" },\n  { id: \"isCanvasTampered\", description: \"A deterministic canvas pixel was modified on readback\", weight: 0.2, confidence: \"low\" },\n];\n\ninterface AsyncSignalSpec {\n  id: keyof InstantAsyncChecks;\n  description: string;\n  weight: number;\n  confidence: InstantConfidenceLevel;\n  triggerWhenFalse?: boolean;\n}\n\nconst INSTANT_ASYNC_SIGNAL_SPECS: AsyncSignalSpec[] = [\n  { id: \"isShaderF16Supported\", description: \"WebGPU shader-f16 feature is missing on Chromium\", weight: 0.3, confidence: \"low\", triggerWhenFalse: true },\n  { id: \"isCdpDetected\", description: \"Chrome DevTools Protocol serialized an Error object\", weight: 0.25, confidence: \"medium\" },\n  { id: \"isNotificationPermissionInconsistent\", description: \"Notification and Permissions API states contradict\", weight: 0.55, confidence: \"high\" },\n  { id: \"isHighEntropyUserAgentDataMismatch\", description: \"High-entropy Client Hints conflict with the User-Agent\", weight: 0.65, confidence: \"high\" },\n  { id: \"isWorkerInconsistent\", description: \"The worker realm names a different operating system than the page\", weight: 0.8, confidence: \"high\" },\n  { id: \"isWebDriverInWorker\", description: \"Worker navigator exposes webdriver\", weight: 0.9, confidence: \"high\" },\n  { id: \"isWorkerWebGLInconsistent\", description: \"Worker and page WebGL identities disagree\", weight: 0.35, confidence: \"medium\" },\n  { id: \"isCdpDetectedInWorker\", description: \"Chrome DevTools Protocol serialized an Error inside a worker\", weight: 0.25, confidence: \"medium\" },\n  { id: \"isMissingMediaDevices\", description: \"Desktop Chromium enumerated no audio or video devices\", weight: 0.3, confidence: \"low\" },\n  { id: \"isVoiceListInconsistent\", description: \"Installed speech voices contradict the claimed platform or browser brand\", weight: 0.35, confidence: \"medium\" },\n];\n\nfunction parseBrowserVersion(userAgent: string, pattern: RegExp): number {\n  const match = userAgent.match(pattern);\n  return parseFloat(match?.[1] ?? \"0\");\n}\n\nfunction hasTruthyProperty(target: object, properties: string[]): boolean {\n  return properties.some((property) =>\n    Boolean(getPropertySafely(target, property)),\n  );\n}\n\nfunction detectSync(context: ExtendedWindow): BooleanChecks {\n  // Inspired by Cloudflare https://scrapeops.io/web-scraping-playbook/how-to-bypass-cloudflare/#low-level-bypass\n  const isWebDriver = Boolean(\n    getPropertySafely(context.navigator, \"webdriver\"),\n  );\n  const isPhantomJS = hasTruthyProperty(context, [\"callPhantom\", \"_phantom\"]);\n  const isNightmare = Boolean(getPropertySafely(context, \"__nightmare\"));\n  const isSelenium =\n    hasTruthyProperty(context, [\n      \"_Selenium_IDE_Recorder\",\n      \"_selenium\",\n      \"calledSelenium\",\n      \"callSelenium\",\n    ]) ||\n    isSeleniumDocumentArtifacts(context);\n  const isDomAutomation = hasTruthyProperty(context, [\n    \"domAutomation\",\n    \"domAutomationController\",\n  ]);\n  const isPlaywrightClient = isPlaywright(context);\n  const isPuppeteerClient = isPuppeteer(context);\n  const isChromeDriverClient = isChromeDriver(context);\n  const hasAutomationArtifacts =\n    isPlaywrightClient ||\n    isPuppeteerClient ||\n    isChromeDriverClient ||\n    isLegacyAutomationArtifacts(context);\n\n  // Custom checks by okasi\n  const isHeadless = Boolean(\n    isWebDriver ||\n      context.navigator.userAgent.includes(\"Headless\") ||\n      context.navigator.appVersion?.includes(\"Headless\") ||\n      context.navigator.userAgentData?.brands.some((brand) =>\n        /Headless/i.test(brand.brand),\n      ),\n  );\n  const isSuspiciousResolution =\n    context.screen.width < 136 || context.screen.height < 170; // Apple Watch Series 3 (38mm)\n  const isUserAgentValid =\n    context.navigator.userAgent.startsWith(\"Mozilla/5.0 (\") &&\n    getScriptingUserAgentKind(context.navigator.userAgent) === null &&\n    !isBotUserAgent(context.navigator.userAgent);\n  const isWebGLSupported = hasWebGlContext(context);\n\n  const userAgent = context.navigator.userAgent;\n  const isModern =\n    (userAgent.includes(\"Chrome/\") &&\n      parseBrowserVersion(userAgent, /Chrome\\/(\\d+\\.\\d+)/) >=\n        MODERN_BROWSER_FLOORS.chrome) ||\n    (userAgent.includes(\"Firefox/\") &&\n      parseBrowserVersion(userAgent, /Firefox\\/(\\d+\\.\\d+)/) >=\n        MODERN_BROWSER_FLOORS.firefox) ||\n    (userAgent.includes(\"Safari\") &&\n      !userAgent.includes(\"Chrome\") &&\n      parseBrowserVersion(userAgent, /Version\\/(\\d+\\.\\d+)/) >=\n        MODERN_BROWSER_FLOORS.safari);\n\n  return {\n    isWebDriver,\n    isPhantomJS,\n    isNightmare,\n    isSelenium,\n    isDomAutomation,\n    isHeadless,\n    isSuspiciousResolution,\n    isUserAgentValid,\n    isWebGLSupported,\n    isModern,\n    isMissingChromeObject: isMissingChromeObject(context),\n    isSoftwareRenderer: isSoftwareRenderer(context),\n    isSuspiciousWindowDimensions: isSuspiciousWindowDimensions(context),\n    isEmptyPlugins: isEmptyPlugins(context),\n    isAutomationArtifacts: hasAutomationArtifacts,\n    isPlaywright: isPlaywrightClient,\n    isPuppeteer: isPuppeteerClient,\n    isChromeDriver: isChromeDriverClient,\n    isSuspiciousWebDriverDescriptor: isSuspiciousWebDriverDescriptor(context),\n    isUserAgentDataMismatch: isUserAgentDataMismatch(context),\n    isLanguageInconsistent: isLanguageInconsistent(context),\n    isPluginMimeTypeInconsistent: isPluginMimeTypeInconsistent(context),\n    isNativeFunctionTampered: isNativeFunctionTampered(context),\n    isNavigatorIdentityInconsistent: isNavigatorIdentityInconsistent(context),\n    isPluginArrayInconsistent: isPluginArrayInconsistent(context),\n    isIframeInconsistent: isIframeInconsistent(context),\n    isErrorStackAutomation: isErrorStackAutomation(context),\n    isDefaultAutomationViewport: isDefaultAutomationViewport(context),\n    isSuspiciousHardware: isSuspiciousHardware(context),\n    isZeroConnectionRtt: isZeroConnectionRtt(context),\n    isCanvasTampered: isCanvasTampered(context),\n    isEngineInconsistent: isEngineInconsistent(context),\n    isGpuPlatformMismatch: isGpuPlatformMismatch(context),\n    isMediaQueryInconsistent: isMediaQueryInconsistent(context),\n    isScreenGeometryInconsistent: isScreenGeometryInconsistent(context),\n    isMissingProprietaryCodecs: isMissingProprietaryCodecs(context),\n    isCanvasNoiseInjected: isCanvasNoiseInjected(context),\n    isTimezoneInconsistent: isTimezoneInconsistent(context),\n    isMissingGreaseBrand: isMissingGreaseBrand(context),\n  };\n}\n\nfunction createSignal(\n  id: string,\n  description: string,\n  triggered: boolean,\n  weight: number,\n  confidence: InstantConfidenceLevel,\n): InstantSignal {\n  return { id, description, triggered, weight, confidence, score: triggered ? weight : 0 };\n}\n\n/**\n * Builds the weighted instant signal list from the boolean checks. Pass\n * `asyncChecks` to include async-only WebGPU, CDP, permission, Client\n * Hints, and worker signals. `null`/`undefined` values are omitted.\n * @internal\n */\nexport function buildInstantSignals(\n  checks: InstantSignalChecks,\n  asyncChecks?: Partial<InstantAsyncChecks> | boolean | null,\n): InstantSignal[] {\n  const resolvedAsyncChecks =\n    typeof asyncChecks === \"boolean\"\n      ? { isShaderF16Supported: asyncChecks }\n      : asyncChecks;\n  const signals = INSTANT_SIGNAL_SPECS.map((spec) => {\n    const value = checks[spec.id] ?? false;\n    const triggered = spec.triggerWhenFalse ? !value : value;\n    return createSignal(spec.id, spec.description, triggered, spec.weight, spec.confidence);\n  });\n\n  let hasCdpSignal = false;\n  for (const spec of INSTANT_ASYNC_SIGNAL_SPECS) {\n    const isCdpSignal =\n      spec.id === \"isCdpDetected\" || spec.id === \"isCdpDetectedInWorker\";\n    if (isCdpSignal && hasCdpSignal) {\n      continue;\n    }\n    const value = resolvedAsyncChecks?.[spec.id];\n    if (value === null || value === undefined) {\n      continue;\n    }\n    const triggered = spec.triggerWhenFalse ? !value : value;\n    if (triggered) {\n      if (isCdpSignal) {\n        hasCdpSignal = true;\n      }\n      signals.push(\n        createSignal(\n          spec.id,\n          spec.description,\n          true,\n          spec.weight,\n          spec.confidence,\n        ),\n      );\n    }\n  }\n\n  return signals;\n}\n\nfunction classifyInstantAutomation(\n  checks: BooleanChecks,\n  isChromium: boolean,\n  confidence: InstantConfidenceLevel,\n  userAgent: string,\n  signals: InstantSignal[],\n): AutomationAssessment {\n  const exactUaKind: AutomationKind | null =\n    getScriptingUserAgentKind(userAgent);\n  if (checks.isPlaywright) {\n    return createAutomationAssessment(true, \"playwright\", \"medium\", [\n      \"Playwright binding or init-script artifact present\",\n    ]);\n  }\n  if (checks.isPuppeteer) {\n    return createAutomationAssessment(true, \"puppeteer\", \"medium\", [\n      \"Puppeteer evaluation artifact present\",\n    ]);\n  }\n  if (checks.isSelenium) {\n    return createAutomationAssessment(true, \"selenium\", \"medium\", [\n      \"Selenium document artifact present\",\n    ]);\n  }\n  if (checks.isChromeDriver) {\n    return createAutomationAssessment(\n      true,\n      \"browser-automation\",\n      \"medium\",\n      [\"ChromeDriver artifact present\"],\n      [\"selenium\"],\n    );\n  }\n  if (checks.isPhantomJS) {\n    return createAutomationAssessment(true, \"phantomjs\", \"medium\", [\n      \"PhantomJS global present\",\n    ]);\n  }\n  if (checks.isNightmare) {\n    return createAutomationAssessment(true, \"nightmare\", \"medium\", [\n      \"Nightmare.js global present\",\n    ]);\n  }\n\n  if (exactUaKind) {\n    return createAutomationAssessment(\n      true,\n      exactUaKind,\n      \"medium\",\n      [`User-Agent claims ${exactUaKind}`],\n      isChromium ? [\"browser-automation\"] : [],\n    );\n  }\n\n  const botUaKind = getBotUserAgentKind(userAgent);\n  if (botUaKind) {\n    const automationKind: AutomationKind =\n      botUaKind === \"crawler\" || botUaKind === \"http-client\"\n        ? \"unknown\"\n        : botUaKind;\n    const alternatives =\n      botUaKind === \"browser-automation\" && isChromium\n        ? [\"patchright\", \"playwright\", \"puppeteer\", \"selenium\"] as const\n        : [];\n    return createAutomationAssessment(\n      true,\n      automationKind,\n      \"high\",\n      [`User-Agent claims ${botUaKind}`],\n      [...alternatives],\n    );\n  }\n\n  const attributionSignalIds = new Set([\n    \"isWebDriver\",\n    \"isWebDriverInWorker\",\n    \"isDomAutomation\",\n    \"isHeadless\",\n    \"isSuspiciousWebDriverDescriptor\",\n  ]);\n  const evidence = signals\n    .filter(\n      (signal) => signal.triggered && attributionSignalIds.has(signal.id),\n    )\n    .map((signal) => signal.description);\n\n  const isBrowserAutomationPattern =\n    checks.isWebDriver ||\n    signals.some(\n      (signal) => signal.id === \"isWebDriverInWorker\" && signal.triggered,\n    ) ||\n    checks.isDomAutomation ||\n    checks.isHeadless ||\n    checks.isSuspiciousWebDriverDescriptor;\n\n  if (isBrowserAutomationPattern) {\n    const alternatives =\n      checks.isHeadless &&\n      !checks.isWebDriver &&\n      !checks.isDomAutomation &&\n      !checks.isSuspiciousWebDriverDescriptor &&\n      isChromium\n        ? [\"patchright\", \"playwright\", \"puppeteer\", \"selenium\"] as const\n        : [\"playwright\", \"puppeteer\", \"selenium\"] as const;\n    return createAutomationAssessment(\n      true,\n      \"browser-automation\",\n      confidence,\n      evidence,\n      [...alternatives],\n    );\n  }\n\n  return createAutomationAssessment(false, \"unknown\", \"low\", []);\n}\n\n/**\n * Aggregates triggered instant signal weights as `1 - Π(1 - weightᵢ)`.\n * @internal\n */\nexport function aggregateInstantSuspicionScore(signals: InstantSignal[]): number {\n  let keep = 1;\n  for (const signal of signals) {\n    if (signal.triggered) {\n      keep *= 1 - signal.weight;\n    }\n  }\n  return 1 - keep;\n}\n\n/**\n * Confidence in the verdict based on high-confidence hits and the score.\n * @internal\n */\nexport function resolveInstantConfidence(\n  signals: InstantSignal[],\n  suspicionScore: number,\n): InstantConfidenceLevel {\n  const triggeredHigh = signals.filter(\n    (signal) => signal.triggered && signal.confidence === \"high\",\n  ).length;\n\n  if (triggeredHigh >= 1 || suspicionScore >= 0.7) {\n    return \"high\";\n  }\n\n  if (suspicionScore >= 0.35) {\n    return \"medium\";\n  }\n\n  return \"low\";\n}\n\nfunction assemble(\n  checks: BooleanChecks,\n  isChromium: boolean,\n  scoreThreshold: number,\n  userAgent: string,\n  asyncChecks?: Partial<InstantAsyncChecks>,\n): InstantClientResult {\n  const signals = buildInstantSignals(checks, asyncChecks);\n  const suspicionScore = aggregateInstantSuspicionScore(signals);\n  const confidence = resolveInstantConfidence(signals, suspicionScore);\n  const isLegitClient = suspicionScore < scoreThreshold;\n\n  return {\n    ...checks,\n    isChromium,\n    suspicionScore,\n    confidence,\n    signals,\n    isLegitClient,\n    automation: classifyInstantAutomation(\n      checks,\n      isChromium,\n      confidence,\n      userAgent,\n      signals,\n    ),\n  };\n}\n\n/**\n * Instant environment checks (automation, headless, UA, WebGL, etc.), scored\n * into a weighted `suspicionScore`. For Chromium WebGPU `shader-f16`\n * validation, use {@link detectInstantClientAsync}.\n */\nexport function detectInstantClient(\n  context: ExtendedWindow,\n  options: InstantDetectorOptions = {},\n): InstantClientResult {\n  const scoreThreshold = options.scoreThreshold ?? DEFAULT_SCORE_THRESHOLD;\n  const checks = detectSync(context);\n  const isChromium = isChromiumBrowser(context);\n\n  return assemble(\n    checks,\n    isChromium,\n    scoreThreshold,\n    context.navigator.userAgent,\n  );\n}\n\n/**\n * Instant checks plus async WebGPU, CDP, permissions, high-entropy Client\n * Hints, and worker-realm consistency checks.\n */\nexport async function detectInstantClientAsync(\n  context: ExtendedWindow,\n  options: InstantDetectorOptions = {},\n): Promise<InstantClientAsyncResult> {\n  const scoreThreshold = options.scoreThreshold ?? DEFAULT_SCORE_THRESHOLD;\n  const checks = detectSync(context);\n  const isChromium = isChromiumBrowser(context);\n  const [\n    shaderF16Supported,\n    isCdpDetected,\n    isNotificationPermissionInconsistent,\n    isHighEntropyUserAgentDataMismatch,\n    isMissingMediaDevices,\n    isVoiceListInconsistent,\n    workerChecks,\n  ] = await Promise.all([\n    isChromium ? checkShaderF16Support(context) : Promise.resolve(null),\n    checkCdpRuntime(context),\n    checkNotificationPermissionConsistency(context),\n    checkHighEntropyUserAgentData(context),\n    checkMediaDevices(context),\n    checkSpeechVoices(context),\n    checkWorkerConsistency(context),\n  ]);\n  const asyncChecks: InstantAsyncChecks = {\n    isShaderF16Supported: shaderF16Supported,\n    isCdpDetected,\n    isNotificationPermissionInconsistent,\n    isHighEntropyUserAgentDataMismatch,\n    isMissingMediaDevices,\n    isVoiceListInconsistent,\n    ...workerChecks,\n  };\n\n  return {\n    ...assemble(\n      checks,\n      isChromium,\n      scoreThreshold,\n      context.navigator.userAgent,\n      asyncChecks,\n    ),\n    ...asyncChecks,\n  };\n}\n\n/**\n * Returns `true` if the client looks human according to instant checks\n * (i.e. `detectInstantClient(...).isLegitClient`).\n *\n * This is the simplest entry point from the `bot-signal` package for most browser use cases.\n */\nexport function isHuman(\n  context: ExtendedWindow,\n  options: InstantDetectorOptions = {},\n): boolean {\n  return detectInstantClient(context, options).isLegitClient;\n}\n\n/**\n * Async version that adds WebGPU, CDP, permissions, high-entropy Client Hints,\n * and worker-realm consistency checks.\n */\nexport async function isHumanAsync(\n  context: ExtendedWindow,\n  options: InstantDetectorOptions = {},\n): Promise<boolean> {\n  const result = await detectInstantClientAsync(context, options);\n  return result.isLegitClient;\n}\n\nexport {\n  isAutomationArtifacts,\n  isCanvasNoiseInjected,\n  isCanvasTampered,\n  isChromeDriver,\n  isDefaultAutomationViewport,\n  isEmptyPlugins,\n  isEngineInconsistent,\n  isErrorStackAutomation,\n  isGpuPlatformMismatch,\n  isIframeInconsistent,\n  isLanguageInconsistent,\n  isMediaQueryInconsistent,\n  isMissingChromeObject,\n  isMissingGreaseBrand,\n  isMissingProprietaryCodecs,\n  isNativeFunctionTampered,\n  isNavigatorIdentityInconsistent,\n  isPlaywright,\n  isPluginArrayInconsistent,\n  isPluginMimeTypeInconsistent,\n  isPuppeteer,\n  isScreenGeometryInconsistent,\n  isSoftwareRenderer,\n  isSuspiciousHardware,\n  isSuspiciousWebDriverDescriptor,\n  isSuspiciousWindowDimensions,\n  isTimezoneInconsistent,\n  isUserAgentDataMismatch,\n  isZeroConnectionRtt,\n} from \"./checks.js\";\nexport {\n  checkCdpRuntime,\n  checkHighEntropyUserAgentData,\n  checkMediaDevices,\n  checkNotificationPermissionConsistency,\n  checkSpeechVoices,\n  checkWorkerConsistency,\n} from \"./asyncChecks.js\";\nexport type { WorkerChecks } from \"./asyncChecks.js\";\nexport type {\n  AutomationAssessment,\n  AutomationConfidence,\n  AutomationKind,\n} from \"./automation.js\";\nexport { isBotUserAgent } from \"./userAgent.js\";\nexport { checkShaderF16Support, isChromiumBrowser } from \"./webgpu.js\";\n","const MINUTES_PER_HOUR = 60;\n\n/** Current UTC offset in minutes for an IANA timezone, or `null` when unknown. */\nexport function getTimezoneOffsetMinutes(\n  timeZone: string,\n  at: Date = new Date(),\n): number | null {\n  try {\n    const formatter = new Intl.DateTimeFormat(\"en-US\", {\n      timeZone,\n      timeZoneName: \"shortOffset\",\n    });\n    const parts = formatter.formatToParts(at);\n    const offsetPart = parts.find((part) => part.type === \"timeZoneName\")?.value;\n\n    if (!offsetPart) {\n      return null;\n    }\n\n    const match = offsetPart.match(/GMT([+-])(\\d{1,2})(?::?(\\d{2}))?/);\n    if (!match) {\n      return offsetPart === \"GMT\" ? 0 : null;\n    }\n\n    const sign = match[1] === \"-\" ? -1 : 1;\n    const hours = Number(match[2]);\n    const minutes = Number(match[3] ?? \"0\");\n\n    return sign * (hours * MINUTES_PER_HOUR + minutes);\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Whether the client-reported timezone disagrees with the GeoIP timezone by\n * more than `toleranceMinutes` of UTC offset. Different zone names with the\n * same offset (e.g. `Europe/Paris` vs `Europe/Berlin`) do not mismatch.\n */\nexport function isTimezoneMismatch(\n  ipTimezone: string | undefined,\n  clientTimezone: string | undefined,\n  toleranceMinutes = 60,\n): boolean {\n  if (!ipTimezone || !clientTimezone) {\n    return false;\n  }\n\n  if (ipTimezone === clientTimezone) {\n    return false;\n  }\n\n  const ipOffset = getTimezoneOffsetMinutes(ipTimezone);\n  const clientOffset = getTimezoneOffsetMinutes(clientTimezone);\n\n  if (ipOffset === null || clientOffset === null) {\n    return false;\n  }\n\n  return Math.abs(ipOffset - clientOffset) > toleranceMinutes;\n}\n\nconst ACCEPT_LANGUAGE_Q_VALUE = /^(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/;\n\n/** Quality (`q`) parameter from an Accept-Language item; invalid q-values mean not usable. */\nfunction getAcceptLanguageQuality(parameters: string[]): number {\n  const qualityParameter = parameters\n    .map((parameter) => parameter.trim())\n    .find((parameter) => parameter.toLowerCase().startsWith(\"q=\"));\n\n  if (!qualityParameter) {\n    return 1;\n  }\n\n  const qualityText = qualityParameter.slice(2).trim();\n\n  return ACCEPT_LANGUAGE_Q_VALUE.test(qualityText) ? Number(qualityText) : 0;\n}\n\nfunction parseAcceptLanguageTags(acceptLanguage: string): string[] {\n  return acceptLanguage\n    .split(\",\")\n    .map((part) => {\n      const [rawTag, ...parameters] = part.trim().split(\";\");\n      const tag = rawTag.trim().toLowerCase().replace(/_/g, \"-\");\n      const quality = getAcceptLanguageQuality(parameters);\n\n      return tag.length > 0 && quality > 0 ? tag : undefined;\n    })\n    .filter((tag): tag is string => tag !== undefined);\n}\n\n/** Alpha-2 country region from a BCP 47 tag; numeric macroregions are not country claims. */\nfunction getRegionSubtag(languageTag: string): string | undefined {\n  try {\n    const region = new Intl.Locale(languageTag).region?.toLowerCase();\n\n    return region && /^[a-z]{2}$/.test(region) ? region : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Whether no Accept-Language alpha-2 country region matches the GeoIP country.\n * Region-less headers (plain `en`) and acceptable wildcards never mismatch.\n */\nexport function isAcceptLanguageGeoMismatch(\n  acceptLanguage: string | undefined,\n  ipCountry: string | undefined,\n): boolean {\n  if (!acceptLanguage || !ipCountry) {\n    return false;\n  }\n\n  const country = ipCountry.toLowerCase();\n  const tags = parseAcceptLanguageTags(acceptLanguage);\n\n  if (tags.includes(\"*\")) {\n    return false;\n  }\n\n  const regions = tags\n    .map(getRegionSubtag)\n    .filter((region): region is string => region !== undefined);\n\n  // Region-less tags like plain `en` carry no location claim — not enough\n  // information to call a mismatch.\n  if (regions.length === 0) {\n    return false;\n  }\n\n  return !regions.includes(country);\n}\n\n/** Datacenter/hosting IP presenting a residential browser User-Agent. */\nexport function isDatacenterBrowserMismatch(\n  isDatacenterIp: boolean | undefined,\n  userAgent: string | undefined,\n): boolean {\n  if (!isDatacenterIp) {\n    return false;\n  }\n\n  return /Mozilla\\/5\\.0 \\(/i.test(userAgent ?? \"\");\n}\n","import type { ConfidenceLevel } from \"./types.js\";\nimport { getScriptingUserAgentKind } from \"../userAgent.js\";\n\nexport interface TlsFingerprintEntry {\n  id: string;\n  label: string;\n  /** Defaults to `ja3` for backward compatibility. */\n  fingerprintType?: \"ja3\" | \"ja4\";\n  hash?: string;\n  prefix?: string;\n  families: UserAgentFamily[];\n  confidence: ConfidenceLevel;\n}\n\nexport type UserAgentFamily =\n  | \"chrome\"\n  | \"chrome-headless\"\n  | \"edge\"\n  | \"firefox\"\n  | \"safari\"\n  | \"curl\"\n  | \"python\"\n  | \"go\"\n  | \"java\"\n  | \"scripting\"\n  | \"unknown\";\n\n/** Curated automation and scripting TLS fingerprints (JA3 hash or prefix) */\nexport const KNOWN_SUSPICIOUS_TLS_FINGERPRINTS: TlsFingerprintEntry[] = [];\n\nconst JA3_HASH_PATTERN = /^[0-9a-f]{32}$/;\n\n/**\n * Whether a string is a well-formed JA3 hash (32-character lowercase MD5).\n * A hash of any other length can never match a real JA3 and is almost always\n * a typo or a truncated/expanded copy-paste.\n */\nexport function isValidJa3Hash(value: string): boolean {\n  return JA3_HASH_PATTERN.test(value.trim().toLowerCase());\n}\n\nconst BROWSER_UA_FAMILIES: UserAgentFamily[] = [\n  \"chrome\",\n  \"chrome-headless\",\n  \"edge\",\n  \"firefox\",\n  \"safari\",\n];\n\nconst UA_FAMILY_COMPATIBILITY: Record<UserAgentFamily, UserAgentFamily[]> = {\n  chrome: [\"chrome\", \"chrome-headless\", \"edge\"],\n  \"chrome-headless\": [\"chrome\", \"chrome-headless\", \"edge\"],\n  edge: [\"chrome\", \"edge\", \"chrome-headless\"],\n  firefox: [\"firefox\"],\n  safari: [\"safari\"],\n  curl: [\"curl\", \"scripting\"],\n  python: [\"python\", \"scripting\"],\n  go: [\"go\", \"scripting\"],\n  java: [\"java\", \"scripting\"],\n  scripting: [\"scripting\", \"python\", \"curl\", \"go\", \"java\"],\n  unknown: [],\n};\n\n/** Lowercases and trims a JA3/JA4 fingerprint for comparison. */\nexport function normalizeTlsFingerprint(fingerprint: string): string {\n  return fingerprint.trim().toLowerCase();\n}\n\n/** Coarse client family from a User-Agent string (`chrome`, `curl`, `python`, …). */\nexport function getUserAgentFamily(userAgent: string | undefined): UserAgentFamily {\n  if (!userAgent) {\n    return \"unknown\";\n  }\n\n  const scriptingFamily = getScriptingUserAgentKind(userAgent);\n  if (scriptingFamily) {\n    return scriptingFamily;\n  }\n\n  if (/HeadlessChrome/i.test(userAgent)) {\n    return \"chrome-headless\";\n  }\n\n  if (/Edg\\//i.test(userAgent)) {\n    return \"edge\";\n  }\n\n  if (/Chrome\\//i.test(userAgent)) {\n    return \"chrome\";\n  }\n\n  if (/Firefox\\//i.test(userAgent)) {\n    return \"firefox\";\n  }\n\n  if (/Safari\\//i.test(userAgent) && !/Chrome/i.test(userAgent)) {\n    return \"safari\";\n  }\n\n  return \"unknown\";\n}\n\n/** Whether the User-Agent claims to be a real browser (Chrome/Edge/Firefox/Safari). */\nexport function isBrowserLikeUserAgent(userAgent: string | undefined): boolean {\n  const family = getUserAgentFamily(userAgent);\n  return BROWSER_UA_FAMILIES.includes(family);\n}\n\n/** Finds the curated (or caller-supplied) entry matching a TLS fingerprint. */\nexport function findTlsFingerprintEntry(\n  fingerprint: string,\n  extraFingerprints: string[] = [],\n  fingerprintType: \"ja3\" | \"ja4\" = \"ja3\",\n  extraEntries: TlsFingerprintEntry[] = [],\n): TlsFingerprintEntry | undefined {\n  const normalized = normalizeTlsFingerprint(fingerprint);\n\n  for (const entry of [\n    ...KNOWN_SUSPICIOUS_TLS_FINGERPRINTS,\n    ...extraEntries,\n  ]) {\n    if ((entry.fingerprintType ?? \"ja3\") !== fingerprintType) {\n      continue;\n    }\n    const normalizedHash = entry.hash\n      ? normalizeTlsFingerprint(entry.hash)\n      : undefined;\n    if (normalizedHash && normalized === normalizedHash) {\n      return entry;\n    }\n\n    const normalizedPrefix = entry.prefix\n      ? normalizeTlsFingerprint(entry.prefix)\n      : undefined;\n    if (normalizedPrefix && normalized.startsWith(normalizedPrefix)) {\n      return entry;\n    }\n  }\n\n  for (const extra of extraFingerprints) {\n    const normalizedExtra = normalizeTlsFingerprint(extra);\n    if (!normalizedExtra) {\n      continue;\n    }\n\n    if (\n      normalized === normalizedExtra ||\n      normalized.startsWith(normalizedExtra)\n    ) {\n      return {\n        id: \"custom\",\n        label: \"Custom suspicious TLS fingerprint\",\n        families: [\"scripting\"],\n        confidence: \"high\",\n      };\n    }\n  }\n\n  return undefined;\n}\n\n/** Whether the fingerprint matches a known automation/scripting TLS client. */\nexport function isKnownSuspiciousTlsFingerprint(\n  fingerprint: string | undefined,\n  extraFingerprints: string[] = [],\n  fingerprintType: \"ja3\" | \"ja4\" = \"ja3\",\n  extraEntries: TlsFingerprintEntry[] = [],\n): boolean {\n  if (!fingerprint) {\n    return false;\n  }\n\n  return (\n    findTlsFingerprintEntry(\n      fingerprint,\n      extraFingerprints,\n      fingerprintType,\n      extraEntries,\n    ) !==\n    undefined\n  );\n}\n\n/**\n * Whether a recognized TLS fingerprint contradicts the declared User-Agent —\n * e.g. a curl JA3 hash presented alongside a Chrome UA.\n */\nexport function isTlsUserAgentMismatch(\n  fingerprint: string | undefined,\n  userAgent: string | undefined,\n  extraFingerprints: string[] = [],\n  fingerprintType: \"ja3\" | \"ja4\" = \"ja3\",\n  extraEntries: TlsFingerprintEntry[] = [],\n): boolean {\n  if (!fingerprint || !userAgent) {\n    return false;\n  }\n\n  const entry = findTlsFingerprintEntry(\n    fingerprint,\n    extraFingerprints,\n    fingerprintType,\n    extraEntries,\n  );\n  if (!entry) {\n    return false;\n  }\n  if (\n    entry.id === \"custom\" &&\n    ![...KNOWN_SUSPICIOUS_TLS_FINGERPRINTS, ...extraEntries].includes(entry)\n  ) {\n    return false;\n  }\n\n  const uaFamily = getUserAgentFamily(userAgent);\n  if (uaFamily === \"unknown\") {\n    return false;\n  }\n\n  const compatibleFamilies = UA_FAMILY_COMPATIBILITY[uaFamily];\n  return !entry.families.some((family) => compatibleFamilies.includes(family));\n}\n\n/** Browser-like UA arriving without a TLS fingerprint (only when `requireTlsFingerprint`). */\nexport function isMissingTlsFingerprint(\n  fingerprint: string | undefined,\n  userAgent: string | undefined,\n  requireTlsFingerprint: boolean,\n): boolean {\n  if (!requireTlsFingerprint) {\n    return false;\n  }\n\n  return isBrowserLikeUserAgent(userAgent) && !fingerprint;\n}\n","import {\n  isAcceptLanguageGeoMismatch,\n  isDatacenterBrowserMismatch,\n  isTimezoneMismatch,\n} from \"./timezone.js\";\nimport {\n  findTlsFingerprintEntry,\n  getUserAgentFamily,\n  isBrowserLikeUserAgent,\n  isKnownSuspiciousTlsFingerprint,\n  isMissingTlsFingerprint,\n  isTlsUserAgentMismatch,\n} from \"./tls.js\";\nimport type {\n  ConfidenceLevel,\n  ServerClientContext,\n  ServerDetectorOptions,\n  ServerSignal,\n} from \"./types.js\";\nimport { isBotUserAgent } from \"../userAgent.js\";\n\nfunction createSignal(\n  id: string,\n  description: string,\n  triggered: boolean,\n  weight: number,\n  confidence: ConfidenceLevel,\n): ServerSignal {\n  return {\n    id,\n    description,\n    triggered,\n    weight,\n    confidence,\n    score: triggered ? weight : 0,\n  };\n}\n\n/**\n * Explicit scripting-library User-Agent (curl, Python, Go, or Java).\n * @internal\n */\nexport function isScriptingUserAgent(userAgent: string | undefined): boolean {\n  const family = getUserAgentFamily(userAgent);\n  return [\"curl\", \"python\", \"go\", \"java\"].includes(family);\n}\n\n/**\n * Chromium UA version disagrees with the `sec-ch-ua` brand/version header.\n * @internal\n */\nexport function isClientHintsMismatch(\n  userAgent: string | undefined,\n  secChUa: string | undefined,\n): boolean {\n  if (!userAgent || !secChUa) {\n    return false;\n  }\n\n  const family = getUserAgentFamily(userAgent);\n  if (family !== \"chrome\" && family !== \"chrome-headless\" && family !== \"edge\") {\n    return false;\n  }\n\n  const uaMajor = userAgent.match(/(?:Chrome|Chromium)\\/(\\d+)/)?.[1];\n  const hintMajors = Array.from(\n    secChUa.matchAll(/\"(?:Chromium|Google Chrome|Microsoft Edge)\";v=\"(\\d+)/gi),\n    (match) => match[1],\n  );\n\n  return Boolean(\n    uaMajor &&\n      hintMajors.length > 0 &&\n      hintMajors.some((hintMajor) => hintMajor !== uaMajor),\n  );\n}\n\n/** HTTP User-Agent disagrees with the value observed by browser JavaScript. */\nexport function isClientUserAgentMismatch(\n  userAgent: string | undefined,\n  clientUserAgent: string | undefined,\n): boolean {\n  const normalizedUserAgent = userAgent?.trim();\n  const normalizedClientUserAgent = clientUserAgent?.trim();\n  return Boolean(\n    normalizedUserAgent &&\n      normalizedClientUserAgent &&\n      normalizedUserAgent !== normalizedClientUserAgent,\n  );\n}\n\nfunction firstAcceptedLanguage(acceptLanguage: string): string | undefined {\n  let preferred: string | undefined;\n  let preferredQuality = -1;\n  let wildcardQuality = -1;\n\n  for (const part of acceptLanguage.split(\",\")) {\n    const [language, ...parameters] = part.trim().split(\";\");\n    const normalizedLanguage = language?.trim().toLowerCase();\n    if (!normalizedLanguage) {\n      continue;\n    }\n\n    const qualityParameter = parameters.find((parameter) =>\n      /^q=/i.test(parameter.trim()),\n    );\n    const qualityMatch = qualityParameter\n      ?.trim()\n      .match(/^q=(0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/i);\n    if (qualityParameter && !qualityMatch) {\n      continue;\n    }\n\n    const quality = qualityMatch ? Number(qualityMatch[1]) : 1;\n    if (normalizedLanguage === \"*\") {\n      wildcardQuality = Math.max(wildcardQuality, quality);\n      continue;\n    }\n    if (quality > 0 && quality > preferredQuality) {\n      preferred = normalizedLanguage;\n      preferredQuality = quality;\n    }\n  }\n\n  return wildcardQuality >= preferredQuality ? undefined : preferred;\n}\n\n/** Accept-Language's preferred value disagrees with Navigator language data. */\nexport function isClientLanguageMismatch(\n  acceptLanguage: string | undefined,\n  clientLanguage: string | undefined,\n  clientLanguages: string[] | undefined,\n): boolean {\n  if (!acceptLanguage || (!clientLanguage && !clientLanguages?.length)) {\n    return false;\n  }\n\n  const preferred = firstAcceptedLanguage(acceptLanguage);\n  if (!preferred) {\n    return false;\n  }\n\n  return Boolean(\n    (clientLanguage && clientLanguage.toLowerCase() !== preferred) ||\n      (clientLanguages?.[0] && clientLanguages[0].toLowerCase() !== preferred),\n  );\n}\n\nfunction claimedPlatform(userAgent: string): string | undefined {\n  if (/Android/i.test(userAgent)) return \"android\";\n  if (/CrOS/i.test(userAgent)) return \"chrome os\";\n  if (/Windows/i.test(userAgent)) return \"windows\";\n  if (/(?:iPhone|iPad|iPod)/i.test(userAgent)) return \"ios\";\n  if (/(?:Macintosh|Mac OS X)/i.test(userAgent)) return \"macos\";\n  if (/Linux/i.test(userAgent)) return \"linux\";\n  return undefined;\n}\n\nfunction normalizePlatform(platform: string): string | undefined {\n  const value = platform.trim().replace(/^\"|\"$/g, \"\").toLowerCase();\n  if (/^android(?:\\b|$)/.test(value)) return \"android\";\n  if (/^(?:cros|chrome os)(?:\\b|$)/.test(value)) return \"chrome os\";\n  if (/^(?:windows|win(?:16|32|64|ce)?)(?:\\b|$)/.test(value)) {\n    return \"windows\";\n  }\n  if (/^(?:iphone|ipad|ipod|ios)(?:\\b|$)/.test(value)) return \"ios\";\n  if (/^(?:mac(?:intel|ppc)?|macos|mac os)(?:\\b|$)/.test(value)) {\n    return \"macos\";\n  }\n  if (/^linux(?:\\b|$)/.test(value)) return \"linux\";\n  return undefined;\n}\n\nfunction platformMatches(\n  actual: string | undefined,\n  expected: string,\n  allowLegacyAliases: boolean,\n): boolean {\n  return actual === undefined ||\n    actual === expected ||\n    (allowLegacyAliases && expected === \"android\" && actual === \"linux\") ||\n    (allowLegacyAliases && expected === \"chrome os\" && actual === \"linux\") ||\n    (allowLegacyAliases && expected === \"ios\" && actual === \"macos\");\n}\n\n/** UA operating-system claim conflicts with JS platform or Client Hints. */\nexport function isClientPlatformMismatch(\n  userAgent: string | undefined,\n  clientPlatform: string | undefined,\n  secChUaPlatform: string | undefined,\n): boolean {\n  if (!userAgent) {\n    return false;\n  }\n\n  const expected = claimedPlatform(userAgent);\n  if (!expected) {\n    return false;\n  }\n\n  const client = clientPlatform ? normalizePlatform(clientPlatform) : undefined;\n  const hint = secChUaPlatform\n    ? normalizePlatform(secChUaPlatform)\n    : undefined;\n  return !platformMatches(client, expected, true) ||\n    !platformMatches(hint, expected, false);\n}\n\n/** sec-ch-ua-mobile conflicts with the User-Agent's mobile claim. */\nexport function isClientHintsMobileMismatch(\n  userAgent: string | undefined,\n  secChUaMobile: string | undefined,\n): boolean {\n  if (!userAgent || !secChUaMobile || !/^\\?[01]$/.test(secChUaMobile.trim())) {\n    return false;\n  }\n\n  return (secChUaMobile.trim() === \"?1\") !==\n    /(?:Mobi|iPhone|iPod)/i.test(userAgent);\n}\n\n/**\n * Browser UA missing one or more Fetch Metadata headers, when explicitly required.\n * @internal\n */\nexport function isMissingBrowserHeaders(\n  context: ServerClientContext,\n  requireBrowserHeaders: boolean,\n): boolean {\n  return (\n    requireBrowserHeaders &&\n    isBrowserLikeUserAgent(context.userAgent) &&\n    (!context.secFetchSite || !context.secFetchMode || !context.secFetchDest)\n  );\n}\n\n/**\n * Evaluates every server-side heuristic and returns the weighted signal list.\n * @internal\n */\nexport function buildServerSignals(\n  context: ServerClientContext,\n  options: ServerDetectorOptions = {},\n): ServerSignal[] {\n  const timezoneToleranceMinutes = options.timezoneToleranceMinutes ?? 60;\n  const suspiciousTlsFingerprints = options.suspiciousTlsFingerprints ?? [];\n  const suspiciousTlsFingerprintEntries =\n    options.suspiciousTlsFingerprintEntries ?? [];\n  const requireTlsFingerprint = options.requireTlsFingerprint ?? false;\n  const requireBrowserHeaders = options.requireBrowserHeaders ?? false;\n  const suspiciousTlsEntry = context.tlsFingerprint\n    ? findTlsFingerprintEntry(\n        context.tlsFingerprint,\n        suspiciousTlsFingerprints,\n        context.tlsFingerprintType,\n        suspiciousTlsFingerprintEntries,\n      )\n    : undefined;\n\n  return [\n    createSignal(\n      \"scripting-user-agent\",\n      \"User-Agent claims a scripting HTTP client\",\n      isScriptingUserAgent(context.userAgent),\n      0.75,\n      \"medium\",\n    ),\n    createSignal(\n      \"bot-user-agent\",\n      \"User-Agent claims a known bot, HTTP, or automation client\",\n      isBotUserAgent(context.userAgent),\n      0.9,\n      \"high\",\n    ),\n    createSignal(\n      \"crawler-identity-spoofed\",\n      \"Trusted edge conclusively rejected the claimed crawler identity\",\n      context.crawlerVerificationStatus === \"spoofed\",\n      0.95,\n      \"high\",\n    ),\n    createSignal(\n      \"client-hints-mismatch\",\n      \"User-Agent version conflicts with sec-ch-ua\",\n      isClientHintsMismatch(context.userAgent, context.secChUa),\n      0.65,\n      \"high\",\n    ),\n    createSignal(\n      \"client-user-agent-mismatch\",\n      \"HTTP User-Agent conflicts with the browser-reported User-Agent\",\n      isClientUserAgentMismatch(context.userAgent, context.clientUserAgent),\n      0.8,\n      \"high\",\n    ),\n    createSignal(\n      \"client-language-mismatch\",\n      \"Accept-Language conflicts with browser-reported languages\",\n      isClientLanguageMismatch(\n        context.acceptLanguage,\n        context.clientLanguage,\n        context.clientLanguages,\n      ),\n      0.45,\n      \"medium\",\n    ),\n    createSignal(\n      \"client-platform-mismatch\",\n      \"User-Agent OS conflicts with browser or Client Hints platform\",\n      isClientPlatformMismatch(\n        context.userAgent,\n        context.clientPlatform,\n        context.secChUaPlatform,\n      ),\n      0.55,\n      \"high\",\n    ),\n    createSignal(\n      \"client-hints-mobile-mismatch\",\n      \"sec-ch-ua-mobile conflicts with the User-Agent\",\n      isClientHintsMobileMismatch(context.userAgent, context.secChUaMobile),\n      0.55,\n      \"high\",\n    ),\n    createSignal(\n      \"missing-browser-headers\",\n      \"Browser-like User-Agent is missing Fetch Metadata headers\",\n      isMissingBrowserHeaders(context, requireBrowserHeaders),\n      0.35,\n      \"medium\",\n    ),\n    createSignal(\n      \"timezone-mismatch\",\n      \"Client-reported timezone does not match GeoIP timezone\",\n      isTimezoneMismatch(\n        context.ipTimezone,\n        context.clientTimezone,\n        timezoneToleranceMinutes,\n      ),\n      // Below the default 0.5 threshold on purpose: a lone timezone mismatch is\n      // routine for VPN users and travelers, so it corroborates rather than\n      // blocks on its own.\n      0.45,\n      \"high\",\n    ),\n    createSignal(\n      \"known-suspicious-tls\",\n      suspiciousTlsEntry\n        ? `TLS fingerprint matches ${suspiciousTlsEntry.label}`\n        : \"TLS fingerprint matches a known automation/scripting client\",\n      isKnownSuspiciousTlsFingerprint(\n        context.tlsFingerprint,\n        suspiciousTlsFingerprints,\n        context.tlsFingerprintType,\n        suspiciousTlsFingerprintEntries,\n      ),\n      0.55,\n      suspiciousTlsEntry?.confidence ?? \"high\",\n    ),\n    createSignal(\n      \"tls-user-agent-mismatch\",\n      \"TLS fingerprint is inconsistent with the declared user agent\",\n      isTlsUserAgentMismatch(\n        context.tlsFingerprint,\n        context.userAgent,\n        suspiciousTlsFingerprints,\n        context.tlsFingerprintType,\n        suspiciousTlsFingerprintEntries,\n      ),\n      0.5,\n      suspiciousTlsEntry?.confidence ?? \"high\",\n    ),\n    createSignal(\n      \"missing-tls-fingerprint\",\n      \"Browser-like user agent without a TLS fingerprint\",\n      isMissingTlsFingerprint(\n        context.tlsFingerprint,\n        context.userAgent,\n        requireTlsFingerprint,\n      ),\n      0.25,\n      \"medium\",\n    ),\n    createSignal(\n      \"accept-language-geo-mismatch\",\n      \"Accept-Language does not include the GeoIP country\",\n      isAcceptLanguageGeoMismatch(context.acceptLanguage, context.ipCountry),\n      0.2,\n      \"low\",\n    ),\n    createSignal(\n      \"datacenter-browser-mismatch\",\n      \"Datacenter/hosting IP with a residential browser user agent\",\n      isDatacenterBrowserMismatch(context.isDatacenterIp, context.userAgent),\n      0.35,\n      \"medium\",\n    ),\n    createSignal(\n      \"abuse-listed-ip\",\n      \"IP appears on the AbuseIPDB 30-day blocklist\",\n      Boolean(context.isAbuseListedIp),\n      0.6,\n      \"high\",\n    ),\n    createSignal(\n      \"icloud-private-relay\",\n      \"IP is an iCloud Private Relay egress address\",\n      Boolean(context.isIcloudPrivateRelay),\n      0.15,\n      \"low\",\n    ),\n  ];\n}\n","import { lookup } from \"doc999tor-fast-geoip\";\n\nexport interface IpGeoResult {\n  ipCountry?: string;\n  ipTimezone?: string;\n  city?: string;\n  region?: string;\n}\n\n/**\n * Looks up country, timezone, city, and region for an IP using the bundled\n * offline GeoIP database (`doc999tor-fast-geoip`). Returns `null` when the IP\n * is unknown or invalid — never throws.\n */\nexport async function lookupClientIpGeo(ip: string): Promise<IpGeoResult | null> {\n  try {\n    const geo = await lookup(ip);\n\n    if (!geo) {\n      return null;\n    }\n\n    return {\n      ipCountry: geo.country || undefined,\n      ipTimezone: geo.timezone || undefined,\n      city: geo.city || undefined,\n      region: geo.region || undefined,\n    };\n  } catch {\n    return null;\n  }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Track data dirs for which we've already emitted the \"no data\" warning.\nconst warnedAboutMissingData = new Set<string>();\n\n/** Result of matching one IP against the bundled blocklists. */\nexport interface IpListMatchResult {\n  /** IP falls inside a known datacenter/hosting provider range */\n  isDatacenterIp: boolean;\n  /** IP appears on the AbuseIPDB 30-day blocklist */\n  isAbuseListedIp: boolean;\n  /** IP is an iCloud Private Relay egress address */\n  isIcloudPrivateRelay: boolean;\n  /** Provider name when `isDatacenterIp` is true (e.g. `Amazon AWS`) */\n  datacenterProvider?: string;\n  /** ISO country code of the relay egress when `isIcloudPrivateRelay` is true */\n  icloudRelayCountry?: string;\n}\n\n/** Pre-parsed blocklist matcher. Create once and reuse — see {@link getIpListChecker}. */\nexport interface IpListChecker {\n  /** Match an IPv4 or IPv6 address against all bundled lists. Invalid input matches nothing. */\n  check(ip: string): IpListMatchResult;\n  /** Entry counts loaded from the data directory. */\n  stats: {\n    abuseIpCount: number;\n    datacenterRangeCount: number;\n    icloudRelayRangeCount: number;\n  };\n}\n\n// ---------------------------------------------------------------------------\n// IP parsing — self-contained so the library stays dependency-light.\n// IPv4 addresses become 32-bit numbers; IPv6 addresses become 128-bit bigints.\n// ---------------------------------------------------------------------------\n\nexport type ParsedIp =\n  | { kind: \"ipv4\"; value: number; canonical: string }\n  | { kind: \"ipv6\"; value: bigint; canonical: string };\n\nconst IPV4_MAPPED_PREFIX = 0xffffn << 32n;\nconst IPV4_MAPPED_MASK = ~0xffffffffn & ((1n << 128n) - 1n);\n\nfunction parseIpv4(address: string): ParsedIp | null {\n  const parts = address.split(\".\");\n  if (parts.length !== 4) {\n    return null;\n  }\n\n  let value = 0;\n  for (const part of parts) {\n    if (part.length === 0 || part.length > 3 || !/^\\d+$/.test(part)) {\n      return null;\n    }\n\n    const octet = Number(part);\n    if (octet > 255 || (part.length > 1 && part.startsWith(\"0\"))) {\n      return null;\n    }\n\n    value = value * 256 + octet;\n  }\n\n  return {\n    kind: \"ipv4\",\n    value,\n    canonical: `${(value >>> 24) & 0xff}.${(value >>> 16) & 0xff}.${(value >>> 8) & 0xff}.${value & 0xff}`,\n  };\n}\n\nfunction parseIpv6(address: string): ParsedIp | null {\n  // Strip zone index (fe80::1%eth0) — irrelevant for list matching.\n  let input = address.split(\"%\")[0].toLowerCase();\n\n  // Embedded IPv4 tail (::ffff:192.0.2.1) → two trailing hex groups.\n  if (input.includes(\".\")) {\n    const lastColon = input.lastIndexOf(\":\");\n    const tail = parseIpv4(input.slice(lastColon + 1));\n    if (!tail || tail.kind !== \"ipv4\") {\n      return null;\n    }\n\n    const high = (tail.value >>> 16) & 0xffff;\n    const low = tail.value & 0xffff;\n    input = `${input.slice(0, lastColon)}:${high.toString(16)}:${low.toString(16)}`;\n  }\n\n  const doubleColonSplit = input.split(\"::\");\n  if (doubleColonSplit.length > 2) {\n    return null;\n  }\n\n  const splitGroups = (segment: string): string[] | null => {\n    if (segment === \"\") {\n      return [];\n    }\n    const groups = segment.split(\":\");\n    return groups.every((group) => /^[0-9a-f]{1,4}$/.test(group)) ? groups : null;\n  };\n\n  const head = splitGroups(doubleColonSplit[0]);\n  const tail = doubleColonSplit.length === 2 ? splitGroups(doubleColonSplit[1]) : [];\n  if (!head || !tail) {\n    return null;\n  }\n\n  const missing = 8 - head.length - tail.length;\n  if (doubleColonSplit.length === 2 ? missing < 1 : missing !== 0) {\n    return null;\n  }\n\n  const groups = [...head, ...Array<string>(missing).fill(\"0\"), ...tail];\n  let value = 0n;\n  for (const group of groups) {\n    value = (value << 16n) | BigInt(parseInt(group, 16));\n  }\n\n  // IPv4-mapped (::ffff:a.b.c.d) → canonical IPv4 so all lists apply.\n  if ((value & IPV4_MAPPED_MASK) === IPV4_MAPPED_PREFIX) {\n    const v4 = Number(value & 0xffffffffn);\n    return {\n      kind: \"ipv4\",\n      value: v4,\n      canonical: `${(v4 >>> 24) & 0xff}.${(v4 >>> 16) & 0xff}.${(v4 >>> 8) & 0xff}.${v4 & 0xff}`,\n    };\n  }\n\n  const canonicalGroups: string[] = [];\n  for (let index = 7; index >= 0; index -= 1) {\n    canonicalGroups.push(((value >> BigInt(index * 16)) & 0xffffn).toString(16));\n  }\n\n  return { kind: \"ipv6\", value, canonical: canonicalGroups.join(\":\") };\n}\n\n/**\n * Parses an IPv4 or IPv6 address. IPv4-mapped IPv6 addresses (`::ffff:1.2.3.4`)\n * normalize to IPv4 so proxies handing over mapped addresses still match.\n * Returns `null` for anything that is not a valid address.\n */\nexport function parseIp(address: string): ParsedIp | null {\n  const trimmed = address.trim();\n  if (trimmed.length === 0) {\n    return null;\n  }\n\n  return trimmed.includes(\":\") ? parseIpv6(trimmed) : parseIpv4(trimmed);\n}\n\n// ---------------------------------------------------------------------------\n// Interval matching — lists are parsed once into sorted arrays, lookups are\n// binary searches. IPv4 and IPv6 live in separate arrays (different spaces).\n// ---------------------------------------------------------------------------\n\ninterface Interval<T extends number | bigint> {\n  start: T;\n  end: T;\n  payload: string;\n}\n\nfunction sortIntervals<T extends number | bigint>(intervals: Interval<T>[]): Interval<T>[] {\n  intervals.sort((left, right) => (left.start < right.start ? -1 : left.start > right.start ? 1 : 0));\n  return intervals;\n}\n\nfunction findInterval<T extends number | bigint>(\n  value: T,\n  intervals: Interval<T>[],\n): Interval<T> | undefined {\n  let low = 0;\n  let high = intervals.length - 1;\n\n  while (low <= high) {\n    const middle = (low + high) >>> 1;\n    const interval = intervals[middle];\n\n    if (value < interval.start) {\n      high = middle - 1;\n    } else if (value > interval.end) {\n      low = middle + 1;\n    } else {\n      return interval;\n    }\n  }\n\n  return undefined;\n}\n\ninterface IntervalSet {\n  v4: Interval<number>[];\n  v6: Interval<bigint>[];\n  size: number;\n}\n\nfunction createIntervalSet(): IntervalSet {\n  return { v4: [], v6: [], size: 0 };\n}\n\nfunction addCidr(set: IntervalSet, cidr: string, payload: string): void {\n  const [address, prefixText] = cidr.split(\"/\");\n  if (prefixText === undefined) {\n    return;\n  }\n\n  const prefix = Number(prefixText);\n  const parsed = parseIp(address);\n  if (!parsed || !Number.isInteger(prefix) || prefix < 0) {\n    return;\n  }\n\n  if (parsed.kind === \"ipv4\") {\n    if (prefix > 32) {\n      return;\n    }\n    const size = 2 ** (32 - prefix);\n    const start = Math.floor(parsed.value / size) * size;\n    set.v4.push({ start, end: start + size - 1, payload });\n  } else {\n    if (prefix > 128) {\n      return;\n    }\n    const hostBits = BigInt(128 - prefix);\n    const start = (parsed.value >> hostBits) << hostBits;\n    set.v6.push({ start, end: start + (1n << hostBits) - 1n, payload });\n  }\n\n  set.size += 1;\n}\n\nfunction addRange(set: IntervalSet, startIp: string, endIp: string, payload: string): void {\n  const start = parseIp(startIp);\n  const end = parseIp(endIp);\n  if (!start || !end || start.kind !== end.kind) {\n    return;\n  }\n\n  if (start.kind === \"ipv4\" && end.kind === \"ipv4\") {\n    if (start.value > end.value) {\n      return;\n    }\n\n    set.v4.push({ start: start.value, end: end.value, payload });\n    set.size += 1;\n  } else if (start.kind === \"ipv6\" && end.kind === \"ipv6\") {\n    if (start.value > end.value) {\n      return;\n    }\n\n    set.v6.push({ start: start.value, end: end.value, payload });\n    set.size += 1;\n  }\n}\n\nfunction finalizeIntervalSet(set: IntervalSet): IntervalSet {\n  sortIntervals(set.v4);\n  sortIntervals(set.v6);\n  return set;\n}\n\nfunction matchIntervalSet(set: IntervalSet, parsed: ParsedIp): string | undefined {\n  const match =\n    parsed.kind === \"ipv4\"\n      ? findInterval(parsed.value, set.v4)\n      : findInterval(parsed.value, set.v6);\n\n  return match?.payload;\n}\n\n// ---------------------------------------------------------------------------\n// Bundled CSV loading\n// ---------------------------------------------------------------------------\n\nfunction getDefaultDataDir(): string {\n  // Walk up from the module (src/server/ in development, dist/ when packaged)\n  // to the package root containing the bundled data/ directory.\n  let dir = path.dirname(fileURLToPath(import.meta.url));\n\n  for (let depth = 0; depth < 4; depth += 1) {\n    const candidate = path.join(dir, \"data\");\n    if (fs.existsSync(path.join(candidate, \"datacenter_ip_ranges.csv\"))) {\n      return candidate;\n    }\n    dir = path.dirname(dir);\n  }\n\n  return path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../data\");\n}\n\nfunction readDataFile(dataDir: string, filename: string): string {\n  const filePath = path.join(dataDir, filename);\n\n  if (!fs.existsSync(filePath)) {\n    return \"\";\n  }\n\n  return fs.readFileSync(filePath, \"utf-8\");\n}\n\nfunction eachDataLine(content: string, visit: (line: string) => void): void {\n  for (const rawLine of content.split(\"\\n\")) {\n    const line = rawLine.trim();\n    if (line && !line.startsWith(\"#\")) {\n      visit(line);\n    }\n  }\n}\n\n/** Bare IPs, optionally annotated (`1.2.3.4  # TH AS23969 provider`) */\nfunction loadAbuseIps(content: string): Set<string> {\n  const ips = new Set<string>();\n\n  eachDataLine(content, (line) => {\n    const spaceIndex = line.search(/[\\s#]/);\n    const parsed = parseIp(spaceIndex === -1 ? line : line.slice(0, spaceIndex));\n    if (parsed) {\n      ips.add(parsed.canonical);\n    }\n  });\n\n  return ips;\n}\n\n/** `start,end,provider,url` rows from ipcat datacenters.csv */\nfunction loadDatacenterRanges(content: string): IntervalSet {\n  const set = createIntervalSet();\n\n  eachDataLine(content, (line) => {\n    const [start, end, provider = \"unknown\"] = line\n      .split(\",\")\n      .map((column) => column.trim());\n    if (start && end) {\n      addRange(set, start, end, provider);\n    }\n  });\n\n  return finalizeIntervalSet(set);\n}\n\n/** `cidr,country` rows from Apple's egress-ip-ranges.csv (IPv4 and IPv6) */\nfunction loadIcloudRelayRanges(content: string): IntervalSet {\n  const set = createIntervalSet();\n\n  eachDataLine(content, (line) => {\n    const [cidr, country = \"\"] = line\n      .split(\",\")\n      .map((column) => column.trim());\n    addCidr(set, cidr, country);\n  });\n\n  return finalizeIntervalSet(set);\n}\n\n/**\n * Builds a blocklist matcher from the CSVs in `dataDir` (defaults to the\n * package's bundled `data/`). Parsing happens once here; `check` calls are\n * then O(log n) binary searches. Prefer {@link getIpListChecker}, which caches\n * the parsed lists per data directory.\n */\nexport function createIpListChecker(dataDir = getDefaultDataDir()): IpListChecker {\n  const abuseIps = loadAbuseIps(readDataFile(dataDir, \"abuse_ip_db_30d_ips.csv\"));\n  const datacenterRanges = loadDatacenterRanges(\n    readDataFile(dataDir, \"datacenter_ip_ranges.csv\"),\n  );\n  const icloudRelayRanges = loadIcloudRelayRanges(\n    readDataFile(dataDir, \"icloud_private_relay_ip_ranges.csv\"),\n  );\n\n  if (abuseIps.size + datacenterRanges.size + icloudRelayRanges.size === 0) {\n    // One-time warning so it doesn't spam on every request if misconfigured.\n    if (!warnedAboutMissingData.has(dataDir)) {\n      warnedAboutMissingData.add(dataDir);\n      process.emitWarning(\n        `bot-signal: no IP list data found in ${dataDir} — ` +\n          \"abuse/datacenter/iCloud relay checks will match nothing\",\n      );\n    }\n  }\n\n  return {\n    stats: {\n      abuseIpCount: abuseIps.size,\n      datacenterRangeCount: datacenterRanges.size,\n      icloudRelayRangeCount: icloudRelayRanges.size,\n    },\n    check(ip: string): IpListMatchResult {\n      const parsed = parseIp(ip);\n\n      if (!parsed) {\n        return {\n          isDatacenterIp: false,\n          isAbuseListedIp: false,\n          isIcloudPrivateRelay: false,\n        };\n      }\n\n      const datacenterProvider = matchIntervalSet(datacenterRanges, parsed);\n      const icloudRelayCountry = matchIntervalSet(icloudRelayRanges, parsed);\n\n      return {\n        isDatacenterIp: datacenterProvider !== undefined,\n        isAbuseListedIp: abuseIps.has(parsed.canonical),\n        isIcloudPrivateRelay: icloudRelayCountry !== undefined,\n        datacenterProvider,\n        icloudRelayCountry: icloudRelayCountry || undefined,\n      };\n    },\n  };\n}\n\nlet cachedChecker: IpListChecker | undefined;\nlet cachedDataDir: string | undefined;\n\n/**\n * Returns a cached {@link IpListChecker} for `dataDir`, creating it on first use.\n *\n * Note: Because of how ESM/CJS interop works, different module instances\n * (e.g. a mix of import vs require, or multiple copies of the package)\n * may each have their own cache. For most server apps this is fine.\n * Call `preloadIpLists()` early at boot.\n */\nexport function getIpListChecker(dataDir?: string): IpListChecker {\n  const resolvedDataDir = dataDir ?? getDefaultDataDir();\n\n  if (!cachedChecker || cachedDataDir !== resolvedDataDir) {\n    cachedChecker = createIpListChecker(resolvedDataDir);\n    cachedDataDir = resolvedDataDir;\n  }\n\n  return cachedChecker;\n}\n\n/**\n * Eagerly parses the bundled IP lists into the shared cache so the first\n * request-time check doesn't pay the one-off parse cost (~0.5s for the full\n * bundled data). Call once at server boot. Returns the loaded entry counts.\n *\n * See {@link getIpListChecker} for notes on module caching across ESM/CJS.\n */\nexport function preloadIpLists(dataDir?: string): IpListChecker[\"stats\"] {\n  return getIpListChecker(dataDir).stats;\n}\n\n/**\n * Clears the cached checker — used by tests that swap data directories.\n * @internal\n */\nexport function resetIpListCheckerCache(): void {\n  cachedChecker = undefined;\n  cachedDataDir = undefined;\n  warnedAboutMissingData.clear();\n}\n\n/**\n * Absolute path of the package's bundled `data/` directory.\n * @internal\n */\nexport function getDefaultIpDataDir(): string {\n  return getDefaultDataDir();\n}\n","import { lookupClientIpGeo } from \"./geoip.js\";\nimport { getIpListChecker } from \"./ipLists.js\";\nimport type { ServerClientContext, ServerDetectorOptions } from \"./types.js\";\n\nexport interface EnrichedServerContext extends ServerClientContext {\n  datacenterProvider?: string;\n  icloudRelayCountry?: string;\n}\n\n/**\n * Fills missing context fields from `clientIp`: GeoIP country/timezone\n * (unless `lookupGeo: false`) and bundled blocklist matches (unless\n * `checkIpLists: false`). Fields already present are never overwritten.\n */\nexport async function enrichServerContext(\n  context: ServerClientContext,\n  options: ServerDetectorOptions = {},\n): Promise<EnrichedServerContext> {\n  const enriched: EnrichedServerContext = { ...context };\n\n  if (context.clientIp) {\n    if (options.lookupGeo !== false) {\n      const geo = await lookupClientIpGeo(context.clientIp);\n\n      if (geo) {\n        enriched.ipCountry = enriched.ipCountry ?? geo.ipCountry;\n        enriched.ipTimezone = enriched.ipTimezone ?? geo.ipTimezone;\n      }\n    }\n\n    if (options.checkIpLists !== false) {\n      const checker = getIpListChecker(options.dataDir);\n      const match = checker.check(context.clientIp);\n\n      enriched.isDatacenterIp = enriched.isDatacenterIp ?? match.isDatacenterIp;\n      enriched.isAbuseListedIp = enriched.isAbuseListedIp ?? match.isAbuseListedIp;\n      enriched.isIcloudPrivateRelay =\n        enriched.isIcloudPrivateRelay ?? match.isIcloudPrivateRelay;\n      enriched.datacenterProvider = match.datacenterProvider;\n      enriched.icloudRelayCountry = match.icloudRelayCountry;\n    }\n  }\n\n  return enriched;\n}\n","import { createAutomationAssessment } from \"../automation.js\";\nimport { getBotUserAgentKind } from \"../userAgent.js\";\nimport { enrichServerContext } from \"./enrich.js\";\nimport { buildServerSignals } from \"./analysis.js\";\nimport type {\n  ConfidenceLevel,\n  ServerClientContext,\n  ServerClientResult,\n  ServerDetectorOptions,\n  ServerSignal,\n} from \"./types.js\";\nimport type { EnrichedServerContext } from \"./enrich.js\";\nimport {\n  findTlsFingerprintEntry,\n  getUserAgentFamily,\n  isTlsUserAgentMismatch,\n  KNOWN_SUSPICIOUS_TLS_FINGERPRINTS,\n} from \"./tls.js\";\nimport type { TlsFingerprintEntry } from \"./tls.js\";\n\n/**\n * Combines triggered signal weights into one score:\n * `1 - Π(1 - weightᵢ)` — independent-probability union, so extra signals\n * always raise the score but never past 1.\n * @internal\n */\nexport function aggregateServerSuspicionScore(signals: ServerSignal[]): number {\n  const triggered = signals.filter((signal) => signal.triggered);\n\n  if (triggered.length === 0) {\n    return 0;\n  }\n\n  let score = 1;\n\n  for (const signal of triggered) {\n    score *= 1 - signal.weight;\n  }\n\n  return 1 - score;\n}\n\n/**\n * Confidence in the verdict based on high-confidence signal hits and score.\n * @internal\n */\nexport function resolveServerConfidence(\n  signals: ServerSignal[],\n  suspicionScore: number,\n): ConfidenceLevel {\n  const triggeredHigh = signals.filter(\n    (signal) => signal.triggered && signal.confidence === \"high\",\n  ).length;\n\n  if (triggeredHigh >= 1 || suspicionScore >= 0.7) {\n    return \"high\";\n  }\n\n  if (suspicionScore >= 0.35) {\n    return \"medium\";\n  }\n\n  return \"low\";\n}\n\nfunction buildResultContext(\n  context: EnrichedServerContext,\n): ServerClientResult[\"context\"] {\n  return {\n    clientIp: context.clientIp,\n    ipTimezone: context.ipTimezone,\n    clientTimezone: context.clientTimezone,\n    tlsFingerprint: context.tlsFingerprint,\n    tlsFingerprintType: context.tlsFingerprintType,\n    userAgent: context.userAgent,\n    clientUserAgent: context.clientUserAgent,\n    acceptLanguage: context.acceptLanguage,\n    clientLanguage: context.clientLanguage,\n    clientLanguages: context.clientLanguages,\n    clientPlatform: context.clientPlatform,\n    secChUa: context.secChUa,\n    secChUaPlatform: context.secChUaPlatform,\n    secChUaMobile: context.secChUaMobile,\n    secFetchSite: context.secFetchSite,\n    secFetchMode: context.secFetchMode,\n    secFetchDest: context.secFetchDest,\n    ipCountry: context.ipCountry,\n    isDatacenterIp: context.isDatacenterIp,\n    isAbuseListedIp: context.isAbuseListedIp,\n    isIcloudPrivateRelay: context.isIcloudPrivateRelay,\n    crawlerVerificationStatus: context.crawlerVerificationStatus,\n    datacenterProvider: context.datacenterProvider,\n    icloudRelayCountry: context.icloudRelayCountry,\n  };\n}\n\nfunction classifyServerAutomation(\n  context: ServerClientContext,\n  suspiciousTlsFingerprints: string[],\n  suspiciousTlsFingerprintEntries: TlsFingerprintEntry[],\n) {\n  const crawlerVerificationEvidence =\n    context.crawlerVerificationStatus === \"verified\"\n      ? \"Trusted edge verified an automated crawler identity\"\n      : context.crawlerVerificationStatus === \"spoofed\"\n        ? \"Trusted edge conclusively rejected the claimed crawler identity\"\n        : undefined;\n  const uaFamily = getUserAgentFamily(context.userAgent);\n  const tlsEntry = context.tlsFingerprint\n    ? findTlsFingerprintEntry(\n        context.tlsFingerprint,\n        suspiciousTlsFingerprints,\n        context.tlsFingerprintType,\n        suspiciousTlsFingerprintEntries,\n      )\n    : undefined;\n  const hasFamilyLabel = Boolean(\n    tlsEntry &&\n      (KNOWN_SUSPICIOUS_TLS_FINGERPRINTS.includes(tlsEntry) ||\n        suspiciousTlsFingerprintEntries.includes(tlsEntry)),\n  );\n  const tlsSupportsUa = Boolean(\n    hasFamilyLabel &&\n      context.tlsFingerprint &&\n      context.userAgent &&\n      !isTlsUserAgentMismatch(\n        context.tlsFingerprint,\n        context.userAgent,\n        suspiciousTlsFingerprints,\n        context.tlsFingerprintType,\n        suspiciousTlsFingerprintEntries,\n      ),\n  );\n  if ([\"curl\", \"python\", \"go\", \"java\"].includes(uaFamily)) {\n    return createAutomationAssessment(\n      true,\n      uaFamily as \"curl\" | \"python\" | \"go\" | \"java\",\n      crawlerVerificationEvidence ? \"high\" : \"medium\",\n      [\n        `User-Agent claims ${uaFamily}`,\n        ...(crawlerVerificationEvidence ? [crawlerVerificationEvidence] : []),\n        ...(tlsSupportsUa ? [`TLS fingerprint is compatible with ${uaFamily}`] : []),\n      ],\n    );\n  }\n\n  const botUaKind = getBotUserAgentKind(context.userAgent);\n  if (botUaKind) {\n    const alternatives = botUaKind === \"browser-automation\"\n      ? [\"patchright\", \"playwright\", \"puppeteer\", \"selenium\"] as const\n      : [];\n    return createAutomationAssessment(\n      true,\n      botUaKind === \"crawler\" || botUaKind === \"http-client\"\n        ? \"unknown\"\n        : botUaKind,\n      \"high\",\n      [\n        `User-Agent claims ${botUaKind}`,\n        ...(crawlerVerificationEvidence ? [crawlerVerificationEvidence] : []),\n        ...(tlsSupportsUa && uaFamily !== \"unknown\"\n          ? [`TLS fingerprint is compatible with ${uaFamily}`]\n          : []),\n      ],\n      [...alternatives],\n    );\n  }\n\n  if (crawlerVerificationEvidence) {\n    return createAutomationAssessment(\n      true,\n      \"unknown\",\n      \"high\",\n      [crawlerVerificationEvidence],\n    );\n  }\n\n  return createAutomationAssessment(false, \"unknown\", \"low\", []);\n}\n\n/**\n * Scores an already-enriched request context synchronously. Use this when you\n * have your own GeoIP/blocklist pipeline; otherwise prefer\n * {@link detectServerClientAsync}, which fills the context from `clientIp`.\n */\nexport function detectServerClient(\n  context: ServerClientContext,\n  options: ServerDetectorOptions = {},\n): ServerClientResult {\n  const scoreThreshold = options.scoreThreshold ?? 0.5;\n  const signals = buildServerSignals(context, options);\n  const suspicionScore = aggregateServerSuspicionScore(signals);\n  const confidence = resolveServerConfidence(signals, suspicionScore);\n  const isLegitClient = suspicionScore < scoreThreshold;\n\n  return {\n    suspicionScore,\n    confidence,\n    signals,\n    isLegitClient,\n    automation: classifyServerAutomation(\n      context,\n      options.suspiciousTlsFingerprints ?? [],\n      options.suspiciousTlsFingerprintEntries ?? [],\n    ),\n    context: buildResultContext(context),\n  };\n}\n\n/**\n * Scores a request in one call. When `clientIp` is set, the context is\n * auto-enriched with GeoIP country/timezone and bundled blocklist matches\n * (datacenter ranges, AbuseIPDB, iCloud Private Relay) before scoring.\n *\n * @example\n * const result = await detectServerClientAsync({\n *   clientIp: req.ip,\n *   clientTimezone: req.headers[\"x-timezone\"],\n *   userAgent: req.headers[\"user-agent\"],\n *   tlsFingerprint: req.headers[\"x-ja3-hash\"],\n * });\n * if (!result.isLegitClient) return res.status(403).end();\n */\nexport async function detectServerClientAsync(\n  context: ServerClientContext,\n  options: ServerDetectorOptions = {},\n): Promise<ServerClientResult> {\n  const enriched = await enrichServerContext(context, options);\n  return detectServerClient(enriched, options);\n}\n","// Keep in sync with package.json during releases.\n// Prefer importing the package's package.json for the canonical version when possible.\nexport const VERSION = \"2.0.14\";\n"]}