@skrillex1224/playwright-toolkit 2.1.276 → 2.1.277

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13,9 +13,11 @@ __export(constants_exports, {
13
13
  ActorInfo: () => ActorInfo,
14
14
  Code: () => Code,
15
15
  Device: () => Device,
16
+ Mode: () => Mode,
16
17
  PresetOfLiveViewKey: () => PresetOfLiveViewKey,
17
18
  Status: () => Status,
18
- normalizeDevice: () => normalizeDevice
19
+ normalizeDevice: () => normalizeDevice,
20
+ normalizeMode: () => normalizeMode
19
21
  });
20
22
  var Code = {
21
23
  Success: 0,
@@ -35,6 +37,10 @@ var Device = Object.freeze({
35
37
  Desktop: "desktop",
36
38
  Mobile: "mobile"
37
39
  });
40
+ var Mode = Object.freeze({
41
+ Default: "default",
42
+ CloakBrowser: "cloakbrowser"
43
+ });
38
44
  var normalizeDevice = (value, fallback = Device.Desktop) => {
39
45
  const normalizedFallback = String(fallback || "").trim().toLowerCase() === Device.Mobile ? Device.Mobile : Device.Desktop;
40
46
  const raw = String(value || "").trim().toLowerCase();
@@ -42,6 +48,13 @@ var normalizeDevice = (value, fallback = Device.Desktop) => {
42
48
  if (raw === Device.Desktop) return Device.Desktop;
43
49
  return normalizedFallback;
44
50
  };
51
+ var normalizeMode = (value, fallback = Mode.Default) => {
52
+ const normalizedFallback = String(fallback || "").trim().toLowerCase() === Mode.CloakBrowser ? Mode.CloakBrowser : Mode.Default;
53
+ const raw = String(value || "").trim().toLowerCase();
54
+ if (raw === Mode.CloakBrowser) return Mode.CloakBrowser;
55
+ if (raw === Mode.Default) return Mode.Default;
56
+ return normalizedFallback;
57
+ };
45
58
  var createActorInfo = (info) => {
46
59
  const normalizeDomain = (value) => {
47
60
  if (!value) return "";
@@ -2449,8 +2462,7 @@ var Utils = {
2449
2462
  }
2450
2463
  };
2451
2464
 
2452
- // src/anti-cheat.js
2453
- var logger5 = createInternalLogger("AntiCheat");
2465
+ // src/internals/anti-cheat/default.js
2454
2466
  var BASE_CONFIG = Object.freeze({
2455
2467
  locale: "zh-CN",
2456
2468
  acceptLanguage: "zh-CN,zh;q=0.9",
@@ -2485,7 +2497,7 @@ function buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVers
2485
2497
  }
2486
2498
  return options;
2487
2499
  }
2488
- var AntiCheat = {
2500
+ var DefaultAntiCheat = {
2489
2501
  /**
2490
2502
  * 获取统一的基础配置
2491
2503
  */
@@ -2522,6 +2534,44 @@ var AntiCheat = {
2522
2534
  }
2523
2535
  };
2524
2536
 
2537
+ // src/internals/anti-cheat/cloakbrowser.js
2538
+ var CloakBrowserAntiCheat = DefaultAntiCheat;
2539
+
2540
+ // src/internals/toolkit-mode.js
2541
+ var currentMode = Mode.Default;
2542
+ var getToolkitMode = () => currentMode;
2543
+ var setToolkitMode = (mode = Mode.Default) => {
2544
+ currentMode = normalizeMode(mode, Mode.Default);
2545
+ return currentMode;
2546
+ };
2547
+
2548
+ // src/anti-cheat.js
2549
+ var resolveAntiCheatDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserAntiCheat : DefaultAntiCheat;
2550
+ var callAntiCheat = (method, ...args) => {
2551
+ const delegate = resolveAntiCheatDelegate();
2552
+ if (typeof delegate?.[method] !== "function") {
2553
+ throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
2554
+ }
2555
+ return delegate[method](...args);
2556
+ };
2557
+ var AntiCheat = {
2558
+ getBaseConfig() {
2559
+ return callAntiCheat("getBaseConfig");
2560
+ },
2561
+ getFingerprintGeneratorOptions(options = {}) {
2562
+ return callAntiCheat("getFingerprintGeneratorOptions", options);
2563
+ },
2564
+ getLaunchArgs(options = {}) {
2565
+ return callAntiCheat("getLaunchArgs", options);
2566
+ },
2567
+ getTlsFingerprintOptions(userAgent = "", acceptLanguage = "", options = {}) {
2568
+ return callAntiCheat("getTlsFingerprintOptions", userAgent, acceptLanguage, options);
2569
+ },
2570
+ applyLocaleHeaders(headers, acceptLanguage = "") {
2571
+ return callAntiCheat("applyLocaleHeaders", headers, acceptLanguage);
2572
+ }
2573
+ };
2574
+
2525
2575
  // src/device-input.js
2526
2576
  var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
2527
2577
  var assertPage = (page, method) => {
@@ -3075,7 +3125,7 @@ var DeviceView = {
3075
3125
  // src/internals/humanize/desktop.js
3076
3126
  import delay2 from "delay";
3077
3127
  import { createCursor } from "ghost-cursor-playwright";
3078
- var logger6 = createInternalLogger("Humanize");
3128
+ var logger5 = createInternalLogger("Humanize");
3079
3129
  var $CursorWeakMap = /* @__PURE__ */ new WeakMap();
3080
3130
  function $GetCursor(page) {
3081
3131
  const cursor = $CursorWeakMap.get(page);
@@ -3103,13 +3153,13 @@ var Humanize = {
3103
3153
  */
3104
3154
  async initializeCursor(page) {
3105
3155
  if ($CursorWeakMap.has(page)) {
3106
- logger6.debug("initializeCursor: cursor already exists, skipping");
3156
+ logger5.debug("initializeCursor: cursor already exists, skipping");
3107
3157
  return;
3108
3158
  }
3109
- logger6.start("initializeCursor", "creating cursor");
3159
+ logger5.start("initializeCursor", "creating cursor");
3110
3160
  const cursor = await createCursor(page);
3111
3161
  $CursorWeakMap.set(page, cursor);
3112
- logger6.success("initializeCursor", "cursor initialized");
3162
+ logger5.success("initializeCursor", "cursor initialized");
3113
3163
  },
3114
3164
  /**
3115
3165
  * 人类化鼠标移动 - 使用 ghost-cursor 移动到指定位置或元素
@@ -3119,17 +3169,17 @@ var Humanize = {
3119
3169
  */
3120
3170
  async humanMove(page, target) {
3121
3171
  const cursor = $GetCursor(page);
3122
- logger6.start("humanMove", `target=${typeof target === "string" ? target : "element/coords"}`);
3172
+ logger5.start("humanMove", `target=${typeof target === "string" ? target : "element/coords"}`);
3123
3173
  try {
3124
3174
  if (typeof target === "string") {
3125
3175
  const element = await page.$(target);
3126
3176
  if (!element) {
3127
- logger6.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);
3177
+ logger5.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);
3128
3178
  return false;
3129
3179
  }
3130
3180
  const box = await element.boundingBox();
3131
3181
  if (!box) {
3132
- logger6.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);
3182
+ logger5.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);
3133
3183
  return false;
3134
3184
  }
3135
3185
  const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;
@@ -3145,10 +3195,10 @@ var Humanize = {
3145
3195
  await cursor.actions.move({ x, y });
3146
3196
  }
3147
3197
  }
3148
- logger6.success("humanMove");
3198
+ logger5.success("humanMove");
3149
3199
  return true;
3150
3200
  } catch (error) {
3151
- logger6.fail("humanMove", error);
3201
+ logger5.fail("humanMove", error);
3152
3202
  throw error;
3153
3203
  }
3154
3204
  },
@@ -3172,12 +3222,12 @@ var Humanize = {
3172
3222
  maxDurationMs = maxSteps * 220 + 800
3173
3223
  } = options;
3174
3224
  const targetDesc = typeof target === "string" ? target : "ElementHandle";
3175
- logger6.start("humanScroll", `target=${targetDesc}`);
3225
+ logger5.start("humanScroll", `target=${targetDesc}`);
3176
3226
  let element;
3177
3227
  if (typeof target === "string") {
3178
3228
  element = await page.$(target);
3179
3229
  if (!element) {
3180
- logger6.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);
3230
+ logger5.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);
3181
3231
  return { element: null, didScroll: false };
3182
3232
  }
3183
3233
  } else {
@@ -3252,26 +3302,26 @@ var Humanize = {
3252
3302
  try {
3253
3303
  for (let i = 0; i < maxSteps; i++) {
3254
3304
  if (Date.now() - startTime > maxDurationMs) {
3255
- logger6.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);
3305
+ logger5.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);
3256
3306
  return { element, didScroll };
3257
3307
  }
3258
3308
  const status = await checkVisibility();
3259
3309
  if (status.code === "VISIBLE") {
3260
3310
  if (status.isFixed) {
3261
- logger6.info("humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
3311
+ logger5.info("humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
3262
3312
  } else {
3263
- logger6.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
3313
+ logger5.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
3264
3314
  }
3265
- logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
3315
+ logger5.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
3266
3316
  return { element, didScroll };
3267
3317
  }
3268
- logger6.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ""}`);
3318
+ logger5.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ""}`);
3269
3319
  if (status.code === "OBSTRUCTED" && status.obstruction) {
3270
- logger6.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id="${status.obstruction.id}">`);
3320
+ logger5.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id="${status.obstruction.id}">`);
3271
3321
  }
3272
3322
  const scrollRect = await getScrollableRect2();
3273
3323
  if (!scrollRect && status.isFixed) {
3274
- logger6.warn("humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
3324
+ logger5.warn("humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
3275
3325
  return { element, didScroll };
3276
3326
  }
3277
3327
  const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
@@ -3307,10 +3357,10 @@ var Humanize = {
3307
3357
  didScroll = true;
3308
3358
  await delay2(this.jitterMs(20 + Math.random() * 40, 0.2));
3309
3359
  }
3310
- logger6.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
3360
+ logger5.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
3311
3361
  return { element, didScroll };
3312
3362
  } catch (error) {
3313
- logger6.fail("humanScroll", error);
3363
+ logger5.fail("humanScroll", error);
3314
3364
  throw error;
3315
3365
  }
3316
3366
  },
@@ -3328,7 +3378,7 @@ var Humanize = {
3328
3378
  const cursor = $GetCursor(page);
3329
3379
  const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;
3330
3380
  const targetDesc = target == null ? "Current Position" : typeof target === "string" ? target : "ElementHandle";
3331
- logger6.start("humanClick", `target=${targetDesc}`);
3381
+ logger5.start("humanClick", `target=${targetDesc}`);
3332
3382
  const restoreOnce = async () => {
3333
3383
  if (restoreOnce.restored) return;
3334
3384
  restoreOnce.restored = true;
@@ -3337,14 +3387,14 @@ var Humanize = {
3337
3387
  await delay2(this.jitterMs(1e3));
3338
3388
  await restoreOnce.do();
3339
3389
  } catch (restoreError) {
3340
- logger6.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);
3390
+ logger5.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);
3341
3391
  }
3342
3392
  };
3343
3393
  try {
3344
3394
  if (target == null) {
3345
3395
  await delay2(this.jitterMs(reactionDelay, 0.4));
3346
3396
  await cursor.actions.click();
3347
- logger6.success("humanClick", "Clicked current position");
3397
+ logger5.success("humanClick", "Clicked current position");
3348
3398
  return true;
3349
3399
  }
3350
3400
  let element;
@@ -3354,7 +3404,7 @@ var Humanize = {
3354
3404
  if (throwOnMissing) {
3355
3405
  throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);
3356
3406
  }
3357
- logger6.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);
3407
+ logger5.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);
3358
3408
  return false;
3359
3409
  }
3360
3410
  } else {
@@ -3370,7 +3420,7 @@ var Humanize = {
3370
3420
  if (throwOnMissing) {
3371
3421
  throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
3372
3422
  }
3373
- logger6.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
3423
+ logger5.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
3374
3424
  return false;
3375
3425
  }
3376
3426
  const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;
@@ -3379,11 +3429,11 @@ var Humanize = {
3379
3429
  await delay2(this.jitterMs(reactionDelay, 0.4));
3380
3430
  await cursor.actions.click();
3381
3431
  await restoreOnce();
3382
- logger6.success("humanClick");
3432
+ logger5.success("humanClick");
3383
3433
  return true;
3384
3434
  } catch (error) {
3385
3435
  await restoreOnce();
3386
- logger6.fail("humanClick", error);
3436
+ logger5.fail("humanClick", error);
3387
3437
  throw error;
3388
3438
  }
3389
3439
  },
@@ -3394,9 +3444,9 @@ var Humanize = {
3394
3444
  */
3395
3445
  async randomSleep(baseMs, jitterPercent = 0.3) {
3396
3446
  const ms = this.jitterMs(baseMs, jitterPercent);
3397
- logger6.start("randomSleep", `base=${baseMs}, actual=${ms}ms`);
3447
+ logger5.start("randomSleep", `base=${baseMs}, actual=${ms}ms`);
3398
3448
  await delay2(ms);
3399
- logger6.success("randomSleep");
3449
+ logger5.success("randomSleep");
3400
3450
  },
3401
3451
  /**
3402
3452
  * 模拟人类"注视"或"阅读"行为:鼠标在页面上随机微动
@@ -3406,7 +3456,7 @@ var Humanize = {
3406
3456
  async simulateGaze(page, baseDurationMs = 2500) {
3407
3457
  const cursor = $GetCursor(page);
3408
3458
  const durationMs = this.jitterMs(baseDurationMs, 0.4);
3409
- logger6.start("simulateGaze", `duration=${durationMs}ms`);
3459
+ logger5.start("simulateGaze", `duration=${durationMs}ms`);
3410
3460
  const startTime = Date.now();
3411
3461
  const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
3412
3462
  while (Date.now() - startTime < durationMs) {
@@ -3415,7 +3465,7 @@ var Humanize = {
3415
3465
  await cursor.actions.move({ x, y });
3416
3466
  await delay2(this.jitterMs(600, 0.5));
3417
3467
  }
3418
- logger6.success("simulateGaze");
3468
+ logger5.success("simulateGaze");
3419
3469
  },
3420
3470
  /**
3421
3471
  * 人类化输入 - 带节奏变化(快-慢-停顿-偶尔加速)
@@ -3428,7 +3478,7 @@ var Humanize = {
3428
3478
  * @param {number} [options.pauseBase=800] - 停顿时长基础值 (ms),实际 ±50% 抖动
3429
3479
  */
3430
3480
  async humanType(page, selector, text, options = {}) {
3431
- logger6.start("humanType", `selector=${selector}, textLen=${text.length}`);
3481
+ logger5.start("humanType", `selector=${selector}, textLen=${text.length}`);
3432
3482
  const {
3433
3483
  baseDelay = 180,
3434
3484
  pauseProbability = 0.08,
@@ -3452,13 +3502,13 @@ var Humanize = {
3452
3502
  await delay2(charDelay);
3453
3503
  if (Math.random() < pauseProbability && i < text.length - 1) {
3454
3504
  const pauseTime = this.jitterMs(pauseBase, 0.5);
3455
- logger6.debug(`\u505C\u987F ${pauseTime}ms...`);
3505
+ logger5.debug(`\u505C\u987F ${pauseTime}ms...`);
3456
3506
  await delay2(pauseTime);
3457
3507
  }
3458
3508
  }
3459
- logger6.success("humanType");
3509
+ logger5.success("humanType");
3460
3510
  } catch (error) {
3461
- logger6.fail("humanType", error);
3511
+ logger5.fail("humanType", error);
3462
3512
  throw error;
3463
3513
  }
3464
3514
  },
@@ -3482,7 +3532,7 @@ var Humanize = {
3482
3532
  keyboardOptions = {}
3483
3533
  } = pressOptions || {};
3484
3534
  const targetDesc = hasTarget ? typeof targetOrKey === "string" ? targetOrKey : "ElementHandle" : "current focus";
3485
- logger6.start("humanPress", `key=${key}, target=${targetDesc}`);
3535
+ logger5.start("humanPress", `key=${key}, target=${targetDesc}`);
3486
3536
  try {
3487
3537
  if (hasTarget) {
3488
3538
  await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });
@@ -3492,10 +3542,10 @@ var Humanize = {
3492
3542
  ...keyboardOptions,
3493
3543
  delay: this.jitterMs(holdDelay, 0.5)
3494
3544
  });
3495
- logger6.success("humanPress");
3545
+ logger5.success("humanPress");
3496
3546
  return true;
3497
3547
  } catch (error) {
3498
- logger6.fail("humanPress", error);
3548
+ logger5.fail("humanPress", error);
3499
3549
  throw error;
3500
3550
  }
3501
3551
  },
@@ -3505,22 +3555,22 @@ var Humanize = {
3505
3555
  * @param {string} selector - 输入框选择器
3506
3556
  */
3507
3557
  async humanClear(page, selector) {
3508
- logger6.start("humanClear", `selector=${selector}`);
3558
+ logger5.start("humanClear", `selector=${selector}`);
3509
3559
  try {
3510
3560
  const locator = page.locator(selector);
3511
3561
  await locator.click();
3512
3562
  await delay2(this.jitterMs(200, 0.4));
3513
3563
  const currentValue = await locator.inputValue();
3514
3564
  if (!currentValue || currentValue.length === 0) {
3515
- logger6.success("humanClear", "already empty");
3565
+ logger5.success("humanClear", "already empty");
3516
3566
  return;
3517
3567
  }
3518
3568
  await page.keyboard.press("Meta+A");
3519
3569
  await delay2(this.jitterMs(100, 0.4));
3520
3570
  await page.keyboard.press("Backspace");
3521
- logger6.success("humanClear");
3571
+ logger5.success("humanClear");
3522
3572
  } catch (error) {
3523
- logger6.fail("humanClear", error);
3573
+ logger5.fail("humanClear", error);
3524
3574
  throw error;
3525
3575
  }
3526
3576
  },
@@ -3532,7 +3582,7 @@ var Humanize = {
3532
3582
  async warmUpBrowsing(page, baseDuration = 3500) {
3533
3583
  const cursor = $GetCursor(page);
3534
3584
  const durationMs = this.jitterMs(baseDuration, 0.4);
3535
- logger6.start("warmUpBrowsing", `duration=${durationMs}ms`);
3585
+ logger5.start("warmUpBrowsing", `duration=${durationMs}ms`);
3536
3586
  const startTime = Date.now();
3537
3587
  const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
3538
3588
  try {
@@ -3551,9 +3601,9 @@ var Humanize = {
3551
3601
  await delay2(this.jitterMs(800, 0.5));
3552
3602
  }
3553
3603
  }
3554
- logger6.success("warmUpBrowsing");
3604
+ logger5.success("warmUpBrowsing");
3555
3605
  } catch (error) {
3556
- logger6.fail("warmUpBrowsing", error);
3606
+ logger5.fail("warmUpBrowsing", error);
3557
3607
  throw error;
3558
3608
  }
3559
3609
  },
@@ -3567,7 +3617,7 @@ var Humanize = {
3567
3617
  async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
3568
3618
  const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
3569
3619
  const actualDistance = this.jitterMs(distance, 0.15);
3570
- logger6.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
3620
+ logger5.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
3571
3621
  const sign = direction === "down" ? 1 : -1;
3572
3622
  const stepDistance = actualDistance / steps;
3573
3623
  try {
@@ -3579,9 +3629,9 @@ var Humanize = {
3579
3629
  const baseDelay = 60 + i * 25;
3580
3630
  await delay2(this.jitterMs(baseDelay, 0.3));
3581
3631
  }
3582
- logger6.success("naturalScroll");
3632
+ logger5.success("naturalScroll");
3583
3633
  } catch (error) {
3584
- logger6.fail("naturalScroll", error);
3634
+ logger5.fail("naturalScroll", error);
3585
3635
  throw error;
3586
3636
  }
3587
3637
  }
@@ -3610,7 +3660,7 @@ var resolveElement = async (page, target, { throwOnMissing = true } = {}) => {
3610
3660
  var waitJitter = (base, jitterPercent = 0.3) => delay3(jitterMs(base, jitterPercent));
3611
3661
 
3612
3662
  // src/internals/humanize/mobile.js
3613
- var logger7 = createInternalLogger("Humanize.Mobile");
3663
+ var logger6 = createInternalLogger("Humanize.Mobile");
3614
3664
  var initializedPages = /* @__PURE__ */ new WeakSet();
3615
3665
  var DEFAULT_TAP_TIMEOUT_MS = 2500;
3616
3666
  var DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;
@@ -4067,7 +4117,7 @@ var dispatchTouchSwipe = async (page, deltaY, options = {}) => {
4067
4117
  }
4068
4118
  return true;
4069
4119
  } catch (error) {
4070
- logger7.debug(`touch swipe fallback: ${error?.message || error}`);
4120
+ logger6.debug(`touch swipe fallback: ${error?.message || error}`);
4071
4121
  try {
4072
4122
  await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);
4073
4123
  await waitJitter(120, 0.35);
@@ -4101,7 +4151,7 @@ var tapPoint = async (page, point, options = {}) => {
4101
4151
  );
4102
4152
  return { method: "touchscreen" };
4103
4153
  } catch (error) {
4104
- logger7.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
4154
+ logger6.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
4105
4155
  if (!allowMouseFallback) throw error;
4106
4156
  }
4107
4157
  }
@@ -4117,10 +4167,10 @@ var MobileHumanize = {
4117
4167
  async initializeCursor(page) {
4118
4168
  if (initializedPages.has(page)) return;
4119
4169
  initializedPages.add(page);
4120
- logger7.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
4170
+ logger6.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
4121
4171
  },
4122
4172
  async humanMove(page, target) {
4123
- logger7.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
4173
+ logger6.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
4124
4174
  if (typeof target === "string" || target && typeof target.boundingBox === "function") {
4125
4175
  const element = await resolveElement(page, target, { throwOnMissing: false });
4126
4176
  if (!element) {
@@ -4139,10 +4189,10 @@ var MobileHumanize = {
4139
4189
  throwOnMissing = false
4140
4190
  } = options;
4141
4191
  const targetDesc = describeTarget(target);
4142
- logger7.start("humanScroll", `target=${targetDesc}`);
4192
+ logger6.start("humanScroll", `target=${targetDesc}`);
4143
4193
  const element = await resolveElement(page, target, { throwOnMissing });
4144
4194
  if (!element) {
4145
- logger7.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
4195
+ logger6.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
4146
4196
  return { element: null, didScroll: false, restore: null };
4147
4197
  }
4148
4198
  const startTime = Date.now();
@@ -4151,42 +4201,42 @@ var MobileHumanize = {
4151
4201
  const status = await checkElementVisibility(element);
4152
4202
  if (status.code === "VISIBLE") {
4153
4203
  if (status.isFixed) {
4154
- logger7.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
4204
+ logger6.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
4155
4205
  } else {
4156
- logger7.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
4206
+ logger6.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
4157
4207
  }
4158
- logger7.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
4208
+ logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
4159
4209
  return { element, didScroll, restore: null };
4160
4210
  }
4161
4211
  if (status.code === "ZERO_DIMENSIONS" || status.code === "NOT_INTERACTABLE") {
4162
- logger7.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
4212
+ logger6.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
4163
4213
  return { element, didScroll, restore: null };
4164
4214
  }
4165
4215
  const scrollRect = await getScrollableRect(element);
4166
4216
  if (!scrollRect && status.isFixed && status.code === "OUT_OF_VIEWPORT") {
4167
- logger7.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || "unknown"})`);
4217
+ logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || "unknown"})`);
4168
4218
  return { element, didScroll, restore: null, unscrollable: true };
4169
4219
  }
4170
4220
  if (!scrollRect && status.isFixed && status.code === "OBSTRUCTED") {
4171
- logger7.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
4221
+ logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
4172
4222
  return { element, didScroll, restore: null, unscrollable: true };
4173
4223
  }
4174
4224
  if (scrollRect && status.code === "OBSTRUCTED" && status.obstruction?.isFixed) {
4175
4225
  const moved = await scrollAwayFromObstruction(element, status);
4176
4226
  if (moved.moved) {
4177
- logger7.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
4227
+ logger6.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
4178
4228
  await waitJitter(90, 0.3);
4179
4229
  didScroll = true;
4180
4230
  continue;
4181
4231
  }
4182
4232
  }
4183
4233
  if (Date.now() - startTime > maxDurationMs) {
4184
- logger7.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
4234
+ logger6.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
4185
4235
  return { element, didScroll, restore: null };
4186
4236
  }
4187
4237
  const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
4188
4238
  const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;
4189
- logger7.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
4239
+ logger6.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
4190
4240
  const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);
4191
4241
  let deltaY = status.direction === "up" ? -distance : distance;
4192
4242
  if (status.code === "OBSTRUCTED") {
@@ -4227,7 +4277,7 @@ var MobileHumanize = {
4227
4277
  const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4228
4278
  if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
4229
4279
  await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);
4230
- logger7.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
4280
+ logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
4231
4281
  }
4232
4282
  }
4233
4283
  let afterElementSnapshot = null;
@@ -4241,7 +4291,7 @@ var MobileHumanize = {
4241
4291
  const afterSnapshot = await readAfterElementSnapshot();
4242
4292
  if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
4243
4293
  await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
4244
- logger7.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
4294
+ logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
4245
4295
  return { element, didScroll, restore: null, unscrollable: true };
4246
4296
  }
4247
4297
  }
@@ -4273,12 +4323,12 @@ var MobileHumanize = {
4273
4323
  const moved = beforeState.kind !== afterState.kind || Math.abs(topDelta) > 2 || Math.abs(leftDelta) > 2;
4274
4324
  if (!moved) {
4275
4325
  const fallback = await scrollScrollableAncestor(element, deltaY);
4276
- logger7.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
4326
+ logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
4277
4327
  } else if (beforeState.kind === afterState.kind && Math.abs(expectedDelta) > 24 && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta) && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)) {
4278
4328
  const residualDelta = expectedDelta - topDelta;
4279
4329
  if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {
4280
4330
  const fallback = await scrollScrollableAncestor(element, residualDelta);
4281
- logger7.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
4331
+ logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
4282
4332
  }
4283
4333
  }
4284
4334
  }
@@ -4286,7 +4336,7 @@ var MobileHumanize = {
4286
4336
  const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);
4287
4337
  if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
4288
4338
  await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
4289
- logger7.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
4339
+ logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
4290
4340
  return { element, didScroll, restore: null, unscrollable: true };
4291
4341
  }
4292
4342
  }
@@ -4297,14 +4347,14 @@ var MobileHumanize = {
4297
4347
  await waitJitter(80, 0.3);
4298
4348
  const finalStatus = await checkElementVisibility(element);
4299
4349
  if (finalStatus.code === "VISIBLE") {
4300
- logger7.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
4301
- logger7.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
4350
+ logger6.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
4351
+ logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
4302
4352
  return { element, didScroll: true, restore: null };
4303
4353
  }
4304
4354
  } catch (fallbackError) {
4305
- logger7.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
4355
+ logger6.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
4306
4356
  }
4307
- logger7.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
4357
+ logger6.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
4308
4358
  return { element, didScroll, restore: null };
4309
4359
  },
4310
4360
  async humanClick(page, target, options = {}) {
@@ -4319,7 +4369,7 @@ var MobileHumanize = {
4319
4369
  fallbackDomClickOnTapError = true
4320
4370
  } = options;
4321
4371
  const targetDesc = describeTarget(target);
4322
- logger7.start("humanClick", `target=${targetDesc}`);
4372
+ logger6.start("humanClick", `target=${targetDesc}`);
4323
4373
  try {
4324
4374
  if (target == null) {
4325
4375
  const viewport = resolveViewport(page);
@@ -4331,12 +4381,12 @@ var MobileHumanize = {
4331
4381
  timeoutMs: tapTimeoutMs,
4332
4382
  mouseFallbackTimeoutMs
4333
4383
  });
4334
- logger7.success("humanClick", "Tapped current position");
4384
+ logger6.success("humanClick", "Tapped current position");
4335
4385
  return true;
4336
4386
  }
4337
4387
  const element = await resolveElement(page, target, { throwOnMissing });
4338
4388
  if (!element) {
4339
- logger7.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
4389
+ logger6.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
4340
4390
  return false;
4341
4391
  }
4342
4392
  const scrollResult = scrollIfNeeded ? await MobileHumanize.humanScroll(page, element, { throwOnMissing }) : null;
@@ -4360,19 +4410,19 @@ var MobileHumanize = {
4360
4410
  ).catch(() => null);
4361
4411
  }
4362
4412
  if (fallback?.activated) {
4363
- logger7.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
4413
+ logger6.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
4364
4414
  return true;
4365
4415
  }
4366
4416
  }
4367
4417
  const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;
4368
4418
  if (throwOnMissing) throw new Error(message);
4369
- logger7.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
4419
+ logger6.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
4370
4420
  return false;
4371
4421
  }
4372
4422
  const box = await element.boundingBox();
4373
4423
  if (!box) {
4374
4424
  if (throwOnMissing) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4375
- logger7.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
4425
+ logger6.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
4376
4426
  return false;
4377
4427
  }
4378
4428
  await waitJitter(reactionDelay, 0.45);
@@ -4393,13 +4443,13 @@ var MobileHumanize = {
4393
4443
  "activation fallback"
4394
4444
  ).catch(() => null);
4395
4445
  if (!fallback?.activated) throw tapError;
4396
- logger7.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
4446
+ logger6.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
4397
4447
  }
4398
4448
  await waitJitter(120, 0.35);
4399
- logger7.success("humanClick");
4449
+ logger6.success("humanClick");
4400
4450
  return true;
4401
4451
  } catch (error) {
4402
- logger7.fail("humanClick", error);
4452
+ logger6.fail("humanClick", error);
4403
4453
  throw error;
4404
4454
  }
4405
4455
  },
@@ -4452,7 +4502,7 @@ var MobileHumanize = {
4452
4502
  keyboardOptions = {}
4453
4503
  } = pressOptions || {};
4454
4504
  const targetDesc = hasTarget ? describeTarget(targetOrKey) : "current focus";
4455
- logger7.start("humanPress", `key=${key}, target=${targetDesc}`);
4505
+ logger6.start("humanPress", `key=${key}, target=${targetDesc}`);
4456
4506
  try {
4457
4507
  if (hasTarget) {
4458
4508
  await MobileHumanize.humanClick(page, targetOrKey, {
@@ -4466,10 +4516,10 @@ var MobileHumanize = {
4466
4516
  ...keyboardOptions,
4467
4517
  delay: jitterMs(holdDelay, 0.5)
4468
4518
  });
4469
- logger7.success("humanPress");
4519
+ logger6.success("humanPress");
4470
4520
  return true;
4471
4521
  } catch (error) {
4472
- logger7.fail("humanPress", error);
4522
+ logger6.fail("humanPress", error);
4473
4523
  throw error;
4474
4524
  }
4475
4525
  },
@@ -4536,7 +4586,7 @@ var MobileHumanize = {
4536
4586
  }
4537
4587
  };
4538
4588
 
4539
- // src/humanize.js
4589
+ // src/internals/humanize/default.js
4540
4590
  var resolveDeviceFromPage2 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
4541
4591
  var resolveDelegate = (page) => {
4542
4592
  return resolveDeviceFromPage2(page) === Device.Mobile ? MobileHumanize : Humanize;
@@ -4545,7 +4595,7 @@ var callDelegate = (method, page, args) => {
4545
4595
  const delegate = resolveDelegate(page);
4546
4596
  return delegate[method](page, ...args);
4547
4597
  };
4548
- var Humanize2 = {
4598
+ var DefaultHumanize = {
4549
4599
  jitterMs(base, jitterPercent = 0.3) {
4550
4600
  return Humanize.jitterMs(base, jitterPercent);
4551
4601
  },
@@ -4591,7 +4641,480 @@ var Humanize2 = {
4591
4641
  }
4592
4642
  };
4593
4643
 
4594
- // src/launch.js
4644
+ // src/internals/humanize/cloakbrowser.js
4645
+ import delay4 from "delay";
4646
+ var logger7 = createInternalLogger("Humanize.CloakBrowser");
4647
+ var humanizedPages = /* @__PURE__ */ new WeakSet();
4648
+ var cachedCloakHumanModulePromise = null;
4649
+ var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
4650
+ var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
4651
+ var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
4652
+ var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
4653
+ var loadCloakHumanModule = async () => {
4654
+ if (!cachedCloakHumanModulePromise) {
4655
+ cachedCloakHumanModulePromise = import("cloakbrowser/human").catch((error) => {
4656
+ cachedCloakHumanModulePromise = null;
4657
+ throw new Error("cloakbrowser/human \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002", {
4658
+ cause: error
4659
+ });
4660
+ });
4661
+ }
4662
+ return cachedCloakHumanModulePromise;
4663
+ };
4664
+ var buildTypingHumanConfig = (options = {}) => {
4665
+ const humanConfig = {};
4666
+ if (Number.isFinite(Number(options.baseDelay))) {
4667
+ humanConfig.typing_delay = Number(options.baseDelay);
4668
+ }
4669
+ if (Number.isFinite(Number(options.pauseProbability))) {
4670
+ humanConfig.typing_pause_chance = Number(options.pauseProbability);
4671
+ }
4672
+ if (Number.isFinite(Number(options.pauseBase))) {
4673
+ const basePause = Math.max(40, Number(options.pauseBase));
4674
+ humanConfig.typing_pause_range = [
4675
+ Math.round(basePause * 0.5),
4676
+ Math.round(basePause * 1.5)
4677
+ ];
4678
+ }
4679
+ return Object.keys(humanConfig).length > 0 ? humanConfig : null;
4680
+ };
4681
+ var buildActionOptions = (options = {}) => {
4682
+ const actionOptions = {};
4683
+ if (options && options.timeout != null) {
4684
+ actionOptions.timeout = options.timeout;
4685
+ }
4686
+ if (options && options.force != null) {
4687
+ actionOptions.force = options.force;
4688
+ }
4689
+ const humanConfig = buildTypingHumanConfig(options);
4690
+ if (humanConfig) {
4691
+ actionOptions.human_config = humanConfig;
4692
+ }
4693
+ return actionOptions;
4694
+ };
4695
+ var ensureDesktopHumanized = async (page) => {
4696
+ if (!page || typeof page !== "object") {
4697
+ throw new Error("Humanize requires a Playwright page");
4698
+ }
4699
+ const humanModule = await loadCloakHumanModule();
4700
+ if (page._original && page._humanCursor) {
4701
+ humanizedPages.add(page);
4702
+ return humanModule;
4703
+ }
4704
+ if (humanizedPages.has(page)) {
4705
+ return humanModule;
4706
+ }
4707
+ const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
4708
+ const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
4709
+ humanModule.patchPage(page, config, cursor);
4710
+ humanizedPages.add(page);
4711
+ return humanModule;
4712
+ };
4713
+ var patchHandle = async (page, handle) => {
4714
+ if (!handle || typeof handle !== "object") return handle;
4715
+ const humanModule = await ensureDesktopHumanized(page);
4716
+ humanModule.patchSingleElementHandle(
4717
+ handle,
4718
+ page,
4719
+ page._humanCfg,
4720
+ page._humanCursor,
4721
+ page._humanRaw,
4722
+ page._humanRawKb,
4723
+ page._humanOriginals,
4724
+ page._stealth
4725
+ );
4726
+ return handle;
4727
+ };
4728
+ var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
4729
+ if (target == null) {
4730
+ return { target: null, dispose: null };
4731
+ }
4732
+ if (typeof target === "string") {
4733
+ const handle = await page.$(target);
4734
+ if (!handle) {
4735
+ if (throwOnMissing) {
4736
+ throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
4737
+ }
4738
+ return { target: null, dispose: null };
4739
+ }
4740
+ return { target: handle, dispose: null };
4741
+ }
4742
+ if (typeof target.elementHandle === "function") {
4743
+ const handle = await target.elementHandle();
4744
+ if (!handle) {
4745
+ if (throwOnMissing) {
4746
+ throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
4747
+ }
4748
+ return { target: null, dispose: null };
4749
+ }
4750
+ await patchHandle(page, handle);
4751
+ return {
4752
+ target: handle,
4753
+ dispose: async () => {
4754
+ await handle.dispose().catch(() => {
4755
+ });
4756
+ }
4757
+ };
4758
+ }
4759
+ await patchHandle(page, target);
4760
+ return { target, dispose: null };
4761
+ };
4762
+ var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
4763
+ await delay4(jitterMs(baseMs, jitterPercent));
4764
+ };
4765
+ var humanMoveToPoint = async (page, point) => {
4766
+ await ensureDesktopHumanized(page);
4767
+ await page.mouse.move(Number(point.x), Number(point.y));
4768
+ return true;
4769
+ };
4770
+ var doDesktopHumanClick = async (page, target, options = {}) => {
4771
+ await ensureDesktopHumanized(page);
4772
+ if (target == null) {
4773
+ const cursor = page._humanCursor || { x: 0, y: 0 };
4774
+ await page.mouse.click(cursor.x || 0, cursor.y || 0);
4775
+ return true;
4776
+ }
4777
+ if (isPoint2(target)) {
4778
+ return humanMoveToPoint(page, target).then(async () => {
4779
+ await page.mouse.click(Number(target.x), Number(target.y));
4780
+ return true;
4781
+ });
4782
+ }
4783
+ const throwOnMissing = options.throwOnMissing !== false;
4784
+ if (typeof target === "string") {
4785
+ if (!throwOnMissing) {
4786
+ const existingHandle = await page.$(target);
4787
+ if (!existingHandle) {
4788
+ return false;
4789
+ }
4790
+ await existingHandle.click(buildActionOptions(options));
4791
+ return true;
4792
+ }
4793
+ await page.click(target, buildActionOptions(options));
4794
+ return true;
4795
+ }
4796
+ const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
4797
+ try {
4798
+ if (!resolvedTarget) {
4799
+ return false;
4800
+ }
4801
+ if (typeof resolvedTarget.click === "function") {
4802
+ await resolvedTarget.click(buildActionOptions(options));
4803
+ return true;
4804
+ }
4805
+ const box = await resolvedTarget.boundingBox?.();
4806
+ if (!box) {
4807
+ if (throwOnMissing) {
4808
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4809
+ }
4810
+ return false;
4811
+ }
4812
+ await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4813
+ return true;
4814
+ } finally {
4815
+ if (typeof dispose === "function") {
4816
+ await dispose();
4817
+ }
4818
+ }
4819
+ };
4820
+ var CloakBrowserHumanize = {
4821
+ jitterMs(base, jitterPercent = 0.3) {
4822
+ return jitterMs(base, jitterPercent);
4823
+ },
4824
+ async initializeCursor(page) {
4825
+ if (isMobilePage(page)) {
4826
+ return MobileHumanize.initializeCursor(page);
4827
+ }
4828
+ await ensureDesktopHumanized(page);
4829
+ logger7.debug("initializeCursor: cloakbrowser human layer ready");
4830
+ },
4831
+ async humanMove(page, target) {
4832
+ if (isMobilePage(page)) {
4833
+ return await MobileHumanize.humanMove(page, target);
4834
+ }
4835
+ await ensureDesktopHumanized(page);
4836
+ if (isPoint2(target)) {
4837
+ return await humanMoveToPoint(page, target);
4838
+ }
4839
+ const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4840
+ try {
4841
+ if (!resolvedTarget) {
4842
+ return false;
4843
+ }
4844
+ if (typeof resolvedTarget.hover === "function") {
4845
+ await resolvedTarget.hover();
4846
+ return true;
4847
+ }
4848
+ const box = await resolvedTarget.boundingBox?.();
4849
+ if (!box) {
4850
+ return false;
4851
+ }
4852
+ await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
4853
+ return true;
4854
+ } finally {
4855
+ if (typeof dispose === "function") {
4856
+ await dispose();
4857
+ }
4858
+ }
4859
+ },
4860
+ async humanScroll(page, target, options = {}) {
4861
+ if (isMobilePage(page)) {
4862
+ return await MobileHumanize.humanScroll(page, target, options);
4863
+ }
4864
+ const humanModule = await ensureDesktopHumanized(page);
4865
+ if (typeof target === "string") {
4866
+ const { x = 0, y = 0 } = page._humanCursor || {};
4867
+ try {
4868
+ const result = await humanModule.scrollToElement(
4869
+ page,
4870
+ page._humanRaw,
4871
+ target,
4872
+ x,
4873
+ y,
4874
+ page._humanCfg,
4875
+ options.timeout
4876
+ );
4877
+ if (page._humanCursor) {
4878
+ page._humanCursor.x = result.cursorX;
4879
+ page._humanCursor.y = result.cursorY;
4880
+ }
4881
+ return {
4882
+ element: await page.$(target),
4883
+ didScroll: Boolean(result.didScroll),
4884
+ restore: null
4885
+ };
4886
+ } catch (error) {
4887
+ logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
4888
+ return { element: null, didScroll: false, restore: null };
4889
+ }
4890
+ }
4891
+ const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4892
+ try {
4893
+ if (!resolvedTarget) {
4894
+ return { element: null, didScroll: false, restore: null };
4895
+ }
4896
+ const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4897
+ await resolvedTarget.scrollIntoViewIfNeeded?.();
4898
+ const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4899
+ return {
4900
+ element: resolvedTarget,
4901
+ didScroll: before.x !== after.x || before.y !== after.y,
4902
+ restore: null
4903
+ };
4904
+ } finally {
4905
+ if (typeof dispose === "function") {
4906
+ await dispose();
4907
+ }
4908
+ }
4909
+ },
4910
+ async humanClick(page, target, options = {}) {
4911
+ if (isMobilePage(page)) {
4912
+ return await MobileHumanize.humanClick(page, target, options);
4913
+ }
4914
+ return await doDesktopHumanClick(page, target, options);
4915
+ },
4916
+ async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
4917
+ if (isPageLike2(pageOrBaseMs)) {
4918
+ if (isMobilePage(pageOrBaseMs)) {
4919
+ return await MobileHumanize.randomSleep(maybeBaseMs, maybeJitterPercent);
4920
+ }
4921
+ await jitterSleep(maybeBaseMs, maybeJitterPercent ?? 0.3);
4922
+ return;
4923
+ }
4924
+ await jitterSleep(pageOrBaseMs, maybeBaseMs ?? 0.3);
4925
+ },
4926
+ async simulateGaze(page, baseDurationMs = 2500) {
4927
+ if (isMobilePage(page)) {
4928
+ return await MobileHumanize.simulateGaze(page, baseDurationMs);
4929
+ }
4930
+ await ensureDesktopHumanized(page);
4931
+ const durationMs = jitterMs(baseDurationMs, 0.4);
4932
+ const startTime = Date.now();
4933
+ const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
4934
+ while (Date.now() - startTime < durationMs) {
4935
+ await page.mouse.move(
4936
+ 100 + Math.random() * Math.max(120, viewportSize.width - 200),
4937
+ 100 + Math.random() * Math.max(120, viewportSize.height - 200)
4938
+ );
4939
+ await jitterSleep(600, 0.5);
4940
+ }
4941
+ },
4942
+ async humanType(page, selector, text, options = {}) {
4943
+ if (isMobilePage(page)) {
4944
+ return await MobileHumanize.humanType(page, selector, text, options);
4945
+ }
4946
+ await ensureDesktopHumanized(page);
4947
+ const actionOptions = buildActionOptions(options);
4948
+ if (typeof selector === "string") {
4949
+ await page.type(selector, text, actionOptions);
4950
+ return;
4951
+ }
4952
+ const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
4953
+ try {
4954
+ if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4955
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4956
+ }
4957
+ await resolvedTarget.type(text, actionOptions);
4958
+ } finally {
4959
+ if (typeof dispose === "function") {
4960
+ await dispose();
4961
+ }
4962
+ }
4963
+ },
4964
+ async humanPress(page, targetOrKey, maybeKey, options = {}) {
4965
+ if (isMobilePage(page)) {
4966
+ return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
4967
+ }
4968
+ await ensureDesktopHumanized(page);
4969
+ const hasTarget = typeof maybeKey === "string";
4970
+ const key = hasTarget ? maybeKey : targetOrKey;
4971
+ const pressOptions = hasTarget ? options : maybeKey || options;
4972
+ if (!hasTarget) {
4973
+ await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
4974
+ await page.keyboard.press(key, {
4975
+ ...pressOptions.keyboardOptions || {},
4976
+ delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
4977
+ });
4978
+ return true;
4979
+ }
4980
+ if (typeof targetOrKey === "string") {
4981
+ await page.press(targetOrKey, key, buildActionOptions(pressOptions));
4982
+ return true;
4983
+ }
4984
+ const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
4985
+ throwOnMissing: pressOptions.throwOnMissing !== false
4986
+ });
4987
+ try {
4988
+ if (!resolvedTarget) {
4989
+ return false;
4990
+ }
4991
+ if (typeof resolvedTarget.press === "function") {
4992
+ await resolvedTarget.press(key, buildActionOptions(pressOptions));
4993
+ return true;
4994
+ }
4995
+ await doDesktopHumanClick(page, targetOrKey, {
4996
+ ...pressOptions,
4997
+ reactionDelay: pressOptions.focusDelay ?? 180
4998
+ });
4999
+ await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
5000
+ await page.keyboard.press(key, {
5001
+ ...pressOptions.keyboardOptions || {},
5002
+ delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
5003
+ });
5004
+ return true;
5005
+ } finally {
5006
+ if (typeof dispose === "function") {
5007
+ await dispose();
5008
+ }
5009
+ }
5010
+ },
5011
+ async humanClear(page, selector) {
5012
+ if (isMobilePage(page)) {
5013
+ return await MobileHumanize.humanClear(page, selector);
5014
+ }
5015
+ await ensureDesktopHumanized(page);
5016
+ if (typeof page.clear === "function") {
5017
+ await page.clear(selector);
5018
+ return;
5019
+ }
5020
+ await page.fill(selector, "");
5021
+ },
5022
+ async warmUpBrowsing(page, baseDuration = 3500) {
5023
+ if (isMobilePage(page)) {
5024
+ return await MobileHumanize.warmUpBrowsing(page, baseDuration);
5025
+ }
5026
+ await ensureDesktopHumanized(page);
5027
+ const durationMs = jitterMs(baseDuration, 0.4);
5028
+ const startTime = Date.now();
5029
+ const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
5030
+ while (Date.now() - startTime < durationMs) {
5031
+ const action = Math.random();
5032
+ if (action < 0.4) {
5033
+ await page.mouse.move(
5034
+ 100 + Math.random() * Math.max(120, viewportSize.width - 200),
5035
+ 100 + Math.random() * Math.max(120, viewportSize.height - 200)
5036
+ );
5037
+ await jitterSleep(350, 0.4);
5038
+ continue;
5039
+ }
5040
+ if (action < 0.7) {
5041
+ await page.mouse.wheel(0, (Math.random() - 0.5) * 220);
5042
+ await jitterSleep(500, 0.4);
5043
+ continue;
5044
+ }
5045
+ await jitterSleep(800, 0.5);
5046
+ }
5047
+ },
5048
+ async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5049
+ if (isMobilePage(page)) {
5050
+ return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
5051
+ }
5052
+ await ensureDesktopHumanized(page);
5053
+ const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
5054
+ const actualDistance = jitterMs(distance, 0.15);
5055
+ const sign = direction === "down" ? 1 : -1;
5056
+ const stepDistance = actualDistance / steps;
5057
+ for (let index = 0; index < steps; index += 1) {
5058
+ const factor = 1 - index / steps * 0.5;
5059
+ const jitter = 0.9 + Math.random() * 0.2;
5060
+ await page.mouse.wheel(0, stepDistance * factor * sign * jitter);
5061
+ await jitterSleep(60 + index * 25, 0.3);
5062
+ }
5063
+ }
5064
+ };
5065
+
5066
+ // src/humanize.js
5067
+ var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
5068
+ var callHumanize = (method, ...args) => {
5069
+ const delegate = resolveHumanizeDelegate();
5070
+ if (typeof delegate?.[method] !== "function") {
5071
+ throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
5072
+ }
5073
+ return delegate[method](...args);
5074
+ };
5075
+ var Humanize2 = {
5076
+ jitterMs(base, jitterPercent = 0.3) {
5077
+ return callHumanize("jitterMs", base, jitterPercent);
5078
+ },
5079
+ initializeCursor(page) {
5080
+ return callHumanize("initializeCursor", page);
5081
+ },
5082
+ humanMove(page, target) {
5083
+ return callHumanize("humanMove", page, target);
5084
+ },
5085
+ humanScroll(page, target, options = {}) {
5086
+ return callHumanize("humanScroll", page, target, options);
5087
+ },
5088
+ humanClick(page, target, options = {}) {
5089
+ return callHumanize("humanClick", page, target, options);
5090
+ },
5091
+ randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
5092
+ return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
5093
+ },
5094
+ simulateGaze(page, baseDurationMs = 2500) {
5095
+ return callHumanize("simulateGaze", page, baseDurationMs);
5096
+ },
5097
+ humanType(page, selector, text, options = {}) {
5098
+ return callHumanize("humanType", page, selector, text, options);
5099
+ },
5100
+ humanPress(page, targetOrKey, maybeKey, options = {}) {
5101
+ if (typeof maybeKey === "string") {
5102
+ return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
5103
+ }
5104
+ return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
5105
+ },
5106
+ humanClear(page, selector) {
5107
+ return callHumanize("humanClear", page, selector);
5108
+ },
5109
+ warmUpBrowsing(page, baseDuration = 3500) {
5110
+ return callHumanize("warmUpBrowsing", page, baseDuration);
5111
+ },
5112
+ naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5113
+ return callHumanize("naturalScroll", page, direction, distance, baseSteps);
5114
+ }
5115
+ };
5116
+
5117
+ // src/internals/launch/default.js
4595
5118
  import { execFileSync } from "node:child_process";
4596
5119
  import { FingerprintGenerator } from "fingerprint-generator";
4597
5120
  import { FingerprintInjector } from "fingerprint-injector";
@@ -4676,7 +5199,7 @@ var ByPass = {
4676
5199
  resolveRouteByProxy
4677
5200
  };
4678
5201
 
4679
- // src/launch.js
5202
+ // src/internals/launch/default.js
4680
5203
  var logger8 = createInternalLogger("Launch");
4681
5204
  var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
4682
5205
  var injectedContexts = /* @__PURE__ */ new WeakSet();
@@ -4743,7 +5266,7 @@ var resolveCoreDevice = (core = {}) => {
4743
5266
  };
4744
5267
  var buildFingerprintGenerator = ({ locale, browserMajorVersion, device }) => {
4745
5268
  return new FingerprintGenerator(
4746
- AntiCheat.getFingerprintGeneratorOptions({
5269
+ DefaultAntiCheat.getFingerprintGeneratorOptions({
4747
5270
  locale,
4748
5271
  browserMajorVersion,
4749
5272
  device
@@ -4787,7 +5310,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
4787
5310
  }
4788
5311
  let nextState = RuntimeEnv.rememberState(runtimeState);
4789
5312
  let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);
4790
- const timezoneId = String(browserProfileCore?.timezone_id || "").trim() || AntiCheat.getBaseConfig().timezoneId;
5313
+ const timezoneId = String(browserProfileCore?.timezone_id || "").trim() || DefaultAntiCheat.getBaseConfig().timezoneId;
4791
5314
  const locale = DEFAULT_LOCALE;
4792
5315
  const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);
4793
5316
  const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);
@@ -4896,7 +5419,7 @@ var buildReplayBrowserPoolOptions = (browserProfileCore) => {
4896
5419
  ]
4897
5420
  };
4898
5421
  };
4899
- var Launch = {
5422
+ var DefaultLaunch = {
4900
5423
  getPlaywrightCrawlerOptions(options = {}) {
4901
5424
  const normalizedOptions = Array.isArray(options) ? { customArgs: options } : options || {};
4902
5425
  const {
@@ -4924,7 +5447,7 @@ var Launch = {
4924
5447
  const launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;
4925
5448
  const launchOptions = {
4926
5449
  args: [
4927
- ...AntiCheat.getLaunchArgs({ locale: launchLocale }),
5450
+ ...DefaultAntiCheat.getLaunchArgs({ locale: launchLocale }),
4928
5451
  ...customArgs
4929
5452
  ],
4930
5453
  ignoreDefaultArgs: ["--enable-automation"]
@@ -4992,7 +5515,7 @@ var Launch = {
4992
5515
  browserPoolOptions: replayBrowserPoolOptions || {
4993
5516
  useFingerprints: true,
4994
5517
  fingerprintOptions: {
4995
- fingerprintGeneratorOptions: AntiCheat.getFingerprintGeneratorOptions({
5518
+ fingerprintGeneratorOptions: DefaultAntiCheat.getFingerprintGeneratorOptions({
4996
5519
  locale: launchLocale,
4997
5520
  device
4998
5521
  })
@@ -5000,7 +5523,7 @@ var Launch = {
5000
5523
  prePageCreateHooks: [
5001
5524
  (_pageId, browserController, pageOptions = {}) => {
5002
5525
  const fingerprintWithHeaders = browserController?.launchContext?.fingerprint;
5003
- const timezoneId = AntiCheat.getBaseConfig().timezoneId;
5526
+ const timezoneId = DefaultAntiCheat.getBaseConfig().timezoneId;
5004
5527
  applyFingerprintPageOptions(pageOptions, {
5005
5528
  fingerprintWithHeaders,
5006
5529
  locale: launchLocale,
@@ -5027,7 +5550,7 @@ var Launch = {
5027
5550
  }
5028
5551
  };
5029
5552
 
5030
- // src/cloakbrowser.js
5553
+ // src/internals/launch/cloakbrowser.js
5031
5554
  import { execFile } from "node:child_process";
5032
5555
  import { promisify } from "node:util";
5033
5556
  var logger9 = createInternalLogger("CloakBrowser");
@@ -5169,7 +5692,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
5169
5692
  logger9.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5170
5693
  });
5171
5694
  };
5172
- var CloakBrowser = {
5695
+ var CloakBrowserLaunch = {
5173
5696
  resolveProxyConfiguration(proxyConfiguration = {}) {
5174
5697
  return resolveCloakBrowserProxy(proxyConfiguration);
5175
5698
  },
@@ -5179,6 +5702,10 @@ var CloakBrowser = {
5179
5702
  createStableGotoHook(recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) {
5180
5703
  return createStableGotoHook(recommendedGotoOptions);
5181
5704
  },
5705
+ async getPlaywrightCrawlerOptions(options = {}) {
5706
+ const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5707
+ return crawlerOptions;
5708
+ },
5182
5709
  async buildLaunchOptions(options = {}) {
5183
5710
  return await buildCloakLaunchOptions(options);
5184
5711
  },
@@ -5256,26 +5783,35 @@ var CloakBrowser = {
5256
5783
  };
5257
5784
  }
5258
5785
  };
5259
- var createCloakLaunchModule = (baseLaunch = {}) => {
5260
- const normalizedBaseLaunch = normalizeObject(baseLaunch);
5261
- return {
5262
- ...normalizedBaseLaunch,
5263
- resolveProxyConfiguration(proxyConfiguration = {}) {
5264
- return CloakBrowser.resolveProxyConfiguration(proxyConfiguration);
5265
- },
5266
- extractFingerprintArg(launchOptions = {}) {
5267
- return CloakBrowser.extractFingerprintArg(launchOptions);
5268
- },
5269
- createStableGotoHook(recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) {
5270
- return CloakBrowser.createStableGotoHook(recommendedGotoOptions);
5271
- },
5272
- async buildLaunchOptions(options = {}) {
5273
- return await CloakBrowser.buildLaunchOptions(options);
5274
- },
5275
- async createPlaywrightCrawlerRuntime(options = {}) {
5276
- return await CloakBrowser.createPlaywrightCrawlerRuntime(options);
5277
- }
5278
- };
5786
+
5787
+ // src/launch.js
5788
+ var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
5789
+ var callLaunch = (method, ...args) => {
5790
+ const delegate = resolveLaunchDelegate();
5791
+ if (typeof delegate?.[method] !== "function") {
5792
+ throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
5793
+ }
5794
+ return delegate[method](...args);
5795
+ };
5796
+ var Launch = {
5797
+ getPlaywrightCrawlerOptions(options = {}) {
5798
+ return callLaunch("getPlaywrightCrawlerOptions", options);
5799
+ },
5800
+ resolveProxyConfiguration(proxyConfiguration = {}) {
5801
+ return callLaunch("resolveProxyConfiguration", proxyConfiguration);
5802
+ },
5803
+ extractFingerprintArg(launchOptions = {}) {
5804
+ return callLaunch("extractFingerprintArg", launchOptions);
5805
+ },
5806
+ createStableGotoHook(recommendedGotoOptions = {}) {
5807
+ return callLaunch("createStableGotoHook", recommendedGotoOptions);
5808
+ },
5809
+ buildLaunchOptions(options = {}) {
5810
+ return callLaunch("buildLaunchOptions", options);
5811
+ },
5812
+ createPlaywrightCrawlerRuntime(options = {}) {
5813
+ return callLaunch("createPlaywrightCrawlerRuntime", options);
5814
+ }
5279
5815
  };
5280
5816
 
5281
5817
  // src/live-view.js
@@ -7645,7 +8181,7 @@ var Logger = {
7645
8181
  };
7646
8182
 
7647
8183
  // src/share.js
7648
- import delay4 from "delay";
8184
+ import delay5 from "delay";
7649
8185
 
7650
8186
  // src/internals/watermarkify.js
7651
8187
  var DEFAULT_TIMEZONE_OFFSET = 8;
@@ -9716,7 +10252,7 @@ var Share = {
9716
10252
  );
9717
10253
  nextProgressLogTs = now + 5e3;
9718
10254
  }
9719
- await delay4(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
10255
+ await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
9720
10256
  }
9721
10257
  if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
9722
10258
  logger16.warning(
@@ -9782,14 +10318,14 @@ var Share = {
9782
10318
  // entrys/node.js
9783
10319
  Logger.setLogger(crawleeLog);
9784
10320
  var usePlaywrightToolKit = (mode = "default") => {
9785
- const launchModule = mode === "cloakbrowser" ? createCloakLaunchModule(Launch) : Launch;
10321
+ setToolkitMode(mode);
9786
10322
  const toolkit = {
9787
10323
  ApifyKit,
9788
10324
  AntiCheat,
9789
10325
  DeviceInput,
9790
10326
  DeviceView,
9791
10327
  Humanize: Humanize2,
9792
- Launch: launchModule,
10328
+ Launch,
9793
10329
  LiveView,
9794
10330
  Constants: constants_exports,
9795
10331
  Utils,