{"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/version.ts"],"names":["platformContradictsUserAgent","DEFAULT_SCORE_THRESHOLD","createSignal"],"mappings":"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","file":"browser.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","// 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"]}