@skrillex1224/playwright-toolkit 2.1.220 → 2.1.221
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.cjs +375 -326
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +375 -326
- package/dist/index.js.map +4 -4
- package/index.d.ts +5 -0
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../entrys/node.js", "../src/constants.js", "../src/internals/logger.js", "../src/internals/viewport.js", "../src/internals/screenshot.js", "../src/errors.js", "../src/apify-kit.js", "../src/internals/proxy-meter-runtime.js", "../src/internals/constants.js", "../src/runtime-env.js", "../src/internals/utils.js", "../src/utils.js", "../src/anti-cheat.js", "../src/humanize.js", "../src/launch.js", "../src/proxy-bypass.js", "../src/live-view.js", "../src/captcha
|
|
4
|
-
"sourcesContent": ["import { log as crawleeLog } from 'crawlee';\nimport { ApifyKit } from '../src/apify-kit';\nimport { Utils } from '../src/utils';\nimport { AntiCheat } from '../src/anti-cheat';\nimport { Humanize } from '../src/humanize';\nimport { Launch } from '../src/launch';\nimport { LiveView } from '../src/live-view';\nimport { Captcha } from '../src/captcha-monitor';\nimport { Mutation } from '../src/mutation';\nimport { Display } from '../src/display.js';\nimport * as Constants from '../src/constants';\nimport * as Errors from '../src/errors';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger';\nimport { Share } from '../src/share';\nimport { ByPass } from '../src/proxy-bypass';\nimport { RuntimeEnv } from '../src/runtime-env.js';\n\n// \u4FEE\u6539\u9ED8\u8BA4logger \u4ECEconsole.log \u5230 crawleeLog\nLogger.setLogger(crawleeLog);\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n AntiCheat,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n RuntimeEnv,\n Captcha,\n Errors,\n Mutation,\n Display,\n Logger,\n Share,\n ByPass,\n $Internals: { LOG_TEMPLATES, stripAnsi }\n };\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n\n\nconst createActorInfo = (info) => {\n const normalizeDomain = (value) => {\n if (!value) return '';\n return String(value).trim().replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n };\n\n const normalizePath = (value) => {\n if (!value) return '/';\n const raw = String(value).trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n };\n\n const normalizeShare = (value) => {\n const raw = value && typeof value === 'object' ? value : {};\n\n const modeRaw = String(raw.mode || 'dom').trim().toLowerCase();\n const mode = modeRaw === 'response' ? 'response' : 'dom';\n\n const prefix = String(raw.prefix || '').trim();\n\n const rawXurl = Array.isArray(raw.xurl)\n ? raw.xurl\n : [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const rawPath = String(input || '').trim();\n if (!rawPath) return [];\n\n return rawPath\n .split('.')\n .map((segment) => String(segment || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const xurl = [];\n\n const matcherList = normalizeMatcherList(rawXurl[0]);\n if (matcherList.length > 0) {\n xurl.push(matcherList);\n }\n\n const flatPath = [];\n const extraPaths = [];\n\n rawXurl.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flatPath.push(...segments);\n }\n });\n\n if (flatPath.length > 0) {\n xurl.push(flatPath);\n }\n\n if (extraPaths.length > 0) {\n xurl.push(...extraPaths);\n }\n\n return {\n mode,\n prefix,\n xurl,\n };\n };\n\n const buildLandingUrl = ({ protocol, domain, path }) => {\n const safeProtocol = String(protocol).trim();\n const safeDomain = normalizeDomain(domain);\n const safePath = normalizePath(path);\n return `${safeProtocol}://${safeDomain}${safePath}`;\n };\n\n const buildIcon = ({ key }) => {\n return `https://heartbitai.com/general/actors/${key}.png`;\n }\n\n\n const protocol = info.protocol || 'https';\n const domain = normalizeDomain(info.domain);\n const path = normalizePath(info.path);\n const share = normalizeShare(info.share);\n\n return {\n ...info,\n protocol,\n domain,\n path,\n share,\n get icon() {\n if (info.icon) return info.icon;\n return buildIcon(this);\n },\n get landingUrl() {\n return buildLandingUrl(this);\n },\n };\n};\n\nexport const ActorInfo = {\n qbot: createActorInfo({\n key: 'qbot',\n name: 'QQ\u6D4F\u89C8\u5668AI\u641C',\n domain: 'sogou.com',\n path: '/web',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n douyin: createActorInfo({\n key: 'douyin',\n name: '\u6296\u97F3AI\u641C',\n domain: 'so.douyin.com',\n path: '/',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [\n ],\n },\n }),\n lingguang: createActorInfo({\n key: 'lingguang',\n name: '\u7075\u5149',\n domain: 'www.lingguang.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.lingguang.com/share/',\n xurl: [\n '/chat/shareChat.json',\n 'result',\n ],\n },\n }),\n doubao: createActorInfo({\n key: 'doubao',\n name: '\u8C46\u5305',\n domain: 'www.doubao.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.doubao.com/thread/',\n xurl: [\n '/samantha/thread/share/save',\n 'data', 'share_id',\n ],\n },\n }),\n deepseek: createActorInfo({\n key: 'deepseek',\n name: 'DeepSeek',\n domain: 'chat.deepseek.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://chat.deepseek.com/share/',\n xurl: [\n '/api/v0/share/create',\n 'data', 'biz_data', 'share_id',\n ],\n },\n }),\n erine: createActorInfo({\n key: 'erine',\n name: '\u6587\u5FC3\u4E00\u8A00',\n domain: 'yiyan.baidu.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://yiyan.baidu.com/share/',\n xurl: [\n '/eb/share/key/gen',\n 'data', 'key',\n ],\n },\n }),\n wenxin: createActorInfo({\n key: 'wenxin',\n name: '\u6587\u5FC3\u52A9\u624B',\n domain: 'chat.baidu.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: '',\n xurl: [\n '/aichat/api/shortURL',\n 'data', 'short_url',\n ],\n },\n }),\n baidu: createActorInfo({\n key: 'baidu',\n name: '\u767E\u5EA6AI\u641C',\n domain: 'www.baidu.com',\n path: '/s',\n share: {\n mode: 'response',\n prefix: '',\n xurl: [\n '/aichat/api/shortURL',\n 'data', 'short_url',\n ],\n },\n }),\n yuanbao: createActorInfo({\n key: 'yuanbao',\n name: '\u5143\u5B9D',\n domain: 'yuanbao.tencent.com',\n path: '/chat/',\n share: {\n mode: 'response',\n prefix: 'https://yb.tencent.com/s/',\n xurl: [\n '/api/conversations/v2/share', 'shareId',\n ],\n },\n }),\n kimi: createActorInfo({\n key: 'kimi',\n name: 'Kimi',\n domain: 'www.kimi.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.kimi.com/share/',\n xurl: [\n '/kimi.gateway.chat.v1.ChatService/CreateChatShare', 'share', 'id'\n ],\n },\n }),\n qwen: createActorInfo({\n key: 'qwen',\n name: '\u901A\u4E49\u5343\u95EE',\n domain: 'www.qianwen.com',\n path: '/chat',\n share: {\n mode: 'response',\n prefix: 'https://www.qianwen.com/share/chat/',\n xurl: [\n '/api/v1/share/create', 'data', 'share_id'\n ],\n },\n }),\n nano: createActorInfo({\n key: 'nano',\n name: '\u7EB3\u7C73',\n domain: 'www.n.cn',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.n.cn/share/mcp?id=',\n xurl: [\n '/api/share/gen', 'data', 'id'\n ],\n },\n }),\n quark: createActorInfo({\n key: 'quark',\n name: '\u5938\u514B',\n domain: 'ai.quark.cn',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n}\n", "\n// =============================================================================\n// Core Helpers & State\n// =============================================================================\n\nconst pad = (value, size = 2) => String(value).padStart(size, '0');\n\nconst FORCED_TIMEZONE_OFFSET_MINUTES = -8 * 60;\n\nconst formatTimestamp = (date = new Date()) => {\n const source = date instanceof Date ? date : new Date(date);\n const forcedDate = new Date(source.getTime() - (FORCED_TIMEZONE_OFFSET_MINUTES * 60 * 1000));\n\n const year = forcedDate.getUTCFullYear();\n const month = pad(forcedDate.getUTCMonth() + 1);\n const day = pad(forcedDate.getUTCDate());\n const hours = pad(forcedDate.getUTCHours());\n const minutes = pad(forcedDate.getUTCMinutes());\n const seconds = pad(forcedDate.getUTCSeconds());\n const millis = pad(forcedDate.getUTCMilliseconds(), 3);\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${millis}`;\n};\n\nconst formatLine = (prefix, icon, message) => {\n const parts = [];\n if (prefix) parts.push(`[${prefix}]`);\n if (icon) parts.push(icon);\n if (message) parts.push(message);\n return parts.join(' ').trim();\n};\n\nconst fallbackLog = {\n info: (...args) => console.log(...args),\n warning: (...args) => (console.warn ? console.warn(...args) : console.log(...args)),\n error: (...args) => console.error(...args),\n debug: (...args) => (console.debug ? console.debug(...args) : console.log(...args)),\n};\n\nconst resolveLogMethod = (logger, name) => {\n if (logger && typeof logger[name] === 'function') {\n return logger[name].bind(logger);\n }\n if (name === 'warning' && logger && typeof logger.warn === 'function') {\n return logger.warn.bind(logger);\n }\n return fallbackLog[name];\n};\n\nlet defaultLogger = null;\n\nexport const setDefaultLogger = (logger) => {\n defaultLogger = logger;\n};\n\n// Lazy resolver: always checks current state\nconst resolveLogger = (explicitLogger) => {\n if (explicitLogger && typeof explicitLogger.info === 'function') {\n return explicitLogger;\n }\n if (defaultLogger && typeof defaultLogger.info === 'function') {\n return defaultLogger;\n }\n return fallbackLog;\n};\n\nconst ANSI = {\n reset: '\\x1b[0m',\n gray: '\\x1b[90m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nconst colorize = (text, color) => {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n};\n\nexport const createBaseLogger = (prefix = '', explicitLogger) => {\n const name = prefix ? String(prefix) : '';\n\n const dispatch = (methodName, icon, message, color) => {\n const logger = resolveLogger(explicitLogger);\n const logFn = resolveLogMethod(logger, methodName);\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n logFn(`${timestamp} ${coloredLine}`.trim());\n };\n\n return {\n info: (message) => dispatch('info', '\uD83D\uDCD6', message, ANSI.cyan),\n success: (message) => dispatch('info', '\u2705', message, ANSI.green),\n warning: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n warn: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n error: (message) => dispatch('error', '\u274C', message, ANSI.red),\n debug: (message) => dispatch('debug', '\uD83D\uDD39', message, ANSI.gray),\n start: (message) => dispatch('info', '\uD83D\uDD37', message, ANSI.blue),\n };\n};\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\n * @param {object} [logger] - \u53EF\u9009\u7684\u663E\u5F0F\u65E5\u5FD7\u5668\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F20\uFF0C\u4F1A\u81EA\u52A8\u4F7F\u7528 setDefaultLogger \u8BBE\u7F6E\u7684\u5168\u5C40\u65E5\u5FD7\u5668\n */\nexport function createInternalLogger(moduleName, explicitLogger) {\n const baseLogger = createBaseLogger(moduleName, explicitLogger);\n\n return {\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);\n },\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);\n },\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);\n },\n debug(message) {\n baseLogger.debug(message);\n },\n warn(message) {\n baseLogger.warning(message);\n },\n warning(message) {\n baseLogger.warning(message);\na },\n info(message) {\n baseLogger.info(message);\n },\n error(message) {\n baseLogger.error(message);\n }\n };\n}\n", "const toPositiveInt = (value) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : 0;\n};\n\nexport const resolveCurrentViewportSize = async (page, fallback = {}) => {\n const directViewport = page?.viewportSize?.();\n const directWidth = toPositiveInt(directViewport?.width);\n const directHeight = toPositiveInt(directViewport?.height);\n\n if (directWidth && directHeight) {\n return {\n width: directWidth,\n height: directHeight,\n };\n }\n\n const measuredViewport = await page?.evaluate?.(() => ({\n width: window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0,\n height: window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0,\n })).catch(() => null);\n\n const fallbackWidth = toPositiveInt(fallback?.width);\n const fallbackHeight = toPositiveInt(fallback?.height);\n\n return {\n width: toPositiveInt(measuredViewport?.width) || fallbackWidth || 1,\n height: toPositiveInt(measuredViewport?.height) || fallbackHeight || 1,\n };\n};\n", "import { createInternalLogger } from './logger.js';\nimport { resolveCurrentViewportSize } from './viewport.js';\n\nconst logger = createInternalLogger('Screenshot');\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst FORCED_FULLPAGE_TYPE = 'jpeg';\nconst FORCED_FULLPAGE_QUALITY = 50;\nconst SUPPORTED_TYPES = new Set(['png', 'jpeg', 'webp']);\n\nconst toPositiveNumber = (value, fallback = 0) => {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return n;\n};\n\nconst normalizeType = (value) => {\n const raw = String(value || 'png').trim().toLowerCase();\n if (!SUPPORTED_TYPES.has(raw)) return 'png';\n return raw;\n};\n\nconst normalizeQuality = (value, type) => {\n if (type !== 'jpeg' && type !== 'webp') return undefined;\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const rounded = Math.round(n);\n if (rounded < 0 || rounded > 100) return undefined;\n return rounded;\n};\n\nconst buildFullPageClip = (metrics, viewport, maxClipHeight) => {\n const contentSize = metrics && typeof metrics === 'object'\n ? metrics.contentSize || null\n : null;\n\n const width = Math.max(1, Math.ceil(viewport.width || contentSize?.width || 1));\n let height = Math.max(1, Math.ceil(contentSize?.height || viewport.height || 1));\n\n if (maxClipHeight > 0) {\n height = Math.min(height, maxClipHeight);\n }\n\n return {\n x: 0,\n y: 0,\n width,\n height,\n scale: 1,\n };\n};\n\nexport const capturePageScreenshot = async (page, options = {}) => {\n const fullPage = Boolean(options.fullPage);\n const type = fullPage ? FORCED_FULLPAGE_TYPE : normalizeType(options.type);\n const quality = fullPage\n ? FORCED_FULLPAGE_QUALITY\n : normalizeQuality(options.quality, type);\n const timeout = toPositiveNumber(options.timeout, DEFAULT_TIMEOUT_MS);\n const maxClipHeight = Math.round(toPositiveNumber(options.maxClipHeight, 0));\n\n const fallbackOptions = {\n type: type === 'webp' ? 'png' : type,\n fullPage,\n };\n if (quality !== undefined && fallbackOptions.type === 'jpeg') {\n fallbackOptions.quality = quality;\n }\n if (timeout > 0) {\n fallbackOptions.timeout = timeout;\n }\n\n try {\n const context = page && typeof page.context === 'function' ? page.context() : null;\n if (!context || typeof context.newCDPSession !== 'function') {\n throw new Error('CDP session is not available');\n }\n\n const session = await context.newCDPSession(page);\n try {\n const metrics = await session.send('Page.getLayoutMetrics');\n const viewport = await resolveCurrentViewportSize(page);\n\n const captureParams = {\n format: type,\n fromSurface: true,\n captureBeyondViewport: fullPage,\n optimizeForSpeed: true,\n };\n\n if (quality !== undefined) {\n captureParams.quality = quality;\n }\n\n if (fullPage) {\n captureParams.clip = buildFullPageClip(metrics, viewport, maxClipHeight);\n }\n\n const result = await session.send('Page.captureScreenshot', captureParams);\n if (!result || typeof result.data !== 'string' || !result.data) {\n throw new Error('CDP returned empty screenshot data');\n }\n\n return Buffer.from(result.data, 'base64');\n } finally {\n if (typeof session.detach === 'function') {\n await session.detach().catch(() => { });\n }\n }\n } catch (error) {\n logger.warning(`CDP \u622A\u56FE\u5931\u8D25\uFF0C\u56DE\u9000 page.screenshot: ${error?.message || error}`);\n return await page.screenshot(fallbackOptions);\n }\n};\n", "/**\n * \u722C\u866B\u81EA\u5B9A\u4E49\u9519\u8BEF\u7C7B\n * \u7528\u4E8E\u643A\u5E26\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF0C\u5728 pushFailed \u65F6\u81EA\u52A8\u89E3\u6790\n */\n\nimport { serializeError } from \"serialize-error\";\nimport { Code } from \"./constants\";\n\n/**\n * CrawlerError - \u81EA\u5B9A\u4E49\u722C\u866B\u9519\u8BEF\u7C7B\n * \n * @example\n * // \u7B80\u5355\u7528\u6CD5 (\u53EA\u6709 message)\n * throw new CrawlerError('\u672A\u6355\u83B7 Feed \u63A5\u53E3\u54CD\u5E94');\n * \n * @example\n * // \u5B8C\u6574\u7528\u6CD5 (\u5E26 code \u548C context)\n * throw new CrawlerError({\n * message: '\u767B\u5F55\u5931\u8D25',\n * code: ErrorKeygen.NotLogin,\n * context: { url: currentUrl, userId: '123' }\n * });\n */\nexport class CrawlerError extends Error {\n /**\n * @param {string|Object} info - \u9519\u8BEF\u4FE1\u606F\u5B57\u7B26\u4E32\u6216\u914D\u7F6E\u5BF9\u8C61\n * @param {string} info.message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} [info.code] - ErrorKeygen \u679A\u4E3E\u503C\uFF08\u7528\u4E8E\u9519\u8BEF\u5206\u7C7B\uFF09\n * @param {Object} [info.context] - \u4E0A\u4E0B\u6587\u4FE1\u606F\u5BF9\u8C61\n */\n constructor(info) {\n // \u517C\u5BB9 string\n if (typeof info === 'string') {\n info = { message: info };\n }\n\n // \u26A0\uFE0F super() \u5FC5\u987B\u5728\u8BBF\u95EE this \u4E4B\u524D\u8C03\u7528\n super(info.message);\n\n this.name = 'CrawlerError';\n this.code = info.code ?? Code.UnknownError;\n this.context = info.context ?? {};\n this.timestamp = new Date().toISOString();\n\n // \u7EF4\u62A4\u6B63\u786E\u7684\u5806\u6808\u8DDF\u8E2A\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CrawlerError);\n }\n }\n\n /**\n * \u8F6C\u6362\u4E3A\u53EF\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n * @returns {Object}\n */\n toJSON() {\n return serializeError(this)\n }\n\n /**\n * \u68C0\u67E5\u4E00\u4E2A error \u662F\u5426\u662F CrawlerError\n * @param {Error} error\n * @returns {boolean}\n */\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n /**\n * \u4ECE\u666E\u901A Error \u521B\u5EFA CrawlerError\n * @param {Error} error - \u539F\u59CB\u9519\u8BEF\n * @param {Object} [options={}] - \u9009\u9879\u5BF9\u8C61 (\u5305\u542B code \u548C context)\n * @returns {CrawlerError}\n */\n static from(error, options = {}) {\n const crawlerError = new CrawlerError({\n message: error.message,\n ...options\n });\n crawlerError.stack = error.stack;\n return crawlerError;\n }\n}\n\n\n", "import { Status, Code } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('ApifyKit');\n\nconst resolveRuntimeContext = (input) => {\n const rememberedState = RuntimeEnv.peekRememberedState();\n const state = rememberedState || RuntimeEnv.parseInput(input || {});\n const envPatch = RuntimeEnv.buildEnvPatch(state) || null;\n\n return {\n actor: state.actor,\n runtime: state.runtime,\n envPatch,\n };\n};\n\nconst isPageLike = (value) => {\n if (!value || typeof value !== 'object') return false;\n return typeof value.evaluate === 'function' && typeof value.context === 'function';\n};\n\nconst pickPage = (...candidates) => {\n for (const candidate of candidates) {\n if (isPageLike(candidate)) {\n return candidate;\n }\n }\n return null;\n};\n\nconst toSerializable = (value, depth = 0, seen = new WeakSet()) => {\n if (depth > 6) return '[MaxDepth]';\n if (value == null) return value;\n\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value;\n }\n if (valueType === 'bigint') {\n return value.toString();\n }\n if (valueType === 'function' || valueType === 'symbol') {\n return undefined;\n }\n if (value instanceof Error) {\n return serializeError(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => toSerializable(item, depth + 1, seen))\n .filter((item) => item !== undefined);\n }\n if (valueType !== 'object') {\n return String(value);\n }\n\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n\n const ctorName = String(value?.constructor?.name || '');\n if (\n ctorName === 'Page' ||\n ctorName === 'BrowserContext' ||\n ctorName === 'Browser' ||\n ctorName === 'Frame' ||\n ctorName === 'ElementHandle' ||\n ctorName === 'JSHandle'\n ) {\n return `[${ctorName}]`;\n }\n\n const output = {};\n Object.entries(value).forEach(([key, item]) => {\n const safeValue = toSerializable(item, depth + 1, seen);\n if (safeValue !== undefined) {\n output[key] = safeValue;\n }\n });\n return output;\n};\n\nconst sanitizeMeta = (meta) => {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n return {};\n }\n const result = toSerializable(meta) || {};\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n delete result.page;\n }\n return result;\n};\n\nconst captureAutoEnvPatch = async (page, runtimeContext) => {\n const currentPage = pickPage(page);\n if (!currentPage) return null;\n try {\n return await RuntimeEnv.captureEnvPatch(\n currentPage,\n {\n actor: runtimeContext.actor,\n runtime: runtimeContext.runtime,\n },\n { actor: runtimeContext.actor },\n );\n } catch (error) {\n logger.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);\n return null;\n }\n};\n\n/**\n * \u521B\u5EFA ApifyKit \u5B9E\u4F8B\n * \u5982\u679C apify \u53EF\u7528\uFF0C\u8FD4\u56DE\u5B8C\u6574\u529F\u80FD\u7684 ApifyKit\n * \u5982\u679C apify \u4E0D\u53EF\u7528\uFF0C\u8FD4\u56DE\u964D\u7EA7\u7248\u672C\uFF08\u975E apify \u76F8\u5173\u529F\u80FD\u4ECD\u53EF\u7528\uFF09\n */\nasync function createApifyKit() {\n let apify = null;\n\n // \u5C1D\u8BD5\u52A0\u8F7D apify\n try {\n apify = await import('apify');\n } catch (error) {\n // apify \u4E0D\u53EF\u7528\uFF0C\u5C06\u4F7F\u7528\u964D\u7EA7\u7248\u672C\n throw new Error('\u26A0\uFE0F apify \u5E93\u672A\u5B89\u88C5\uFF0CApifyKit \u7684 Actor \u76F8\u5173\u529F\u80FD\u4E0D\u53EF\u7528')\n }\n\n const { Actor } = apify;\n const actorInput = (await Actor.getInput()) || {};\n let lastPage = null;\n const getRuntimeContext = () => resolveRuntimeContext(actorInput);\n\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u3001\u5931\u8D25\u622A\u56FE\u5904\u7406\u548C\u91CD\u8BD5\u673A\u5236\n * \n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} actionFn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {boolean} [options.failActor=true] - \u5931\u8D25\u65F6\u662F\u5426\u8C03\u7528 Actor.fail\n * @param {Object} [options.retry] - \u91CD\u8BD5\u914D\u7F6E\n * @param {number} [options.retry.times=0] - \u91CD\u8BD5\u6B21\u6570\n * @param {'direct'|'refresh'} [options.retry.mode='direct'] - \u91CD\u8BD5\u6A21\u5F0F\n * @param {Function} [options.retry.before] - \u91CD\u8BD5\u524D\u94A9\u5B50\uFF0C\u53EF\u8986\u76D6\u9ED8\u8BA4\u7B49\u5F85\u884C\u4E3A\n */\n async runStep(step, page, actionFn, options = {}) {\n if (isPageLike(page)) {\n lastPage = page;\n }\n const { failActor = true, retry = {} } = options;\n const { times: retryTimes = 0, mode: retryMode = 'direct', before: beforeRetry } = retry;\n\n // \u5185\u90E8\u6267\u884C\u51FD\u6570\n const executeAction = async (attemptNumber) => {\n const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : '';\n logger.start(`[Step] ${step}${attemptLabel}`);\n\n try {\n const result = await actionFn();\n logger.success(`[Step] ${step}${attemptLabel}`);\n return { success: true, result };\n } catch (error) {\n logger.fail(`[Step] ${step}${attemptLabel}`, error);\n return { success: false, error };\n }\n };\n\n // \u91CD\u8BD5\u524D\u7684\u51C6\u5907\u64CD\u4F5C\n const prepareForRetry = async (attemptNumber) => {\n if (typeof beforeRetry === 'function') {\n // \u4F7F\u7528\u81EA\u5B9A\u4E49\u94A9\u5B50\n logger.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await beforeRetry(page, attemptNumber);\n logger.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);\n } else if (retryMode === 'refresh') {\n // \u5237\u65B0\u6A21\u5F0F\uFF1A\u5237\u65B0\u9875\u9762\u5E76\u7B49\u5F85\u5BFC\u822A commit\uFF0C\u540E\u7EED\u6B65\u9AA4\u81EA\u884C\u505A\u4EA4\u4E92\u5C31\u7EEA\u68C0\u67E5\n logger.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await page.reload({ waitUntil: 'commit' });\n logger.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);\n } else {\n // direct \u6A21\u5F0F\uFF1A\u9ED8\u8BA4\u7B49\u5F85 3 \u79D2\n logger.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await new Promise(resolve => setTimeout(resolve, 3000));\n logger.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);\n }\n };\n\n // \u9996\u6B21\u6267\u884C\n let lastResult = await executeAction(0);\n\n // \u5982\u679C\u9996\u6B21\u6210\u529F\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (lastResult.success) {\n return lastResult.result;\n }\n\n // \u91CD\u8BD5\u903B\u8F91\n for (let attempt = 1; attempt <= retryTimes; attempt++) {\n logger.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);\n\n try {\n await prepareForRetry(attempt);\n } catch (prepareError) {\n logger.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);\n // \u51C6\u5907\u5931\u8D25\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u4E0B\u4E00\u6B21\u91CD\u8BD5\n continue;\n }\n\n lastResult = await executeAction(attempt);\n if (lastResult.success) {\n return lastResult.result;\n }\n }\n\n // \u6240\u6709\u91CD\u8BD5\u90FD\u5931\u8D25\uFF0C\u5904\u7406\u6700\u7EC8\u9519\u8BEF\n const finalError = lastResult.error;\n if (failActor) {\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'jpeg',\n quality: 60,\n });\n base64 = `data:image/jpeg;base64,${buffer.toString('base64')}`;\n }\n } catch (snapErr) {\n logger.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);\n }\n\n await this.pushFailed(\n finalError,\n {\n step,\n base64,\n retryAttempts: retryTimes,\n },\n {\n page,\n options,\n },\n );\n await Actor.fail(`Run Step ${step} \u5931\u8D25 (\u5DF2\u91CD\u8BD5 ${retryTimes} \u6B21): ${finalError.message}`);\n } else {\n throw finalError;\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n * \u652F\u6301\u900F\u4F20 retry \u7B49\u9009\u9879\uFF08failActor \u59CB\u7EC8\u56FA\u5B9A\u4E3A false\uFF09\n *\n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} fn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u652F\u6301 retry\uFF09\n */\n async runStepLoose(step, page, fn, options = {}) {\n return await this.runStep(step, page, fn, {\n ...options,\n failActor: false,\n });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\u3002\n * \u8FD9\u91CC\u4F1A\u81EA\u52A8\u505A\u4E09\u4EF6\u4E8B\uFF1A\n * 1. \u91C7\u96C6\u5F53\u524D\u9875\u9762\u7684 env_patch\uFF1B\n * 2. \u5408\u5E76\u663E\u5F0F\u4F20\u5165\u7684 env_patch\uFF1B\n * 3. \u4E00\u5E76\u5199\u5165 dataset\uFF0C\u4F9B\u540E\u7AEF\u56DE\u5199 runtime_env_json\u3002\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, data?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n\n let payloadData = data;\n let explicitPatch = null;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n payloadData = { ...data };\n explicitPatch = payloadData.env_patch;\n delete payloadData.env_patch;\n delete payloadData.page;\n }\n\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n code: Code.Success,\n status: Status.Success,\n ...(traffic ? { traffic } : {}),\n timestamp: new Date().toISOString(),\n data: payloadData,\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushSuccess', 'Data pushed');\n },\n\n /**\n * \u63A8\u9001\u5931\u8D25\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\uFF08\u79C1\u6709\u65B9\u6CD5\uFF0C\u4EC5\u4F9B runStep \u5185\u90E8\u4F7F\u7528\uFF09\u3002\n * \u5373\u4FBF\u4EFB\u52A1\u5931\u8D25\uFF0C\u8FD9\u91CC\u4E5F\u4F1A\u81EA\u52A8\u56DE\u6536 env_patch\uFF0C\u786E\u4FDD cookies/storage \u7684\u6700\u65B0\u72B6\u6001\u4E0D\u4F1A\u4E22\u3002\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982 failedStep\u3001screenshotBase64 \u7B49\uFF09\n * @param {Object} [options] - \u9644\u52A0\u9009\u9879\uFF08\u5982 page\uFF09\n * @private\n */\n async pushFailed(error, meta = {}, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, meta?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const explicitPatch = meta?.env_patch;\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const safeMeta = sanitizeMeta(meta);\n delete safeMeta.env_patch;\n\n // \u5982\u679C\u662F CrawlerError\uFF0C\u63D0\u53D6\u5176 key \u548C context\n const isCrawlerError = CrawlerError.isCrawlerError(error);\n const code = isCrawlerError ? error.code : Code.UnknownError;\n const context = isCrawlerError ? error.context : {};\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n // \u5982\u679C\u662F CrawlerError\uFF0C\u4F7F\u7528\u5176 code\uFF0C\u5426\u5219\u4F7F\u7528\u9ED8\u8BA4 Failed code\n code,\n status: Status.Failed,\n ...(traffic ? { traffic } : {}),\n error: serializeError(error),\n meta: safeMeta,\n context,\n timestamp: new Date().toISOString(),\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushFailed', 'Error data pushed');\n }\n };\n}\n\n// \u61D2\u52A0\u8F7D\u5355\u4F8B\nlet instance = null;\n\n/**\n * \u83B7\u53D6 ApifyKit \u5B9E\u4F8B\uFF08\u61D2\u52A0\u8F7D\uFF09\n * @returns {Promise<Object>} ApifyKit \u5B9E\u4F8B\n */\nasync function useApifyKit() {\n if (!instance) {\n instance = await createApifyKit();\n }\n return instance;\n}\n\n// \u4E5F\u5BFC\u51FA\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u4F9B\u9700\u8981\u7684\u7528\u6237\u4F7F\u7528\nexport const ApifyKit = {\n useApifyKit\n};\n", "import { spawn, spawnSync } from 'child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';\nimport { tmpdir } from 'os';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('ProxyMeter');\n\nconst MAX_TOP_DOMAINS = 20;\nconst FLUSH_INTERVAL_MS = 2000;\nconst DEFAULT_DEBUG_MAX_EVENTS = 400;\n\nlet runtime = null;\nlet cleanupInstalled = false;\nlet observedDomainResourceTypes = new Map();\n\nconst toSafeInt = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return 0;\n return Math.round(num);\n};\n\nconst toSafeFloat = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num)) return 0;\n return num;\n};\n\nconst normalizeResourceType = (value) => {\n const type = String(value || '').trim().toLowerCase();\n if (!type) return 'other';\n return type;\n};\n\nconst resolveHostname = (requestUrl) => {\n const raw = String(requestUrl || '').trim();\n if (!raw) return '';\n try {\n return String(new URL(raw).hostname || '').trim().toLowerCase();\n } catch {\n return '';\n }\n};\n\nconst recordDomainResourceType = (domain, resourceType) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return;\n const type = normalizeResourceType(resourceType);\n let byType = observedDomainResourceTypes.get(host);\n if (!byType) {\n byType = new Map();\n observedDomainResourceTypes.set(host, byType);\n }\n byType.set(type, (byType.get(type) || 0) + 1);\n};\n\nconst resolveResourceTypeMeta = (domain) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return { resourceType: '', resourceTypeCounts: undefined };\n const byType = observedDomainResourceTypes.get(host);\n if (!byType || byType.size === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n const entries = Array.from(byType.entries())\n .filter(([type, count]) => type && Number(count) > 0)\n .sort((a, b) => {\n if (Number(b[1]) !== Number(a[1])) return Number(b[1]) - Number(a[1]);\n return String(a[0]).localeCompare(String(b[0]));\n });\n if (entries.length === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n return {\n resourceType: entries[0][0],\n resourceTypeCounts: Object.fromEntries(entries.map(([type, count]) => [type, toSafeInt(count)])),\n };\n};\n\nconst resolveScriptPath = () => {\n const baseDir = typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n const internalCandidate = path.join(baseDir, 'internals', 'proxy-meter.js');\n if (existsSync(internalCandidate)) {\n return internalCandidate;\n }\n return path.join(baseDir, 'proxy-meter.js');\n};\n\nconst pickFreePort = () => {\n const script = [\n 'const net=require(\"net\");',\n 'const server=net.createServer();',\n 'server.listen(0,\"127.0.0.1\",()=>{',\n 'const port=server.address().port;',\n 'server.close(()=>{console.log(port);});',\n '});',\n ].join('');\n const result = spawnSync(process.execPath, ['-e', script], { encoding: 'utf8' });\n const port = Number(String(result.stdout || '').trim());\n if (result.status === 0 && Number.isFinite(port) && port > 0) {\n return port;\n }\n return 20000 + Math.floor(Math.random() * 20000);\n};\n\nconst resolveLogDir = () => {\n const storageDir = process.env.APIFY_STORAGE_DIR || process.env.APIFY_LOCAL_STORAGE_DIR || '';\n if (storageDir) {\n return path.join(storageDir, 'proxy-meter');\n }\n return path.join(tmpdir(), 'proxy-meter');\n};\n\nconst ensureLogPath = () => {\n const baseDir = resolveLogDir();\n if (!existsSync(baseDir)) {\n try {\n mkdirSync(baseDir, { recursive: true });\n } catch {}\n }\n const runId = String(process.env.APIFY_ACTOR_RUN_ID || '').trim();\n const suffix = `${Date.now()}-${Math.floor(Math.random() * 1000000)}`;\n const label = runId ? `proxy-meter-${runId}-${suffix}.json` : `proxy-meter-${process.pid}-${suffix}.json`;\n return path.join(baseDir, label);\n};\n\nconst readSnapshot = (logPath) => {\n if (!logPath || !existsSync(logPath)) return null;\n try {\n const raw = readFileSync(logPath, 'utf8');\n if (!raw) return null;\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst normalizeDomainRows = (hosts) => {\n const rows = [];\n let requestCount = 0;\n let connectCount = 0;\n\n for (const [domain, stat] of Object.entries(hosts || {})) {\n if (!stat || typeof stat !== 'object') continue;\n const inBytes = toSafeInt(stat.inBytes);\n const outBytes = toSafeInt(stat.outBytes);\n const requests = toSafeInt(stat.requests);\n const connections = toSafeInt(stat.connections);\n const totalBytes = inBytes + outBytes;\n requestCount += requests;\n connectCount += connections;\n if (totalBytes <= 0 && requests <= 0 && connections <= 0) continue;\n const resourceTypeMeta = resolveResourceTypeMeta(domain);\n rows.push({\n domain,\n inBytes,\n outBytes,\n totalBytes,\n requests,\n connections,\n resourceType: resourceTypeMeta.resourceType || undefined,\n resourceTypeCounts: resourceTypeMeta.resourceTypeCounts || undefined,\n });\n }\n\n rows.sort((a, b) => {\n if (b.totalBytes !== a.totalBytes) return b.totalBytes - a.totalBytes;\n if (b.requests !== a.requests) return b.requests - a.requests;\n return String(a.domain).localeCompare(String(b.domain));\n });\n\n return {\n topDomains: rows.slice(0, MAX_TOP_DOMAINS),\n requestCount,\n connectCount,\n };\n};\n\nconst normalizeDebugRows = (rows, type) => {\n if (!Array.isArray(rows) || rows.length === 0) return undefined;\n const normalized = rows\n .map((row) => {\n if (!row || typeof row !== 'object') return null;\n return {\n domain: String(row.domain || '').trim(),\n status: String(row.status || '').trim(),\n count: toSafeInt(row.count),\n failedCount: toSafeInt(row.failedCount),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n avgDurationMs: toSafeFloat(row.avgDurationMs),\n reconnectCount: toSafeInt(row.reconnectCount),\n largeResponseCount: toSafeInt(row.largeResponseCount),\n failureRatePct: toSafeFloat(row.failureRatePct),\n type,\n };\n })\n .filter((row) => row && row.domain && row.count > 0);\n return normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeDebugEvent = (row) => {\n if (!row || typeof row !== 'object') return null;\n const host = String(row.host || '').trim();\n if (!host) return null;\n return {\n ts: String(row.ts || ''),\n runId: String(row.runId || ''),\n channel: String(row.channel || ''),\n host,\n method: String(row.method || ''),\n path: String(row.path || ''),\n statusCode: toSafeInt(row.statusCode),\n durationMs: toSafeInt(row.durationMs),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n error: String(row.error || ''),\n };\n};\n\nconst normalizeDebugSummary = (debug) => {\n if (!debug || typeof debug !== 'object' || !debug.summary || typeof debug.summary !== 'object') {\n return null;\n }\n const summary = debug.summary;\n const domainStatus = normalizeDebugRows(summary.domainStatus, 'domain_status');\n const topFailureDomains = normalizeDebugRows(summary.topFailureDomains, 'top_failure');\n const topLargeDomains = normalizeDebugRows(summary.topLargeDomains, 'top_large');\n const topReconnectDomains = normalizeDebugRows(summary.topReconnectDomains, 'top_reconnect');\n\n return {\n enabled: Boolean(debug.enabled),\n sampledEvents: toSafeInt(debug.sampledEvents),\n droppedEvents: toSafeInt(debug.droppedEvents),\n totalEvents: toSafeInt(debug.totalEvents),\n largeResponseThresholdBytes: toSafeInt(summary.largeResponseThresholdBytes),\n requestCount: toSafeInt(summary.requestCount),\n failedCount: toSafeInt(summary.failedCount),\n failureRatePct: toSafeFloat(summary.failureRatePct),\n largeResponseCount: toSafeInt(summary.largeResponseCount),\n reconnectCount: toSafeInt(summary.reconnectCount),\n domainStatus,\n topFailureDomains,\n topLargeDomains,\n topReconnectDomains,\n };\n};\n\nconst normalizeSnapshot = (raw) => {\n if (!raw || typeof raw !== 'object') return null;\n const totalIn = toSafeInt(raw.totalInBytes);\n const totalOut = toSafeInt(raw.totalOutBytes);\n const domains = normalizeDomainRows(raw.hosts && typeof raw.hosts === 'object' ? raw.hosts : {});\n\n const normalized = {\n meter: 'proxy-meter-v1',\n totalBytes: totalIn + totalOut,\n uploadBytes: totalOut,\n downloadBytes: totalIn,\n requestCount: domains.requestCount,\n connectCount: domains.connectCount,\n topDomains: domains.topDomains,\n };\n\n const debug = raw.debug && typeof raw.debug === 'object' ? raw.debug : null;\n const summary = normalizeDebugSummary(debug);\n const events = Array.isArray(debug?.events)\n ? debug.events.map(normalizeDebugEvent).filter(Boolean)\n : [];\n if (summary) {\n normalized.trafficDebugSummary = summary;\n }\n if (events.length > 0) {\n normalized.trafficDebugEvents = events;\n }\n\n const hasSignal = normalized.totalBytes > 0\n || normalized.uploadBytes > 0\n || normalized.downloadBytes > 0\n || normalized.requestCount > 0\n || normalized.connectCount > 0\n || (normalized.topDomains && normalized.topDomains.length > 0)\n || Boolean(summary)\n || events.length > 0;\n\n if (!hasSignal) return null;\n return normalized;\n};\n\nconst registerCleanup = () => {\n if (cleanupInstalled) return;\n cleanupInstalled = true;\n const shutdown = () => {\n if (!runtime || !runtime.proc) return;\n try { runtime.proc.kill('SIGTERM'); } catch {}\n };\n process.once('exit', shutdown);\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n};\n\nconst startProxyMeter = (options = {}) => {\n const upstreamUrl = String(options.proxyUrl || '').trim();\n if (!upstreamUrl) return null;\n\n if (runtime && runtime.proc) {\n try { runtime.proc.kill('SIGTERM'); } catch {}\n runtime = null;\n }\n observedDomainResourceTypes = new Map();\n\n const port = pickFreePort();\n const logPath = ensureLogPath();\n const scriptPath = resolveScriptPath();\n const debugMode = Boolean(options.debugMode);\n const debugMaxEvents = Math.max(10, toSafeInt(options.debugMaxEvents) || DEFAULT_DEBUG_MAX_EVENTS);\n const env = {\n ...process.env,\n PROXY_METER_PORT: String(port),\n PROXY_METER_LOG: logPath,\n PROXY_METER_UPSTREAM: upstreamUrl,\n PROXY_METER_FLUSH_MS: String(FLUSH_INTERVAL_MS),\n PROXY_METER_DEBUG: debugMode ? '1' : '0',\n PROXY_METER_DEBUG_MAX_EVENTS: String(debugMaxEvents),\n };\n\n const child = spawn(process.execPath, [scriptPath], {\n env,\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n\n child.once('exit', (code) => {\n if (code && code !== 0) {\n logger.warn(`[proxy-meter] exited with code ${code}`);\n }\n });\n\n runtime = {\n proc: child,\n port,\n logPath,\n startedAt: Date.now(),\n };\n\n registerCleanup();\n return { server: `http://127.0.0.1:${port}` };\n};\n\nconst recordProxyMeterResourceType = (requestUrl, resourceType) => {\n if (!runtime) return;\n const host = resolveHostname(requestUrl);\n if (!host) return;\n recordDomainResourceType(host, resourceType);\n};\n\nconst stopProxyMeter = async () => {\n if (!runtime) return null;\n const { proc, logPath } = runtime;\n if (!proc || proc.killed) {\n runtime = null;\n return logPath || null;\n }\n\n await new Promise((resolve) => {\n const timeout = setTimeout(() => {\n try { proc.kill('SIGKILL'); } catch {}\n resolve();\n }, 2000);\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n try { proc.kill('SIGTERM'); } catch { resolve(); }\n });\n\n runtime = null;\n return logPath || null;\n};\n\nconst getProxyMeterSnapshot = async (options = {}) => {\n if (!runtime) return null;\n const finalize = Boolean(options.finalize);\n const logPath = finalize ? await stopProxyMeter() : runtime.logPath;\n const raw = readSnapshot(logPath);\n const snapshot = normalizeSnapshot(raw);\n if (finalize && logPath) {\n try { rmSync(logPath, { force: true }); } catch {}\n }\n return snapshot;\n};\n\nexport const ProxyMeterRuntime = {\n startProxyMeter,\n recordProxyMeterResourceType,\n stopProxyMeter,\n getProxyMeterSnapshot,\n};\n", "export const PageRuntimeStateKey = '__playwright_toolkit_runtime_state__';\n", "import { PageRuntimeStateKey } from './internals/constants.js';\n\nconst BROWSER_PROFILE_SCHEMA_VERSION = 1;\n\nlet rememberedRuntimeState = null;\n\nconst isPlainObject = (value) => value && typeof value === 'object' && !Array.isArray(value);\n\n// \u8FD0\u884C\u6001\u5FEB\u7167\u5728 visitor / toolkit / \u540E\u7AEF\u4E4B\u95F4\u6765\u56DE\u4F20\u9012\uFF0C\n// \u6240\u4EE5\u6240\u6709\u5165\u53E3\u90FD\u5148\u8D70 deepClone\uFF0C\u907F\u514D\u5171\u4EAB\u5F15\u7528\u5F15\u53D1\u201C\u8FB9\u8DD1\u8FB9\u6539\u201D\u7684\u9690\u5F0F\u526F\u4F5C\u7528\u3002\nconst deepClone = (value) => {\n if (value == null) return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n\t}\n};\n\n// \u5C1D\u8BD5\u628A runtime / browser_profile \u4E4B\u7C7B\u7684 JSON \u5B57\u6BB5\u89E3\u6790\u6210\u5BF9\u8C61\u3002\nconst tryParseJSON = (value) => {\n if (value == null) return null;\n if (typeof value === 'object') return value;\n const raw = String(value || '').trim();\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n\t}\n};\n\n// local/session \u7684\u89C4\u8303\u5316\u76EE\u6807\u53EA\u6709\u4E00\u4E2A\uFF1A\u8FC7\u6EE4\u7A7A\u503C\uFF0C\u7EDF\u4E00\u8F6C\u6210\u5B57\u7B26\u4E32\u3002\nconst normalizeLocalStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeSessionStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeCookieSameSite = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (!raw) return '';\n\n switch (raw) {\n case 'strict':\n return 'Strict';\n case 'lax':\n return 'Lax';\n case 'none':\n case 'no_restriction':\n return 'None';\n case 'unspecified':\n default:\n return '';\n }\n};\n\nconst normalizeCookieExpires = (raw = {}) => {\n const source = raw && typeof raw === 'object' ? raw : {};\n const session = Boolean(source.session);\n if (session) return null;\n\n const expiresCandidate = Number(source.expires);\n if (Number.isFinite(expiresCandidate) && expiresCandidate > 0) {\n return expiresCandidate;\n }\n\n const expirationDateCandidate = Number(source.expirationDate);\n if (Number.isFinite(expirationDateCandidate) && expirationDateCandidate > 0) {\n return expirationDateCandidate;\n }\n\n return null;\n};\n\nconst normalizeCookies = (value) => {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n const raw = item && typeof item === 'object' ? item : {};\n const name = String(raw.name || '').trim();\n const cookieValue = String(raw.value ?? '').trim();\n if (!name || !cookieValue || cookieValue === '<nil>') return null;\n const domain = String(raw.domain || '').trim();\n const url = normalizeHttpUrl(raw.url);\n const path = String(raw.path || '').trim() || '/';\n const sameSite = normalizeCookieSameSite(raw.sameSite);\n const expires = normalizeCookieExpires(raw);\n const secure = Boolean(raw.secure);\n const httpOnly = Boolean(raw.httpOnly);\n const partitionKey = typeof raw.partitionKey === 'string' ? String(raw.partitionKey).trim() : '';\n\n // \u7EDF\u4E00\u8F93\u51FA Playwright \u53EF\u63A5\u53D7\u7684 Cookie \u7ED3\u6784\uFF0C\u907F\u514D\u628A Chrome \u6269\u5C55\u4FA7\u5B57\u6BB5\u539F\u6837\u900F\u4F20\u8FC7\u53BB\u3002\n const normalized = {\n name,\n value: cookieValue,\n path,\n ...(domain ? { domain } : {}),\n ...(!domain && url ? { url } : {}),\n ...(sameSite ? { sameSite } : {}),\n ...(secure ? { secure: true } : {}),\n ...(httpOnly ? { httpOnly: true } : {}),\n ...(expires !== null ? { expires } : {}),\n ...(partitionKey ? { partitionKey } : {}),\n };\n\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n\n return {\n ...normalized,\n };\n })\n .filter(Boolean);\n};\n\nconst buildCookieMap = (cookies) => cookies.reduce((acc, item) => {\n\tacc[item.name] = item.value;\n\treturn acc;\n}, {});\n\n// \u7EDF\u4E00\u628A\u539F\u59CB URL \u5FEB\u7167\u8FC7\u6EE4\u6210 http/https\uFF0C\u907F\u514D browser/runtime \u4E24\u7AEF\u5404\u81EA\u505A\u4E00\u5957\u5224\u65AD\u3002\nconst normalizeHttpUrl = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return '';\n }\n};\n\nconst uniqueStrings = (value) => {\n const list = Array.isArray(value) ? value : [];\n const seen = new Set();\n const result = [];\n list.forEach((item) => {\n const normalized = String(item || '').trim();\n if (!normalized || seen.has(normalized)) return;\n seen.add(normalized);\n result.push(normalized);\n });\n return result;\n};\n\nconst normalizeHttpUrlList = (value) => uniqueStrings(\n (Array.isArray(value) ? value : [value])\n .map((item) => normalizeHttpUrl(item))\n .filter(Boolean),\n);\n\nconst normalizeCookieDomain = (value) => String(value || '').trim().replace(/^\\./, '').toLowerCase();\n\nconst normalizeCookiePath = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n};\n\nconst doesCookieMatchUrl = (cookie, url) => {\n if (!cookie || !url) return false;\n try {\n const parsed = new URL(url);\n const host = String(parsed.hostname || '').trim().toLowerCase();\n const pathname = String(parsed.pathname || '/').trim() || '/';\n const cookieDomain = normalizeCookieDomain(cookie.domain);\n const cookiePath = normalizeCookiePath(cookie.path);\n if (!host || !cookieDomain) return false;\n const domainMatched = host === cookieDomain || host.endsWith(`.${cookieDomain}`);\n if (!domainMatched) return false;\n if (cookie.secure && parsed.protocol !== 'https:') return false;\n return pathname.startsWith(cookiePath);\n } catch {\n return false;\n }\n};\n\nconst normalizeRawSnapshot = (value = {}) => {\n const source = isPlainObject(value) ? value : {};\n const pageUrl = normalizeHttpUrl(source.page_url ?? source.pageUrl);\n const frameUrls = normalizeHttpUrlList(source.frame_urls ?? source.frameUrls);\n const resourceUrls = normalizeHttpUrlList(source.resource_urls ?? source.resourceUrls);\n const browserProfileObservedSource =\n source.browser_profile_observed\n ?? source.browserProfileObserved\n ?? source.browser_profile?.observed\n ?? source.browserProfile?.observed\n ?? source.browserProfile;\n\n return {\n page_url: pageUrl,\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n cookies: Array.isArray(source.cookies) ? deepClone(source.cookies) : [],\n local_storage: normalizeLocalStorage(source.local_storage ?? source.localStorage),\n session_storage: normalizeSessionStorage(source.session_storage ?? source.sessionStorage),\n browser_profile_observed: normalizeObservedBrowserProfile(browserProfileObservedSource),\n };\n};\n\nconst collectCookieUrlsFromSnapshot = (snapshot = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n return uniqueStrings([\n normalized.page_url,\n ...normalized.frame_urls,\n ...normalized.resource_urls,\n ].filter(Boolean));\n};\n\nconst filterCookiesBySnapshot = (cookies = [], snapshot = {}) => {\n const normalizedCookies = normalizeCookies(cookies);\n const cookieUrls = collectCookieUrlsFromSnapshot(snapshot);\n if (cookieUrls.length === 0) {\n return normalizedCookies;\n }\n return normalizedCookies.filter((cookie) => cookieUrls.some((url) => doesCookieMatchUrl(cookie, url)));\n};\n\nconst buildEnvPayloadFromSnapshot = (snapshot = {}, options = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n const cookies = filterCookiesBySnapshot(snapshot?.cookies || normalized.cookies, normalized);\n const localStorage = normalized.local_storage;\n const sessionStorage = normalized.session_storage;\n const browserProfileCore = normalizeBrowserProfileCore(\n options.browserProfileCore\n ?? snapshot?.browser_profile?.core\n ?? snapshot?.browserProfile?.core,\n );\n const browserProfile = buildBrowserProfilePayload(browserProfileCore, normalized.browser_profile_observed);\n\n const payload = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(payload).length > 0 ? payload : null;\n};\n\nconst captureRawSnapshotFromPage = async (page) => {\n const frameUrls = typeof page?.frames === 'function'\n ? page.frames().map((frame) => {\n try {\n return frame.url();\n } catch {\n return '';\n }\n })\n : [];\n\n const snapshot = await page.evaluate(() => {\n const localStorage = {};\n const sessionStorage = {};\n const resourceUrls = [];\n const frameUrls = [];\n\n try {\n for (let i = 0; i < window.localStorage.length; i += 1) {\n const key = window.localStorage.key(i);\n if (!key) continue;\n const value = window.localStorage.getItem(key);\n if (value !== null) localStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n for (let i = 0; i < window.sessionStorage.length; i += 1) {\n const key = window.sessionStorage.key(i);\n if (!key) continue;\n const value = window.sessionStorage.getItem(key);\n if (value !== null) sessionStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n const perfEntries = performance.getEntriesByType('resource') || [];\n perfEntries.forEach((entry) => {\n const name = String(entry?.name || '').trim();\n if (name) resourceUrls.push(name);\n });\n } catch {\n // ignore\n }\n\n try {\n document.querySelectorAll('iframe,frame').forEach((node) => {\n const src = String(node?.src || '').trim();\n if (src) frameUrls.push(src);\n });\n } catch {\n // ignore\n }\n\n const nav = window.navigator || {};\n const screen = window.screen || {};\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n\n return {\n page_url: window.location.href || '',\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n local_storage: localStorage,\n session_storage: sessionStorage,\n browser_profile_observed: {\n user_agent: nav.userAgent || '',\n platform: nav.platform || '',\n language: nav.language || '',\n languages: Array.isArray(nav.languages) ? nav.languages : [],\n hardware_concurrency: Number(nav.hardwareConcurrency || 0),\n device_memory: Number(nav.deviceMemory || 0),\n timezone,\n viewport: {\n width: Number(window.innerWidth || 0),\n height: Number(window.innerHeight || 0),\n },\n screen: {\n width: Number(screen.width || 0),\n height: Number(screen.height || 0),\n avail_width: Number(screen.availWidth || 0),\n avail_height: Number(screen.availHeight || 0),\n color_depth: Number(screen.colorDepth || 0),\n pixel_depth: Number(screen.pixelDepth || 0),\n },\n },\n };\n });\n\n return normalizeRawSnapshot({\n ...snapshot,\n frame_urls: [...frameUrls, ...(snapshot?.frame_urls || [])],\n });\n};\n\n// observed \u53EA\u4FDD\u5B58\u201C\u8FD0\u884C\u540E\u770B\u5230\u7684\u6D4F\u89C8\u5668\u8868\u73B0\u201D\uFF0C\u5B83\u4E0D\u662F\u542F\u52A8\u771F\u6E90\u3002\nconst normalizeObservedBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const stringFields = {\n user_agent: source.user_agent,\n platform: source.platform,\n language: source.language,\n timezone: source.timezone,\n };\n Object.entries(stringFields).forEach(([key, item]) => {\n const safeValue = String(item || '').trim();\n if (safeValue) {\n profile[key] = safeValue;\n }\n });\n\n if (Array.isArray(source.languages)) {\n const languages = source.languages\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n if (languages.length > 0) {\n profile.languages = languages;\n }\n }\n\n const numericFields = {\n hardware_concurrency: Number(source.hardware_concurrency || 0),\n device_memory: Number(source.device_memory || 0),\n };\n Object.entries(numericFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n profile[key] = item;\n }\n });\n\n if (isPlainObject(source.viewport)) {\n const width = Number(source.viewport.width || 0);\n const height = Number(source.viewport.height || 0);\n if (width > 0 && height > 0) {\n profile.viewport = { width, height };\n }\n }\n\n if (isPlainObject(source.screen)) {\n const screenProfile = {};\n const screenFields = {\n width: Number(source.screen.width || 0),\n height: Number(source.screen.height || 0),\n avail_width: Number(source.screen.avail_width || 0),\n avail_height: Number(source.screen.avail_height || 0),\n color_depth: Number(source.screen.color_depth || 0),\n pixel_depth: Number(source.screen.pixel_depth || 0),\n };\n Object.entries(screenFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n screenProfile[key] = item;\n }\n });\n if (Object.keys(screenProfile).length > 0) {\n profile.screen = screenProfile;\n }\n }\n\n\treturn profile;\n};\n\n// core \u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u552F\u4E00\u771F\u6E90\uFF1A\n// fingerprint / timezone_id / locale / browser_major_version \u90FD\u5728\u8FD9\u91CC\u3002\nconst normalizeBrowserProfileCore = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n if (isPlainObject(source.fingerprint) && Object.keys(source.fingerprint).length > 0) {\n profile.fingerprint = deepClone(source.fingerprint);\n }\n\n const timezoneId = String(source.timezone_id || '').trim();\n if (timezoneId) {\n profile.timezone_id = timezoneId;\n }\n\n const locale = String(source.locale || '').trim();\n if (locale) {\n profile.locale = locale;\n }\n\n const browserMajorVersion = Number(source.browser_major_version || 0);\n if (Number.isFinite(browserMajorVersion) && browserMajorVersion > 0) {\n profile.browser_major_version = browserMajorVersion;\n }\n\n const schemaVersion = Number(source.schema_version || 0);\n if (Number.isFinite(schemaVersion) && schemaVersion > 0) {\n profile.schema_version = schemaVersion;\n } else if (Object.keys(profile).length > 0) {\n profile.schema_version = BROWSER_PROFILE_SCHEMA_VERSION;\n }\n\n\treturn profile;\n};\n\n// buildBrowserProfilePayload \u4FDD\u8BC1 browser_profile \u6C38\u8FDC\u53EA\u66B4\u9732 core / observed \u4E24\u5C42\u7ED3\u6784\u3002\nconst buildBrowserProfilePayload = (core = {}, observed = {}) => {\n const payload = {};\n if (isPlainObject(core) && Object.keys(core).length > 0) {\n payload.core = core;\n }\n if (isPlainObject(observed) && Object.keys(observed).length > 0) {\n payload.observed = observed;\n }\n return payload;\n};\n\nconst mergePlainObject = (target = {}, source = {}) => {\n const next = isPlainObject(target) ? deepClone(target) : {};\n if (!isPlainObject(source)) return next;\n\n Object.entries(source).forEach(([key, value]) => {\n if (!key) return;\n if (isPlainObject(value) && isPlainObject(next[key])) {\n next[key] = mergePlainObject(next[key], value);\n return;\n }\n next[key] = deepClone(value);\n });\n\n\treturn next;\n};\n\n// mergeBrowserProfilePayload \u7684\u6838\u5FC3\u89C4\u5219\uFF1A\n// 1. core \u53EA\u5728\u5F53\u524D\u4E3A\u7A7A\uFF0C\u6216\u6D4F\u89C8\u5668\u5927\u7248\u672C\u51B2\u7A81\u65F6\u624D\u66FF\u6362\uFF1B\n// 2. observed \u6BCF\u6B21\u90FD\u5141\u8BB8\u8986\u76D6\u66F4\u65B0\u3002\nconst mergeBrowserProfilePayload = (target = {}, source = {}) => {\n const current = isPlainObject(target) ? target : {};\n const incoming = isPlainObject(source) ? source : {};\n const currentCore = normalizeBrowserProfileCore(current.core);\n const incomingCore = normalizeBrowserProfileCore(incoming.core);\n const currentObserved = normalizeObservedBrowserProfile(current.observed);\n const incomingObserved = normalizeObservedBrowserProfile(incoming.observed);\n\n let mergedCore = currentCore;\n if (Object.keys(mergedCore).length === 0 && Object.keys(incomingCore).length > 0) {\n mergedCore = incomingCore;\n } else if (Object.keys(incomingCore).length > 0) {\n const currentVersion = Number(currentCore.browser_major_version || 0);\n const incomingVersion = Number(incomingCore.browser_major_version || 0);\n if (currentVersion > 0 && incomingVersion > 0 && currentVersion !== incomingVersion) {\n mergedCore = incomingCore;\n }\n }\n\n const mergedObserved = mergePlainObject(currentObserved, incomingObserved);\n\treturn buildBrowserProfilePayload(mergedCore, mergedObserved);\n};\n\n// mergeEnvPatchObjects \u662F visitor \u6210\u529F/\u5931\u8D25\u81EA\u52A8\u56DE\u5199 env_patch \u7684\u5408\u5E76\u5165\u53E3\u3002\nconst mergeEnvPatchObjects = (...patches) => {\n const merged = {};\n\n patches.forEach((patch) => {\n if (!isPlainObject(patch)) return;\n Object.entries(patch).forEach(([key, value]) => {\n if (!key) return;\n if (key === 'browser_profile') {\n const browserProfile = mergeBrowserProfilePayload(merged.browser_profile, value);\n if (Object.keys(browserProfile).length > 0) {\n merged.browser_profile = browserProfile;\n }\n return;\n }\n if (isPlainObject(value) && isPlainObject(merged[key])) {\n merged[key] = mergePlainObject(merged[key], value);\n return;\n }\n merged[key] = deepClone(value);\n });\n });\n\n return Object.keys(merged).length > 0 ? merged : null;\n};\n\nconst normalizeBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const coreSource = isPlainObject(source.core) ? source.core : {};\n const observedSource = isPlainObject(source.observed) ? source.observed : {};\n const core = normalizeBrowserProfileCore(coreSource);\n const observed = normalizeObservedBrowserProfile(observedSource);\n return {\n core,\n observed,\n payload: buildBrowserProfilePayload(core, observed),\n };\n};\n\nconst rememberRuntimeState = (state) => {\n rememberedRuntimeState = deepClone(state);\n return rememberedRuntimeState;\n};\n\nconst normalizeRuntimeState = (source = {}, actor = '') => {\n if (\n source &&\n typeof source === 'object' &&\n source.runtime &&\n typeof source.runtime === 'object' &&\n !Array.isArray(source.runtime) &&\n Object.prototype.hasOwnProperty.call(source, 'browserProfileCore')\n ) {\n return source;\n }\n return RuntimeEnv.parseInput(source, actor);\n};\n\nexport const RuntimeEnv = {\n tryParseJSON,\n normalizeCookies,\n normalizeLocalStorage,\n normalizeSessionStorage,\n normalizeBrowserProfileCore,\n normalizeObservedBrowserProfile,\n normalizeSnapshot(snapshot = {}) {\n return normalizeRawSnapshot(snapshot);\n },\n collectCookieUrls(snapshot = {}) {\n return collectCookieUrlsFromSnapshot(snapshot);\n },\n buildRuntimeEnvFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n buildEnvPatchFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n mergeEnvPatches(...patches) {\n return mergeEnvPatchObjects(...patches);\n },\n\n // parseInput \u628A Actor \u8F93\u5165\u91CC\u7684 runtime \u5B57\u6BB5\u6807\u51C6\u5316\u6210 toolkit \u5185\u90E8\u7EDF\u4E00\u7ED3\u6784\u3002\n // \u540E\u7EED visitor \u53EA\u548C\u8FD9\u4E2A state \u4EA4\u4E92\uFF0C\u4E0D\u518D\u81EA\u5DF1\u62FC token/cookie \u903B\u8F91\u3002\n parseInput(input = {}, actor = '') {\n const runtime = tryParseJSON(input?.runtime) || {};\n const resolvedActor = String(actor || input?.actor || '').trim();\n const query = String(input?.query || '').trim();\n const cookies = normalizeCookies(runtime?.cookies);\n const cookieMap = buildCookieMap(cookies);\n const localStorage = normalizeLocalStorage(runtime?.local_storage);\n const sessionStorage = normalizeSessionStorage(runtime?.session_storage);\n const browserProfile = normalizeBrowserProfile(runtime?.browser_profile);\n const envId = String(input?.env_id || '').trim();\n\n const normalizedRuntime = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n };\n if (Object.keys(browserProfile.payload).length > 0) {\n normalizedRuntime.browser_profile = browserProfile.payload;\n } else {\n delete normalizedRuntime.browser_profile;\n }\n\n const state = {\n actor: resolvedActor,\n runtime: normalizedRuntime,\n envId,\n query,\n cookies,\n cookieMap,\n localStorage,\n sessionStorage,\n browserProfile: browserProfile.payload,\n browserProfileCore: browserProfile.core,\n browserProfileObserved: browserProfile.observed,\n };\n rememberRuntimeState(state);\n return state;\n },\n\n // buildEnvPatch \u53EA\u6784\u9020\u5141\u8BB8\u56DE\u5199\u5230\u540E\u7AEF env \u7684\u5B57\u6BB5\u96C6\u5408\u3002\n buildEnvPatch(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);\n const envPatch = {\n ...(Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {}),\n ...(Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {}),\n ...(Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(envPatch).length > 0 ? envPatch : null;\n },\n\n // hasLoginState \u53EA\u5224\u65AD runtime \u662F\u5426\u5B58\u5728\u6709\u6548\u8F7D\u8377\uFF0C\u4E0D\u518D\u533A\u5206\u5177\u4F53\u5B57\u6BB5\u6765\u6E90\u3002\n hasLoginState(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;\n },\n\n rememberState(source = {}) {\n const state = normalizeRuntimeState(source);\n rememberRuntimeState(state);\n return RuntimeEnv.peekRememberedState();\n },\n\n peekRememberedState() {\n return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;\n },\n\n getBrowserProfileCore(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return deepClone(state.browserProfileCore || {});\n },\n\n setBrowserProfileCore(source = {}, core = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const normalizedCore = normalizeBrowserProfileCore(core);\n state.browserProfileCore = normalizedCore;\n state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);\n if (Object.keys(state.browserProfile).length > 0) {\n state.runtime.browser_profile = state.browserProfile;\n } else {\n delete state.runtime.browser_profile;\n }\n rememberRuntimeState(state);\n return state;\n },\n\n // applyToPage \u53EA\u8D1F\u8D23\u628A\u767B\u5F55\u6001\u76F8\u5173\u5B57\u6BB5\u6CE8\u5165\u9875\u9762\uFF1A\n // cookies / localStorage / sessionStorage\u3002\n // \u6307\u7EB9\u3001\u65F6\u533A\u3001UA\u3001viewport \u7684\u56DE\u653E\u53D1\u751F\u5728 launch.js \u542F\u52A8\u9636\u6BB5\uFF0C\u4E0D\u5728\u8FD9\u91CC\u505A\u3002\n async applyToPage(page, source = {}, options = {}) {\n if (!page) return;\n const state = normalizeRuntimeState(source, options?.actor || '');\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n const localStorage = state.localStorage || {};\n const sessionStorage = state.sessionStorage || {};\n const cookies = (state.cookies || [])\n .map((cookie) => {\n const normalized = { ...cookie };\n if (!normalized.path) {\n normalized.path = '/';\n }\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n return normalized;\n })\n .filter(Boolean);\n\n if (cookies.length > 0) {\n await page.context().addCookies(cookies);\n }\n if (Object.keys(localStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.localStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, localStorage);\n }\n if (Object.keys(sessionStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.sessionStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, sessionStorage);\n }\n },\n\n // captureEnvPatch \u5728\u4EFB\u52A1\u7ED3\u675F\u65F6\u91C7\u96C6\u6700\u65B0\u73AF\u5883\u5FEB\u7167\uFF0C\u7528\u4E8E pushSuccess / pushFailed \u81EA\u52A8\u56DE\u5199\u3002\n async captureEnvPatch(page, source = {}, options = {}) {\n const state = normalizeRuntimeState(source, options?.actor || '');\n const baseline = RuntimeEnv.buildEnvPatch(state) || {};\n if (!page || typeof page.evaluate !== 'function' || typeof page.context !== 'function') {\n return Object.keys(baseline).length > 0 ? baseline : null;\n }\n\n try {\n const rawSnapshot = await captureRawSnapshotFromPage(page);\n const cookieUrls = collectCookieUrlsFromSnapshot(rawSnapshot);\n let cookies = [];\n try {\n cookies = cookieUrls.length > 0\n ? await page.context().cookies(cookieUrls)\n : await page.context().cookies();\n } catch {\n cookies = [];\n }\n const capturedPatch = RuntimeEnv.buildEnvPatchFromSnapshot(\n {\n ...rawSnapshot,\n cookies,\n },\n {\n browserProfileCore: state.browserProfileCore,\n },\n );\n return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);\n } catch {\n // ignore\n }\n return Object.keys(baseline).length > 0 ? baseline : null;\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('InternalUtils');\n\n/**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\nexport const parseCookies = (cookieString, domain) => {\n const cookies = [];\n const pairs = cookieString.split(';').map(c => c.trim());\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.split('=');\n if (name && valueParts.length > 0) {\n const cookie = {\n name: name.trim(),\n value: valueParts.join('=').trim(),\n path: '/',\n };\n if (domain) {\n cookie.domain = domain;\n }\n cookies.push(cookie);\n }\n }\n logger.success('parseCookies', `parsed ${cookies.length} cookies`);\n return cookies;\n};\n", "import { parseCookies as internalParseCookies } from './internals/utils.js';\n\nexport const Utils = {\n /**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\n parseCookies(cookieString, domain) {\n return internalParseCookies(cookieString, domain);\n },\n\n /**\n * \u4ECE\u5B57\u7B26\u4E32\u4E2D\u63D0\u53D6 URL \u94FE\u63A5\n * @param {string} text\n * @param {Object} [options]\n * @param {string} [options.prefix] - \u4EC5\u8FD4\u56DE\u6B64\u524D\u7F00\u5F00\u5934\uFF0C\u4E14\u524D\u7F00\u540E\u81F3\u5C11 1 \u4F4D\u5B57\u7B26\u7684\u94FE\u63A5\n * @returns {string[]}\n */\n parseLinks(text, options = {}) {\n const raw = String(text || '');\n if (!raw) return [];\n\n const opts = options && typeof options === 'object' ? options : {};\n const prefix = String(opts.prefix || '').trim();\n\n const matched = raw.match(/https?:\\/\\/[\\w\\-._~:/?#[\\]@!$&'()*+,;=%]+/g) || [];\n const unique = new Set();\n\n for (const item of matched) {\n const link = String(item || '').trim().replace(/[\"'\u201C\u201D\u2018\u2019>\\].,\uFF0C\u3002\uFF1B;!\uFF01?\uFF1F]+$/, '');\n if (!link || !/^https?:\\/\\//i.test(link)) continue;\n\n if (prefix) {\n if (!link.startsWith(prefix)) continue;\n if (link.length <= prefix.length) continue;\n }\n\n unique.add(link);\n }\n\n return Array.from(unique);\n },\n}\n", "import { createInternalLogger } from './internals/logger';\n\nconst logger = createInternalLogger('AntiCheat');\n\nconst BASE_CONFIG = Object.freeze({\n locale: 'zh-CN',\n acceptLanguage: 'zh-CN,zh;q=0.9',\n timezoneId: 'Asia/Shanghai',\n timezoneOffset: -480,\n geolocation: null,\n});\n\n// \u6700\u5C0F\u5316\u542F\u52A8\u53C2\u6570\uFF0C\u4F9D\u8D56 Crawlee/Playwright \u9ED8\u8BA4\u884C\u4E3A\nconst DEFAULT_LAUNCH_ARGS = [\n // '--disable-blink-features=AutomationControlled', // Crawlee \u53EF\u80FD\u4F1A\u81EA\u52A8\u5904\u7406\uFF0C\u8FC7\u591A\u5E72\u9884\u53CD\u800C\u4F1A\u88AB\u8BC6\u522B\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--window-position=0,0',\n];\n\nfunction buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVersion = 0 } = {}) {\n const normalizedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const browserDescriptor = normalizedBrowserMajorVersion > 0\n ? [{ name: 'chrome', minVersion: normalizedBrowserMajorVersion, maxVersion: normalizedBrowserMajorVersion }]\n : [{ name: 'chrome', minVersion: 110 }];\n\n return {\n browsers: browserDescriptor,\n devices: ['desktop'],\n operatingSystems: ['windows', 'macos', 'linux'],\n locales: [locale],\n };\n}\n\nexport const AntiCheat = {\n /**\n * \u83B7\u53D6\u7EDF\u4E00\u7684\u57FA\u7840\u914D\u7F6E\n */\n getBaseConfig() {\n return { ...BASE_CONFIG };\n },\n\n /**\n * \u7528\u4E8E Crawlee fingerprint generator \u7684\u7EDF\u4E00\u914D\u7F6E\uFF08\u684C\u9762\u7AEF\uFF09\u3002\n */\n getFingerprintGeneratorOptions(options = {}) {\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u83B7\u53D6\u57FA\u7840\u542F\u52A8\u53C2\u6570\u3002\n */\n getLaunchArgs(options = {}) {\n const locale = String(options?.locale || BASE_CONFIG.locale).trim() || BASE_CONFIG.locale;\n return [...DEFAULT_LAUNCH_ARGS, `--lang=${locale}`];\n },\n\n /**\n * \u4E3A got-scraping \u751F\u6210\u4E0E\u6D4F\u89C8\u5668\u4E00\u81F4\u7684 TLS \u6307\u7EB9\u914D\u7F6E\uFF08\u684C\u9762\u7AEF\uFF09\u3002\n */\n getTlsFingerprintOptions(userAgent = '', acceptLanguage = '') {\n // \u7B80\u5316\u903B\u8F91\uFF0C\u4E0D\u518D\u89E3\u6790 acceptLanguage\uFF0C\u4EC5\u63D0\u4F9B\u57FA\u7840\u6307\u7EB9\u914D\u7F6E\n return buildFingerprintOptions();\n },\n\n /**\n * \u89C4\u8303\u5316\u8BF7\u6C42\u5934\n */\n applyLocaleHeaders(headers, acceptLanguage = '') {\n if (!headers['accept-language']) {\n headers['accept-language'] = acceptLanguage || BASE_CONFIG.acceptLanguage;\n }\n return headers;\n },\n};\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Humanize');\n\n// \u5185\u90E8 cursor \u5B9E\u4F8B\u7F13\u5B58 (\u6BCF\u4E2A page \u4E00\u4E2A) - \u4E0D\u5BF9\u5916\u66B4\u9732\nconst $CursorWeakMap = new WeakMap();\n\n/**\n * \u5185\u90E8\u65B9\u6CD5\uFF1A\u83B7\u53D6\u9875\u9762\u7684 cursor\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u629B\u51FA\u9519\u8BEF\n */\nfunction $GetCursor(page) {\n const cursor = $CursorWeakMap.get(page);\n if (!cursor) {\n throw new Error('Cursor \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 Humanize.initializeCursor(page)');\n }\n return cursor;\n}\n\nexport const Humanize = {\n /**\n * \u751F\u6210\u5E26\u6296\u52A8\u7684\u6BEB\u79D2\u6570 - \u57FA\u4E8E\u57FA\u7840\u503C\u6DFB\u52A0\u968F\u673A\u6D6E\u52A8 (\u00B130% \u9ED8\u8BA4)\n * @param {number} base - \u57FA\u7840\u5EF6\u8FDF (ms)\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4 (0.3 = \u00B130%)\n * @returns {number} \u6296\u52A8\u540E\u7684\u6BEB\u79D2\u6570\n */\n jitterMs(base, jitterPercent = 0.3) {\n const jitter = base * jitterPercent * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(base + jitter));\n },\n\n /**\n * \u521D\u59CB\u5316\u9875\u9762\u7684 Ghost Cursor\uFF08\u5FC5\u987B\u5728\u4F7F\u7528\u5176\u4ED6 cursor \u76F8\u5173\u65B9\u6CD5\u524D\u8C03\u7528\uFF09\n * \n * @param {import('playwright').Page} page\n * @returns {Promise<void>}\n */\n async initializeCursor(page) {\n if ($CursorWeakMap.has(page)) {\n logger.debug('initializeCursor: cursor already exists, skipping');\n return;\n }\n logger.start('initializeCursor', 'creating cursor');\n const cursor = await createCursor(page);\n $CursorWeakMap.set(page, cursor);\n logger.success('initializeCursor', 'cursor initialized');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u9F20\u6807\u79FB\u52A8 - \u4F7F\u7528 ghost-cursor \u79FB\u52A8\u5230\u6307\u5B9A\u4F4D\u7F6E\u6216\u5143\u7D20\n * \n * @param {import('playwright').Page} page\n * @param {string|{x: number, y: number}|import('playwright').ElementHandle} target - CSS\u9009\u62E9\u5668\u3001\u5750\u6807\u5BF9\u8C61\u6216\u5143\u7D20\u53E5\u67C4\n */\n async humanMove(page, target) {\n const cursor = $GetCursor(page);\n logger.start('humanMove', `target=${typeof target === 'string' ? target : 'element/coords'}`);\n try {\n if (typeof target === 'string') {\n // CSS \u9009\u62E9\u5668\n const element = await page.$(target);\n if (!element) {\n logger.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);\n return false;\n }\n const box = await element.boundingBox();\n if (!box) {\n logger.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);\n return false;\n }\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n } else if (target && typeof target.x === 'number' && typeof target.y === 'number') {\n // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\n const box = await target.boundingBox();\n if (box) {\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n }\n }\n logger.success('humanMove');\n return true;\n } catch (error) {\n logger.fail('humanMove', error);\n throw error;\n }\n },\n\n /**\n * \u6E10\u8FDB\u5F0F\u6EDA\u52A8\u5230\u5143\u7D20\u53EF\u89C1\uFF08\u4EC5\u5904\u7406 Y \u8F74\u6EDA\u52A8\uFF09\n * \u8FD4\u56DE restore \u65B9\u6CD5\uFF0C\u7528\u4E8E\u5C06\u6EDA\u52A8\u5BB9\u5668\u6062\u590D\u5230\u539F\u4F4D\u7F6E\n * \n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} target - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\n * @param {Object} [options]\n * @param {number} [options.maxSteps=14] - \u6700\u5927\u6EDA\u52A8\u6B65\u6570\n * @param {number} [options.minStep=260] - \u5355\u6B21\u6EDA\u52A8\u6700\u5C0F\u6B65\u957F\n * @param {number} [options.maxStep=800] - \u5355\u6B21\u6EDA\u52A8\u6700\u5927\u6B65\u957F\n * @param {number} [options.maxDurationMs] - \u6700\u957F\u8017\u65F6\u4E0A\u9650 (\u9ED8\u8BA4\u968F maxSteps \u4F30\u7B97)\n */\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 14,\n minStep = 260,\n maxStep = 800,\n maxDurationMs = maxSteps * 220 + 800\n } = options;\n const targetDesc = typeof target === 'string' ? target : 'ElementHandle';\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);\n return { element: null, didScroll: false };\n }\n } else {\n element = target;\n }\n\n const cursor = $GetCursor(page);\n let didScroll = false;\n\n // \u8F85\u52A9\u51FD\u6570\uFF1A\u68C0\u67E5\u53EF\u89C1\u6027\u548C\u906E\u6321\n const checkVisibility = async () => {\n return await element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width === 0 || rect.height === 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6' };\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const viewH = window.innerHeight;\n const viewW = window.innerWidth;\n let isFixed = false;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && style.position === 'fixed') {\n isFixed = true;\n break;\n }\n }\n\n // 1. \u68C0\u67E5\u662F\u5426\u5728\u51E0\u4F55\u89C6\u53E3\u5185\n if (cy < 0 || cy > viewH || cx < 0 || cx > viewW) {\n // \u8BA1\u7B97\u6240\u9700\u65B9\u5411\n const direction = cy < 0 ? 'up' : (cy > viewH ? 'down' : 'unknown');\n return { code: 'OUT_OF_VIEWPORT', reason: '\u4E0D\u5728\u89C6\u53E3\u5185', direction, cy, viewH, isFixed };\n }\n\n // 2. \u68C0\u67E5\u906E\u6321\n const pointElement = document.elementFromPoint(cx, cy);\n if (pointElement && !el.contains(pointElement) && !pointElement.contains(el)) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n obstruction: {\n tag: pointElement.tagName,\n id: pointElement.id,\n className: pointElement.className\n },\n cy, // Return Center Y for smart direction calculation\n viewH,\n isFixed\n };\n }\n\n return { code: 'VISIBLE', isFixed };\n });\n };\n\n const getScrollableRect = async () => {\n return await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n };\n\n const startTime = Date.now();\n\n try {\n for (let i = 0; i < maxSteps; i++) {\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);\n return { element, didScroll };\n }\n\n const status = await checkVisibility();\n\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ''}`);\n\n if (status.code === 'OBSTRUCTED' && status.obstruction) {\n logger.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id=\"${status.obstruction.id}\">`);\n }\n\n const scrollRect = await getScrollableRect();\n if (!scrollRect && status.isFixed) {\n logger.warn('humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n\n // \u786E\u5B9A\u6EDA\u52A8\u65B9\u5411\u548C\u8DDD\u79BB\n let deltaY = 0;\n if (status.code === 'OUT_OF_VIEWPORT') {\n if (status.direction === 'down') {\n deltaY = stepMin + Math.random() * (stepMax - stepMin);\n } else if (status.direction === 'up') {\n deltaY = -(stepMin + Math.random() * (stepMax - stepMin));\n } else {\n // \u6C34\u5E73\u95EE\u9898\u6216\u5947\u602A\u72B6\u6001\uFF0C\u5C1D\u8BD5\u5411\u4E0B\u6EDA\u52A8\u4E00\u70B9\n deltaY = 100;\n }\n } else if (status.code === 'OBSTRUCTED') {\n // \u667A\u80FD\u907F\u8BA9\u906E\u6321\n // \u5982\u679C\u5143\u7D20\u5728\u89C6\u53E3\u4E0B\u534A\u90E8\u5206\u88AB\u906E\u6321\uFF0C\u901A\u5E38\u662F\u88AB\u5E95\u90E8\u56FA\u5B9A\u5143\u7D20\uFF08\u5982 Footer\uFF09\u906E\u6321 -> \u9700\u8981\u5411\u4E0B\u6EDA\u52A8\u66F4\u591A\uFF08\u5185\u5BB9\u4E0A\u79FB\uFF09\n // \u5982\u679C\u5143\u7D20\u5728\u89C6\u53E3\u4E0A\u534A\u90E8\u5206\u88AB\u906E\u6321\uFF0C\u901A\u5E38\u662F\u88AB\u9876\u90E8\u56FA\u5B9A\u5143\u7D20\uFF08\u5982 Header\uFF09\u906E\u6321 -> \u9700\u8981\u5411\u4E0A\u6EDA\u52A8\u66F4\u591A\uFF08\u5185\u5BB9\u4E0B\u79FB\uFF09\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n const isBottomHalf = status.cy > halfY;\n const direction = isBottomHalf ? 1 : -1;\n\n // \u57FA\u7840\u6EDA\u52A8\u91CF + \u968F\u673A\u6CE2\u52A8\n deltaY = direction * (stepMin + Math.random() * 50);\n }\n\n // \u5C06\u9F20\u6807\u79FB\u52A8\u5230\u53EF\u6EDA\u52A8\u5BB9\u5668\uFF08\u4F18\u5148\uFF09\uFF0C\u5426\u5219\u79FB\u52A8\u5230\u89C6\u53E3\u4E2D\u5FC3\n if (i === 0) {\n const viewSize = page.viewportSize();\n if (scrollRect) {\n const safeX = scrollRect.x + scrollRect.width * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.width * 0.4);\n const safeY = scrollRect.y + scrollRect.height * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.height * 0.4);\n await cursor.actions.move({ x: safeX, y: safeY });\n } else if (viewSize) {\n const safeX = viewSize.width * 0.5 + (Math.random() - 0.5) * 80;\n const safeY = viewSize.height * 0.5 + (Math.random() - 0.5) * 80;\n await cursor.actions.move({ x: safeX, y: safeY });\n }\n }\n\n // \u6267\u884C\u6EDA\u52A8\n await page.mouse.wheel(0, deltaY);\n didScroll = true;\n\n // \u7B49\u5F85\u6EDA\u52A8\u7A33\u5B9A - \u7D27\u51D1\u8282\u594F (20ms - 60ms)\n await delay(this.jitterMs(20 + Math.random() * 40, 0.2));\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll };\n\n } catch (error) {\n logger.fail('humanScroll', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u70B9\u51FB - \u4F7F\u7528 ghost-cursor \u6A21\u62DF\u4EBA\u7C7B\u9F20\u6807\u79FB\u52A8\u8F68\u8FF9\u5E76\u70B9\u51FB\n * \n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} [target] - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\u3002\u5982\u679C\u4E3A\u7A7A\uFF0C\u5219\u70B9\u51FB\u5F53\u524D\u9F20\u6807\u4F4D\u7F6E\n * @param {Object} [options]\n * @param {number} [options.reactionDelay=250] - \u53CD\u5E94\u5EF6\u8FDF\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B130% \u6296\u52A8\n * @param {boolean} [options.throwOnMissing=true] - \u5143\u7D20\u4E0D\u5B58\u5728\u65F6\u662F\u5426\u629B\u51FA\u9519\u8BEF\n * @param {boolean} [options.scrollIfNeeded=true] - \u5143\u7D20\u4E0D\u5728\u89C6\u53E3\u65F6\u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u589E\u52A0 restore \u9009\u9879\uFF0C\u9ED8\u8BA4 false (\u4E0D\u8FD8\u539F\u6EDA\u52A8\u4F4D\u7F6E)\n const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\n\n\n const restoreOnce = async () => {\n if (restoreOnce.restored) return;\n restoreOnce.restored = true;\n\n if (typeof restoreOnce.do !== 'function') return;\n try {\n await delay(this.jitterMs(1000));\n await restoreOnce.do();\n } catch (restoreError) {\n logger.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);\n }\n };\n\n\n try {\n // Case 1: \u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E (target \u4E3A null/undefined)\n if (target == null) {\n // \u4EC5\u6267\u884C\u53CD\u5E94\u5EF6\u8FDF + \u70B9\u51FB\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n logger.success('humanClick', 'Clicked current position');\n return true;\n }\n\n // Case 2: \u70B9\u51FB\u6307\u5B9A\u76EE\u6807\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);\n }\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);\n return false;\n }\n } else {\n element = target;\n }\n\n if (scrollIfNeeded) {\n const { restore: restoreFn, didScroll } = await this.humanScroll(page, element);\n // \u4EC5\u5728 didScroll \u4E3A true \u4E14 options.restore \u4E3A true \u65F6\u624D\u8FD8\u539F\n restoreOnce.do = (didScroll && restore) ? restoreFn : null;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n await restoreOnce();\n if (throwOnMissing) {\n throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n }\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.3;\n\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n await restoreOnce();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\n await restoreOnce();\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n /**\n * \u968F\u673A\u5EF6\u8FDF\u4E00\u6BB5\u6BEB\u79D2\u6570\uFF08\u5E26 \u00B130% \u6296\u52A8\uFF09\n * @param {number} baseMs - \u57FA\u7840\u5EF6\u8FDF\u6BEB\u79D2\u6570\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4\n */\n async randomSleep(baseMs, jitterPercent = 0.3) {\n const ms = this.jitterMs(baseMs, jitterPercent);\n logger.start('randomSleep', `base=${baseMs}, actual=${ms}ms`);\n await delay(ms);\n logger.success('randomSleep');\n },\n\n /**\n * \u6A21\u62DF\u4EBA\u7C7B\"\u6CE8\u89C6\"\u6216\"\u9605\u8BFB\"\u884C\u4E3A\uFF1A\u9F20\u6807\u5728\u9875\u9762\u4E0A\u968F\u673A\u5FAE\u52A8\n * @param {import('playwright').Page} page\n * @param {number} [baseDurationMs=2500] - \u57FA\u7840\u6301\u7EED\u65F6\u95F4 (\u00B140% \u6296\u52A8)\n */\n async simulateGaze(page, baseDurationMs = 2500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDurationMs, 0.4);\n logger.start('simulateGaze', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n while (Date.now() - startTime < durationMs) {\n // \u5728\u89C6\u53E3\u8303\u56F4\u5185\u968F\u673A\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n // \u6CE8\u89C6\u505C\u7559 300-1200ms\n await delay(this.jitterMs(600, 0.5));\n }\n logger.success('simulateGaze');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u8F93\u5165 - \u5E26\u8282\u594F\u53D8\u5316\uFF08\u5FEB-\u6162-\u505C\u987F-\u5076\u5C14\u52A0\u901F\uFF09\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n * @param {string} text - \u8981\u8F93\u5165\u7684\u6587\u672C\n * @param {Object} [options] \n * @param {number} [options.baseDelay=180] - \u57FA\u7840\u6309\u952E\u5EF6\u8FDF (ms)\uFF0C\u5B9E\u9645 \u00B140% \u6296\u52A8\n * @param {number} [options.pauseProbability=0.08] - \u505C\u987F\u6982\u7387 (0-1)\n * @param {number} [options.pauseBase=800] - \u505C\u987F\u65F6\u957F\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B150% \u6296\u52A8\n */\n async humanType(page, selector, text, options = {}) {\n logger.start('humanType', `selector=${selector}, textLen=${text.length}`);\n const {\n baseDelay = 180,\n pauseProbability = 0.08,\n pauseBase = 800\n } = options;\n\n try {\n const locator = page.locator(selector);\n await Humanize.humanClick(page, locator);\n\n // \u70B9\u51FB\u540E\u601D\u8003\u5EF6\u8FDF\n await delay(this.jitterMs(200, 0.4));\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n let charDelay;\n\n if (char === ' ') {\n // \u7A7A\u683C\u952E\u7A0D\u5FEB\n charDelay = this.jitterMs(baseDelay * 0.6, 0.3);\n } else if (/[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)) {\n // \u6807\u70B9\u7B26\u53F7\u540E\u7A0D\u6162\uFF08\u6A21\u62DF\u601D\u8003\uFF09\n charDelay = this.jitterMs(baseDelay * 1.5, 0.4);\n } else {\n // \u666E\u901A\u5B57\u7B26\n charDelay = this.jitterMs(baseDelay, 0.4);\n }\n\n await page.keyboard.type(char);\n await delay(charDelay);\n\n // \u968F\u673A\u505C\u987F\uFF08\u6A21\u62DF\u601D\u8003/\u56DE\u987E\uFF09\n if (Math.random() < pauseProbability && i < text.length - 1) {\n const pauseTime = this.jitterMs(pauseBase, 0.5);\n logger.debug(`\u505C\u987F ${pauseTime}ms...`);\n await delay(pauseTime);\n }\n }\n logger.success('humanType');\n } catch (error) {\n logger.fail('humanType', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6E05\u7A7A\u8F93\u5165\u6846 - \u6A21\u62DF\u4EBA\u7C7B\u5220\u9664\u6587\u672C\u7684\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n */\n async humanClear(page, selector) {\n logger.start('humanClear', `selector=${selector}`);\n try {\n const locator = page.locator(selector);\n await locator.click();\n await delay(this.jitterMs(200, 0.4));\n\n const currentValue = await locator.inputValue();\n if (!currentValue || currentValue.length === 0) {\n logger.success('humanClear', 'already empty');\n return;\n }\n\n // \u5168\u9009 + \u5220\u9664\n await page.keyboard.press('Meta+A');\n await delay(this.jitterMs(100, 0.4));\n await page.keyboard.press('Backspace');\n\n logger.success('humanClear');\n } catch (error) {\n logger.fail('humanClear', error);\n throw error;\n }\n },\n\n /**\n * \u9875\u9762\u9884\u70ED\u6D4F\u89C8 - \u6A21\u62DF\u4EBA\u7C7B\u8FDB\u5165\u9875\u9762\u540E\u7684\u63A2\u7D22\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {number} [baseDuration=3500] - \u9884\u70ED\u65F6\u957F\u57FA\u7840\u503C (\u00B140% \u6296\u52A8)\n */\n async warmUpBrowsing(page, baseDuration = 3500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDuration, 0.4);\n\n logger.start('warmUpBrowsing', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n try {\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n\n if (action < 0.4) {\n // \u9F20\u6807\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(350, 0.4));\n } else if (action < 0.7) {\n // \u6EDA\u52A8\n const scrollY = (Math.random() - 0.5) * 200;\n await page.mouse.wheel(0, scrollY);\n await delay(this.jitterMs(500, 0.4));\n } else {\n // \u505C\u987F/\u6CE8\u89C6\n await delay(this.jitterMs(800, 0.5));\n }\n }\n logger.success('warmUpBrowsing');\n } catch (error) {\n logger.fail('warmUpBrowsing', error);\n throw error;\n }\n },\n\n /**\n * \u81EA\u7136\u6EDA\u52A8 - \u5E26\u60EF\u6027\u3001\u51CF\u901F\u6548\u679C\u548C\u968F\u673A\u6296\u52A8\n * @param {import('playwright').Page} page\n * @param {'up' | 'down'} [direction='down'] - \u6EDA\u52A8\u65B9\u5411\n * @param {number} [distance=300] - \u603B\u6EDA\u52A8\u8DDD\u79BB\u57FA\u7840\u503C (px)\uFF0C\u00B115% \u6296\u52A8\n * @param {number} [baseSteps=5] - \u5206\u51E0\u6B65\u5B8C\u6210\u57FA\u7840\u503C\uFF0C\u00B11 \u968F\u673A\n */\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n // steps \u52A0\u968F\u673A\u6D6E\u52A8 \u00B11\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n // distance \u52A0\u6296\u52A8\n const actualDistance = this.jitterMs(distance, 0.15);\n\n logger.start('naturalScroll', `dir=${direction}, dist=${actualDistance}, steps=${steps}`);\n const sign = direction === 'down' ? 1 : -1;\n const stepDistance = actualDistance / steps;\n\n try {\n for (let i = 0; i < steps; i++) {\n // \u60EF\u6027\u51CF\u901F\u56E0\u5B50\n const factor = 1 - (i / steps) * 0.5;\n // \u6BCF\u6B65\u52A0 \u00B110% \u6296\u52A8\n const jitter = 0.9 + Math.random() * 0.2;\n const scrollAmount = stepDistance * factor * sign * jitter;\n\n await page.mouse.wheel(0, scrollAmount);\n\n // \u5EF6\u8FDF\u4E5F\u5E26\u6296\u52A8\n const baseDelay = 60 + i * 25;\n await delay(this.jitterMs(baseDelay, 0.3));\n }\n logger.success('naturalScroll');\n } catch (error) {\n logger.fail('naturalScroll', error);\n throw error;\n }\n }\n}\n", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u53CD\u722C\u53C2\u6570\u4E0E\u6307\u7EB9\u914D\u7F6E\u7EDF\u4E00\u7531 AntiCheat \u63D0\u4F9B\nimport { execFileSync } from 'node:child_process';\nimport { FingerprintGenerator } from 'fingerprint-generator';\nimport { FingerprintInjector } from 'fingerprint-injector';\nimport { AntiCheat } from './anti-cheat';\nimport { createInternalLogger } from './internals/logger';\nimport { ByPass } from './proxy-bypass';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('Launch');\nconst REQUEST_HOOK_FLAG = Symbol('playwright-toolkit-request-hook');\nconst injectedContexts = new WeakSet();\nconst browserMajorVersionCache = new Map();\n\nconst DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;\nconst DEFAULT_LOCALE = 'zh-CN';\n\nconst DEFAULT_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst fingerprintInjector = new FingerprintInjector();\n\nconst resolveProxyLaunchOptions = (proxyConfiguration = {}) => {\n const config = proxyConfiguration && typeof proxyConfiguration === 'object' && !Array.isArray(proxyConfiguration)\n ? proxyConfiguration\n : {};\n\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean' ? config.enable_proxy : proxyUrl !== '';\n\n if (!enableProxy || !proxyUrl) {\n return { byPassDomains: [], enableProxy, proxyUrl };\n }\n const byPassDomains = ByPass.normalizeByPassDomains(config.by_pass_domains);\n return { byPassDomains, enableProxy, proxyUrl };\n};\n\nconst parseChromeMajorVersion = (rawValue = '') => {\n const match = String(rawValue || '').match(/Chrome\\/(\\d+)/i);\n return match ? Number(match[1] || 0) : 0;\n};\n\nconst resolveLauncherExecutablePath = (launcher) => {\n if (!launcher || typeof launcher !== 'object') return '';\n if (typeof launcher.executablePath === 'function') {\n try {\n return String(launcher.executablePath() || '').trim();\n } catch {\n return '';\n }\n }\n return '';\n};\n\nconst detectBrowserMajorVersion = (launcher) => {\n\tconst executablePath = resolveLauncherExecutablePath(launcher);\n if (!executablePath) return 0;\n if (browserMajorVersionCache.has(executablePath)) {\n return browserMajorVersionCache.get(executablePath);\n }\n\n let detectedVersion = 0;\n try {\n const rawVersion = execFileSync(executablePath, ['--version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n detectedVersion = parseChromeMajorVersion(rawVersion);\n } catch (error) {\n logger.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);\n }\n\n\tbrowserMajorVersionCache.set(executablePath, detectedVersion);\n\treturn detectedVersion;\n};\n\n// buildFingerprintGenerator \u53EA\u5728\u201C\u6CA1\u6709\u53EF\u590D\u7528 core.fingerprint\u201D\u65F6\u515C\u5E95\u751F\u6210\u4E00\u6B21\u3002\nconst buildFingerprintGenerator = ({ locale, browserMajorVersion }) => {\n\treturn new FingerprintGenerator(\n AntiCheat.getFingerprintGeneratorOptions({\n locale,\n browserMajorVersion,\n }),\n\t);\n};\n\n// buildReplayableBrowserProfile \u8D1F\u8D23\u628A\u201C\u767B\u5F55\u6001 env\u201D\u63D0\u5347\u6210\u201C\u53EF\u8DE8\u673A\u5668\u590D\u7528\u7684\u6D4F\u89C8\u5668\u771F\u6E90\u201D\u3002\n// \u89C4\u5219\u662F\uFF1A\n// 1. \u6CA1\u6709\u767B\u5F55\u6001\u65F6\uFF0C\u4E0D\u5F3A\u6C42\u751F\u6210\u6301\u4E45\u5316\u6307\u7EB9\uFF1B\n// 2. \u6709\u767B\u5F55\u6001\u4F46\u6CA1\u6709 core.fingerprint \u65F6\uFF0C\u9996\u6B21\u751F\u6210\u5E76\u5199\u56DE runtimeState\uFF1B\n// 3. \u6D4F\u89C8\u5668\u5927\u7248\u672C\u53D8\u5316\u65F6\uFF0C\u5141\u8BB8\u91CD\u5EFA core\uFF0C\u907F\u514D\u65E7\u6307\u7EB9\u4E0E\u65B0\u5185\u6838\u4E0D\u517C\u5BB9\u3002\nconst buildReplayableBrowserProfile = (runtimeState, launcher) => {\n if (!runtimeState || !RuntimeEnv.hasLoginState(runtimeState)) {\n return { runtimeState, browserProfileCore: null };\n }\n\n let nextState = RuntimeEnv.rememberState(runtimeState);\n let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);\n const timezoneId = String(browserProfileCore?.timezone_id || '').trim() || AntiCheat.getBaseConfig().timezoneId;\n const locale = DEFAULT_LOCALE;\n const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);\n const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);\n const needsRebuild = !browserProfileCore?.fingerprint\n || Object.keys(browserProfileCore.fingerprint || {}).length === 0\n || (currentBrowserMajorVersion > 0 && storedBrowserMajorVersion > 0 && storedBrowserMajorVersion !== currentBrowserMajorVersion);\n\n if (needsRebuild) {\n const generator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: currentBrowserMajorVersion,\n });\n const fingerprint = generator.getFingerprint();\n const fingerprintBrowserMajorVersion = parseChromeMajorVersion(fingerprint?.fingerprint?.navigator?.userAgent || '');\n browserProfileCore = {\n fingerprint,\n timezone_id: timezoneId,\n locale,\n browser_major_version: currentBrowserMajorVersion > 0 ? currentBrowserMajorVersion : fingerprintBrowserMajorVersion,\n schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n };\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);\n logger.info(\n `\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || '-')} | version=${browserProfileCore.browser_major_version || '-'} | timezone=${timezoneId}`,\n );\n return { runtimeState: nextState, browserProfileCore };\n }\n\n const normalizedBrowserProfileCore = {\n ...browserProfileCore,\n timezone_id: timezoneId,\n locale,\n schema_version: Number(browserProfileCore.schema_version || 0) > 0\n ? Number(browserProfileCore.schema_version || 0)\n : DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n browser_major_version: currentBrowserMajorVersion > 0\n ? currentBrowserMajorVersion\n : Number(browserProfileCore.browser_major_version || 0),\n };\n\n const currentCoreRaw = JSON.stringify(browserProfileCore || {});\n const nextCoreRaw = JSON.stringify(normalizedBrowserProfileCore);\n if (currentCoreRaw !== nextCoreRaw) {\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, normalizedBrowserProfileCore);\n }\n\n return {\n runtimeState: nextState,\n browserProfileCore: normalizedBrowserProfileCore,\n\t};\n};\n\n// buildReplayBrowserPoolOptions \u8BA9 BrowserPool / Playwright / FingerprintInjector\n// \u90FD\u4ECE\u540C\u4E00\u4EFD core.fingerprint \u6D3E\u751F\u53C2\u6570\uFF0C\u907F\u514D UA / viewport / JS \u6307\u7EB9\u591A\u771F\u6E90\u51B2\u7A81\u3002\nconst buildReplayBrowserPoolOptions = (browserProfileCore) => {\n const fingerprintWithHeaders = browserProfileCore?.fingerprint;\n const fingerprint = fingerprintWithHeaders?.fingerprint;\n if (!fingerprintWithHeaders || !fingerprint) {\n return null;\n }\n\n return {\n useFingerprints: false,\n prePageCreateHooks: [\n (_pageId, _browserController, pageOptions = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n\n const screen = fingerprint.screen || {};\n const userAgent = String(fingerprint.navigator?.userAgent || '').trim();\n if (userAgent) {\n pageOptions.userAgent = userAgent;\n }\n if (Number(screen.width || 0) > 0 && Number(screen.height || 0) > 0) {\n pageOptions.viewport = {\n width: Number(screen.width),\n height: Number(screen.height),\n };\n pageOptions.screen = {\n width: Number(screen.width),\n height: Number(screen.height),\n };\n }\n if (browserProfileCore.locale) {\n pageOptions.locale = browserProfileCore.locale;\n }\n if (browserProfileCore.timezone_id) {\n pageOptions.timezoneId = browserProfileCore.timezone_id;\n }\n },\n ],\n postPageCreateHooks: [\n async (page) => {\n const context = page?.context?.();\n if (!context) return;\n if (!injectedContexts.has(context)) {\n await fingerprintInjector.attachFingerprintToPlaywright(context, fingerprintWithHeaders);\n injectedContexts.add(context);\n }\n },\n ],\n };\n};\n\nexport const Launch = {\n getPlaywrightCrawlerOptions(options = {}) {\n const normalizedOptions = Array.isArray(options) ? { customArgs: options } : (options || {});\n const {\n customArgs = [],\n proxyConfiguration = {},\n log: logOptions = null,\n runInHeadfulMode = false,\n debugMode = false,\n isRunningOnApify = false,\n launcher = null,\n preNavigationHooks = [],\n postNavigationHooks = [],\n runtimeState = null,\n } = normalizedOptions;\n\n const { byPassDomains, enableProxy, proxyUrl } = resolveProxyLaunchOptions(proxyConfiguration);\n const byPassRules = ByPass.buildByPassDomainRules(byPassDomains);\n const proxyMeter = enableProxy && proxyUrl\n ? ProxyMeterRuntime.startProxyMeter({ proxyUrl, debugMode })\n : null;\n const launchProxy = proxyMeter ? { server: proxyMeter.server } : null;\n if (launchProxy && byPassDomains.length > 0) {\n launchProxy.bypass = byPassDomains.join(',');\n }\n\n\t\t// \u542F\u52A8\u524D\u5148\u786E\u5B9A\u662F\u5426\u8D70\u201C\u7A33\u5B9A\u56DE\u653E\u6A21\u5F0F\u201D\u3002\n\t\tconst replayContext = buildReplayableBrowserProfile(runtimeState, launcher);\n\t\tconst replayBrowserPoolOptions = buildReplayBrowserPoolOptions(replayContext.browserProfileCore);\n\t\tconst launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;\n\n const launchOptions = {\n args: [\n ...AntiCheat.getLaunchArgs({ locale: launchLocale }),\n ...customArgs,\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n\n if (launchProxy) {\n launchOptions.proxy = launchProxy;\n }\n\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n if (enableByPassLogger && launchProxy) {\n let upstreamLabel = '';\n try {\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;\n } catch {}\n logger.info(\n `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || '-'} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(',')}`,\n );\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger && enableProxy && !launchProxy) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A');\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger && !enableProxy && proxyUrl) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E');\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger) {\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n }\n\n const onPageCreated = (page) => {\n const recommendedGotoOptions = {\n waitUntil: 'commit',\n };\n\n if (!page || typeof page.on !== 'function') {\n return recommendedGotoOptions;\n }\n if (page[REQUEST_HOOK_FLAG]) {\n return recommendedGotoOptions;\n }\n page[REQUEST_HOOK_FLAG] = true;\n\n const requestHandler = (req) => {\n const requestUrl = req.url();\n const resourceType = req.resourceType();\n const matched = byPassDomains.length > 0\n ? ByPass.findMatchedByPassRule(byPassRules, requestUrl)\n : null;\n if (launchProxy) {\n ProxyMeterRuntime.recordProxyMeterResourceType(requestUrl, resourceType);\n }\n if (!enableByPassLogger || byPassDomains.length === 0) return;\n if (!matched || !matched.rule) return;\n logger.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);\n };\n page.on('request', requestHandler);\n return recommendedGotoOptions;\n };\n\n const launchContext = {\n useIncognitoPages: true,\n launchOptions,\n };\n if (launcher) {\n launchContext.launcher = launcher;\n }\n\n const crawlerBaseOptions = {\n ...DEFAULT_CRAWLER_BASE_OPTIONS,\n headless: !runInHeadfulMode || isRunningOnApify,\n\t\t\t// \u6709 core.fingerprint \u65F6\u8D70\u56FA\u5B9A\u56DE\u653E\uFF1B\u5426\u5219\u9000\u56DE Crawlee \u9ED8\u8BA4\u6307\u7EB9\u6A21\u5F0F\u3002\n\t\t\tbrowserPoolOptions: replayBrowserPoolOptions || {\n\t\t\t\tuseFingerprints: true,\n\t\t\t\tfingerprintOptions: {\n fingerprintGeneratorOptions: AntiCheat.getFingerprintGeneratorOptions(),\n },\n },\n launchContext,\n };\n\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n const internalPreNavigationHook = async ({ page }, gotoOptions = {}) => {\n const recommendedGotoOptions = onPageCreated(page);\n if (recommendedGotoOptions && typeof recommendedGotoOptions === 'object') {\n Object.assign(gotoOptions, recommendedGotoOptions);\n }\n };\n\n return {\n ...crawlerBaseOptions,\n preNavigationHooks: [internalPreNavigationHook, ...normalizedPreNavigationHooks],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n },\n};\n", "import picomatch from 'picomatch';\n\nconst normalizeByPassDomains = (domains) => {\n if (!Array.isArray(domains)) return [];\n return domains\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n};\n\nconst normalizeHostname = (value = '') => String(value || '').trim().toLowerCase();\n\nconst buildByPassDomainRule = (rawPattern) => {\n const pattern = String(rawPattern || '').trim().toLowerCase();\n if (!pattern) return null;\n\n let matcher;\n try {\n matcher = picomatch(pattern, { nocase: true });\n } catch {\n return null;\n }\n\n return {\n pattern,\n test: (hostname) => matcher(String(hostname || '').toLowerCase()),\n };\n};\n\nconst buildByPassDomainRules = (domains = []) => {\n return normalizeByPassDomains(domains)\n .map((domain) => buildByPassDomainRule(domain))\n .filter(Boolean);\n};\n\nconst findMatchedByPassRule = (rules = [], requestUrl = '') => {\n let hostname = '';\n try {\n hostname = normalizeHostname(new URL(String(requestUrl || '')).hostname);\n } catch {\n return null;\n }\n\n for (const rule of rules) {\n if (rule && typeof rule.test === 'function' && rule.test(hostname)) {\n return {\n rule,\n hostname,\n };\n }\n }\n\n return {\n rule: null,\n hostname,\n };\n};\n\nconst isDomainCoveredByByPass = (domain = '', rules = []) => {\n const hostname = normalizeHostname(domain);\n if (!hostname) return false;\n\n for (const rule of rules || []) {\n if (!rule || typeof rule.test !== 'function') continue;\n if (rule.test(hostname)) return true;\n }\n\n return false;\n};\n\nconst resolveRouteByProxy = ({\n requestUrl = '',\n enableProxy = false,\n byPassRules = [],\n}) => {\n if (!enableProxy) {\n return { route: 'direct', matchedRule: null, hostname: '' };\n }\n\n const matched = findMatchedByPassRule(byPassRules, requestUrl);\n if (!matched) {\n return { route: 'proxy', matchedRule: null, hostname: '' };\n }\n\n if (matched.rule) {\n return { route: 'direct', matchedRule: matched.rule, hostname: matched.hostname };\n }\n\n return { route: 'proxy', matchedRule: null, hostname: matched.hostname };\n};\n\nexport const ByPass = {\n normalizeByPassDomains,\n normalizeHostname,\n buildByPassDomainRule,\n buildByPassDomainRules,\n findMatchedByPassRule,\n isDomainCoveredByByPass,\n resolveRouteByProxy,\n};\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\n\nconst logger = createInternalLogger('LiveView');\n\n/**\n * \u542F\u52A8\u4E00\u4E2A Web \u670D\u52A1\u5668\u4EE5\u5728 Live View \u9009\u9879\u5361\u4E2D\u663E\u793A\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\u3002\n */\nasync function startLiveViewServer(liveViewKey) {\n const app = express();\n\n app.get('/', async (req, res) => {\n try {\n // \u4ECE\u9ED8\u8BA4\u7684 Key-Value Store \u4E2D\u8BFB\u53D6\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\n const screenshotBuffer = await Actor.getValue(liveViewKey);\n\n if (!screenshotBuffer) {\n // \u5982\u679C\u8FD8\u6CA1\u6709\u622A\u56FE\uFF0C\u53D1\u9001\u4E00\u4E2A\u81EA\u52A8\u5237\u65B0\u7684\u5360\u4F4D\u9875\u9762\n res.send('<html><head><meta http-equiv=\"refresh\" content=\"2\"></head><body>\u7B49\u5F85\u7B2C\u4E00\u4E2A\u5C4F\u5E55\u622A\u56FE...</body></html>');\n return;\n }\n\n // \u5C06 Buffer \u8F6C\u6362\u4E3A Base64 \u5B57\u7B26\u4E32\n const screenshotBase64 = screenshotBuffer.toString('base64');\n\n // \u53D1\u9001\u4E00\u4E2A HTML \u9875\u9762\uFF0C\u8BE5\u9875\u9762\u6BCF 1 \u79D2\u81EA\u52A8\u5237\u65B0\u4E00\u6B21\uFF0C\u5E76\u663E\u793A\u622A\u56FE\n res.send(`\n <html>\n <head>\n <title>Live View (\u622A\u56FE)</title>\n <meta http-equiv=\"refresh\" content=\"1\">\n </head>\n <body style=\"margin:0; padding:0;\">\n <img src=\"data:image/png;base64,${screenshotBase64}\" \n alt=\"Live View Screenshot\" \n style=\"width: 100%; height: auto;\" />\n </body>\n </html>\n `);\n } catch (error) {\n logger.fail('Live View Server', error);\n res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);\n }\n });\n\n // \u76D1\u542C Apify \u5BB9\u5668\u7AEF\u53E3 \n const port = process.env.APIFY_CONTAINER_PORT || 4321;\n app.listen(port, () => { logger.success('startLiveViewServer', `\u76D1\u542C\u7AEF\u53E3 ${port}`); });\n}\n\n/**\n * \u62CD\u6444\u5F53\u524D\u9875\u9762\u7684\u5C4F\u5E55\u622A\u56FE\u5E76\u5C06\u5176\u4FDD\u5B58\u5230 Key-Value Store\u3002\n * @param {import('playwright').Page} page\n * @param {string} [logMessage] - \u53EF\u9009\u7684\u65E5\u5FD7\u6D88\u606F\u3002\n */\nasync function takeLiveScreenshot(liveViewKey, page, logMessage) {\n try {\n const buffer = await capturePageScreenshot(page, { type: 'png' });\n await Actor.setValue(liveViewKey, buffer, { contentType: 'image/png' });\n if (logMessage) {\n logger.info(`(\u622A\u56FE): ${logMessage}`);\n }\n } catch (e) {\n logger.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);\n }\n}\n\nconst useLiveView = (liveViewKey = PresetOfLiveViewKey) => {\n return {\n takeLiveScreenshot: async (page, logMessage) => {\n return await takeLiveScreenshot(liveViewKey, page, logMessage)\n },\n startLiveViewServer: async () => {\n return await startLiveViewServer(liveViewKey);\n }\n }\n}\n\nexport const LiveView = {\n useLiveView,\n};\n", " \nimport { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger';\n\nconst logger = createInternalLogger('Captcha');\nconst DEFAULT_BYTEDANCE_CAPTCHA_TOKEN = 'eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI';\n\nconst DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({\n token: DEFAULT_BYTEDANCE_CAPTCHA_TOKEN,\n apiUrl: 'https://api.jfbym.com/api/YmServer/customApi',\n apiType: '31234',\n maxRetries: 3,\n containerSelector: '#captcha_container',\n iframeSelector: 'iframe[src*=\"verifycenter\"]',\n iframeFallbackSelector: 'iframe',\n sourceImageSelector: 'div.canvas-container',\n dropTargetContainerSelector: '#captcha_verify_image div',\n dropTargetTexts: ['\u62D6\u62FD\u5230\u8FD9\u91CC'],\n refreshTexts: ['\u5237\u65B0'],\n submitTexts: ['\u63D0\u4EA4'],\n recognitionSuccessCode: 10000,\n containerVisibleTimeoutMs: 2000,\n iframeVisibleTimeoutMs: 12000,\n iframeFallbackVisibleTimeoutMs: 4000,\n contentFrameResolveRetries: 5,\n contentFrameResolveDelayMs: 500,\n actionVisibleTimeoutMs: 1500,\n sourceImageVisibleTimeoutMs: 3000,\n challengeReadyTimeoutMs: 15000,\n challengeReadyRefreshTimeoutMs: 20000,\n challengeReadyPollMs: 300,\n loadingIndicatorVisibleTimeoutMs: 200,\n loadingTexts: ['\u52A0\u8F7D\u4E2D', '\u52A0\u8F7D\u4E2D...'],\n errorTexts: [\n '\u68C0\u6D4B\u5230\u60A8\u7684\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u8005\u7A0D\u540E\u518D\u8BD5',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u7A0D\u540E\u518D\u8BD5',\n '\u7A0D\u540E\u518D\u8BD5',\n ],\n recognitionDelayMs: 2000,\n refreshWaitMs: 3000,\n submitWaitMs: 3000,\n retryDelayBaseMs: 2000,\n retryDelayStepMs: 1000,\n});\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668\uFF0C\u652F\u6301\u57FA\u4E8E DOM \u6216 URL \u7684\u9A8C\u8BC1\u7801\u68C0\u6D4B\u3002\n *\n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector]\n * @param {string} [options.urlPattern]\n * @param {() => Promise<void>} options.onDetected\n */\nexport function useCaptchaMonitor(page, options) {\n const { domSelector, urlPattern, onDetected } = options;\n\n if (!domSelector && !urlPattern) {\n throw new Error('[CaptchaMonitor] \u5FC5\u987B\u63D0\u4F9B domSelector \u6216 urlPattern\u3002');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u51FD\u6570\u3002');\n }\n\n let isStopped = false;\n let isHandling = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isStopped || isHandling) return;\n isHandling = true;\n try {\n await onDetected();\n } finally {\n isHandling = false;\n }\n };\n\n const cleanupFns = [];\n\n if (domSelector) {\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u9875\u9762\u751F\u547D\u5468\u671F\u8FB9\u754C\u5BFC\u81F4\u7684\u91CD\u590D\u66B4\u9732\u9519\u8BEF\u3002\n });\n\n page.addInitScript(({ selector, callbackName, cleanerName: cleanupName }) => {\n (() => {\n /** @type {MutationObserver | null} */\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (!element) {\n return false;\n }\n\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n };\n\n checkAndReport();\n\n observer = new MutationObserver((mutations) => {\n const shouldCheck = mutations.some((mutation) => mutation.addedNodes.length > 0);\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n const mountObserver = () => {\n const target = document.documentElement;\n if (target && observer) {\n observer.observe(target, { childList: true, subtree: true });\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', mountObserver);\n } else {\n mountObserver();\n }\n\n window[cleanupName] = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n };\n })();\n }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });\n\n logger.success('useCaptchaMonitor', `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);\n\n cleanupFns.push(async () => {\n try {\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch {\n // \u5BFC\u822A\u6216\u9875\u9762\u5173\u95ED\u540E\u7684\u6E05\u7406\u9519\u8BEF\u53EF\u4EE5\u5FFD\u7565\u3002\n }\n });\n }\n\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame !== page.mainFrame()) {\n return;\n }\n\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);\n\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n return {\n stop: async () => {\n logger.info('\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isStopped = true;\n },\n };\n}\n\nconst callCaptchaRecognitionApi = async (imageBase64, { apiUrl, apiType, token }) => {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: apiType,\n image: imageBase64,\n token,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Captcha API request failed with status ${response.status}`);\n }\n\n return await response.json();\n};\n\nconst extractCaptchaSerialNumbers = (apiResponse) => {\n const serialNumbers = apiResponse?.data?.data?.serial_number;\n if (!Array.isArray(serialNumbers)) {\n return [];\n }\n\n return serialNumbers\n .map((value) => Number(value))\n .filter((value) => Number.isInteger(value) && value >= 0);\n};\n\nconst waitForVisible = async (locator, timeout) => {\n try {\n await locator.waitFor({\n state: 'visible',\n timeout,\n });\n return true;\n } catch {\n return false;\n }\n};\n\nconst isAnyCaptchaTextVisible = async (frame, texts, timeout) => {\n for (const text of texts || []) {\n if (!text) {\n continue;\n }\n\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nconst waitForCaptchaChallengeReady = async (page, frame, options) => {\n const deadline = Date.now() + options.challengeReadyTimeoutMs;\n let refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n let hasSeenLoading = false;\n\n while (Date.now() < deadline) {\n const isLoadingVisible = await isAnyCaptchaTextVisible(\n frame,\n options.loadingTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n const hasErrorTextVisible = await isAnyCaptchaTextVisible(\n frame,\n options.errorTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n\n hasSeenLoading = hasSeenLoading || isLoadingVisible;\n\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const hasVisibleSourceImage = imageCount > 0\n ? await sourceImages.first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false)\n : false;\n\n if (!isLoadingVisible && hasVisibleSourceImage) {\n logger.info(hasSeenLoading ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002' : '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002');\n return;\n }\n\n if (hasErrorTextVisible) {\n logger.warn('\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002');\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n if (!hasVisibleSourceImage && Date.now() >= refreshDeadline) {\n logger.warn(`\u9A8C\u8BC1\u7801\u56FE\u7247\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51FA\u73B0\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n await page.waitForTimeout(options.challengeReadyPollMs);\n }\n\n throw new Error('Captcha challenge is still loading and did not become ready in time.');\n};\n\nconst resolveContentFrame = async (page, iframeLocator, options) => {\n for (let attempt = 1; attempt <= options.contentFrameResolveRetries; attempt++) {\n const iframeHandle = await iframeLocator.elementHandle();\n const frame = await iframeHandle?.contentFrame();\n if (frame) {\n return frame;\n }\n\n if (attempt < options.contentFrameResolveRetries) {\n await page.waitForTimeout(options.contentFrameResolveDelayMs);\n }\n }\n\n return null;\n};\n\nconst getVerifycenterCaptchaContext = async (page, options) => {\n const captchaContainer = page.locator(options.containerSelector).first();\n const isContainerVisible = await waitForVisible(\n captchaContainer,\n options.containerVisibleTimeoutMs,\n );\n\n if (!isContainerVisible) {\n return null;\n }\n\n logger.info('\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002');\n\n let iframeLocator = page.locator(options.iframeSelector).first();\n let isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeVisibleTimeoutMs,\n );\n\n if (!isIframeVisible) {\n logger.warn('\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002');\n iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();\n isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeFallbackVisibleTimeoutMs,\n );\n }\n\n if (!isIframeVisible) {\n throw new Error('verifycenter iframe not found inside captcha container.');\n }\n\n logger.info('\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002');\n const frame = await resolveContentFrame(page, iframeLocator, options);\n if (!frame) {\n throw new Error('Failed to resolve verifycenter iframe content frame.');\n }\n\n return { iframeLocator, frame };\n};\n\nconst clickCaptchaAction = async (frame, texts, options) => {\n for (const text of texts) {\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (!isVisible) {\n continue;\n }\n\n await candidate.click();\n return true;\n }\n }\n\n return false;\n};\n\nconst findCaptchaDropTarget = async (frame, options) => {\n for (const text of options.dropTargetTexts) {\n const candidates = [\n frame.locator(options.dropTargetContainerSelector).filter({ hasText: text }).first(),\n frame.getByText(text, { exact: false }).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (isVisible) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst dragCaptchaWithMouse = async (page, sourceLocator, targetLocator) => {\n const sourceBox = await sourceLocator.boundingBox();\n const targetBox = await targetLocator.boundingBox();\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve captcha drag coordinates.');\n }\n\n const startX = sourceBox.x + sourceBox.width / 2;\n const startY = sourceBox.y + sourceBox.height / 2;\n const endX = targetBox.x + targetBox.width / 2;\n const endY = targetBox.y + targetBox.height / 2;\n const steps = 10;\n const liftOffsetX = Math.min(18, Math.max(8, sourceBox.width * 0.12));\n const liftOffsetY = Math.min(12, Math.max(4, sourceBox.height * 0.08));\n\n await page.mouse.move(startX, startY, { steps: 8 });\n await page.waitForTimeout(250);\n await page.mouse.down();\n await page.waitForTimeout(350);\n\n await page.mouse.move(startX + liftOffsetX, startY + liftOffsetY, { steps: 6 });\n await page.waitForTimeout(250);\n\n for (let step = 1; step <= steps; step++) {\n const progress = step / steps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n const currentX = startX + liftOffsetX + ((endX - startX - liftOffsetX) * easedProgress);\n const currentY = startY + liftOffsetY + ((endY - startY - liftOffsetY) * easedProgress);\n await page.mouse.move(currentX, currentY, { steps: 2 });\n await page.waitForTimeout(90);\n }\n\n await page.waitForTimeout(100);\n await page.mouse.up();\n await page.waitForTimeout(100);\n};\n\nconst refreshCaptcha = async (page, frame, options) => {\n const clicked = await clickCaptchaAction(frame, options.refreshTexts, options).catch(() => false);\n if (!clicked) {\n logger.warn('Refresh button not found.');\n return false;\n }\n\n await page.waitForTimeout(options.refreshWaitMs);\n return true;\n};\n\n/**\n * \u901A\u8FC7\u622A\u56FE\u5E76\u8C03\u7528\u5916\u90E8\u8BC6\u522B\u63A5\u53E3\uFF0C\u81EA\u52A8\u5904\u7406\u5B57\u8282\u7CFB verifycenter \u9A8C\u8BC1\u7801\u3002\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {string} [options.token]\n * @param {number} [options.maxRetries]\n * @param {string} [options.apiUrl]\n * @param {string} [options.apiType]\n * @returns {Promise<boolean>}\n */\nexport async function solveBytedanceCaptcha(page, options = {}) {\n const config = {\n ...DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS,\n ...options,\n };\n\n if (!config.token) {\n logger.warn('\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002');\n return false;\n }\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt++) {\n logger.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);\n\n try {\n const captchaContext = await getVerifycenterCaptchaContext(page, config);\n if (!captchaContext) {\n logger.info('Captcha container is not visible anymore.');\n return true;\n }\n\n const { iframeLocator, frame } = captchaContext;\n await waitForCaptchaChallengeReady(page, frame, config);\n await page.waitForTimeout(config.recognitionDelayMs);\n\n const screenshotBuffer = await iframeLocator.screenshot();\n const apiResponse = await callCaptchaRecognitionApi(\n screenshotBuffer.toString('base64'),\n config,\n );\n const serialNumbers = extractCaptchaSerialNumbers(apiResponse);\n\n if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {\n logger.warn(\n `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || 'unknown'}`,\n );\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(', ')}`);\n\n const dropTarget = await findCaptchaDropTarget(frame, config);\n if (!dropTarget) {\n logger.warn('\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002');\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n const sourceImages = frame.locator(config.sourceImageSelector);\n const imageCount = await sourceImages.count();\n\n for (const rawIndex of serialNumbers) {\n let imageIndex = rawIndex;\n if (imageIndex >= imageCount && imageIndex > 0 && imageIndex - 1 < imageCount) {\n imageIndex -= 1;\n }\n\n if (imageIndex < 0 || imageIndex >= imageCount) {\n throw new Error(`Captcha image index ${rawIndex} is out of range. count=${imageCount}`);\n }\n\n const sourceImage = sourceImages.nth(imageIndex);\n await sourceImage.waitFor({\n state: 'visible',\n timeout: config.sourceImageVisibleTimeoutMs,\n });\n await dragCaptchaWithMouse(page, sourceImage, dropTarget);\n }\n\n const submitted = await clickCaptchaAction(frame, config.submitTexts, config).catch(() => false);\n if (!submitted) {\n logger.warn('\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002');\n }\n\n await page.waitForTimeout(config.submitWaitMs);\n\n const stillVisible = await iframeLocator\n .isVisible({ timeout: config.containerVisibleTimeoutMs })\n .catch(() => false);\n\n if (!stillVisible) {\n logger.info('\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002');\n return true;\n }\n\n logger.warn('\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002');\n await page.waitForTimeout(2000)\n await refreshCaptcha(page, frame, config);\n } catch (error) {\n logger.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);\n }\n\n if (attempt < config.maxRetries) {\n await page.waitForTimeout(config.retryDelayBaseMs + (attempt * config.retryDelayStepMs));\n }\n }\n\n logger.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);\n return false;\n}\n\nexport const Captcha = {\n useCaptchaMonitor,\n solveBytedanceCaptcha,\n};\n\n \n", "import { createHash } from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Mutation');\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\n/**\n * \u751F\u6210\u552F\u4E00\u7684 key \u540D\u79F0\uFF0C\u907F\u514D\u51B2\u7A81\n * @returns {string}\n */\nfunction generateKey(prefix) {\n return `__${prefix}_${uuidv4().replace(/-/g, '_')}`;\n}\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n /**\n * \u7B49\u5F85 DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u65E0\u53D8\u5316\uFF09\n * \u4F7F\u7528 MutationObserver \u76D1\u63A7\u6307\u5B9A\u5143\u7D20\uFF0C\u5F53\u5143\u7D20\u6301\u7EED\u4E00\u6BB5\u65F6\u95F4\u65E0\u53D8\u5316\u65F6 resolve\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 30000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 5000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 120000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => any\n * \u8FD4\u56DE null/undefined: \u6B63\u5E38\u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\n * \u8FD4\u56DE\u5176\u4ED6\u503C: \u6682\u505C\u7A33\u5B9A\u8BA1\u65F6\uFF08timeout \u4ECD\u7136\u751F\u6548\uFF09\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStable(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const initialTimeout = options.initialTimeout ?? 30 * 1000;\n const stableTime = options.stableTime ?? 5 * 1000;\n const timeout = options.timeout ?? 120 * 1000;\n const onMutation = options.onMutation;\n\n logger.start('waitForStable', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);\n\n if (initialTimeout > 0) {\n const selectorQuery = selectorList.join(',');\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n // \u751F\u6210\u552F\u4E00\u7684\u56DE\u8C03\u540D\n const callbackName = generateKey('pk_mut_cb');\n\n // \u5982\u679C\u6709 onMutation \u56DE\u8C03\uFF0C\u66B4\u9732\u51FD\u6570\u5E76\u8FD4\u56DE\u7ED3\u679C\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, async (context) => {\n try {\n const result = await onMutation(context);\n const paused = !(result === null || result === undefined);\n // \u8FD4\u56DE null/undefined \u8868\u793A\u6B63\u5E38\u8BA1\u65F6\uFF0C\u5176\u4ED6\u503C\u8868\u793A\u6682\u505C\n return paused ? '__PAUSE__' : '__CONTINUE__';\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u9ED8\u8BA4\u7EE7\u7EED\u8BA1\u65F6\n return '__CONTINUE__';\n }\n });\n logger.info('waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03');\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n const result = await page.evaluate(\n async ({ selectorList, stableTime, timeout, callbackName, hasCallback }) => {\n return new Promise((resolve, reject) => {\n let mutationCount = 0;\n let stableTimer = null;\n let timeoutTimer = null;\n let isPaused = false;\n let wasPaused = false;\n const observers = [];\n\n // \u6E05\u7406\u51FD\u6570\n const cleanup = () => {\n observers.forEach(obs => obs.disconnect());\n if (stableTimer) clearTimeout(stableTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n };\n\n // \u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\u5668\n const resetStableTimer = () => {\n if (stableTimer) clearTimeout(stableTimer);\n if (isPaused) return;\n stableTimer = setTimeout(() => {\n cleanup();\n resolve({ mutationCount, stableTime, wasPaused });\n }, stableTime);\n };\n\n const setPaused = (nextPaused) => {\n if (isPaused === nextPaused) return;\n isPaused = nextPaused;\n if (isPaused) {\n if (stableTimer) clearTimeout(stableTimer);\n stableTimer = null;\n wasPaused = true;\n return;\n }\n resetStableTimer();\n };\n\n // \u6574\u4F53\u8D85\u65F6\uFF08\u59CB\u7EC8\u751F\u6548\uFF0C\u4E0D\u53D7\u6682\u505C\u5F71\u54CD\uFF09\n timeoutTimer = setTimeout(() => {\n cleanup();\n reject(new Error(`waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`));\n }, timeout);\n\n // \u4E3A\u6BCF\u4E2A\u9009\u62E9\u5668\u521B\u5EFA MutationObserver\n selectorList.forEach(selector => {\n const elements = document.querySelectorAll(selector);\n elements.forEach(element => {\n const observer = new MutationObserver(async (mutations) => {\n mutationCount += mutations.length;\n\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u5143\u7D20\u5185\u5BB9\n const html = element.outerHTML || '';\n const text = element.innerText || element.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount,\n html,\n text,\n mutationNodes\n });\n\n const shouldPause = signal === '__PAUSE__';\n setPaused(shouldPause);\n if (!shouldPause) {\n resetStableTimer();\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\u8BA1\u65F6\n setPaused(false);\n resetStableTimer();\n }\n } else {\n // \u6CA1\u6709\u56DE\u8C03\uFF0C\u4FDD\u6301\u539F\u6709\u884C\u4E3A\n resetStableTimer();\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true\n });\n\n observers.push(observer);\n });\n });\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4EFB\u4F55\u5143\u7D20\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (observers.length === 0) {\n cleanup();\n resolve({ mutationCount: 0, stableTime: 0, wasPaused: false });\n return;\n }\n\n // \u521D\u59CB\u68C0\u67E5\uFF1A\u6302\u8F7D\u540E\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u56DE\u8C03\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u6682\u505C\n const runInitialCheck = async () => {\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u76D1\u63A7\u5143\u7D20\u7684\u5185\u5BB9\n const firstSelector = selectorList[0];\n const firstElement = document.querySelector(firstSelector);\n if (firstElement) {\n const html = firstElement.outerHTML || '';\n const text = firstElement.innerText || firstElement.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount: 0,\n html,\n text,\n mutationNodes\n });\n\n if (signal === '__PAUSE__') {\n setPaused(true);\n return; // \u6682\u505C\u65F6\u4E0D\u542F\u52A8\u521D\u59CB\u8BA1\u65F6\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\n }\n }\n }\n // \u542F\u52A8\u521D\u59CB\u7A33\u5B9A\u8BA1\u65F6\u5668\n resetStableTimer();\n };\n\n runInitialCheck();\n });\n },\n { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }\n );\n\n if (result.mutationCount === 0 && result.stableTime === 0) {\n logger.warning('waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n }\n logger.success('waitForStable', `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return result;\n },\n /**\n * \u7B49\u5F85\u8DE8 root DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u4E3B\u6587\u6863 + iframe \u5185\u5BB9\uFF09\n * \u901A\u8FC7\u8F6E\u8BE2\u5FEB\u7167\u68C0\u6D4B\u53D8\u5316\uFF0C\u9002\u914D iframe / shadow \u573A\u666F\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\uFF08\u5EFA\u8BAE\u4F20 iframe \u9009\u62E9\u5668\uFF09\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u7B7E\u540D\u4E0E waitForStable \u4FDD\u6301\u4E00\u81F4\uFF09\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 60000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 10000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 180000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStableAcrossRoots(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const selectorQuery = selectorList.join(',');\n const initialTimeout = options.initialTimeout ?? 60 * 1000;\n const waitForStableTime = options.stableTime ?? 10 * 1000;\n const overallTimeout = options.timeout ?? 180 * 1000;\n const onMutation = options.onMutation;\n const pollInterval = 500;\n\n const sleep = (ms) => new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n const truncate = (value, max = 800) => {\n const text = String(value || '');\n if (text.length <= max) return text;\n return `${text.slice(0, max)}...`;\n };\n\n const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim();\n const normalizeHtml = (value) => String(value || '').trim();\n const hashSnapshot = (value) => createHash('sha256').update(String(value || '')).digest('hex');\n\n const buildState = async () => {\n const items = [];\n const describeElement = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const tagName = String(node?.tagName || '').toUpperCase();\n return {\n tagName,\n id: String(node?.id || '').trim(),\n name: String(node?.getAttribute?.('name') || '').trim(),\n };\n });\n };\n\n const readElementSnapshot = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const text = String(node?.innerText || node?.textContent || '');\n const html = String(node?.innerHTML || node?.outerHTML || '');\n return {\n text,\n html,\n };\n });\n };\n\n const readFrameSnapshot = async (frame) => {\n return await frame.evaluate(() => {\n const root = document.documentElement || document.body;\n const text = String(root?.innerText || root?.textContent || '');\n const html = String(root?.innerHTML || '');\n return {\n text,\n html,\n url: window.location.href,\n readyState: document.readyState,\n };\n });\n };\n\n for (const selector of selectorList) {\n let handles = [];\n try {\n handles = await page.locator(selector).elementHandles();\n } catch {\n continue;\n }\n\n for (let index = 0; index < handles.length; index += 1) {\n const handle = handles[index];\n try {\n const descriptor = await describeElement(handle);\n const tagName = descriptor?.tagName || '';\n const isFrameElement = tagName === 'IFRAME' || tagName === 'FRAME';\n const nodeName = descriptor?.id || descriptor?.name || 'no-id';\n let source = 'main';\n let path = `${selector}[${index}]`;\n let text = '';\n let html = '';\n let frameUrl = '';\n let readyState = '';\n\n if (isFrameElement) {\n source = 'iframe';\n path = `${selector}[${index}]::iframe(${nodeName})`;\n\n const frame = await handle.contentFrame();\n if (frame) {\n try {\n const frameSnapshot = await readFrameSnapshot(frame);\n text = normalizeText(frameSnapshot?.text || '');\n html = normalizeHtml(frameSnapshot?.html || '');\n frameUrl = String(frameSnapshot?.url || '').trim();\n readyState = String(frameSnapshot?.readyState || '').trim();\n } catch (error) {\n source = 'iframe-unreadable';\n readyState = error?.name || 'unreadable';\n }\n } else {\n source = 'iframe-detached';\n }\n } else {\n try {\n const elementSnapshot = await readElementSnapshot(handle);\n text = normalizeText(elementSnapshot?.text || '');\n html = normalizeHtml(elementSnapshot?.html || '');\n } catch (error) {\n source = 'main-unreadable';\n readyState = error?.name || 'unreadable';\n }\n }\n\n const snapshot = text;\n items.push({\n selector,\n source,\n path,\n text,\n html,\n frameUrl,\n readyState,\n snapshot,\n });\n } finally {\n await handle.dispose().catch(() => { });\n }\n }\n }\n\n const serializedSnapshot = items\n .map((item) => JSON.stringify({\n path: item.path,\n source: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n snapshot: item.snapshot,\n }))\n .join('||');\n const summaryText = items.map((item) => item.text).join('\\n').trim();\n const summaryHtml = items.map((item) => item.html).join('\\n');\n const hasMatched = items.length > 0;\n const primary = items.length > 0 ? items[items.length - 1] : null;\n\n return {\n hasMatched,\n snapshotKey: hashSnapshot(serializedSnapshot),\n text: summaryText,\n html: summaryHtml,\n snapshotLength: serializedSnapshot.length,\n itemCount: items.length,\n primaryPath: primary?.path || '',\n mutationNodes: items.map((item) => ({\n html: item.html,\n text: item.text,\n mutationType: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n })),\n };\n };\n\n const invokeMutationCallback = async (context) => {\n if (!onMutation) return '__CONTINUE__';\n try {\n const result = await onMutation(context);\n return (result === null || result === undefined) ? '__CONTINUE__' : '__PAUSE__';\n } catch {\n return '__CONTINUE__';\n }\n };\n\n logger.start(\n 'waitForStableAcrossRoots',\n `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`\n );\n\n if (initialTimeout > 0) {\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n let state = await buildState();\n if (!state?.hasMatched) {\n logger.warning('waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n return { mutationCount: 0, stableTime: 0, wasPaused: false };\n }\n\n let mutationCount = 0;\n let stableSince = 0;\n let isPaused = false;\n let wasPaused = false;\n let lastSnapshotKey = state.snapshotKey;\n\n const applyPauseSignal = (signal) => {\n const nextPaused = signal === '__PAUSE__';\n if (nextPaused) {\n if (!isPaused) wasPaused = true;\n isPaused = true;\n stableSince = 0;\n return;\n }\n\n isPaused = false;\n stableSince = Date.now();\n };\n\n const initialSignal = await invokeMutationCallback({\n mutationCount: 0,\n html: state.html || '',\n text: state.text || '',\n mutationNodes: state.mutationNodes || [],\n });\n applyPauseSignal(initialSignal);\n\n const deadline = Date.now() + overallTimeout;\n let lastState = state;\n\n while (Date.now() < deadline) {\n await sleep(pollInterval);\n lastState = await buildState();\n\n if (!lastState?.hasMatched) {\n continue;\n }\n\n if (lastState.snapshotKey !== lastSnapshotKey) {\n lastSnapshotKey = lastState.snapshotKey;\n mutationCount += 1;\n\n logger.info(\n `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || 'unknown'}, preview=\"${truncate(lastState.text, 120)}\"`\n );\n\n const signal = await invokeMutationCallback({\n mutationCount,\n html: lastState.html || '',\n text: lastState.text || '',\n mutationNodes: lastState.mutationNodes || [],\n });\n applyPauseSignal(signal);\n continue;\n }\n\n if (!isPaused && stableSince > 0 && (Date.now() - stableSince) >= waitForStableTime) {\n logger.success('waitForStableAcrossRoots', `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return {\n mutationCount,\n stableTime: waitForStableTime,\n wasPaused,\n };\n }\n }\n\n throw new Error(`waitForStableAcrossRoots \u8D85\u65F6 (${overallTimeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`);\n },\n\n /**\n * \u521B\u5EFA\u4E00\u4E2A\u6301\u7EED\u76D1\u63A7 DOM \u53D8\u5316\u7684\u76D1\u63A7\u5668\uFF08\u9ED8\u8BA4\u4EC5\u76D1\u542C\u65B0\u589E DOM\uFF09\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u652F\u6301 'document.documentElement'\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => void\n * \u6240\u6709\u6A21\u5F0F\u90FD\u8FD4\u56DE\u672C\u6B21\u5168\u90E8\u53D8\u5316\u8282\u70B9\u5FEB\u7167 mutationNodes\n * @param {'added' | 'changed' | 'all'} [options.mode='added'] - \u76D1\u63A7\u6A21\u5F0F\n * @returns {Promise<{ stop: () => Promise<{ totalMutations: number }> }>} - \u8FD4\u56DE\u505C\u6B62\u51FD\u6570\n */\n async useMonitor(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const onMutation = options.onMutation;\n const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();\n const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode)\n ? rawMode\n : MUTATION_MONITOR_MODE.Added;\n\n logger.start('useMonitor', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);\n\n const monitorKey = generateKey('pk_mon');\n const callbackName = generateKey('pk_mon_cb');\n const cleanerName = generateKey('pk_mon_clean');\n\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, (payload) => {\n try {\n onMutation(payload);\n } catch (e) {\n // \u5FFD\u7565\u56DE\u8C03\u9519\u8BEF\n }\n });\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n await page.evaluate(({ selectorList, monitorKey, callbackName, cleanerName, hasCallback, mode }) => {\n const monitor = {\n observers: [],\n totalMutations: 0,\n running: true,\n };\n\n const resolveTargets = (selector) => {\n const key = String(selector || '').trim();\n if (!key) return [];\n\n if (key === 'document.documentElement' || key === 'documentElement' || key === 'document') {\n return document.documentElement ? [document.documentElement] : [];\n }\n\n if (key === 'document.body') {\n return document.body ? [document.body] : [];\n }\n\n return Array.from(document.querySelectorAll(key));\n };\n\n const serializeNode = (node, mutationType = 'unknown') => {\n if (!node) {\n return { html: '', text: '', mutationType };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n return {\n html: node.outerHTML || '',\n text: node.innerText || node.textContent || '',\n mutationType,\n };\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n }\n\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const nodes = Array.from(node.childNodes || []);\n const html = nodes\n .map(item => item?.nodeType === Node.ELEMENT_NODE ? (item.outerHTML || '') : (item?.textContent || ''))\n .join('\\n');\n const text = node.textContent || '';\n return { html: html || text, text, mutationType };\n }\n\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n };\n\n const collectMutationNodes = (mutations) => {\n const mutationNodes = [];\n\n for (const mutation of mutations) {\n if (mode === 'added') {\n if (mutation.type !== 'childList') continue;\n const added = Array.from(mutation.addedNodes || []);\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n continue;\n }\n\n if (mode === 'changed') {\n if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n }\n continue;\n }\n\n if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n } else if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else {\n mutationNodes.push(serializeNode(mutation.target, mutation.type || 'unknown'));\n }\n }\n\n return mutationNodes;\n };\n\n selectorList.forEach(selector => {\n const elements = resolveTargets(selector);\n elements.forEach(element => {\n const observer = new MutationObserver((mutations) => {\n if (!monitor.running) return;\n\n const mutationNodes = collectMutationNodes(mutations);\n if (mutationNodes.length <= 0) return;\n\n monitor.totalMutations += mutationNodes.length;\n\n if (hasCallback && window[callbackName]) {\n const html = mutationNodes.map(item => item.html || '').join('\\n');\n const text = mutationNodes.map(item => item.text || '').join('\\n');\n\n window[callbackName]({\n mutationCount: monitor.totalMutations,\n html,\n text,\n mutationNodes,\n });\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: mode !== 'added',\n attributes: mode !== 'added',\n });\n\n monitor.observers.push(observer);\n });\n });\n\n window[monitorKey] = monitor;\n window[cleanerName] = () => {\n monitor.running = false;\n monitor.observers.forEach(obs => obs.disconnect());\n const total = monitor.totalMutations;\n delete window[monitorKey];\n delete window[cleanerName];\n return total;\n };\n }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });\n\n logger.success('useMonitor', '\u76D1\u63A7\u5668\u5DF2\u542F\u52A8');\n\n return {\n stop: async () => {\n let totalMutations = 0;\n try {\n totalMutations = await page.evaluate((cleanerName) => {\n if (window[cleanerName]) {\n return window[cleanerName]();\n }\n return 0;\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\uFF0C\u5FFD\u7565\n }\n logger.success('useMonitor.stop', `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);\n return { totalMutations };\n }\n };\n }\n};\n", "export const Display = {\n parseTokenDisplayName(value) {\n if (!value) {\n return { owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const owner = (parts[0] || '').trim();\n const envType = (parts[1] || '').trim();\n const note = parts.length > 2 ? parts.slice(2).join(':').trim() : '';\n return { owner, envType, note };\n },\n\n parseEnvDisplayName(value) {\n if (!value) {\n return { env: '', owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const env = (parts[0] || '').trim();\n const owner = (parts[1] || '').trim();\n const envType = (parts[2] || '').trim();\n const note = parts.length > 3 ? parts.slice(3).join(':').trim() : '';\n return { env, owner, envType, note };\n },\n\n buildTokenDisplayName({ owner, envType, note } = {}) {\n const trimmedOwner = owner?.trim() || '';\n const trimmedType = envType?.trim() || '';\n const trimmedNote = note?.trim() || '';\n const parts = [trimmedOwner, trimmedType];\n if (trimmedNote) {\n parts.push(trimmedNote);\n }\n return parts.filter(Boolean).join(':');\n },\n\n shortId(value, max = 8) {\n const clean = String(value || '').trim();\n if (!clean) return '';\n if (clean.length <= max) return clean;\n return clean.slice(0, max);\n },\n\n resolveTokenIdentity(displayName, tokenId) {\n const cleanName = String(displayName || '').trim();\n const cleanId = String(tokenId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = cleanName !== '' && cleanName !== cleanId;\n const primary = hasName ? cleanName : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, fullId: cleanId, shortId: short };\n },\n\n resolveEnvIdentity(displayName, envId) {\n const parts = this.parseEnvDisplayName(displayName);\n const cleanId = String(envId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = parts.env !== '' && parts.env !== cleanId;\n const primary = hasName ? parts.env : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, parts, fullId: cleanId, shortId: short };\n },\n};\n", "import { createBaseLogger, setDefaultLogger } from './internals/logger.js';\n\nexport const stripAnsi = (input) => {\n if (!input) return '';\n return String(input).replace(/\\x1b\\[[0-9;]*m/g, '');\n};\n\n// =============================================================================\n// Log Templates & Definitions\n// =============================================================================\n\nconst STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst STEP_EMOJIS = [\n { match: '\u4EFB\u52A1', emoji: '\uD83E\uDDED' },\n { match: '\u8FD0\u884C\u6A21\u5F0F', emoji: '\uD83E\uDDE9' },\n { match: '\u6A21\u677F\u8BC6\u522B', emoji: '\uD83E\uDDF1' },\n { match: '\u767B\u5F55', emoji: '\uD83D\uDD10' },\n { match: '\u73AF\u5883', emoji: '\uD83E\uDDEA' },\n { match: '\u8F93\u5165', emoji: '\u2328\uFE0F' },\n { match: '\u53D1\u9001', emoji: '\uD83D\uDCE4' },\n { match: '\u54CD\u5E94\u76D1\u542C', emoji: '\uD83D\uDCE1' },\n { match: '\u7B49\u5F85\u54CD\u5E94', emoji: '\u23F3' },\n { match: '\u6D41\u5F0F', emoji: '\uD83E\uDDF5' },\n { match: '\u5F15\u7528', emoji: '\uD83D\uDCCE' },\n { match: '\u622A\u56FE', emoji: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB\u94FE\u63A5', emoji: '\uD83D\uDD17' },\n { match: '\u6570\u636E\u63A8\u9001', emoji: '\uD83D\uDCE6' },\n { match: '\u5F39\u7A97', emoji: '\uD83E\uDE9F' },\n];\nconst STATUS_EMOJIS = [\n { match: '\u5F00\u59CB', emoji: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', emoji: '\u2705' },\n { match: '\u6210\u529F', emoji: '\u2705' },\n { match: '\u5931\u8D25', emoji: '\u274C' },\n { match: '\u8DF3\u8FC7', emoji: '\u23ED\uFE0F' },\n { match: '\u8D85\u65F6', emoji: '\u23F1\uFE0F' },\n { match: '\u91CD\u8BD5', emoji: '\uD83D\uDD01' },\n { match: '\u7ED3\u675F', emoji: '\uD83C\uDFC1' },\n { match: '\u5DF2\u914D\u7F6E', emoji: '\uD83E\uDDF7' },\n { match: '\u5DF2\u68C0\u6D4B', emoji: '\uD83D\uDD0E' },\n];\n\nconst toErrorMessage = (error) => {\n if (!error) return '';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst decorateLabel = (label, mappings) => {\n if (!label) return '';\n const mapping = mappings.find((item) => label.includes(item.match));\n if (!mapping) return label;\n return `${mapping.emoji} ${label}`;\n};\n\nconst normalizeSnippet = (snippet, maxLen = 120) => {\n if (!snippet) return '';\n const text = String(snippet).replace(/\\s+/g, ' ').trim();\n if (!text) return '';\n const cleaned = text.replace(/\"/g, \"'\");\n if (cleaned.length <= maxLen) return cleaned;\n return `${cleaned.slice(0, maxLen)}...`;\n};\n\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\n\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `\u6B65\u9AA4: .*${escapeRegExp(step)}`;\n if (status) {\n pattern += `.*${escapeRegExp(status)}`;\n }\n return new RegExp(pattern);\n};\n\nconst buildDefinitionPatterns = (definition) => {\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n if (Array.isArray(definition.extraPatterns)) {\n patterns.push(...definition.extraPatterns);\n }\n return patterns;\n};\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\n\nconst LOG_DEFINITIONS = [\n {\n key: 'task_start',\n method: 'taskStart',\n label: '\u4EFB\u52A1\u5F00\u59CB',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (url) => [url ? `url=${url}` : ''],\n },\n {\n key: 'task_success',\n method: 'taskSuccess',\n label: '\u4EFB\u52A1\u5B8C\u6210',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'task_fail',\n method: 'taskFail',\n label: '\u4EFB\u52A1\u5931\u8D25',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (url, err) => [\n url ? `url=${url}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'runtime_headless',\n method: 'runtimeHeadless',\n label: '\u8FD0\u884C\u6A21\u5F0F\u5F3A\u5236\u65E0\u5934',\n group: '\u8FD0\u884C\u6A21\u5F0F',\n step: '\u8FD0\u884C\u6A21\u5F0F',\n status: 'Apify \u73AF\u5883\u5F3A\u5236\u65E0\u5934',\n level: 'warning',\n attention: 'medium',\n },\n {\n key: 'login_inject_success',\n method: 'loginInjectSuccess',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_inject_skip',\n method: 'loginInjectSkip',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_inject_fail',\n method: 'loginInjectFail',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'login_verify_success',\n method: 'loginVerifySuccess',\n label: '\u767B\u5F55\u9A8C\u8BC1\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_verify_skip',\n method: 'loginVerifySkip',\n label: '\u767B\u5F55\u9A8C\u8BC1\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_verify_fail',\n method: 'loginVerifyFail',\n label: '\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'env_check_success',\n method: 'envCheckSuccess',\n label: '\u73AF\u5883\u68C0\u67E5\u6210\u529F',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'env_check_fail',\n method: 'envCheckFail',\n label: '\u73AF\u5883\u68C0\u67E5\u5931\u8D25',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'input_query_start',\n method: 'inputQuery',\n label: '\u8F93\u5165\u67E5\u8BE2\u5F00\u59CB',\n group: '\u8F93\u5165',\n step: '\u8F93\u5165\u67E5\u8BE2',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (query) => [query ? `query=${query}` : ''],\n },\n {\n key: 'send_action',\n method: 'sendAction',\n label: '\u53D1\u9001\u8BF7\u6C42',\n group: '\u53D1\u9001',\n step: '\u53D1\u9001\u8BF7\u6C42',\n status: '\u70B9\u51FB\u53D1\u9001',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'response_listen_start',\n method: 'responseListenStart',\n label: '\u54CD\u5E94\u76D1\u542C\u5F00\u59CB',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label, timeoutSec) => [\n label ? `\u76EE\u6807=${label}` : '',\n timeoutSec ? `timeout=${timeoutSec}s` : ''\n ],\n },\n {\n key: 'response_listen_ready',\n method: 'responseListenReady',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u914D\u7F6E',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u914D\u7F6E',\n level: 'info',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_detected',\n method: 'responseListenDetected',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u68C0\u6D4B',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u68C0\u6D4B',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_timeout',\n method: 'responseListenTimeout',\n label: '\u54CD\u5E94\u76D1\u542C\u8D85\u65F6',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u8D85\u65F6',\n level: 'error',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_listen_end',\n method: 'responseListenEnd',\n label: '\u54CD\u5E94\u76D1\u542C\u7ED3\u675F',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_start',\n method: 'responseWaitStart',\n label: '\u7B49\u5F85\u54CD\u5E94\u5F00\u59CB',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_success',\n method: 'responseWaitSuccess',\n label: '\u7B49\u5F85\u54CD\u5E94\u5B8C\u6210',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_fail',\n method: 'responseWaitFail',\n label: '\u7B49\u5F85\u54CD\u5E94\u5931\u8D25',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_wait_retry',\n method: 'responseWaitRetry',\n label: '\u7B49\u5F85\u54CD\u5E94\u91CD\u8BD5',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (label, attempt) => [\n label ? `\u76EE\u6807=${label}` : '',\n attempt !== undefined ? `\u5C1D\u8BD5=${attempt}` : ''\n ],\n },\n {\n key: 'dom_wait_start',\n method: 'domWaitStart',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5F00\u59CB',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'dom_wait_fail',\n method: 'domWaitFail',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5931\u8D25',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'dom_chunk',\n method: 'domChunk',\n label: 'DOM\u7247\u6BB5',\n group: 'DOM',\n step: 'DOM\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'dom-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet, paused) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : '',\n paused ? 'paused=1' : ''\n ],\n },\n {\n key: 'dom_wait_success',\n method: 'domWaitSuccess',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5B8C\u6210',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (mutationCount, stableTime, wasPaused) => [\n mutationCount !== undefined ? `mutations=${mutationCount}` : '',\n stableTime !== undefined ? `stableTime=${stableTime}ms` : '',\n wasPaused ? 'paused=1' : ''\n ],\n },\n {\n key: 'stream_chunk',\n method: 'streamChunk',\n label: '\u6D41\u5F0F\u7247\u6BB5',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : ''\n ],\n },\n {\n key: 'stream_events_parsed',\n method: 'streamEventsParsed',\n label: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790\u5B8C\u6210',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790',\n status: '\u5B8C\u6210',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-events',\n throttleMs: 4000,\n buildDetails: (count) => [count !== undefined ? `count=${count}` : ''],\n },\n {\n key: 'stream_complete_event',\n method: 'streamCompleteEvent',\n label: '\u6D41\u5F0F\u5B8C\u6210\u4E8B\u4EF6\u6355\u83B7',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6',\n status: '\u5B8C\u6210\u4E8B\u4EF6\u5DF2\u6355\u83B7',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'stream_end',\n method: 'streamEnd',\n label: '\u6D41\u5F0F\u54CD\u5E94\u7ED3\u675F',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u54CD\u5E94',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'reference_expand_start',\n method: 'referenceExpandStart',\n label: '\u5F15\u7528\u5C55\u5F00\u5F00\u59CB',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'reference_expand_fail',\n method: 'referenceExpandFail',\n label: '\u5F15\u7528\u5C55\u5F00\u5931\u8D25',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'screenshot_start',\n method: 'screenshotStart',\n label: '\u622A\u56FE\u5F00\u59CB',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'screenshot_success',\n method: 'screenshotSuccess',\n label: '\u622A\u56FE\u6210\u529F',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'screenshot_fail',\n method: 'screenshotFail',\n label: '\u622A\u56FE\u5931\u8D25',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u94FE\u63A5\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'share_progress',\n method: 'shareProgress',\n label: '\u5206\u4EAB\u94FE\u63A5\u6B65\u9AA4',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6B65\u9AA4',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u6B65\u9AA4=${label}` : ''],\n },\n {\n key: 'share_dom_hit',\n method: 'shareDomHit',\n label: '\u5206\u4EAB\u94FE\u63A5DOM\u547D\u4E2D',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: 'DOM\u547D\u4E2D',\n level: 'info',\n attention: 'low',\n buildDetails: (link, domSnapshot) => [\n link ? `\u94FE\u63A5=${link}` : '',\n domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_source',\n method: 'shareSource',\n label: '\u5206\u4EAB\u94FE\u63A5\u6765\u6E90',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6765\u6E90',\n level: 'info',\n attention: 'low',\n buildDetails: (source, link, domSnapshot) => [\n source ? `\u6765\u6E90=${source}` : '',\n link ? `\u94FE\u63A5=${link}` : '',\n source === 'dom' && domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u94FE\u63A5\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (link) => [link ? `\u94FE\u63A5=${link}` : ''],\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u94FE\u63A5\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_skip',\n method: 'shareSkip',\n label: '\u5206\u4EAB\u94FE\u63A5\u8DF3\u8FC7',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'ai_search_card_detect_attempt',\n method: 'aiSearchCardDetectAttempt',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u5C1D\u8BD5',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u5C1D\u8BD5',\n level: 'info',\n attention: 'low',\n buildDetails: (attempt = 1, maxAttempts = 1, url = '') => [\n `attempt=${attempt}/${maxAttempts}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_detect_success',\n method: 'aiSearchCardDetectSuccess',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (cardType = '', attempts = 1, refreshCount = 0, url = '') => [\n cardType ? `cardType=${cardType}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_empty_result_success',\n method: 'aiSearchCardEmptyResultSuccess',\n label: 'AI Search \u7A7A\u7ED3\u679C\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u7A7A\u7ED3\u679C',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (contentLeftTpls = [], targetTpls = [], url = '', attempts = 0, refreshCount = 0) => [\n Array.isArray(contentLeftTpls) ? `contentLeftTpls=${normalizeSnippet(contentLeftTpls.join(','), 200)}` : '',\n Array.isArray(targetTpls) ? `targetTpls=${normalizeSnippet(targetTpls.join(','), 200)}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'data_push_success',\n method: 'dataPushSuccess',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u8BF4\u660E=${label}` : ''],\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'popup_detected',\n method: 'popupDetected',\n label: '\u5F39\u7A97\u68C0\u6D4B',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u68C0\u6D4B\u5230\u906E\u7F69',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_attempt',\n method: 'popupCloseAttempt',\n label: '\u5F39\u7A97\u5173\u95ED\u5C1D\u8BD5',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5C1D\u8BD5\u5173\u95ED',\n level: 'info',\n attention: 'low',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_success',\n method: 'popupCloseSuccess',\n label: '\u5F39\u7A97\u5173\u95ED\u5B8C\u6210',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'popup_close_fail',\n method: 'popupCloseFail',\n label: '\u5F39\u7A97\u5173\u95ED\u5931\u8D25',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n];\n\nexport const LOG_TEMPLATES = LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const defaultSelected = attentionRank >= DEFAULT_ATTENTION_RANK;\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns: buildDefinitionPatterns(definition),\n defaultSelected,\n };\n});\n\nconst buildStepLine = (step, status, details = []) => {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_EMOJIS) : '';\n const base = decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX;\n parts.push(base.trim());\n if (status) parts.push(decorateLabel(status, STATUS_EMOJIS));\n const detailParts = details.filter(Boolean);\n if (detailParts.length > 0) {\n parts.push(...detailParts);\n }\n return parts.join(STEP_SEPARATOR);\n};\n\nconst createThrottle = () => {\n const lastMap = new Map();\n return (key, intervalMs, fn) => {\n const now = Date.now();\n const last = lastMap.get(key) || 0;\n if (now - last >= intervalMs) {\n lastMap.set(key, now);\n fn();\n }\n };\n};\n\nexport const createTemplateLogger = (baseLogger = createBaseLogger()) => {\n const throttle = createThrottle();\n\n const info = (line) => baseLogger.info(line);\n const success = (line) => baseLogger.success(line);\n const warning = (line) => baseLogger.warning(line);\n const error = (line) => baseLogger.error(line);\n const debug = (line) => baseLogger.debug(line);\n const start = (line) => baseLogger.start(line);\n\n const stepInfo = (step, status, details = []) => info(buildStepLine(step, status, details));\n const stepSuccess = (step, status, details = []) => success(buildStepLine(step, status, details));\n const stepWarn = (step, status, details = []) => warning(buildStepLine(step, status, details));\n const stepError = (step, status, details = []) => error(buildStepLine(step, status, details));\n const stepStart = (step, status, details = []) => start(buildStepLine(step, status, details));\n\n const stepHandlers = {\n info: stepInfo,\n success: stepSuccess,\n warning: stepWarn,\n error: stepError,\n start: stepStart,\n };\n\n const logFromDefinition = (definition, details = []) => {\n const handler = stepHandlers[definition.level] || stepInfo;\n const payload = [...details, buildLogTag(definition.key)];\n const emit = () => handler(definition.step, definition.status, payload);\n if (definition.throttleMs) {\n throttle(definition.throttleKey || definition.key, definition.throttleMs, emit);\n return;\n }\n emit();\n };\n\n const definitionMethods = {};\n LOG_DEFINITIONS.forEach((definition) => {\n if (!definition.method) return;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n logFromDefinition(definition, details);\n };\n });\n\n return {\n step: (step, status, details, level = 'info') => {\n if (level === 'error') return stepError(step, status, details);\n if (level === 'warn' || level === 'warning') return stepWarn(step, status, details);\n if (level === 'start') return stepStart(step, status, details);\n if (level === 'success') return stepSuccess(step, status, details);\n return stepInfo(step, status, details);\n },\n info: (message) => info(message),\n success: (message) => success(message),\n warning: (message) => warning(message),\n warn: (message) => warning(message),\n error: (message) => error(message),\n debug: (message) => debug(message),\n start: (message) => start(message),\n ...definitionMethods,\n };\n};\n\nconst getDefaultBaseLogger = () => createBaseLogger('');\n\nexport const Logger = {\n setLogger: (logger) => setDefaultLogger(logger),\n info: (message) => getDefaultBaseLogger().info(message),\n success: (message) => getDefaultBaseLogger().success(message),\n warning: (message) => getDefaultBaseLogger().warning(message),\n warn: (message) => getDefaultBaseLogger().warning(message),\n error: (message) => getDefaultBaseLogger().error(message),\n debug: (message) => getDefaultBaseLogger().debug(message),\n start: (message) => getDefaultBaseLogger().start(message),\n useTemplate: (logger) => {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger();\n },\n};\n", "import delay from 'delay';\nimport { Utils } from './utils.js';\nimport { Mutation } from './mutation.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\nimport {\n normalizeScreenshotWatermarkify,\n resolveScreenshotWatermarkifyMeta,\n watermarkifyScreenshotBuffer,\n} from './internals/watermarkify.js';\nimport { createInternalLogger } from './internals/logger.js';\nimport { capturePageScreenshot } from './internals/screenshot.js';\nimport { resolveCurrentViewportSize } from './internals/viewport.js';\n\nconst logger = createInternalLogger('Share');\n\nconst DEFAULT_TIMEOUT_MS = 50 * 1000;\nconst DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;\nconst DEFAULT_POLL_INTERVAL_MS = 120;\n\nconst normalizePrefix = (value) => value == null ? undefined : String(value).trim();\n\nconst toSnapshot = (value, maxLen) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toInline = (value, maxLen = 200) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toJsonInline = (value, maxLen = 260) => {\n try {\n return toInline(JSON.stringify(value), maxLen);\n } catch {\n return '[\u4E0D\u53EF\u5E8F\u5217\u5316]';\n }\n};\n\nconst normalizeXurl = (value) => {\n if (!Array.isArray(value)) return [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const raw = String(input || '').trim();\n if (!raw) return [];\n\n return raw\n .split('.')\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const normalized = [];\n\n const apiMatchers = normalizeMatcherList(value[0]);\n if (apiMatchers.length > 0) {\n normalized.push(apiMatchers);\n }\n\n const flattenedPath = [];\n const extraPaths = [];\n\n value.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flattenedPath.push(...segments);\n }\n });\n\n if (flattenedPath.length > 0) {\n normalized.push(flattenedPath);\n }\n\n if (extraPaths.length > 0) {\n normalized.push(...extraPaths);\n }\n\n return normalized;\n};\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n const modeRaw = String(source.mode || 'dom').trim().toLowerCase();\n const mode = modeRaw === 'response' ? 'response' : 'dom';\n\n return {\n mode,\n prefix: normalizePrefix(source.prefix),\n xurl: normalizeXurl(source.xurl),\n };\n};\n\nconst resolveCaptureScreenWatermarkify = (page, optionValue) => {\n if (optionValue === false) {\n return normalizeScreenshotWatermarkify(false);\n }\n\n const runtimeQuery = String(page?.[PageRuntimeStateKey]?.query || '').trim();\n if (optionValue == null || optionValue === true) {\n return normalizeScreenshotWatermarkify(runtimeQuery ? { query: runtimeQuery } : true);\n }\n\n const optionSource = optionValue && typeof optionValue === 'object' ? optionValue : {};\n return normalizeScreenshotWatermarkify({\n ...(runtimeQuery ? { query: runtimeQuery } : {}),\n ...optionSource,\n });\n};\n\nconst getByPathSegments = (source, pathSegments) => {\n if (!Array.isArray(pathSegments) || pathSegments.length === 0) return undefined;\n\n let current = source;\n\n for (const rawSegment of pathSegments) {\n const segment = String(rawSegment || '').trim();\n if (!segment) return undefined;\n if (current == null) return undefined;\n\n if (Array.isArray(current) && /^\\d+$/.test(segment)) {\n current = current[Number(segment)];\n continue;\n }\n\n current = current[segment];\n }\n\n return current;\n};\n\nconst buildShareLink = (prefix, value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw;\n }\n\n const safePrefix = normalizePrefix(prefix);\n if (!safePrefix) return '';\n\n const valueNoSlash = raw.replace(/^\\/+/, '');\n\n if (/[?&=]$/.test(safePrefix)) {\n return `${safePrefix}${valueNoSlash}`;\n }\n\n const prefixNoSlash = safePrefix.replace(/\\/+$/, '');\n return `${prefixNoSlash}/${valueNoSlash}`;\n};\n\nconst parseJsonSafely = (text) => {\n const raw = String(text || '').trim();\n if (!raw) return null;\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst createDomShareMonitor = async (page, options = {}) => {\n const prefix = normalizePrefix(options.prefix);\n const selectors = options.selectors ?? 'html';\n const mode = options.mode ?? Mutation.Mode.All;\n const onMatch = typeof options.onMatch === 'function' ? options.onMatch : null;\n const onTelemetry = typeof options.onTelemetry === 'function' ? options.onTelemetry : null;\n\n let matched = false;\n\n logger.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);\n\n const monitor = await Mutation.useMonitor(page, selectors, {\n mode,\n onMutation: (context = {}) => {\n if (matched) return;\n\n const mutationCount = Number(context.mutationCount || 0);\n const mutationNodes = Array.isArray(context.mutationNodes) ? context.mutationNodes : [];\n const html = String(context.html || '');\n const text = String(context.text || '');\n const rawDom = `${html}\\n${text}`;\n\n if (onTelemetry) {\n onTelemetry({\n mutationCount,\n mutationNodesCount: mutationNodes.length,\n });\n }\n\n if (mutationCount <= 5 || mutationCount % 50 === 0) {\n logger.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);\n }\n\n const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];\n if (!candidate) return;\n\n matched = true;\n logger.success('captureLink.domHit', `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);\n\n if (onMatch) {\n onMatch({\n link: candidate,\n rawDom,\n mutationCount,\n html,\n text,\n mutationNodes,\n });\n }\n },\n });\n\n return {\n stop: async () => {\n const result = await monitor.stop();\n logger.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);\n return result;\n },\n };\n};\n\nexport const Share = {\n /**\n * \u6355\u83B7\u5206\u4EAB\u94FE\u63A5\uFF08\u5355\u6A21\u5F0F\uFF09\n * - mode='dom': \u4EC5 DOM \u76D1\u542C\n * - mode='response': \u4EC5\u63A5\u53E3\u76D1\u542C\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ mode?: 'dom' | 'response', prefix: string, xurl?: Array<string | string[]> }} options.share\n * @param {number} [options.timeoutMs=50000]\n * @param {number} [options.payloadSnapshotMaxLen=500]\n * @param {string | string[]} [options.domSelectors='html']\n * @param {'added' | 'changed' | 'all'} [options.domMode='all']\n * @param {() => Promise<void>} [options.performActions]\n * @returns {Promise<{ link: string | null; payloadText: string; payloadSnapshot: string; source: 'dom' | 'response' | 'none' }>}\n */\n async captureLink(page, options = {}) {\n const share = normalizeShare(options.share);\n const timeoutMs = Math.max(0, Number(options.timeoutMs ?? DEFAULT_TIMEOUT_MS) || 0);\n const payloadSnapshotMaxLen = options.payloadSnapshotMaxLen ?? DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN;\n const domSelectors = options.domSelectors ?? 'html';\n const domMode = options.domMode ?? Mutation.Mode.All;\n const performActions = typeof options.performActions === 'function' ? options.performActions : async () => { };\n\n if (share.prefix === undefined) {\n throw new Error('Share.captureLink requires options.share.prefix');\n }\n\n if (share.mode !== 'dom' && share.mode !== 'response') {\n throw new Error(`Share.captureLink unsupported share.mode: ${share.mode}`);\n }\n\n const apiMatchers = share.mode === 'response' ? (share.xurl[0] || []) : [];\n const fieldPaths = share.mode === 'response' ? share.xurl.slice(1) : [];\n\n if (share.mode === 'response' && apiMatchers.length === 0) {\n throw new Error('Share.captureLink requires share.xurl[0] api matcher when mode=response');\n }\n\n logger.start('captureLink', `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);\n logger.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);\n\n const stats = {\n actionTimedOut: false,\n domMutationCount: 0,\n domMutationNodes: 0,\n responseObserved: 0,\n responseMatched: 0,\n responseResolved: 0,\n lastMatchedUrl: '',\n responseSampleUrls: [],\n };\n\n const candidates = {\n dom: null,\n response: null,\n };\n\n const setCandidate = (source, link, payloadText = '') => {\n const safe = String(link || '').trim();\n if (!safe) return false;\n\n const [validated] = Utils.parseLinks(safe, { prefix: share.prefix }) || [];\n if (!validated) return false;\n\n if (candidates[source]?.link) return false;\n\n candidates[source] = {\n link: validated,\n payloadText: String(payloadText || ''),\n };\n\n logger.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);\n return true;\n };\n\n const resolveResponseCandidate = (responseText) => {\n const rawText = String(responseText || '');\n if (!rawText) return null;\n\n const [direct] = Utils.parseLinks(rawText, { prefix: share.prefix }) || [];\n if (direct) {\n return { link: direct, payloadText: rawText };\n }\n\n if (fieldPaths.length === 0) return null;\n\n const payload = parseJsonSafely(rawText);\n if (!payload || typeof payload !== 'object') return null;\n\n for (const pathSegments of fieldPaths) {\n const value = getByPathSegments(payload, pathSegments);\n if (value == null || value === '') continue;\n\n const composed = buildShareLink(share.prefix, value);\n if (!composed) continue;\n\n const [validated] = Utils.parseLinks(composed, { prefix: share.prefix }) || [];\n if (!validated) continue;\n\n return {\n link: validated,\n payloadText: rawText,\n };\n }\n\n return null;\n };\n\n let domMonitor = null;\n\n const stopDomMonitor = async () => {\n if (!domMonitor) return;\n const monitor = domMonitor;\n domMonitor = null;\n try {\n await monitor.stop();\n } catch (error) {\n logger.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n const onResponse = async (response) => {\n if (share.mode !== 'response') return;\n if (candidates.response?.link) return;\n\n stats.responseObserved += 1;\n\n try {\n const url = String(response.url() || '');\n\n if (url && stats.responseSampleUrls.length < 8 && !stats.responseSampleUrls.includes(url)) {\n stats.responseSampleUrls.push(url);\n }\n\n if (stats.responseObserved <= 5) {\n logger.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);\n }\n\n if (!apiMatchers.some((matcher) => url.includes(matcher))) return;\n\n stats.responseMatched += 1;\n stats.lastMatchedUrl = url;\n logger.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);\n\n const text = await response.text();\n const hit = resolveResponseCandidate(text);\n if (!hit?.link) {\n if (stats.responseMatched <= 3) {\n logger.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);\n }\n return;\n }\n\n stats.responseResolved += 1;\n logger.success('captureLink.responseHit', `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);\n setCandidate('response', hit.link, hit.payloadText);\n } catch (error) {\n logger.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n if (share.mode === 'dom') {\n logger.info('\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C');\n domMonitor = await createDomShareMonitor(page, {\n prefix: share.prefix,\n selectors: domSelectors,\n mode: domMode,\n onTelemetry: ({ mutationCount, mutationNodesCount }) => {\n stats.domMutationCount = mutationCount;\n stats.domMutationNodes = mutationNodesCount;\n },\n onMatch: ({ link, rawDom }) => {\n setCandidate('dom', link, rawDom);\n },\n });\n }\n\n if (share.mode === 'response') {\n logger.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);\n page.on('response', onResponse);\n }\n\n const deadline = Date.now() + timeoutMs;\n const getRemainingMs = () => Math.max(0, deadline - Date.now());\n\n try {\n const actionTimeout = getRemainingMs();\n logger.start('captureLink.performActions', `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);\n\n if (actionTimeout > 0) {\n let timer = null;\n let actionError = null;\n\n const actionPromise = Promise.resolve()\n .then(() => performActions())\n .then(() => '__ACTION_DONE__')\n .catch((error) => {\n actionError = error;\n return '__ACTION_ERROR__';\n });\n\n const timeoutPromise = new Promise((resolve) => {\n timer = setTimeout(() => resolve('__ACTION_TIMEOUT__'), actionTimeout);\n });\n\n const actionResult = await Promise.race([actionPromise, timeoutPromise]);\n if (timer) clearTimeout(timer);\n\n if (actionResult === '__ACTION_ERROR__') {\n logger.fail('captureLink.performActions', actionError);\n throw actionError;\n }\n\n if (actionResult === '__ACTION_TIMEOUT__') {\n stats.actionTimedOut = true;\n logger.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);\n } else {\n logger.success('captureLink.performActions', '\u6267\u884C\u52A8\u4F5C\u5B8C\u6210');\n }\n }\n\n let nextProgressLogTs = Date.now() + 3000;\n\n while (true) {\n const selected = share.mode === 'dom' ? candidates.dom : candidates.response;\n if (selected?.link) {\n logger.success('captureLink', `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);\n return {\n link: selected.link,\n payloadText: selected.payloadText,\n payloadSnapshot: toSnapshot(selected.payloadText, payloadSnapshotMaxLen),\n source: share.mode,\n };\n }\n\n const remaining = getRemainingMs();\n if (remaining <= 0) break;\n\n const now = Date.now();\n if (now >= nextProgressLogTs) {\n logger.info(\n `captureLink \u7B49\u5F85\u4E2D: remaining=${remaining}ms, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`\n );\n nextProgressLogTs = now + 5000;\n }\n\n await delay(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));\n }\n\n if (share.mode === 'response' && stats.responseMatched === 0) {\n logger.warning(\n `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`\n );\n }\n\n logger.warning(\n `captureLink \u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || 'none'}`\n );\n\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: '',\n source: 'none',\n };\n } finally {\n if (share.mode === 'response') {\n page.off('response', onResponse);\n logger.info('response \u76D1\u542C\u5DF2\u5378\u8F7D');\n }\n await stopDomMonitor();\n }\n },\n\n\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\uFF08\u57FA\u7840\u80FD\u529B\uFF09\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {number} [options.buffer]\n * @param {boolean} [options.restore]\n * @param {number} [options.maxHeight]\n * @returns {Promise<string>} base64 png\n */\n async captureScreen(page, options = {}) {\n const originalViewport = await resolveCurrentViewportSize(page);\n const defaultBuffer = Math.round((originalViewport.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n const restore = options.restore ?? false;\n const maxHeight = options.maxHeight ?? 8000;\n const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);\n\n try {\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n\n el.dataset.pkOrigOverflow = el.style.overflow;\n el.dataset.pkOrigHeight = el.style.height;\n el.dataset.pkOrigMaxHeight = el.style.maxHeight;\n el.classList.add('__pk_expanded__');\n\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n const targetHeight = Math.min(maxScrollHeight + buffer, maxHeight);\n\n await page.setViewportSize({\n width: originalViewport.width,\n height: targetHeight,\n });\n\n await delay(1000);\n\n const capturedAt = new Date();\n const rawBuffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'png',\n maxClipHeight: targetHeight,\n });\n\n if (!screenshotWatermarkify.enabled) {\n return rawBuffer.toString('base64');\n }\n\n const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {\n ...screenshotWatermarkify,\n capturedAt,\n });\n const buffer_ = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);\n\n return buffer_.toString('base64');\n } finally {\n if (restore) {\n await page.evaluate(() => {\n document.querySelectorAll('.__pk_expanded__').forEach(el => {\n el.style.overflow = el.dataset.pkOrigOverflow || '';\n el.style.height = el.dataset.pkOrigHeight || '';\n el.style.maxHeight = el.dataset.pkOrigMaxHeight || '';\n\n delete el.dataset.pkOrigOverflow;\n delete el.dataset.pkOrigHeight;\n delete el.dataset.pkOrigMaxHeight;\n el.classList.remove('__pk_expanded__');\n });\n });\n\n await page.setViewportSize(originalViewport);\n }\n }\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 8;\nconst DEFAULT_RESOLVER_TIMEOUT_MS = 180;\nconst DEFAULT_IP_LOOKUP_TIMEOUT_MS = 10000;\nconst DEFAULT_WATERMARK_OPACITY = 0.156;\nconst DEFAULT_WATERMARK_ROTATE_DEG = -16;\nconst DEFAULT_WATERMARK_CELL_WIDTH = 860;\nconst DEFAULT_WATERMARK_CELL_HEIGHT = 330;\nconst DEFAULT_STRIP_LOGO_URL = 'https://static.heartbitai.com/geo/icon/favicon.png';\nconst DEFAULT_IP_LOOKUP_URL = 'https://myip.ipip.net/json';\nconst DEFAULT_LOGO_FETCH_TIMEOUT_MS = 2500;\nconst DEFAULT_STRIP_ONE_LINE_HEIGHT = 78;\nconst DEFAULT_STRIP_WRAPPED_MIN_HEIGHT = 108;\nconst DEFAULT_STRIP_PADDING_LEFT = 22;\nconst DEFAULT_STRIP_PADDING_RIGHT = 28;\nconst DEFAULT_STRIP_GAP = 18;\nconst DEFAULT_STRIP_LABEL_WIDTH = 56;\nconst DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS = 180;\nconst DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH = 320;\nconst DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO = 0.58;\nconst DEFAULT_STRIP_ZONE_GAP = 18;\nconst DEFAULT_STRIP_PROMPT_TRAILING_PADDING = 16;\nconst DEFAULT_STRIP_LABEL_FONT_SIZE = 14.5;\nconst DEFAULT_STRIP_VALUE_FONT_SIZE = 15.5;\nconst DEFAULT_STRIP_VALUE_PADDING = 10;\nconst DEFAULT_STRIP_LABEL_PADDING = 14;\nconst DEFAULT_STRIP_SECTION_GAP = DEFAULT_STRIP_GAP + 16;\nconst DEFAULT_STRIP_LINE_HEIGHT_RATIO = 1.28;\nconst DEFAULT_STRIP_PROMPT_MAX_LINES = 3;\nconst DEFAULT_STRIP_CONTENT_SAFE_PADDING_X = 12;\nconst DEFAULT_STRIP_TEXT_WIDTH_SAFETY = 10;\nconst DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT = 1200;\n\nconst WEAK_LOCATION_VALUES = new Set(['cn', '\u4E2D\u56FD']);\nconst LOCATION_NETWORK_SUFFIX_PATTERNS = [\n /(?:\u4E2D\u56FD)?\u79FB\u52A8$/i,\n /(?:\u4E2D\u56FD)?\u8054\u901A$/i,\n /(?:\u4E2D\u56FD)?\u7535\u4FE1$/i,\n /\u94C1\u901A$/i,\n /\u6559\u80B2\u7F51$/i,\n /\u5E7F\u7535$/i,\n /\u9E4F\u535A\u58EB$/i,\n /\u963F\u91CC\u4E91$/i,\n /\u817E\u8BAF\u4E91$/i,\n /\u767E\u5EA6\u4E91$/i,\n /\u534E\u4E3A\u4E91$/i,\n /cloudflare$/i,\n /amazon$/i,\n /aws$/i,\n /azure$/i,\n /google$/i,\n /oracle$/i,\n /linode$/i,\n /vultr$/i,\n /digitalocean$/i,\n];\n\nlet cachedStripLogoSrcPromise = null;\nconst cachedEnrichmentByContext = new WeakMap();\nconst logger = createInternalLogger('Watermarkify');\n\nconst normalizeText = (value) => String(value || '').trim();\n\nconst toInline = (value, maxLen = 200) => {\n const text = normalizeText(value);\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst shortenTail = (value, maxLen = 80) => {\n const text = toInline(value, Math.max(maxLen * 2, maxLen + 8));\n if (!text || text.length <= maxLen) return text;\n return `${text.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;\n};\n\nconst shortenByCharacters = (value, maxChars = 80) => {\n const text = normalizeWhitespace(value);\n if (!text) return '';\n\n const chars = Array.from(text);\n if (chars.length <= maxChars) {\n return text;\n }\n\n return `${chars.slice(0, Math.max(0, maxChars - 1)).join('').trimEnd()}\u2026`;\n};\n\nconst padDatePart = (value) => String(value).padStart(2, '0');\n\nconst formatUtcOffsetLabel = (offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const sign = offsetHours >= 0 ? '+' : '-';\n const absolute = Math.abs(offsetHours);\n const hours = Math.trunc(absolute);\n const minutes = Math.round((absolute - hours) * 60);\n\n if (!minutes) {\n return `UTC${sign}${hours}`;\n }\n\n return `UTC${sign}${hours}:${padDatePart(minutes)}`;\n};\n\nconst formatTimestampForUtcOffset = (date, offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const source = date instanceof Date ? date : new Date(date || Date.now());\n const shifted = new Date(source.getTime() + offsetHours * 60 * 60 * 1000);\n\n return [\n `${shifted.getUTCFullYear()}-${padDatePart(shifted.getUTCMonth() + 1)}-${padDatePart(shifted.getUTCDate())}`,\n `${padDatePart(shifted.getUTCHours())}:${padDatePart(shifted.getUTCMinutes())}:${padDatePart(shifted.getUTCSeconds())}`,\n formatUtcOffsetLabel(offsetHours),\n ].join(' ');\n};\n\nconst normalizeWhitespace = (value) => String(value || '')\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\nconst stripLocationNetworkSuffix = (value) => {\n const parts = normalizeWhitespace(value).split(' ').filter(Boolean);\n if (parts.length <= 1) {\n return normalizeWhitespace(value);\n }\n\n const last = parts[parts.length - 1];\n if (!LOCATION_NETWORK_SUFFIX_PATTERNS.some((pattern) => pattern.test(last))) {\n return parts.join(' ');\n }\n\n return parts.slice(0, -1).join(' ').trim();\n};\n\nconst isWeakLocationValue = (value) => {\n const text = normalizeWhitespace(value).toLowerCase();\n if (!text) return true;\n if (WEAK_LOCATION_VALUES.has(text)) return true;\n return /^[a-z]{2,3}$/i.test(text);\n};\n\nconst pickHeaderValue = async (response, names = []) => {\n if (!response || typeof response.headerValue !== 'function') return '';\n\n for (const name of names) {\n const value = await response.headerValue(name).catch(() => null);\n const text = normalizeText(value);\n if (text) return text;\n }\n\n return '';\n};\n\nconst parseIpIpJsonResponse = (rawText) => {\n const text = normalizeWhitespace(rawText);\n if (!text || (!text.startsWith('{') && !text.startsWith('['))) {\n return null;\n }\n\n try {\n const payload = JSON.parse(text);\n const ip = toInline(payload?.data?.ip || payload?.ip, 80);\n const locationParts = Array.isArray(payload?.data?.location)\n ? payload.data.location.map((item) => normalizeWhitespace(item)).filter(Boolean)\n : [];\n const location = toInline(\n stripLocationNetworkSuffix(locationParts.join(' ')),\n 80,\n );\n\n if (!ip && !location) {\n return null;\n }\n\n return { ip, location };\n } catch {\n return null;\n }\n};\n\nconst fillEnrichment = (target, source) => {\n if (!target || !source || typeof source !== 'object') {\n return target;\n }\n\n if (!target.ip && source.ip) {\n target.ip = toInline(source.ip, 80);\n }\n if (!target.location && source.location) {\n target.location = toInline(source.location, 80);\n }\n\n return target;\n};\n\nconst readCachedEnrichment = (page) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context) {\n return null;\n }\n\n const cached = cachedEnrichmentByContext.get(context);\n return cached && typeof cached === 'object' ? cached : null;\n};\n\nconst writeCachedEnrichment = (page, source) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context || !source || typeof source !== 'object') {\n return;\n }\n\n const current = cachedEnrichmentByContext.get(context) || {};\n const next = {\n ip: toInline(source.ip || current.ip, 80),\n location: toInline(source.location || current.location, 80),\n };\n\n if (!next.ip && !next.location) {\n return;\n }\n\n cachedEnrichmentByContext.set(context, next);\n};\n\nconst getHostname = (url) => {\n try {\n const parsed = new URL(url);\n return parsed.hostname || parsed.host || '\u672C\u5730\u9875\u9762';\n } catch {\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n\n return '\u672C\u5730\u9875\u9762';\n }\n};\n\nconst withTimeout = async (promise, timeoutMs) => {\n const safeTimeoutMs = Math.max(0, Number(timeoutMs) || 0);\n if (!safeTimeoutMs) {\n return promise;\n }\n\n let timer = null;\n try {\n return await Promise.race([\n promise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve(null), safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst fetchAsDataUrl = async (url, timeoutMs = DEFAULT_LOGO_FETCH_TIMEOUT_MS) => {\n if (typeof fetch !== 'function') {\n return '';\n }\n\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n const safeTimeoutMs = Math.max(300, Number(timeoutMs) || DEFAULT_LOGO_FETCH_TIMEOUT_MS);\n const timer = controller\n ? setTimeout(() => controller.abort(), safeTimeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n redirect: 'follow',\n signal: controller?.signal,\n });\n\n if (!response?.ok) {\n return '';\n }\n\n const contentType = normalizeText(response.headers?.get?.('content-type')) || 'image/png';\n if (!/^image\\//i.test(contentType)) {\n return '';\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (!buffer.length) {\n return '';\n }\n\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n } catch {\n return '';\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst resolveStripLogoSrc = async () => {\n if (!cachedStripLogoSrcPromise) {\n cachedStripLogoSrcPromise = (async () => {\n const dataUrl = await fetchAsDataUrl(DEFAULT_STRIP_LOGO_URL);\n return dataUrl || DEFAULT_STRIP_LOGO_URL;\n })();\n }\n\n const resolved = await cachedStripLogoSrcPromise.catch(() => DEFAULT_STRIP_LOGO_URL);\n return normalizeText(resolved) || DEFAULT_STRIP_LOGO_URL;\n};\n\nconst normalizeLayer = (value, defaults) => {\n if (value === false) {\n return {\n ...defaults,\n enabled: false,\n };\n }\n\n if (value && typeof value === 'object') {\n return {\n ...defaults,\n ...value,\n enabled: value.enabled !== false,\n };\n }\n\n return {\n ...defaults,\n enabled: true,\n };\n};\n\nconst resolveWithCustomResolver = async (page, baseMeta, options = {}) => {\n const resolver = typeof options.resolver === 'function'\n ? options.resolver\n : null;\n if (!resolver) {\n return null;\n }\n\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const serverAddr = response && typeof response.serverAddr === 'function'\n ? await response.serverAddr().catch(() => null)\n : null;\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n\n try {\n const resolved = await withTimeout(\n Promise.resolve(resolver({\n page,\n response,\n url: baseMeta.url,\n hostname: baseMeta.hostname,\n title: baseMeta.title,\n prompt: baseMeta.prompt,\n query: baseMeta.query,\n serverAddr,\n signal: controller?.signal,\n })).catch(() => null),\n options.resolverTimeoutMs ?? DEFAULT_RESOLVER_TIMEOUT_MS,\n );\n\n if (!resolved || typeof resolved !== 'object') {\n return null;\n }\n\n const enrichment = {\n ip: toInline(resolved.ip, 80),\n location: toInline(resolved.location, 80),\n };\n if (enrichment.ip || enrichment.location) {\n logger.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || '-'}, loc=${enrichment.location || '-'}`);\n } else {\n logger.warning('\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc');\n }\n\n return enrichment;\n } finally {\n controller?.abort();\n }\n};\n\nconst openProbePage = async (page) => {\n if (!page || typeof page.context !== 'function') {\n return null;\n }\n\n const context = page.context();\n if (!context) {\n return null;\n }\n\n const browser = typeof context.browser === 'function'\n ? context.browser()\n : null;\n\n if (browser && typeof browser.newContext === 'function') {\n const probeContext = await browser.newContext().catch(() => null);\n if (probeContext && typeof probeContext.newPage === 'function') {\n const probePage = await probeContext.newPage().catch(async () => {\n await probeContext.close().catch(() => { });\n return null;\n });\n if (probePage) {\n return {\n page: probePage,\n close: async () => {\n await probeContext.close().catch(() => { });\n },\n };\n }\n } else {\n await probeContext?.close?.().catch(() => { });\n }\n }\n\n if (typeof context.newPage === 'function') {\n try {\n const probePage = await context.newPage();\n return {\n page: probePage,\n close: async () => {\n await probePage.close().catch(() => { });\n },\n };\n } catch {\n // \u67D0\u4E9B\u6258\u7BA1\u4E0A\u4E0B\u6587\u4E0D\u5141\u8BB8\u76F4\u63A5 newPage\uFF0C\u8FD9\u91CC\u8FD4\u56DE null \u8BA9\u4E0A\u5C42\u9000\u5316\u3002\n }\n }\n\n return null;\n};\n\nconst readPngDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 24) {\n return { width: 0, height: 0 };\n }\n\n const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let index = 0; index < pngSignature.length; index += 1) {\n if (buffer[index] !== pngSignature[index]) {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n};\n\nconst readJpegDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 4 || buffer[0] !== 0xff || buffer[1] !== 0xd8) {\n return { width: 0, height: 0 };\n }\n\n let offset = 2;\n while (offset + 9 <= buffer.length) {\n if (buffer[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = buffer[offset + 1];\n offset += 2;\n\n if (marker === 0xd8 || marker === 0xd9) {\n continue;\n }\n\n if (marker === 0xda) {\n break;\n }\n\n if (offset + 2 > buffer.length) {\n break;\n }\n\n const segmentLength = buffer.readUInt16BE(offset);\n if (segmentLength < 2 || offset + segmentLength > buffer.length) {\n break;\n }\n\n const isStartOfFrame = (\n marker >= 0xc0\n && marker <= 0xcf\n && marker !== 0xc4\n && marker !== 0xc8\n && marker !== 0xcc\n );\n\n if (isStartOfFrame && offset + 7 <= buffer.length) {\n return {\n height: buffer.readUInt16BE(offset + 3),\n width: buffer.readUInt16BE(offset + 5),\n };\n }\n\n offset += segmentLength;\n }\n\n return { width: 0, height: 0 };\n};\n\nconst readImageInfo = (buffer) => {\n const png = readPngDimensions(buffer);\n if (png.width && png.height) {\n return {\n mimeType: 'image/png',\n width: png.width,\n height: png.height,\n };\n }\n\n const jpeg = readJpegDimensions(buffer);\n if (jpeg.width && jpeg.height) {\n return {\n mimeType: 'image/jpeg',\n width: jpeg.width,\n height: jpeg.height,\n };\n }\n\n return {\n mimeType: '',\n width: 0,\n height: 0,\n };\n};\n\nconst buildWatermarkifyRenderHtml = ({ imageSrc, overlaySvg, width, height }) => {\n const safeWidth = Math.max(1, Number(width) || 1);\n const safeHeight = Math.max(1, Number(height) || 1);\n\n return `\n <!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <style>\n html, body {\n margin: 0;\n padding: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n background: #ffffff;\n }\n\n body {\n position: relative;\n }\n\n #pk-stage {\n position: relative;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n }\n\n #pk-base-image {\n position: absolute;\n inset: 0;\n display: block;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n }\n\n #pk-overlay {\n position: absolute;\n inset: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n pointer-events: none;\n }\n </style>\n </head>\n <body>\n <div id=\"pk-stage\">\n <img id=\"pk-base-image\" src=\"${escapeHtmlAttribute(imageSrc)}\" alt=\"\" />\n <div id=\"pk-overlay\">${overlaySvg}</div>\n </div>\n </body>\n </html>\n `;\n};\n\nconst composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}) => {\n if (!page || typeof page.context !== 'function') {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page');\n return buffer;\n }\n\n const renderScope = await openProbePage(page);\n if (!renderScope?.page) {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page');\n return buffer;\n }\n\n try {\n const renderPage = renderScope.page;\n const safeWidth = Math.max(1, Number(imageInfo.width) || 1);\n const safeHeight = Math.max(1, Number(imageInfo.height) || 1);\n const viewportHeight = Math.max(\n 1,\n Math.min(safeHeight, DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT),\n );\n\n await renderPage.setViewportSize({\n width: safeWidth,\n height: viewportHeight,\n }).catch(() => { });\n\n await renderPage.setContent(buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n }), {\n waitUntil: 'load',\n });\n\n await renderPage.waitForFunction(() => {\n const image = document.getElementById('pk-base-image');\n return image instanceof HTMLImageElement\n && image.complete\n && image.naturalWidth > 0\n && image.naturalHeight > 0;\n }, {\n timeout: 5000,\n }).catch(() => { });\n\n await renderPage.evaluate(async () => {\n if (document.fonts?.ready) {\n await document.fonts.ready.catch(() => { });\n }\n }).catch(() => { });\n\n const composed = await renderPage.screenshot({\n type: 'png',\n fullPage: true,\n animations: 'disabled',\n }).catch((error) => {\n logger.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (Buffer.isBuffer(composed) && composed.length > 0) {\n return composed;\n }\n\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C');\n return buffer;\n } finally {\n await renderScope.close().catch(() => { });\n }\n};\n\nconst resolveWithIpLookup = async (page, options = {}) => {\n if (!page || typeof page.context !== 'function' || options.ipLookup === false) {\n return null;\n }\n\n const probeScope = await openProbePage(page);\n if (!probeScope?.page) {\n logger.warning('ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page');\n return null;\n }\n\n const timeoutMs = Math.max(\n 300,\n Number(options.ipLookupTimeoutMs) || DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n );\n try {\n const probePage = probeScope.page;\n logger.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);\n\n const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {\n waitUntil: 'commit',\n timeout: timeoutMs,\n }).catch((error) => {\n logger.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n const status = response && typeof response.status === 'function'\n ? response.status()\n : 0;\n const contentType = normalizeText(await pickHeaderValue(response, ['content-type']));\n let rawText = '';\n\n if (response && typeof response.text === 'function') {\n rawText = String(await withTimeout(\n response.text().catch(() => ''),\n timeoutMs,\n ) || '');\n }\n\n if (!rawText) {\n rawText = String(await withTimeout(\n probePage.evaluate(() => {\n return document.body?.innerText\n || document.documentElement?.innerText\n || '';\n }).catch(() => ''),\n Math.min(timeoutMs, 500),\n ) || '');\n }\n\n const parsed = parseIpIpJsonResponse(rawText);\n if (parsed?.ip || parsed?.location) {\n logger.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, ip=${parsed.ip || '-'}, loc=${parsed.location || '-'}`);\n return parsed;\n }\n\n logger.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, preview=${shortenTail(rawText, 120) || '[empty]'}`);\n return null;\n } catch (error) {\n logger.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n } finally {\n await probeScope.close().catch(() => { });\n }\n};\n\nconst resolveEnrichment = async (page, baseMeta, options) => {\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const cached = readCachedEnrichment(page);\n\n const merged = {\n ip: toInline(options.ip, 80),\n location: toInline(options.location, 80),\n };\n\n logger.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || '-'}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);\n\n if (!merged.ip || !merged.location) {\n if (cached?.ip || cached?.location) {\n logger.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || '-'}, loc=${cached.location || '-'}`);\n }\n fillEnrichment(merged, cached);\n }\n\n if (!merged.ip || !merged.location) {\n fillEnrichment(\n merged,\n await resolveWithCustomResolver(page, baseMeta, options),\n );\n }\n\n if ((!merged.ip || !merged.location) && options.ipLookup !== false) {\n fillEnrichment(\n merged,\n await resolveWithIpLookup(page, options),\n );\n }\n\n if (!merged.location || isWeakLocationValue(merged.location)) {\n const headerLocation = toInline(await pickHeaderValue(response, [\n 'cf-ipcountry',\n 'x-vercel-ip-country',\n 'x-country-code',\n 'x-geo-country',\n ]), 80);\n if (!merged.location || (isWeakLocationValue(merged.location) && headerLocation)) {\n logger.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || '-'}`);\n merged.location = headerLocation || merged.location;\n }\n }\n\n writeCachedEnrichment(page, merged);\n if (merged.ip || merged.location) {\n logger.info(`enrichment \u5B8C\u6210: ip=${merged.ip || '-'}, loc=${merged.location || '-'}`);\n } else {\n logger.warning('enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc');\n }\n\n return merged;\n};\n\nconst buildWatermarkStamp = ({ prompt, captureTime, ip, location }) => {\n const parts = [\n `Prompt ${shortenTail(prompt, 40) || '-'}`,\n `Time ${captureTime}`,\n `Loc ${shortenTail(location, 20) || '-'}`,\n `IP ${toInline(ip, 24) || '-'}`,\n ];\n\n return parts.join(' | ');\n};\n\nconst buildStripSegments = ({ prompt, captureTime, ip, location }) => {\n const promptValue = shortenByCharacters(\n normalizeWhitespace(prompt) || '-',\n DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS,\n ) || '-';\n const ipValue = normalizeWhitespace(ip) || '-';\n const locationValue = normalizeWhitespace(location) || '-';\n\n return [\n {\n kind: 'prompt',\n label: 'Prompt',\n value: promptValue,\n rawValue: promptValue,\n },\n {\n kind: 'time',\n label: 'Time',\n value: captureTime,\n rawValue: captureTime,\n },\n {\n kind: 'location',\n label: 'Loc',\n value: locationValue,\n rawValue: locationValue,\n },\n {\n kind: 'ip',\n label: 'IP',\n value: ipValue,\n rawValue: ipValue,\n },\n ];\n};\n\nconst escapeXml = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst escapeHtmlAttribute = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\nconst estimateTextWidth = (value, fontSize = 16) => {\n const text = String(value || '');\n let width = 0;\n\n for (const char of text) {\n if (/\\s/.test(char)) {\n width += fontSize * 0.34;\n } else if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf\\u3040-\\u30ff\\uac00-\\ud7af]/.test(char)) {\n width += fontSize * 0.92;\n } else if (/[A-Z0-9]/.test(char)) {\n width += fontSize * 0.62;\n } else {\n width += fontSize * 0.56;\n }\n }\n\n return Math.ceil(width);\n};\n\nconst resolvePromptFields = (options = {}, fallbackTitle = '') => {\n const query = normalizeText(options.query);\n const prompt = query\n || normalizeText(options.prompt)\n || normalizeText(fallbackTitle)\n || '\u672A\u63D0\u4F9B Prompt';\n\n return {\n prompt,\n query: query || prompt,\n };\n};\n\nconst createBaseWatermarkifyOptions = () => ({\n enabled: true,\n timezoneOffsetHours: DEFAULT_TIMEZONE_OFFSET,\n response: null,\n ip: '',\n location: '',\n prompt: '',\n query: '',\n ipLookup: true,\n ipLookupTimeoutMs: DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: null,\n resolverTimeoutMs: DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(undefined, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(undefined, {}),\n});\n\nconst createDisabledWatermarkifyOptions = () => ({\n ...createBaseWatermarkifyOptions(),\n enabled: false,\n watermark: normalizeLayer(false, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(false, {}),\n});\n\nexport const normalizeScreenshotWatermarkify = (value) => {\n const base = createBaseWatermarkifyOptions();\n\n if (value === false) {\n return createDisabledWatermarkifyOptions();\n }\n\n if (value == null || value === true) {\n return base;\n }\n\n const source = value && typeof value === 'object' ? value : {};\n const timezoneOffsetHoursRaw = Number(source.timezoneOffsetHours);\n const ipLookupTimeoutMsRaw = Number(source.ipLookupTimeoutMs);\n const resolverTimeoutMsRaw = Number(source.resolverTimeoutMs);\n\n return {\n ...base,\n enabled: source.enabled !== false,\n timezoneOffsetHours: Number.isFinite(timezoneOffsetHoursRaw)\n ? timezoneOffsetHoursRaw\n : DEFAULT_TIMEZONE_OFFSET,\n response: source.response ?? null,\n ip: normalizeText(source.ip),\n location: normalizeText(source.location),\n prompt: normalizeWhitespace(source.prompt),\n query: normalizeWhitespace(source.query),\n ipLookup: source.ipLookup !== false,\n ipLookupTimeoutMs: Number.isFinite(ipLookupTimeoutMsRaw)\n ? ipLookupTimeoutMsRaw\n : DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: typeof source.resolver === 'function' ? source.resolver : null,\n resolverTimeoutMs: Number.isFinite(resolverTimeoutMsRaw)\n ? resolverTimeoutMsRaw\n : DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(source.watermark, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(source.strip, {}),\n };\n};\n\nexport const resolveScreenshotWatermarkifyMeta = async (page, options = {}) => {\n const timezoneOffsetHours = options.timezoneOffsetHours ?? DEFAULT_TIMEZONE_OFFSET;\n const url = normalizeText(page?.url?.()) || 'about:blank';\n const title = normalizeText(await page.title().catch(() => '')) || '\u672A\u547D\u540D\u9875\u9762';\n const hostname = getHostname(url);\n const { prompt, query } = resolvePromptFields(options, title);\n const capturedAt = options.capturedAt instanceof Date\n ? options.capturedAt\n : new Date(options.capturedAt || Date.now());\n const captureTime = formatTimestampForUtcOffset(capturedAt, timezoneOffsetHours);\n\n const [enrichment, stripLogoSrc] = await Promise.all([\n resolveEnrichment(page, {\n url,\n hostname,\n title,\n prompt,\n query,\n }, options),\n resolveStripLogoSrc(),\n ]);\n\n const ip = enrichment.ip || '-';\n const location = enrichment.location || '-';\n\n return {\n watermarkText: buildWatermarkStamp({\n prompt,\n captureTime,\n ip,\n location,\n }),\n stripSegments: buildStripSegments({\n prompt,\n captureTime,\n ip,\n location,\n }),\n watermark: options.watermark,\n strip: options.strip,\n stripLogoSrc,\n };\n};\n\nconst buildFontFamily = () => 'MiSans, \"SF Pro Display\", \"PingFang SC\", \"Helvetica Neue\", Arial, sans-serif';\n\nconst buildStripSegmentLayout = (segment, options = {}) => {\n const label = normalizeWhitespace(segment?.label || '');\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const rawValueWidth = Math.max(\n 24,\n estimateTextWidth(rawValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING,\n );\n const maxValueWidth = Math.max(0, Number(options.valueMaxWidth) || 0);\n const renderValue = maxValueWidth > 0\n ? fitTextWithEllipsis(rawValue, Math.max(18, maxValueWidth - DEFAULT_STRIP_VALUE_PADDING), valueFontSize)\n : rawValue;\n const valueWidth = maxValueWidth > 0\n ? Math.max(24, Math.min(maxValueWidth, estimateTextWidth(renderValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING))\n : rawValueWidth;\n\n return {\n ...segment,\n label,\n rawValue,\n renderValue,\n labelFontSize,\n valueFontSize,\n labelWidth,\n valueWidth,\n segmentWidth: labelWidth + valueWidth,\n rowHeight: Math.round(Math.max(labelFontSize, valueFontSize) * 1.42),\n };\n};\n\nconst buildStripRowLayout = (segments, overrides = {}) => {\n const safeSegments = Array.isArray(segments) ? segments : [];\n const sectionGap = DEFAULT_STRIP_SECTION_GAP;\n const layouts = safeSegments.map((segment, index) => buildStripSegmentLayout(segment, {\n valueMaxWidth: overrides?.valueMaxWidths?.[index],\n }));\n const totalWidth = layouts.reduce((sum, segment) => sum + segment.segmentWidth, 0)\n + Math.max(0, layouts.length - 1) * sectionGap;\n const rowHeight = layouts.reduce((max, segment) => Math.max(max, segment.rowHeight || 0), 0);\n\n return {\n sectionGap,\n layouts,\n totalWidth,\n rowHeight,\n };\n};\n\nconst fitTextWithEllipsis = (chars, maxWidth, fontSize) => {\n const safeChars = Array.isArray(chars) ? chars.slice() : Array.from(String(chars || ''));\n if (!safeChars.length) {\n return '-';\n }\n\n if (estimateTextWidth(safeChars.join(''), fontSize) <= maxWidth) {\n return safeChars.join('').trim() || '-';\n }\n\n while (safeChars.length > 1 && estimateTextWidth(`${safeChars.join('').trimEnd()}\u2026`, fontSize) > maxWidth) {\n safeChars.pop();\n }\n\n return `${safeChars.join('').trimEnd()}\u2026` || '\u2026';\n};\n\nconst splitTextToLines = (value, maxWidth, fontSize, maxLines = 2) => {\n const chars = Array.from(normalizeWhitespace(value) || '-');\n const safeMaxWidth = Math.max(18, maxWidth - DEFAULT_STRIP_TEXT_WIDTH_SAFETY);\n if (!chars.length) {\n return { lines: ['-'], truncated: false };\n }\n\n const lines = [];\n let cursor = 0;\n let truncated = false;\n\n while (cursor < chars.length && lines.length < maxLines) {\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (cursor >= chars.length) {\n break;\n }\n\n const isLastLine = lines.length === maxLines - 1;\n const lineChars = [];\n\n while (cursor < chars.length) {\n const nextChars = [...lineChars, chars[cursor]];\n const remaining = cursor < chars.length - 1;\n const previewText = nextChars.join('') + (isLastLine && remaining ? '\u2026' : '');\n\n if (estimateTextWidth(previewText, fontSize) <= safeMaxWidth || lineChars.length === 0) {\n lineChars.push(chars[cursor]);\n cursor += 1;\n continue;\n }\n\n break;\n }\n\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (isLastLine && cursor < chars.length) {\n lines.push(fitTextWithEllipsis([...lineChars, ...chars.slice(cursor)], safeMaxWidth, fontSize));\n truncated = true;\n cursor = chars.length;\n continue;\n }\n\n lines.push(lineChars.join('').trim() || '-');\n }\n\n return {\n lines: lines.length > 0 ? lines : ['-'],\n truncated,\n };\n};\n\nconst resolveMetadataMinValueWidth = (segment) => {\n switch (segment?.kind) {\n case 'time':\n return Math.max(148, estimateTextWidth('2026-04-23 21:27:16 UTC+8', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'ip':\n return Math.max(108, estimateTextWidth('255.255.255.255', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'location':\n return 76;\n default:\n return 56;\n }\n};\n\nconst buildMetadataRowLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const naturalRow = buildStripRowLayout(safeSegments);\n\n if (!safeSegments.length || naturalRow.totalWidth <= contentWidth) {\n return naturalRow;\n }\n\n const sectionGap = naturalRow.sectionGap;\n const totalLabelWidth = naturalRow.layouts.reduce((sum, segment) => sum + segment.labelWidth, 0);\n const availableValueWidth = Math.max(\n 72,\n Math.floor(contentWidth - totalLabelWidth - Math.max(0, safeSegments.length - 1) * sectionGap),\n );\n const minValueWidths = naturalRow.layouts.map((segment) => resolveMetadataMinValueWidth(segment));\n const naturalValueWidths = naturalRow.layouts.map((segment) => segment.valueWidth);\n const valueWidths = naturalValueWidths.slice();\n let overflow = naturalRow.totalWidth - contentWidth;\n const shrinkOrder = ['location', 'ip', 'time'];\n\n shrinkOrder.forEach((kind) => {\n if (overflow <= 0) return;\n\n naturalRow.layouts.forEach((segment, index) => {\n if (overflow <= 0 || segment.kind !== kind) return;\n const minWidth = minValueWidths[index];\n const reducible = Math.max(0, valueWidths[index] - minWidth);\n if (!reducible) return;\n const reduction = Math.min(reducible, overflow);\n valueWidths[index] -= reduction;\n overflow -= reduction;\n });\n });\n\n if (overflow > 0) {\n const minTotalWidth = minValueWidths.reduce((sum, width) => sum + width, 0);\n if (minTotalWidth > availableValueWidth) {\n const flexibleIndexes = naturalRow.layouts\n .map((segment, index) => ({ segment, index }))\n .filter(({ segment }) => segment.kind !== 'time');\n let extraOverflow = minTotalWidth - availableValueWidth;\n\n flexibleIndexes.forEach(({ index }) => {\n if (extraOverflow <= 0) return;\n const minFloor = 40;\n const reducible = Math.max(0, minValueWidths[index] - minFloor);\n if (!reducible) return;\n const reduction = Math.min(reducible, extraOverflow);\n valueWidths[index] -= reduction;\n extraOverflow -= reduction;\n });\n }\n }\n\n return buildStripRowLayout(safeSegments, {\n valueMaxWidths: valueWidths,\n });\n};\n\nconst buildPromptWrapLayout = (segment, contentWidth) => {\n const label = normalizeWhitespace(segment?.label || 'Prompt') || 'Prompt';\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const safeTotalWidth = Math.max(labelWidth + 56, Number(contentWidth) || 0);\n const valueWidth = Math.max(\n 56,\n safeTotalWidth - labelWidth - DEFAULT_STRIP_CONTENT_SAFE_PADDING_X,\n );\n const result = splitTextToLines(rawValue, valueWidth, valueFontSize, DEFAULT_STRIP_PROMPT_MAX_LINES);\n const lineHeight = Math.max(18, Math.round(valueFontSize * DEFAULT_STRIP_LINE_HEIGHT_RATIO));\n const lineWidths = result.lines.map((line) => estimateTextWidth(line, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING);\n const measuredValueWidth = Math.min(\n valueWidth,\n Math.max(56, ...lineWidths),\n );\n const rowHeight = Math.round(Math.max(labelFontSize, valueFontSize) * 1.42);\n\n return {\n mode: result.lines.length === 1 ? 'single' : 'wrapped',\n label,\n rawValue,\n labelFontSize,\n labelWidth,\n valueFontSize,\n valueWidth,\n lines: result.lines,\n truncated: result.truncated,\n lineHeight,\n blockHeight: result.lines.length === 1\n ? rowHeight\n : Math.max(lineHeight, result.lines.length * lineHeight),\n totalWidth: labelWidth + measuredValueWidth,\n };\n};\n\nconst buildStripLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const promptSegment = safeSegments.find((segment) => segment.kind === 'prompt') || safeSegments[0] || null;\n const metadataSegments = safeSegments.filter((segment) => segment !== promptSegment);\n const zoneGap = DEFAULT_STRIP_ZONE_GAP;\n let metadataRow = buildMetadataRowLayout(\n metadataSegments,\n Math.max(220, contentWidth),\n );\n let metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n let promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n\n if (promptAvailableWidth < DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH && metadataSegments.length > 0) {\n const tighterMetadataWidth = Math.max(180, contentWidth - DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH - zoneGap);\n metadataRow = buildMetadataRowLayout(metadataSegments, tighterMetadataWidth);\n metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n }\n\n const preferredPromptWidth = Math.min(\n promptAvailableWidth,\n Math.max(280, Math.round(contentWidth * DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO)),\n );\n let promptRow = buildPromptWrapLayout(promptSegment, preferredPromptWidth);\n\n if (promptRow?.truncated && promptAvailableWidth > preferredPromptWidth + 24) {\n promptRow = buildPromptWrapLayout(promptSegment, promptAvailableWidth);\n }\n\n const contentHeight = Math.max(\n promptRow?.blockHeight || 0,\n metadataRow?.rowHeight || 0,\n 24,\n );\n const verticalPadding = contentHeight > (metadataRow?.rowHeight || 0) ? 18 : 16;\n const stripHeight = Math.max(\n contentHeight > (metadataRow?.rowHeight || 0)\n ? DEFAULT_STRIP_WRAPPED_MIN_HEIGHT\n : DEFAULT_STRIP_ONE_LINE_HEIGHT,\n Math.ceil(contentHeight + verticalPadding * 2),\n );\n\n return {\n mode: 'zoned',\n height: stripHeight,\n contentHeight,\n promptRow,\n promptStartX: 0,\n metadataRow,\n metadataStartX,\n };\n};\n\nconst renderStripRow = (row, options = {}) => {\n const startX = Number(options.startX) || 0;\n const centerY = Number(options.centerY) || 0;\n const fontFamily = String(options.fontFamily || '');\n const showDividers = options.showDividers !== false;\n const layouts = Array.isArray(row?.layouts) ? row.layouts : [];\n\n if (!layouts.length) {\n return '';\n }\n\n const rowHeight = Math.max(18, Number(row?.rowHeight) || 18);\n const dividerHalfHeight = Math.max(12, Math.round(rowHeight * 0.56));\n const sectionGap = Math.max(0, Number(row?.sectionGap) || 0);\n const svgSegments = [];\n let currentX = startX;\n\n layouts.forEach((segment, index) => {\n const label = escapeXml(segment.label || '');\n const value = escapeXml(segment.renderValue || '-');\n const labelX = currentX;\n const valueX = currentX + segment.labelWidth;\n\n svgSegments.push(`\n <text\n x=\"${labelX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${label}</text>\n <text\n x=\"${valueX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.valueFontSize}\"\n font-weight=\"${segment.kind === 'prompt' ? 760 : 710}\"\n dominant-baseline=\"middle\"\n >${value}</text>\n `);\n\n currentX += segment.segmentWidth;\n\n if (showDividers && index < layouts.length - 1) {\n const lineX = currentX + Math.round(sectionGap / 2);\n svgSegments.push(`\n <line\n x1=\"${lineX}\"\n y1=\"${centerY - dividerHalfHeight}\"\n x2=\"${lineX}\"\n y2=\"${centerY + dividerHalfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `);\n currentX += sectionGap;\n }\n });\n\n return svgSegments.join('');\n};\n\nconst renderStripDivider = (x, centerY, height) => {\n const safeX = Number(x) || 0;\n const safeCenterY = Number(centerY) || 0;\n const safeHeight = Math.max(18, Number(height) || 18);\n const halfHeight = Math.max(12, Math.round(safeHeight * 0.56));\n\n return `\n <line\n x1=\"${safeX}\"\n y1=\"${safeCenterY - halfHeight}\"\n x2=\"${safeX}\"\n y2=\"${safeCenterY + halfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `;\n};\n\nconst buildWatermarkifySvg = (meta, imageWidth, imageHeight) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!hasWatermark && !hasStrip) {\n return '';\n }\n\n const width = Math.max(1, Number(imageWidth) || 1);\n const height = Math.max(1, Number(imageHeight) || 1);\n const fontFamily = escapeXml(buildFontFamily());\n const parts = [];\n\n if (hasWatermark) {\n const stampText = escapeXml(normalizeText(meta.watermarkText));\n const cellWidth = Math.max(680, Number(meta.watermark?.cellWidth) || DEFAULT_WATERMARK_CELL_WIDTH);\n const cellHeight = Math.max(260, Number(meta.watermark?.cellHeight) || DEFAULT_WATERMARK_CELL_HEIGHT);\n const rotateDeg = Number(meta.watermark?.rotateDeg) || DEFAULT_WATERMARK_ROTATE_DEG;\n const opacity = Math.min(0.22, Math.max(0.05, Number(meta.watermark?.opacity) || DEFAULT_WATERMARK_OPACITY));\n const rowOffset = Math.round(cellWidth * 0.24);\n const startX = -Math.round(cellWidth * 0.16);\n const startY = -Math.round(cellHeight * 0.12);\n const cols = Math.ceil((width + cellWidth * 1.1) / cellWidth) + 1;\n const rows = Math.ceil((height + cellHeight * 0.9) / cellHeight) + 1;\n const stamps = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let col = 0; col < cols; col += 1) {\n const x = startX + col * cellWidth + (row % 2 ? rowOffset : 0);\n const y = startY + row * cellHeight + (row % 2 ? 14 : -8);\n stamps.push(`\n <g transform=\"translate(${x} ${y}) rotate(${rotateDeg})\">\n <text\n x=\"0\"\n y=\"0\"\n fill=\"#111111\"\n fill-opacity=\"${opacity}\"\n stroke=\"#ffffff\"\n stroke-opacity=\"0.12\"\n stroke-width=\"0.22\"\n font-family=\"${fontFamily}\"\n font-size=\"19\"\n font-weight=\"720\"\n letter-spacing=\"0.6\"\n >${stampText}</text>\n </g>\n `);\n }\n }\n\n parts.push(`<g id=\"watermarks\">${stamps.join('')}</g>`);\n }\n\n if (hasStrip) {\n const logoSize = 28;\n const logoX = DEFAULT_STRIP_PADDING_LEFT;\n const contentStartX = logoX + logoSize + DEFAULT_STRIP_GAP;\n const contentWidth = width - contentStartX - DEFAULT_STRIP_PADDING_RIGHT;\n const stripLayout = buildStripLayout(meta.stripSegments, contentWidth);\n const stripHeight = stripLayout.height;\n const stripY = height - stripHeight;\n const logoY = Number((stripY + ((stripHeight - logoSize) / 2)).toFixed(2));\n let stripContentSvg = '';\n const centerY = stripY + stripHeight / 2 + 1;\n const promptRow = stripLayout.promptRow;\n const metadataRow = stripLayout.metadataRow;\n const promptParts = [];\n const hasPrompt = Boolean(promptRow?.label);\n const hasMetadata = Array.isArray(metadataRow?.layouts) && metadataRow.layouts.length > 0;\n const zoneDividerX = hasPrompt && hasMetadata\n ? contentStartX + stripLayout.metadataStartX - (DEFAULT_STRIP_ZONE_GAP / 2)\n : null;\n\n if (promptRow?.mode === 'single') {\n promptParts.push(renderStripRow({\n layouts: [\n {\n kind: 'prompt',\n label: promptRow.label,\n renderValue: promptRow.lines[0] || '-',\n labelFontSize: promptRow.labelFontSize,\n valueFontSize: promptRow.valueFontSize,\n labelWidth: promptRow.labelWidth,\n segmentWidth: promptRow.labelWidth + promptRow.valueWidth,\n },\n ],\n sectionGap: 0,\n rowHeight: promptRow.blockHeight,\n }, {\n startX: contentStartX + stripLayout.promptStartX,\n centerY,\n fontFamily,\n showDividers: false,\n }));\n } else if (promptRow) {\n const promptStartX = contentStartX + stripLayout.promptStartX;\n const labelX = promptStartX;\n const valueX = promptStartX + promptRow.labelWidth;\n const blockTop = centerY - (promptRow.blockHeight / 2);\n const labelY = centerY;\n\n promptParts.push(`\n <text\n x=\"${labelX}\"\n y=\"${labelY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(promptRow.label)}</text>\n `);\n\n promptRow.lines.forEach((line, index) => {\n const lineY = blockTop + (index * promptRow.lineHeight) + (promptRow.lineHeight / 2);\n promptParts.push(`\n <text\n x=\"${valueX}\"\n y=\"${lineY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.valueFontSize}\"\n font-weight=\"760\"\n dominant-baseline=\"middle\"\n >${escapeXml(line)}</text>\n `);\n });\n }\n\n stripContentSvg = [\n promptParts.join(''),\n zoneDividerX == null\n ? ''\n : renderStripDivider(\n zoneDividerX,\n centerY,\n Math.max(promptRow?.blockHeight || 0, metadataRow?.rowHeight || 0),\n ),\n renderStripRow(metadataRow, {\n startX: contentStartX + stripLayout.metadataStartX,\n centerY,\n fontFamily,\n showDividers: true,\n }),\n ].join('');\n\n parts.push(`\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${DEFAULT_STRIP_PADDING_LEFT}\" y=\"${stripY}\" width=\"${Math.max(120, Math.round(width * 0.42))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${meta.stripLogoSrc ? `<image href=\"${escapeXml(meta.stripLogoSrc)}\" x=\"${logoX}\" y=\"${logoY}\" width=\"${logoSize}\" height=\"${logoSize}\" />` : ''}\n ${stripContentSvg}\n </g>\n `);\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n};\n\nexport const watermarkifyScreenshotBuffer = async (buffer, meta, page = null) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!Buffer.isBuffer(buffer) || !meta || (!hasWatermark && !hasStrip)) {\n return buffer;\n }\n\n const imageInfo = readImageInfo(buffer);\n if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {\n logger.warning('watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F');\n return buffer;\n }\n\n const overlaySvg = buildWatermarkifySvg(meta, imageInfo.width, imageInfo.height);\n if (!overlaySvg) {\n return buffer;\n }\n\n return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, imageInfo);\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["normalizeShare", "segments", "protocol", "domain", "path", "logger", "import_serialize_error", "logger", "a", "path", "path", "frameUrls", "runtime", "logger", "Actor", "logger", "logger", "logger", "delay", "picomatch", "logger", "logger", "express", "logger", "uuidv4", "import_uuid", "logger", "uuidv4", "result", "selectorList", "stableTime", "timeout", "callbackName", "normalizeText", "path", "monitorKey", "cleanerName", "mode", "text", "logger", "import_delay", "logger", "logger", "DEFAULT_TIMEOUT_MS", "toInline", "segments", "delay", "maxHeight", "crawleeLog"]
|
|
3
|
+
"sources": ["../entrys/node.js", "../src/constants.js", "../src/internals/logger.js", "../src/internals/viewport.js", "../src/internals/screenshot.js", "../src/errors.js", "../src/apify-kit.js", "../src/internals/proxy-meter-runtime.js", "../src/internals/constants.js", "../src/runtime-env.js", "../src/internals/utils.js", "../src/utils.js", "../src/anti-cheat.js", "../src/humanize.js", "../src/launch.js", "../src/proxy-bypass.js", "../src/live-view.js", "../src/chaptcha.js", "../src/internals/captcha/shared.js", "../src/internals/captcha/bytedance.js", "../src/mutation.js", "../src/display.js", "../src/logger.js", "../src/share.js", "../src/internals/watermarkify.js"],
|
|
4
|
+
"sourcesContent": ["import { log as crawleeLog } from 'crawlee';\nimport { ApifyKit } from '../src/apify-kit';\nimport { Utils } from '../src/utils';\nimport { AntiCheat } from '../src/anti-cheat';\nimport { Humanize } from '../src/humanize';\nimport { Launch } from '../src/launch';\nimport { LiveView } from '../src/live-view';\nimport { Captcha } from '../src/chaptcha.js';\nimport { Mutation } from '../src/mutation';\nimport { Display } from '../src/display.js';\nimport * as Constants from '../src/constants';\nimport * as Errors from '../src/errors';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger';\nimport { Share } from '../src/share';\nimport { ByPass } from '../src/proxy-bypass';\nimport { RuntimeEnv } from '../src/runtime-env.js';\n\n// \u4FEE\u6539\u9ED8\u8BA4logger \u4ECEconsole.log \u5230 crawleeLog\nLogger.setLogger(crawleeLog);\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n AntiCheat,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n RuntimeEnv,\n Captcha,\n Errors,\n Mutation,\n Display,\n Logger,\n Share,\n ByPass,\n $Internals: { LOG_TEMPLATES, stripAnsi }\n };\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n\n\nconst createActorInfo = (info) => {\n const normalizeDomain = (value) => {\n if (!value) return '';\n return String(value).trim().replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n };\n\n const normalizePath = (value) => {\n if (!value) return '/';\n const raw = String(value).trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n };\n\n const normalizeShare = (value) => {\n const raw = value && typeof value === 'object' ? value : {};\n\n const modeRaw = String(raw.mode || 'dom').trim().toLowerCase();\n const mode = modeRaw === 'response' ? 'response' : 'dom';\n\n const prefix = String(raw.prefix || '').trim();\n\n const rawXurl = Array.isArray(raw.xurl)\n ? raw.xurl\n : [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const rawPath = String(input || '').trim();\n if (!rawPath) return [];\n\n return rawPath\n .split('.')\n .map((segment) => String(segment || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const xurl = [];\n\n const matcherList = normalizeMatcherList(rawXurl[0]);\n if (matcherList.length > 0) {\n xurl.push(matcherList);\n }\n\n const flatPath = [];\n const extraPaths = [];\n\n rawXurl.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flatPath.push(...segments);\n }\n });\n\n if (flatPath.length > 0) {\n xurl.push(flatPath);\n }\n\n if (extraPaths.length > 0) {\n xurl.push(...extraPaths);\n }\n\n return {\n mode,\n prefix,\n xurl,\n };\n };\n\n const buildLandingUrl = ({ protocol, domain, path }) => {\n const safeProtocol = String(protocol).trim();\n const safeDomain = normalizeDomain(domain);\n const safePath = normalizePath(path);\n return `${safeProtocol}://${safeDomain}${safePath}`;\n };\n\n const buildIcon = ({ key }) => {\n return `https://heartbitai.com/general/actors/${key}.png`;\n }\n\n\n const protocol = info.protocol || 'https';\n const domain = normalizeDomain(info.domain);\n const path = normalizePath(info.path);\n const share = normalizeShare(info.share);\n\n return {\n ...info,\n protocol,\n domain,\n path,\n share,\n get icon() {\n if (info.icon) return info.icon;\n return buildIcon(this);\n },\n get landingUrl() {\n return buildLandingUrl(this);\n },\n };\n};\n\nexport const ActorInfo = {\n qbot: createActorInfo({\n key: 'qbot',\n name: 'QQ\u6D4F\u89C8\u5668AI\u641C',\n domain: 'sogou.com',\n path: '/web',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n douyin: createActorInfo({\n key: 'douyin',\n name: '\u6296\u97F3AI\u641C',\n domain: 'so.douyin.com',\n path: '/',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [\n ],\n },\n }),\n lingguang: createActorInfo({\n key: 'lingguang',\n name: '\u7075\u5149',\n domain: 'www.lingguang.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.lingguang.com/share/',\n xurl: [\n '/chat/shareChat.json',\n 'result',\n ],\n },\n }),\n doubao: createActorInfo({\n key: 'doubao',\n name: '\u8C46\u5305',\n domain: 'www.doubao.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.doubao.com/thread/',\n xurl: [\n '/samantha/thread/share/save',\n 'data', 'share_id',\n ],\n },\n }),\n deepseek: createActorInfo({\n key: 'deepseek',\n name: 'DeepSeek',\n domain: 'chat.deepseek.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://chat.deepseek.com/share/',\n xurl: [\n '/api/v0/share/create',\n 'data', 'biz_data', 'share_id',\n ],\n },\n }),\n erine: createActorInfo({\n key: 'erine',\n name: '\u6587\u5FC3\u4E00\u8A00',\n domain: 'yiyan.baidu.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://yiyan.baidu.com/share/',\n xurl: [\n '/eb/share/key/gen',\n 'data', 'key',\n ],\n },\n }),\n wenxin: createActorInfo({\n key: 'wenxin',\n name: '\u6587\u5FC3\u52A9\u624B',\n domain: 'chat.baidu.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: '',\n xurl: [\n '/aichat/api/shortURL',\n 'data', 'short_url',\n ],\n },\n }),\n baidu: createActorInfo({\n key: 'baidu',\n name: '\u767E\u5EA6AI\u641C',\n domain: 'www.baidu.com',\n path: '/s',\n share: {\n mode: 'response',\n prefix: '',\n xurl: [\n '/aichat/api/shortURL',\n 'data', 'short_url',\n ],\n },\n }),\n yuanbao: createActorInfo({\n key: 'yuanbao',\n name: '\u5143\u5B9D',\n domain: 'yuanbao.tencent.com',\n path: '/chat/',\n share: {\n mode: 'response',\n prefix: 'https://yb.tencent.com/s/',\n xurl: [\n '/api/conversations/v2/share', 'shareId',\n ],\n },\n }),\n kimi: createActorInfo({\n key: 'kimi',\n name: 'Kimi',\n domain: 'www.kimi.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.kimi.com/share/',\n xurl: [\n '/kimi.gateway.chat.v1.ChatService/CreateChatShare', 'share', 'id'\n ],\n },\n }),\n qwen: createActorInfo({\n key: 'qwen',\n name: '\u901A\u4E49\u5343\u95EE',\n domain: 'www.qianwen.com',\n path: '/chat',\n share: {\n mode: 'response',\n prefix: 'https://www.qianwen.com/share/chat/',\n xurl: [\n '/api/v1/share/create', 'data', 'share_id'\n ],\n },\n }),\n nano: createActorInfo({\n key: 'nano',\n name: '\u7EB3\u7C73',\n domain: 'www.n.cn',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.n.cn/share/mcp?id=',\n xurl: [\n '/api/share/gen', 'data', 'id'\n ],\n },\n }),\n quark: createActorInfo({\n key: 'quark',\n name: '\u5938\u514B',\n domain: 'ai.quark.cn',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n}\n", "\n// =============================================================================\n// Core Helpers & State\n// =============================================================================\n\nconst pad = (value, size = 2) => String(value).padStart(size, '0');\n\nconst FORCED_TIMEZONE_OFFSET_MINUTES = -8 * 60;\n\nconst formatTimestamp = (date = new Date()) => {\n const source = date instanceof Date ? date : new Date(date);\n const forcedDate = new Date(source.getTime() - (FORCED_TIMEZONE_OFFSET_MINUTES * 60 * 1000));\n\n const year = forcedDate.getUTCFullYear();\n const month = pad(forcedDate.getUTCMonth() + 1);\n const day = pad(forcedDate.getUTCDate());\n const hours = pad(forcedDate.getUTCHours());\n const minutes = pad(forcedDate.getUTCMinutes());\n const seconds = pad(forcedDate.getUTCSeconds());\n const millis = pad(forcedDate.getUTCMilliseconds(), 3);\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${millis}`;\n};\n\nconst formatLine = (prefix, icon, message) => {\n const parts = [];\n if (prefix) parts.push(`[${prefix}]`);\n if (icon) parts.push(icon);\n if (message) parts.push(message);\n return parts.join(' ').trim();\n};\n\nconst fallbackLog = {\n info: (...args) => console.log(...args),\n warning: (...args) => (console.warn ? console.warn(...args) : console.log(...args)),\n error: (...args) => console.error(...args),\n debug: (...args) => (console.debug ? console.debug(...args) : console.log(...args)),\n};\n\nconst resolveLogMethod = (logger, name) => {\n if (logger && typeof logger[name] === 'function') {\n return logger[name].bind(logger);\n }\n if (name === 'warning' && logger && typeof logger.warn === 'function') {\n return logger.warn.bind(logger);\n }\n return fallbackLog[name];\n};\n\nlet defaultLogger = null;\n\nexport const setDefaultLogger = (logger) => {\n defaultLogger = logger;\n};\n\n// Lazy resolver: always checks current state\nconst resolveLogger = (explicitLogger) => {\n if (explicitLogger && typeof explicitLogger.info === 'function') {\n return explicitLogger;\n }\n if (defaultLogger && typeof defaultLogger.info === 'function') {\n return defaultLogger;\n }\n return fallbackLog;\n};\n\nconst ANSI = {\n reset: '\\x1b[0m',\n gray: '\\x1b[90m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nconst colorize = (text, color) => {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n};\n\nexport const createBaseLogger = (prefix = '', explicitLogger) => {\n const name = prefix ? String(prefix) : '';\n\n const dispatch = (methodName, icon, message, color) => {\n const logger = resolveLogger(explicitLogger);\n const logFn = resolveLogMethod(logger, methodName);\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n logFn(`${timestamp} ${coloredLine}`.trim());\n };\n\n return {\n info: (message) => dispatch('info', '\uD83D\uDCD6', message, ANSI.cyan),\n success: (message) => dispatch('info', '\u2705', message, ANSI.green),\n warning: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n warn: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n error: (message) => dispatch('error', '\u274C', message, ANSI.red),\n debug: (message) => dispatch('debug', '\uD83D\uDD39', message, ANSI.gray),\n start: (message) => dispatch('info', '\uD83D\uDD37', message, ANSI.blue),\n };\n};\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\n * @param {object} [logger] - \u53EF\u9009\u7684\u663E\u5F0F\u65E5\u5FD7\u5668\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F20\uFF0C\u4F1A\u81EA\u52A8\u4F7F\u7528 setDefaultLogger \u8BBE\u7F6E\u7684\u5168\u5C40\u65E5\u5FD7\u5668\n */\nexport function createInternalLogger(moduleName, explicitLogger) {\n const baseLogger = createBaseLogger(moduleName, explicitLogger);\n\n return {\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);\n },\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);\n },\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);\n },\n debug(message) {\n baseLogger.debug(message);\n },\n warn(message) {\n baseLogger.warning(message);\n },\n warning(message) {\n baseLogger.warning(message);\na },\n info(message) {\n baseLogger.info(message);\n },\n error(message) {\n baseLogger.error(message);\n }\n };\n}\n", "const toPositiveInt = (value) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : 0;\n};\n\nexport const resolveCurrentViewportSize = async (page, fallback = {}) => {\n const directViewport = page?.viewportSize?.();\n const directWidth = toPositiveInt(directViewport?.width);\n const directHeight = toPositiveInt(directViewport?.height);\n\n if (directWidth && directHeight) {\n return {\n width: directWidth,\n height: directHeight,\n };\n }\n\n const measuredViewport = await page?.evaluate?.(() => ({\n width: window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0,\n height: window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0,\n })).catch(() => null);\n\n const fallbackWidth = toPositiveInt(fallback?.width);\n const fallbackHeight = toPositiveInt(fallback?.height);\n\n return {\n width: toPositiveInt(measuredViewport?.width) || fallbackWidth || 1,\n height: toPositiveInt(measuredViewport?.height) || fallbackHeight || 1,\n };\n};\n", "import { createInternalLogger } from './logger.js';\nimport { resolveCurrentViewportSize } from './viewport.js';\n\nconst logger = createInternalLogger('Screenshot');\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst FORCED_FULLPAGE_TYPE = 'jpeg';\nconst FORCED_FULLPAGE_QUALITY = 50;\nconst SUPPORTED_TYPES = new Set(['png', 'jpeg', 'webp']);\n\nconst toPositiveNumber = (value, fallback = 0) => {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return n;\n};\n\nconst normalizeType = (value) => {\n const raw = String(value || 'png').trim().toLowerCase();\n if (!SUPPORTED_TYPES.has(raw)) return 'png';\n return raw;\n};\n\nconst normalizeQuality = (value, type) => {\n if (type !== 'jpeg' && type !== 'webp') return undefined;\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const rounded = Math.round(n);\n if (rounded < 0 || rounded > 100) return undefined;\n return rounded;\n};\n\nconst buildFullPageClip = (metrics, viewport, maxClipHeight) => {\n const contentSize = metrics && typeof metrics === 'object'\n ? metrics.contentSize || null\n : null;\n\n const width = Math.max(1, Math.ceil(viewport.width || contentSize?.width || 1));\n let height = Math.max(1, Math.ceil(contentSize?.height || viewport.height || 1));\n\n if (maxClipHeight > 0) {\n height = Math.min(height, maxClipHeight);\n }\n\n return {\n x: 0,\n y: 0,\n width,\n height,\n scale: 1,\n };\n};\n\nexport const capturePageScreenshot = async (page, options = {}) => {\n const fullPage = Boolean(options.fullPage);\n const type = fullPage ? FORCED_FULLPAGE_TYPE : normalizeType(options.type);\n const quality = fullPage\n ? FORCED_FULLPAGE_QUALITY\n : normalizeQuality(options.quality, type);\n const timeout = toPositiveNumber(options.timeout, DEFAULT_TIMEOUT_MS);\n const maxClipHeight = Math.round(toPositiveNumber(options.maxClipHeight, 0));\n\n const fallbackOptions = {\n type: type === 'webp' ? 'png' : type,\n fullPage,\n };\n if (quality !== undefined && fallbackOptions.type === 'jpeg') {\n fallbackOptions.quality = quality;\n }\n if (timeout > 0) {\n fallbackOptions.timeout = timeout;\n }\n\n try {\n const context = page && typeof page.context === 'function' ? page.context() : null;\n if (!context || typeof context.newCDPSession !== 'function') {\n throw new Error('CDP session is not available');\n }\n\n const session = await context.newCDPSession(page);\n try {\n const metrics = await session.send('Page.getLayoutMetrics');\n const viewport = await resolveCurrentViewportSize(page);\n\n const captureParams = {\n format: type,\n fromSurface: true,\n captureBeyondViewport: fullPage,\n optimizeForSpeed: true,\n };\n\n if (quality !== undefined) {\n captureParams.quality = quality;\n }\n\n if (fullPage) {\n captureParams.clip = buildFullPageClip(metrics, viewport, maxClipHeight);\n }\n\n const result = await session.send('Page.captureScreenshot', captureParams);\n if (!result || typeof result.data !== 'string' || !result.data) {\n throw new Error('CDP returned empty screenshot data');\n }\n\n return Buffer.from(result.data, 'base64');\n } finally {\n if (typeof session.detach === 'function') {\n await session.detach().catch(() => { });\n }\n }\n } catch (error) {\n logger.warning(`CDP \u622A\u56FE\u5931\u8D25\uFF0C\u56DE\u9000 page.screenshot: ${error?.message || error}`);\n return await page.screenshot(fallbackOptions);\n }\n};\n", "/**\n * \u722C\u866B\u81EA\u5B9A\u4E49\u9519\u8BEF\u7C7B\n * \u7528\u4E8E\u643A\u5E26\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF0C\u5728 pushFailed \u65F6\u81EA\u52A8\u89E3\u6790\n */\n\nimport { serializeError } from \"serialize-error\";\nimport { Code } from \"./constants\";\n\n/**\n * CrawlerError - \u81EA\u5B9A\u4E49\u722C\u866B\u9519\u8BEF\u7C7B\n * \n * @example\n * // \u7B80\u5355\u7528\u6CD5 (\u53EA\u6709 message)\n * throw new CrawlerError('\u672A\u6355\u83B7 Feed \u63A5\u53E3\u54CD\u5E94');\n * \n * @example\n * // \u5B8C\u6574\u7528\u6CD5 (\u5E26 code \u548C context)\n * throw new CrawlerError({\n * message: '\u767B\u5F55\u5931\u8D25',\n * code: ErrorKeygen.NotLogin,\n * context: { url: currentUrl, userId: '123' }\n * });\n */\nexport class CrawlerError extends Error {\n /**\n * @param {string|Object} info - \u9519\u8BEF\u4FE1\u606F\u5B57\u7B26\u4E32\u6216\u914D\u7F6E\u5BF9\u8C61\n * @param {string} info.message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} [info.code] - ErrorKeygen \u679A\u4E3E\u503C\uFF08\u7528\u4E8E\u9519\u8BEF\u5206\u7C7B\uFF09\n * @param {Object} [info.context] - \u4E0A\u4E0B\u6587\u4FE1\u606F\u5BF9\u8C61\n */\n constructor(info) {\n // \u517C\u5BB9 string\n if (typeof info === 'string') {\n info = { message: info };\n }\n\n // \u26A0\uFE0F super() \u5FC5\u987B\u5728\u8BBF\u95EE this \u4E4B\u524D\u8C03\u7528\n super(info.message);\n\n this.name = 'CrawlerError';\n this.code = info.code ?? Code.UnknownError;\n this.context = info.context ?? {};\n this.timestamp = new Date().toISOString();\n\n // \u7EF4\u62A4\u6B63\u786E\u7684\u5806\u6808\u8DDF\u8E2A\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CrawlerError);\n }\n }\n\n /**\n * \u8F6C\u6362\u4E3A\u53EF\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n * @returns {Object}\n */\n toJSON() {\n return serializeError(this)\n }\n\n /**\n * \u68C0\u67E5\u4E00\u4E2A error \u662F\u5426\u662F CrawlerError\n * @param {Error} error\n * @returns {boolean}\n */\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n /**\n * \u4ECE\u666E\u901A Error \u521B\u5EFA CrawlerError\n * @param {Error} error - \u539F\u59CB\u9519\u8BEF\n * @param {Object} [options={}] - \u9009\u9879\u5BF9\u8C61 (\u5305\u542B code \u548C context)\n * @returns {CrawlerError}\n */\n static from(error, options = {}) {\n const crawlerError = new CrawlerError({\n message: error.message,\n ...options\n });\n crawlerError.stack = error.stack;\n return crawlerError;\n }\n}\n\n\n", "import { Status, Code } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('ApifyKit');\n\nconst resolveRuntimeContext = (input) => {\n const rememberedState = RuntimeEnv.peekRememberedState();\n const state = rememberedState || RuntimeEnv.parseInput(input || {});\n const envPatch = RuntimeEnv.buildEnvPatch(state) || null;\n\n return {\n actor: state.actor,\n runtime: state.runtime,\n envPatch,\n };\n};\n\nconst isPageLike = (value) => {\n if (!value || typeof value !== 'object') return false;\n return typeof value.evaluate === 'function' && typeof value.context === 'function';\n};\n\nconst pickPage = (...candidates) => {\n for (const candidate of candidates) {\n if (isPageLike(candidate)) {\n return candidate;\n }\n }\n return null;\n};\n\nconst toSerializable = (value, depth = 0, seen = new WeakSet()) => {\n if (depth > 6) return '[MaxDepth]';\n if (value == null) return value;\n\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value;\n }\n if (valueType === 'bigint') {\n return value.toString();\n }\n if (valueType === 'function' || valueType === 'symbol') {\n return undefined;\n }\n if (value instanceof Error) {\n return serializeError(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => toSerializable(item, depth + 1, seen))\n .filter((item) => item !== undefined);\n }\n if (valueType !== 'object') {\n return String(value);\n }\n\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n\n const ctorName = String(value?.constructor?.name || '');\n if (\n ctorName === 'Page' ||\n ctorName === 'BrowserContext' ||\n ctorName === 'Browser' ||\n ctorName === 'Frame' ||\n ctorName === 'ElementHandle' ||\n ctorName === 'JSHandle'\n ) {\n return `[${ctorName}]`;\n }\n\n const output = {};\n Object.entries(value).forEach(([key, item]) => {\n const safeValue = toSerializable(item, depth + 1, seen);\n if (safeValue !== undefined) {\n output[key] = safeValue;\n }\n });\n return output;\n};\n\nconst sanitizeMeta = (meta) => {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n return {};\n }\n const result = toSerializable(meta) || {};\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n delete result.page;\n }\n return result;\n};\n\nconst captureAutoEnvPatch = async (page, runtimeContext) => {\n const currentPage = pickPage(page);\n if (!currentPage) return null;\n try {\n return await RuntimeEnv.captureEnvPatch(\n currentPage,\n {\n actor: runtimeContext.actor,\n runtime: runtimeContext.runtime,\n },\n { actor: runtimeContext.actor },\n );\n } catch (error) {\n logger.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);\n return null;\n }\n};\n\n/**\n * \u521B\u5EFA ApifyKit \u5B9E\u4F8B\n * \u5982\u679C apify \u53EF\u7528\uFF0C\u8FD4\u56DE\u5B8C\u6574\u529F\u80FD\u7684 ApifyKit\n * \u5982\u679C apify \u4E0D\u53EF\u7528\uFF0C\u8FD4\u56DE\u964D\u7EA7\u7248\u672C\uFF08\u975E apify \u76F8\u5173\u529F\u80FD\u4ECD\u53EF\u7528\uFF09\n */\nasync function createApifyKit() {\n let apify = null;\n\n // \u5C1D\u8BD5\u52A0\u8F7D apify\n try {\n apify = await import('apify');\n } catch (error) {\n // apify \u4E0D\u53EF\u7528\uFF0C\u5C06\u4F7F\u7528\u964D\u7EA7\u7248\u672C\n throw new Error('\u26A0\uFE0F apify \u5E93\u672A\u5B89\u88C5\uFF0CApifyKit \u7684 Actor \u76F8\u5173\u529F\u80FD\u4E0D\u53EF\u7528')\n }\n\n const { Actor } = apify;\n const actorInput = (await Actor.getInput()) || {};\n let lastPage = null;\n const getRuntimeContext = () => resolveRuntimeContext(actorInput);\n\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u3001\u5931\u8D25\u622A\u56FE\u5904\u7406\u548C\u91CD\u8BD5\u673A\u5236\n * \n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} actionFn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {boolean} [options.failActor=true] - \u5931\u8D25\u65F6\u662F\u5426\u8C03\u7528 Actor.fail\n * @param {Object} [options.retry] - \u91CD\u8BD5\u914D\u7F6E\n * @param {number} [options.retry.times=0] - \u91CD\u8BD5\u6B21\u6570\n * @param {'direct'|'refresh'} [options.retry.mode='direct'] - \u91CD\u8BD5\u6A21\u5F0F\n * @param {Function} [options.retry.before] - \u91CD\u8BD5\u524D\u94A9\u5B50\uFF0C\u53EF\u8986\u76D6\u9ED8\u8BA4\u7B49\u5F85\u884C\u4E3A\n */\n async runStep(step, page, actionFn, options = {}) {\n if (isPageLike(page)) {\n lastPage = page;\n }\n const { failActor = true, retry = {} } = options;\n const { times: retryTimes = 0, mode: retryMode = 'direct', before: beforeRetry } = retry;\n\n // \u5185\u90E8\u6267\u884C\u51FD\u6570\n const executeAction = async (attemptNumber) => {\n const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : '';\n logger.start(`[Step] ${step}${attemptLabel}`);\n\n try {\n const result = await actionFn();\n logger.success(`[Step] ${step}${attemptLabel}`);\n return { success: true, result };\n } catch (error) {\n logger.fail(`[Step] ${step}${attemptLabel}`, error);\n return { success: false, error };\n }\n };\n\n // \u91CD\u8BD5\u524D\u7684\u51C6\u5907\u64CD\u4F5C\n const prepareForRetry = async (attemptNumber) => {\n if (typeof beforeRetry === 'function') {\n // \u4F7F\u7528\u81EA\u5B9A\u4E49\u94A9\u5B50\n logger.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await beforeRetry(page, attemptNumber);\n logger.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);\n } else if (retryMode === 'refresh') {\n // \u5237\u65B0\u6A21\u5F0F\uFF1A\u5237\u65B0\u9875\u9762\u5E76\u7B49\u5F85\u5BFC\u822A commit\uFF0C\u540E\u7EED\u6B65\u9AA4\u81EA\u884C\u505A\u4EA4\u4E92\u5C31\u7EEA\u68C0\u67E5\n logger.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await page.reload({ waitUntil: 'commit' });\n logger.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);\n } else {\n // direct \u6A21\u5F0F\uFF1A\u9ED8\u8BA4\u7B49\u5F85 3 \u79D2\n logger.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await new Promise(resolve => setTimeout(resolve, 3000));\n logger.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);\n }\n };\n\n // \u9996\u6B21\u6267\u884C\n let lastResult = await executeAction(0);\n\n // \u5982\u679C\u9996\u6B21\u6210\u529F\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (lastResult.success) {\n return lastResult.result;\n }\n\n // \u91CD\u8BD5\u903B\u8F91\n for (let attempt = 1; attempt <= retryTimes; attempt++) {\n logger.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);\n\n try {\n await prepareForRetry(attempt);\n } catch (prepareError) {\n logger.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);\n // \u51C6\u5907\u5931\u8D25\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u4E0B\u4E00\u6B21\u91CD\u8BD5\n continue;\n }\n\n lastResult = await executeAction(attempt);\n if (lastResult.success) {\n return lastResult.result;\n }\n }\n\n // \u6240\u6709\u91CD\u8BD5\u90FD\u5931\u8D25\uFF0C\u5904\u7406\u6700\u7EC8\u9519\u8BEF\n const finalError = lastResult.error;\n if (failActor) {\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'jpeg',\n quality: 60,\n });\n base64 = `data:image/jpeg;base64,${buffer.toString('base64')}`;\n }\n } catch (snapErr) {\n logger.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);\n }\n\n await this.pushFailed(\n finalError,\n {\n step,\n base64,\n retryAttempts: retryTimes,\n },\n {\n page,\n options,\n },\n );\n await Actor.fail(`Run Step ${step} \u5931\u8D25 (\u5DF2\u91CD\u8BD5 ${retryTimes} \u6B21): ${finalError.message}`);\n } else {\n throw finalError;\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n * \u652F\u6301\u900F\u4F20 retry \u7B49\u9009\u9879\uFF08failActor \u59CB\u7EC8\u56FA\u5B9A\u4E3A false\uFF09\n *\n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} fn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u652F\u6301 retry\uFF09\n */\n async runStepLoose(step, page, fn, options = {}) {\n return await this.runStep(step, page, fn, {\n ...options,\n failActor: false,\n });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\u3002\n * \u8FD9\u91CC\u4F1A\u81EA\u52A8\u505A\u4E09\u4EF6\u4E8B\uFF1A\n * 1. \u91C7\u96C6\u5F53\u524D\u9875\u9762\u7684 env_patch\uFF1B\n * 2. \u5408\u5E76\u663E\u5F0F\u4F20\u5165\u7684 env_patch\uFF1B\n * 3. \u4E00\u5E76\u5199\u5165 dataset\uFF0C\u4F9B\u540E\u7AEF\u56DE\u5199 runtime_env_json\u3002\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, data?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n\n let payloadData = data;\n let explicitPatch = null;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n payloadData = { ...data };\n explicitPatch = payloadData.env_patch;\n delete payloadData.env_patch;\n delete payloadData.page;\n }\n\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n code: Code.Success,\n status: Status.Success,\n ...(traffic ? { traffic } : {}),\n timestamp: new Date().toISOString(),\n data: payloadData,\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushSuccess', 'Data pushed');\n },\n\n /**\n * \u63A8\u9001\u5931\u8D25\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\uFF08\u79C1\u6709\u65B9\u6CD5\uFF0C\u4EC5\u4F9B runStep \u5185\u90E8\u4F7F\u7528\uFF09\u3002\n * \u5373\u4FBF\u4EFB\u52A1\u5931\u8D25\uFF0C\u8FD9\u91CC\u4E5F\u4F1A\u81EA\u52A8\u56DE\u6536 env_patch\uFF0C\u786E\u4FDD cookies/storage \u7684\u6700\u65B0\u72B6\u6001\u4E0D\u4F1A\u4E22\u3002\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982 failedStep\u3001screenshotBase64 \u7B49\uFF09\n * @param {Object} [options] - \u9644\u52A0\u9009\u9879\uFF08\u5982 page\uFF09\n * @private\n */\n async pushFailed(error, meta = {}, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, meta?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const explicitPatch = meta?.env_patch;\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const safeMeta = sanitizeMeta(meta);\n delete safeMeta.env_patch;\n\n // \u5982\u679C\u662F CrawlerError\uFF0C\u63D0\u53D6\u5176 key \u548C context\n const isCrawlerError = CrawlerError.isCrawlerError(error);\n const code = isCrawlerError ? error.code : Code.UnknownError;\n const context = isCrawlerError ? error.context : {};\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n // \u5982\u679C\u662F CrawlerError\uFF0C\u4F7F\u7528\u5176 code\uFF0C\u5426\u5219\u4F7F\u7528\u9ED8\u8BA4 Failed code\n code,\n status: Status.Failed,\n ...(traffic ? { traffic } : {}),\n error: serializeError(error),\n meta: safeMeta,\n context,\n timestamp: new Date().toISOString(),\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushFailed', 'Error data pushed');\n }\n };\n}\n\n// \u61D2\u52A0\u8F7D\u5355\u4F8B\nlet instance = null;\n\n/**\n * \u83B7\u53D6 ApifyKit \u5B9E\u4F8B\uFF08\u61D2\u52A0\u8F7D\uFF09\n * @returns {Promise<Object>} ApifyKit \u5B9E\u4F8B\n */\nasync function useApifyKit() {\n if (!instance) {\n instance = await createApifyKit();\n }\n return instance;\n}\n\n// \u4E5F\u5BFC\u51FA\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u4F9B\u9700\u8981\u7684\u7528\u6237\u4F7F\u7528\nexport const ApifyKit = {\n useApifyKit\n};\n", "import { spawn, spawnSync } from 'child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';\nimport { tmpdir } from 'os';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('ProxyMeter');\n\nconst MAX_TOP_DOMAINS = 20;\nconst FLUSH_INTERVAL_MS = 2000;\nconst DEFAULT_DEBUG_MAX_EVENTS = 400;\n\nlet runtime = null;\nlet cleanupInstalled = false;\nlet observedDomainResourceTypes = new Map();\n\nconst toSafeInt = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return 0;\n return Math.round(num);\n};\n\nconst toSafeFloat = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num)) return 0;\n return num;\n};\n\nconst normalizeResourceType = (value) => {\n const type = String(value || '').trim().toLowerCase();\n if (!type) return 'other';\n return type;\n};\n\nconst resolveHostname = (requestUrl) => {\n const raw = String(requestUrl || '').trim();\n if (!raw) return '';\n try {\n return String(new URL(raw).hostname || '').trim().toLowerCase();\n } catch {\n return '';\n }\n};\n\nconst recordDomainResourceType = (domain, resourceType) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return;\n const type = normalizeResourceType(resourceType);\n let byType = observedDomainResourceTypes.get(host);\n if (!byType) {\n byType = new Map();\n observedDomainResourceTypes.set(host, byType);\n }\n byType.set(type, (byType.get(type) || 0) + 1);\n};\n\nconst resolveResourceTypeMeta = (domain) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return { resourceType: '', resourceTypeCounts: undefined };\n const byType = observedDomainResourceTypes.get(host);\n if (!byType || byType.size === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n const entries = Array.from(byType.entries())\n .filter(([type, count]) => type && Number(count) > 0)\n .sort((a, b) => {\n if (Number(b[1]) !== Number(a[1])) return Number(b[1]) - Number(a[1]);\n return String(a[0]).localeCompare(String(b[0]));\n });\n if (entries.length === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n return {\n resourceType: entries[0][0],\n resourceTypeCounts: Object.fromEntries(entries.map(([type, count]) => [type, toSafeInt(count)])),\n };\n};\n\nconst resolveScriptPath = () => {\n const baseDir = typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n const internalCandidate = path.join(baseDir, 'internals', 'proxy-meter.js');\n if (existsSync(internalCandidate)) {\n return internalCandidate;\n }\n return path.join(baseDir, 'proxy-meter.js');\n};\n\nconst pickFreePort = () => {\n const script = [\n 'const net=require(\"net\");',\n 'const server=net.createServer();',\n 'server.listen(0,\"127.0.0.1\",()=>{',\n 'const port=server.address().port;',\n 'server.close(()=>{console.log(port);});',\n '});',\n ].join('');\n const result = spawnSync(process.execPath, ['-e', script], { encoding: 'utf8' });\n const port = Number(String(result.stdout || '').trim());\n if (result.status === 0 && Number.isFinite(port) && port > 0) {\n return port;\n }\n return 20000 + Math.floor(Math.random() * 20000);\n};\n\nconst resolveLogDir = () => {\n const storageDir = process.env.APIFY_STORAGE_DIR || process.env.APIFY_LOCAL_STORAGE_DIR || '';\n if (storageDir) {\n return path.join(storageDir, 'proxy-meter');\n }\n return path.join(tmpdir(), 'proxy-meter');\n};\n\nconst ensureLogPath = () => {\n const baseDir = resolveLogDir();\n if (!existsSync(baseDir)) {\n try {\n mkdirSync(baseDir, { recursive: true });\n } catch {}\n }\n const runId = String(process.env.APIFY_ACTOR_RUN_ID || '').trim();\n const suffix = `${Date.now()}-${Math.floor(Math.random() * 1000000)}`;\n const label = runId ? `proxy-meter-${runId}-${suffix}.json` : `proxy-meter-${process.pid}-${suffix}.json`;\n return path.join(baseDir, label);\n};\n\nconst readSnapshot = (logPath) => {\n if (!logPath || !existsSync(logPath)) return null;\n try {\n const raw = readFileSync(logPath, 'utf8');\n if (!raw) return null;\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst normalizeDomainRows = (hosts) => {\n const rows = [];\n let requestCount = 0;\n let connectCount = 0;\n\n for (const [domain, stat] of Object.entries(hosts || {})) {\n if (!stat || typeof stat !== 'object') continue;\n const inBytes = toSafeInt(stat.inBytes);\n const outBytes = toSafeInt(stat.outBytes);\n const requests = toSafeInt(stat.requests);\n const connections = toSafeInt(stat.connections);\n const totalBytes = inBytes + outBytes;\n requestCount += requests;\n connectCount += connections;\n if (totalBytes <= 0 && requests <= 0 && connections <= 0) continue;\n const resourceTypeMeta = resolveResourceTypeMeta(domain);\n rows.push({\n domain,\n inBytes,\n outBytes,\n totalBytes,\n requests,\n connections,\n resourceType: resourceTypeMeta.resourceType || undefined,\n resourceTypeCounts: resourceTypeMeta.resourceTypeCounts || undefined,\n });\n }\n\n rows.sort((a, b) => {\n if (b.totalBytes !== a.totalBytes) return b.totalBytes - a.totalBytes;\n if (b.requests !== a.requests) return b.requests - a.requests;\n return String(a.domain).localeCompare(String(b.domain));\n });\n\n return {\n topDomains: rows.slice(0, MAX_TOP_DOMAINS),\n requestCount,\n connectCount,\n };\n};\n\nconst normalizeDebugRows = (rows, type) => {\n if (!Array.isArray(rows) || rows.length === 0) return undefined;\n const normalized = rows\n .map((row) => {\n if (!row || typeof row !== 'object') return null;\n return {\n domain: String(row.domain || '').trim(),\n status: String(row.status || '').trim(),\n count: toSafeInt(row.count),\n failedCount: toSafeInt(row.failedCount),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n avgDurationMs: toSafeFloat(row.avgDurationMs),\n reconnectCount: toSafeInt(row.reconnectCount),\n largeResponseCount: toSafeInt(row.largeResponseCount),\n failureRatePct: toSafeFloat(row.failureRatePct),\n type,\n };\n })\n .filter((row) => row && row.domain && row.count > 0);\n return normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeDebugEvent = (row) => {\n if (!row || typeof row !== 'object') return null;\n const host = String(row.host || '').trim();\n if (!host) return null;\n return {\n ts: String(row.ts || ''),\n runId: String(row.runId || ''),\n channel: String(row.channel || ''),\n host,\n method: String(row.method || ''),\n path: String(row.path || ''),\n statusCode: toSafeInt(row.statusCode),\n durationMs: toSafeInt(row.durationMs),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n error: String(row.error || ''),\n };\n};\n\nconst normalizeDebugSummary = (debug) => {\n if (!debug || typeof debug !== 'object' || !debug.summary || typeof debug.summary !== 'object') {\n return null;\n }\n const summary = debug.summary;\n const domainStatus = normalizeDebugRows(summary.domainStatus, 'domain_status');\n const topFailureDomains = normalizeDebugRows(summary.topFailureDomains, 'top_failure');\n const topLargeDomains = normalizeDebugRows(summary.topLargeDomains, 'top_large');\n const topReconnectDomains = normalizeDebugRows(summary.topReconnectDomains, 'top_reconnect');\n\n return {\n enabled: Boolean(debug.enabled),\n sampledEvents: toSafeInt(debug.sampledEvents),\n droppedEvents: toSafeInt(debug.droppedEvents),\n totalEvents: toSafeInt(debug.totalEvents),\n largeResponseThresholdBytes: toSafeInt(summary.largeResponseThresholdBytes),\n requestCount: toSafeInt(summary.requestCount),\n failedCount: toSafeInt(summary.failedCount),\n failureRatePct: toSafeFloat(summary.failureRatePct),\n largeResponseCount: toSafeInt(summary.largeResponseCount),\n reconnectCount: toSafeInt(summary.reconnectCount),\n domainStatus,\n topFailureDomains,\n topLargeDomains,\n topReconnectDomains,\n };\n};\n\nconst normalizeSnapshot = (raw) => {\n if (!raw || typeof raw !== 'object') return null;\n const totalIn = toSafeInt(raw.totalInBytes);\n const totalOut = toSafeInt(raw.totalOutBytes);\n const domains = normalizeDomainRows(raw.hosts && typeof raw.hosts === 'object' ? raw.hosts : {});\n\n const normalized = {\n meter: 'proxy-meter-v1',\n totalBytes: totalIn + totalOut,\n uploadBytes: totalOut,\n downloadBytes: totalIn,\n requestCount: domains.requestCount,\n connectCount: domains.connectCount,\n topDomains: domains.topDomains,\n };\n\n const debug = raw.debug && typeof raw.debug === 'object' ? raw.debug : null;\n const summary = normalizeDebugSummary(debug);\n const events = Array.isArray(debug?.events)\n ? debug.events.map(normalizeDebugEvent).filter(Boolean)\n : [];\n if (summary) {\n normalized.trafficDebugSummary = summary;\n }\n if (events.length > 0) {\n normalized.trafficDebugEvents = events;\n }\n\n const hasSignal = normalized.totalBytes > 0\n || normalized.uploadBytes > 0\n || normalized.downloadBytes > 0\n || normalized.requestCount > 0\n || normalized.connectCount > 0\n || (normalized.topDomains && normalized.topDomains.length > 0)\n || Boolean(summary)\n || events.length > 0;\n\n if (!hasSignal) return null;\n return normalized;\n};\n\nconst registerCleanup = () => {\n if (cleanupInstalled) return;\n cleanupInstalled = true;\n const shutdown = () => {\n if (!runtime || !runtime.proc) return;\n try { runtime.proc.kill('SIGTERM'); } catch {}\n };\n process.once('exit', shutdown);\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n};\n\nconst startProxyMeter = (options = {}) => {\n const upstreamUrl = String(options.proxyUrl || '').trim();\n if (!upstreamUrl) return null;\n\n if (runtime && runtime.proc) {\n try { runtime.proc.kill('SIGTERM'); } catch {}\n runtime = null;\n }\n observedDomainResourceTypes = new Map();\n\n const port = pickFreePort();\n const logPath = ensureLogPath();\n const scriptPath = resolveScriptPath();\n const debugMode = Boolean(options.debugMode);\n const debugMaxEvents = Math.max(10, toSafeInt(options.debugMaxEvents) || DEFAULT_DEBUG_MAX_EVENTS);\n const env = {\n ...process.env,\n PROXY_METER_PORT: String(port),\n PROXY_METER_LOG: logPath,\n PROXY_METER_UPSTREAM: upstreamUrl,\n PROXY_METER_FLUSH_MS: String(FLUSH_INTERVAL_MS),\n PROXY_METER_DEBUG: debugMode ? '1' : '0',\n PROXY_METER_DEBUG_MAX_EVENTS: String(debugMaxEvents),\n };\n\n const child = spawn(process.execPath, [scriptPath], {\n env,\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n\n child.once('exit', (code) => {\n if (code && code !== 0) {\n logger.warn(`[proxy-meter] exited with code ${code}`);\n }\n });\n\n runtime = {\n proc: child,\n port,\n logPath,\n startedAt: Date.now(),\n };\n\n registerCleanup();\n return { server: `http://127.0.0.1:${port}` };\n};\n\nconst recordProxyMeterResourceType = (requestUrl, resourceType) => {\n if (!runtime) return;\n const host = resolveHostname(requestUrl);\n if (!host) return;\n recordDomainResourceType(host, resourceType);\n};\n\nconst stopProxyMeter = async () => {\n if (!runtime) return null;\n const { proc, logPath } = runtime;\n if (!proc || proc.killed) {\n runtime = null;\n return logPath || null;\n }\n\n await new Promise((resolve) => {\n const timeout = setTimeout(() => {\n try { proc.kill('SIGKILL'); } catch {}\n resolve();\n }, 2000);\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n try { proc.kill('SIGTERM'); } catch { resolve(); }\n });\n\n runtime = null;\n return logPath || null;\n};\n\nconst getProxyMeterSnapshot = async (options = {}) => {\n if (!runtime) return null;\n const finalize = Boolean(options.finalize);\n const logPath = finalize ? await stopProxyMeter() : runtime.logPath;\n const raw = readSnapshot(logPath);\n const snapshot = normalizeSnapshot(raw);\n if (finalize && logPath) {\n try { rmSync(logPath, { force: true }); } catch {}\n }\n return snapshot;\n};\n\nexport const ProxyMeterRuntime = {\n startProxyMeter,\n recordProxyMeterResourceType,\n stopProxyMeter,\n getProxyMeterSnapshot,\n};\n", "export const PageRuntimeStateKey = '__playwright_toolkit_runtime_state__';\n", "import { PageRuntimeStateKey } from './internals/constants.js';\n\nconst BROWSER_PROFILE_SCHEMA_VERSION = 1;\n\nlet rememberedRuntimeState = null;\n\nconst isPlainObject = (value) => value && typeof value === 'object' && !Array.isArray(value);\n\n// \u8FD0\u884C\u6001\u5FEB\u7167\u5728 visitor / toolkit / \u540E\u7AEF\u4E4B\u95F4\u6765\u56DE\u4F20\u9012\uFF0C\n// \u6240\u4EE5\u6240\u6709\u5165\u53E3\u90FD\u5148\u8D70 deepClone\uFF0C\u907F\u514D\u5171\u4EAB\u5F15\u7528\u5F15\u53D1\u201C\u8FB9\u8DD1\u8FB9\u6539\u201D\u7684\u9690\u5F0F\u526F\u4F5C\u7528\u3002\nconst deepClone = (value) => {\n if (value == null) return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n\t}\n};\n\n// \u5C1D\u8BD5\u628A runtime / browser_profile \u4E4B\u7C7B\u7684 JSON \u5B57\u6BB5\u89E3\u6790\u6210\u5BF9\u8C61\u3002\nconst tryParseJSON = (value) => {\n if (value == null) return null;\n if (typeof value === 'object') return value;\n const raw = String(value || '').trim();\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n\t}\n};\n\n// local/session \u7684\u89C4\u8303\u5316\u76EE\u6807\u53EA\u6709\u4E00\u4E2A\uFF1A\u8FC7\u6EE4\u7A7A\u503C\uFF0C\u7EDF\u4E00\u8F6C\u6210\u5B57\u7B26\u4E32\u3002\nconst normalizeLocalStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeSessionStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeCookieSameSite = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (!raw) return '';\n\n switch (raw) {\n case 'strict':\n return 'Strict';\n case 'lax':\n return 'Lax';\n case 'none':\n case 'no_restriction':\n return 'None';\n case 'unspecified':\n default:\n return '';\n }\n};\n\nconst normalizeCookieExpires = (raw = {}) => {\n const source = raw && typeof raw === 'object' ? raw : {};\n const session = Boolean(source.session);\n if (session) return null;\n\n const expiresCandidate = Number(source.expires);\n if (Number.isFinite(expiresCandidate) && expiresCandidate > 0) {\n return expiresCandidate;\n }\n\n const expirationDateCandidate = Number(source.expirationDate);\n if (Number.isFinite(expirationDateCandidate) && expirationDateCandidate > 0) {\n return expirationDateCandidate;\n }\n\n return null;\n};\n\nconst normalizeCookies = (value) => {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n const raw = item && typeof item === 'object' ? item : {};\n const name = String(raw.name || '').trim();\n const cookieValue = String(raw.value ?? '').trim();\n if (!name || !cookieValue || cookieValue === '<nil>') return null;\n const domain = String(raw.domain || '').trim();\n const url = normalizeHttpUrl(raw.url);\n const path = String(raw.path || '').trim() || '/';\n const sameSite = normalizeCookieSameSite(raw.sameSite);\n const expires = normalizeCookieExpires(raw);\n const secure = Boolean(raw.secure);\n const httpOnly = Boolean(raw.httpOnly);\n const partitionKey = typeof raw.partitionKey === 'string' ? String(raw.partitionKey).trim() : '';\n\n // \u7EDF\u4E00\u8F93\u51FA Playwright \u53EF\u63A5\u53D7\u7684 Cookie \u7ED3\u6784\uFF0C\u907F\u514D\u628A Chrome \u6269\u5C55\u4FA7\u5B57\u6BB5\u539F\u6837\u900F\u4F20\u8FC7\u53BB\u3002\n const normalized = {\n name,\n value: cookieValue,\n path,\n ...(domain ? { domain } : {}),\n ...(!domain && url ? { url } : {}),\n ...(sameSite ? { sameSite } : {}),\n ...(secure ? { secure: true } : {}),\n ...(httpOnly ? { httpOnly: true } : {}),\n ...(expires !== null ? { expires } : {}),\n ...(partitionKey ? { partitionKey } : {}),\n };\n\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n\n return {\n ...normalized,\n };\n })\n .filter(Boolean);\n};\n\nconst buildCookieMap = (cookies) => cookies.reduce((acc, item) => {\n\tacc[item.name] = item.value;\n\treturn acc;\n}, {});\n\n// \u7EDF\u4E00\u628A\u539F\u59CB URL \u5FEB\u7167\u8FC7\u6EE4\u6210 http/https\uFF0C\u907F\u514D browser/runtime \u4E24\u7AEF\u5404\u81EA\u505A\u4E00\u5957\u5224\u65AD\u3002\nconst normalizeHttpUrl = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return '';\n }\n};\n\nconst uniqueStrings = (value) => {\n const list = Array.isArray(value) ? value : [];\n const seen = new Set();\n const result = [];\n list.forEach((item) => {\n const normalized = String(item || '').trim();\n if (!normalized || seen.has(normalized)) return;\n seen.add(normalized);\n result.push(normalized);\n });\n return result;\n};\n\nconst normalizeHttpUrlList = (value) => uniqueStrings(\n (Array.isArray(value) ? value : [value])\n .map((item) => normalizeHttpUrl(item))\n .filter(Boolean),\n);\n\nconst normalizeCookieDomain = (value) => String(value || '').trim().replace(/^\\./, '').toLowerCase();\n\nconst normalizeCookiePath = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n};\n\nconst doesCookieMatchUrl = (cookie, url) => {\n if (!cookie || !url) return false;\n try {\n const parsed = new URL(url);\n const host = String(parsed.hostname || '').trim().toLowerCase();\n const pathname = String(parsed.pathname || '/').trim() || '/';\n const cookieDomain = normalizeCookieDomain(cookie.domain);\n const cookiePath = normalizeCookiePath(cookie.path);\n if (!host || !cookieDomain) return false;\n const domainMatched = host === cookieDomain || host.endsWith(`.${cookieDomain}`);\n if (!domainMatched) return false;\n if (cookie.secure && parsed.protocol !== 'https:') return false;\n return pathname.startsWith(cookiePath);\n } catch {\n return false;\n }\n};\n\nconst normalizeRawSnapshot = (value = {}) => {\n const source = isPlainObject(value) ? value : {};\n const pageUrl = normalizeHttpUrl(source.page_url ?? source.pageUrl);\n const frameUrls = normalizeHttpUrlList(source.frame_urls ?? source.frameUrls);\n const resourceUrls = normalizeHttpUrlList(source.resource_urls ?? source.resourceUrls);\n const browserProfileObservedSource =\n source.browser_profile_observed\n ?? source.browserProfileObserved\n ?? source.browser_profile?.observed\n ?? source.browserProfile?.observed\n ?? source.browserProfile;\n\n return {\n page_url: pageUrl,\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n cookies: Array.isArray(source.cookies) ? deepClone(source.cookies) : [],\n local_storage: normalizeLocalStorage(source.local_storage ?? source.localStorage),\n session_storage: normalizeSessionStorage(source.session_storage ?? source.sessionStorage),\n browser_profile_observed: normalizeObservedBrowserProfile(browserProfileObservedSource),\n };\n};\n\nconst collectCookieUrlsFromSnapshot = (snapshot = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n return uniqueStrings([\n normalized.page_url,\n ...normalized.frame_urls,\n ...normalized.resource_urls,\n ].filter(Boolean));\n};\n\nconst filterCookiesBySnapshot = (cookies = [], snapshot = {}) => {\n const normalizedCookies = normalizeCookies(cookies);\n const cookieUrls = collectCookieUrlsFromSnapshot(snapshot);\n if (cookieUrls.length === 0) {\n return normalizedCookies;\n }\n return normalizedCookies.filter((cookie) => cookieUrls.some((url) => doesCookieMatchUrl(cookie, url)));\n};\n\nconst buildEnvPayloadFromSnapshot = (snapshot = {}, options = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n const cookies = filterCookiesBySnapshot(snapshot?.cookies || normalized.cookies, normalized);\n const localStorage = normalized.local_storage;\n const sessionStorage = normalized.session_storage;\n const browserProfileCore = normalizeBrowserProfileCore(\n options.browserProfileCore\n ?? snapshot?.browser_profile?.core\n ?? snapshot?.browserProfile?.core,\n );\n const browserProfile = buildBrowserProfilePayload(browserProfileCore, normalized.browser_profile_observed);\n\n const payload = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(payload).length > 0 ? payload : null;\n};\n\nconst captureRawSnapshotFromPage = async (page) => {\n const frameUrls = typeof page?.frames === 'function'\n ? page.frames().map((frame) => {\n try {\n return frame.url();\n } catch {\n return '';\n }\n })\n : [];\n\n const snapshot = await page.evaluate(() => {\n const localStorage = {};\n const sessionStorage = {};\n const resourceUrls = [];\n const frameUrls = [];\n\n try {\n for (let i = 0; i < window.localStorage.length; i += 1) {\n const key = window.localStorage.key(i);\n if (!key) continue;\n const value = window.localStorage.getItem(key);\n if (value !== null) localStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n for (let i = 0; i < window.sessionStorage.length; i += 1) {\n const key = window.sessionStorage.key(i);\n if (!key) continue;\n const value = window.sessionStorage.getItem(key);\n if (value !== null) sessionStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n const perfEntries = performance.getEntriesByType('resource') || [];\n perfEntries.forEach((entry) => {\n const name = String(entry?.name || '').trim();\n if (name) resourceUrls.push(name);\n });\n } catch {\n // ignore\n }\n\n try {\n document.querySelectorAll('iframe,frame').forEach((node) => {\n const src = String(node?.src || '').trim();\n if (src) frameUrls.push(src);\n });\n } catch {\n // ignore\n }\n\n const nav = window.navigator || {};\n const screen = window.screen || {};\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n\n return {\n page_url: window.location.href || '',\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n local_storage: localStorage,\n session_storage: sessionStorage,\n browser_profile_observed: {\n user_agent: nav.userAgent || '',\n platform: nav.platform || '',\n language: nav.language || '',\n languages: Array.isArray(nav.languages) ? nav.languages : [],\n hardware_concurrency: Number(nav.hardwareConcurrency || 0),\n device_memory: Number(nav.deviceMemory || 0),\n timezone,\n viewport: {\n width: Number(window.innerWidth || 0),\n height: Number(window.innerHeight || 0),\n },\n screen: {\n width: Number(screen.width || 0),\n height: Number(screen.height || 0),\n avail_width: Number(screen.availWidth || 0),\n avail_height: Number(screen.availHeight || 0),\n color_depth: Number(screen.colorDepth || 0),\n pixel_depth: Number(screen.pixelDepth || 0),\n },\n },\n };\n });\n\n return normalizeRawSnapshot({\n ...snapshot,\n frame_urls: [...frameUrls, ...(snapshot?.frame_urls || [])],\n });\n};\n\n// observed \u53EA\u4FDD\u5B58\u201C\u8FD0\u884C\u540E\u770B\u5230\u7684\u6D4F\u89C8\u5668\u8868\u73B0\u201D\uFF0C\u5B83\u4E0D\u662F\u542F\u52A8\u771F\u6E90\u3002\nconst normalizeObservedBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const stringFields = {\n user_agent: source.user_agent,\n platform: source.platform,\n language: source.language,\n timezone: source.timezone,\n };\n Object.entries(stringFields).forEach(([key, item]) => {\n const safeValue = String(item || '').trim();\n if (safeValue) {\n profile[key] = safeValue;\n }\n });\n\n if (Array.isArray(source.languages)) {\n const languages = source.languages\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n if (languages.length > 0) {\n profile.languages = languages;\n }\n }\n\n const numericFields = {\n hardware_concurrency: Number(source.hardware_concurrency || 0),\n device_memory: Number(source.device_memory || 0),\n };\n Object.entries(numericFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n profile[key] = item;\n }\n });\n\n if (isPlainObject(source.viewport)) {\n const width = Number(source.viewport.width || 0);\n const height = Number(source.viewport.height || 0);\n if (width > 0 && height > 0) {\n profile.viewport = { width, height };\n }\n }\n\n if (isPlainObject(source.screen)) {\n const screenProfile = {};\n const screenFields = {\n width: Number(source.screen.width || 0),\n height: Number(source.screen.height || 0),\n avail_width: Number(source.screen.avail_width || 0),\n avail_height: Number(source.screen.avail_height || 0),\n color_depth: Number(source.screen.color_depth || 0),\n pixel_depth: Number(source.screen.pixel_depth || 0),\n };\n Object.entries(screenFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n screenProfile[key] = item;\n }\n });\n if (Object.keys(screenProfile).length > 0) {\n profile.screen = screenProfile;\n }\n }\n\n\treturn profile;\n};\n\n// core \u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u552F\u4E00\u771F\u6E90\uFF1A\n// fingerprint / timezone_id / locale / browser_major_version \u90FD\u5728\u8FD9\u91CC\u3002\nconst normalizeBrowserProfileCore = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n if (isPlainObject(source.fingerprint) && Object.keys(source.fingerprint).length > 0) {\n profile.fingerprint = deepClone(source.fingerprint);\n }\n\n const timezoneId = String(source.timezone_id || '').trim();\n if (timezoneId) {\n profile.timezone_id = timezoneId;\n }\n\n const locale = String(source.locale || '').trim();\n if (locale) {\n profile.locale = locale;\n }\n\n const browserMajorVersion = Number(source.browser_major_version || 0);\n if (Number.isFinite(browserMajorVersion) && browserMajorVersion > 0) {\n profile.browser_major_version = browserMajorVersion;\n }\n\n const schemaVersion = Number(source.schema_version || 0);\n if (Number.isFinite(schemaVersion) && schemaVersion > 0) {\n profile.schema_version = schemaVersion;\n } else if (Object.keys(profile).length > 0) {\n profile.schema_version = BROWSER_PROFILE_SCHEMA_VERSION;\n }\n\n\treturn profile;\n};\n\n// buildBrowserProfilePayload \u4FDD\u8BC1 browser_profile \u6C38\u8FDC\u53EA\u66B4\u9732 core / observed \u4E24\u5C42\u7ED3\u6784\u3002\nconst buildBrowserProfilePayload = (core = {}, observed = {}) => {\n const payload = {};\n if (isPlainObject(core) && Object.keys(core).length > 0) {\n payload.core = core;\n }\n if (isPlainObject(observed) && Object.keys(observed).length > 0) {\n payload.observed = observed;\n }\n return payload;\n};\n\nconst mergePlainObject = (target = {}, source = {}) => {\n const next = isPlainObject(target) ? deepClone(target) : {};\n if (!isPlainObject(source)) return next;\n\n Object.entries(source).forEach(([key, value]) => {\n if (!key) return;\n if (isPlainObject(value) && isPlainObject(next[key])) {\n next[key] = mergePlainObject(next[key], value);\n return;\n }\n next[key] = deepClone(value);\n });\n\n\treturn next;\n};\n\n// mergeBrowserProfilePayload \u7684\u6838\u5FC3\u89C4\u5219\uFF1A\n// 1. core \u53EA\u5728\u5F53\u524D\u4E3A\u7A7A\uFF0C\u6216\u6D4F\u89C8\u5668\u5927\u7248\u672C\u51B2\u7A81\u65F6\u624D\u66FF\u6362\uFF1B\n// 2. observed \u6BCF\u6B21\u90FD\u5141\u8BB8\u8986\u76D6\u66F4\u65B0\u3002\nconst mergeBrowserProfilePayload = (target = {}, source = {}) => {\n const current = isPlainObject(target) ? target : {};\n const incoming = isPlainObject(source) ? source : {};\n const currentCore = normalizeBrowserProfileCore(current.core);\n const incomingCore = normalizeBrowserProfileCore(incoming.core);\n const currentObserved = normalizeObservedBrowserProfile(current.observed);\n const incomingObserved = normalizeObservedBrowserProfile(incoming.observed);\n\n let mergedCore = currentCore;\n if (Object.keys(mergedCore).length === 0 && Object.keys(incomingCore).length > 0) {\n mergedCore = incomingCore;\n } else if (Object.keys(incomingCore).length > 0) {\n const currentVersion = Number(currentCore.browser_major_version || 0);\n const incomingVersion = Number(incomingCore.browser_major_version || 0);\n if (currentVersion > 0 && incomingVersion > 0 && currentVersion !== incomingVersion) {\n mergedCore = incomingCore;\n }\n }\n\n const mergedObserved = mergePlainObject(currentObserved, incomingObserved);\n\treturn buildBrowserProfilePayload(mergedCore, mergedObserved);\n};\n\n// mergeEnvPatchObjects \u662F visitor \u6210\u529F/\u5931\u8D25\u81EA\u52A8\u56DE\u5199 env_patch \u7684\u5408\u5E76\u5165\u53E3\u3002\nconst mergeEnvPatchObjects = (...patches) => {\n const merged = {};\n\n patches.forEach((patch) => {\n if (!isPlainObject(patch)) return;\n Object.entries(patch).forEach(([key, value]) => {\n if (!key) return;\n if (key === 'browser_profile') {\n const browserProfile = mergeBrowserProfilePayload(merged.browser_profile, value);\n if (Object.keys(browserProfile).length > 0) {\n merged.browser_profile = browserProfile;\n }\n return;\n }\n if (isPlainObject(value) && isPlainObject(merged[key])) {\n merged[key] = mergePlainObject(merged[key], value);\n return;\n }\n merged[key] = deepClone(value);\n });\n });\n\n return Object.keys(merged).length > 0 ? merged : null;\n};\n\nconst normalizeBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const coreSource = isPlainObject(source.core) ? source.core : {};\n const observedSource = isPlainObject(source.observed) ? source.observed : {};\n const core = normalizeBrowserProfileCore(coreSource);\n const observed = normalizeObservedBrowserProfile(observedSource);\n return {\n core,\n observed,\n payload: buildBrowserProfilePayload(core, observed),\n };\n};\n\nconst rememberRuntimeState = (state) => {\n rememberedRuntimeState = deepClone(state);\n return rememberedRuntimeState;\n};\n\nconst normalizeRuntimeState = (source = {}, actor = '') => {\n if (\n source &&\n typeof source === 'object' &&\n source.runtime &&\n typeof source.runtime === 'object' &&\n !Array.isArray(source.runtime) &&\n Object.prototype.hasOwnProperty.call(source, 'browserProfileCore')\n ) {\n return source;\n }\n return RuntimeEnv.parseInput(source, actor);\n};\n\nexport const RuntimeEnv = {\n tryParseJSON,\n normalizeCookies,\n normalizeLocalStorage,\n normalizeSessionStorage,\n normalizeBrowserProfileCore,\n normalizeObservedBrowserProfile,\n normalizeSnapshot(snapshot = {}) {\n return normalizeRawSnapshot(snapshot);\n },\n collectCookieUrls(snapshot = {}) {\n return collectCookieUrlsFromSnapshot(snapshot);\n },\n buildRuntimeEnvFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n buildEnvPatchFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n mergeEnvPatches(...patches) {\n return mergeEnvPatchObjects(...patches);\n },\n\n // parseInput \u628A Actor \u8F93\u5165\u91CC\u7684 runtime \u5B57\u6BB5\u6807\u51C6\u5316\u6210 toolkit \u5185\u90E8\u7EDF\u4E00\u7ED3\u6784\u3002\n // \u540E\u7EED visitor \u53EA\u548C\u8FD9\u4E2A state \u4EA4\u4E92\uFF0C\u4E0D\u518D\u81EA\u5DF1\u62FC token/cookie \u903B\u8F91\u3002\n parseInput(input = {}, actor = '') {\n const runtime = tryParseJSON(input?.runtime) || {};\n const resolvedActor = String(actor || input?.actor || '').trim();\n const query = String(input?.query || '').trim();\n const cookies = normalizeCookies(runtime?.cookies);\n const cookieMap = buildCookieMap(cookies);\n const localStorage = normalizeLocalStorage(runtime?.local_storage);\n const sessionStorage = normalizeSessionStorage(runtime?.session_storage);\n const browserProfile = normalizeBrowserProfile(runtime?.browser_profile);\n const envId = String(input?.env_id || '').trim();\n\n const normalizedRuntime = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n };\n if (Object.keys(browserProfile.payload).length > 0) {\n normalizedRuntime.browser_profile = browserProfile.payload;\n } else {\n delete normalizedRuntime.browser_profile;\n }\n\n const state = {\n actor: resolvedActor,\n runtime: normalizedRuntime,\n envId,\n query,\n cookies,\n cookieMap,\n localStorage,\n sessionStorage,\n browserProfile: browserProfile.payload,\n browserProfileCore: browserProfile.core,\n browserProfileObserved: browserProfile.observed,\n };\n rememberRuntimeState(state);\n return state;\n },\n\n // buildEnvPatch \u53EA\u6784\u9020\u5141\u8BB8\u56DE\u5199\u5230\u540E\u7AEF env \u7684\u5B57\u6BB5\u96C6\u5408\u3002\n buildEnvPatch(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);\n const envPatch = {\n ...(Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {}),\n ...(Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {}),\n ...(Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(envPatch).length > 0 ? envPatch : null;\n },\n\n // hasLoginState \u53EA\u5224\u65AD runtime \u662F\u5426\u5B58\u5728\u6709\u6548\u8F7D\u8377\uFF0C\u4E0D\u518D\u533A\u5206\u5177\u4F53\u5B57\u6BB5\u6765\u6E90\u3002\n hasLoginState(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;\n },\n\n rememberState(source = {}) {\n const state = normalizeRuntimeState(source);\n rememberRuntimeState(state);\n return RuntimeEnv.peekRememberedState();\n },\n\n peekRememberedState() {\n return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;\n },\n\n getBrowserProfileCore(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return deepClone(state.browserProfileCore || {});\n },\n\n setBrowserProfileCore(source = {}, core = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const normalizedCore = normalizeBrowserProfileCore(core);\n state.browserProfileCore = normalizedCore;\n state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);\n if (Object.keys(state.browserProfile).length > 0) {\n state.runtime.browser_profile = state.browserProfile;\n } else {\n delete state.runtime.browser_profile;\n }\n rememberRuntimeState(state);\n return state;\n },\n\n // applyToPage \u53EA\u8D1F\u8D23\u628A\u767B\u5F55\u6001\u76F8\u5173\u5B57\u6BB5\u6CE8\u5165\u9875\u9762\uFF1A\n // cookies / localStorage / sessionStorage\u3002\n // \u6307\u7EB9\u3001\u65F6\u533A\u3001UA\u3001viewport \u7684\u56DE\u653E\u53D1\u751F\u5728 launch.js \u542F\u52A8\u9636\u6BB5\uFF0C\u4E0D\u5728\u8FD9\u91CC\u505A\u3002\n async applyToPage(page, source = {}, options = {}) {\n if (!page) return;\n const state = normalizeRuntimeState(source, options?.actor || '');\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n const localStorage = state.localStorage || {};\n const sessionStorage = state.sessionStorage || {};\n const cookies = (state.cookies || [])\n .map((cookie) => {\n const normalized = { ...cookie };\n if (!normalized.path) {\n normalized.path = '/';\n }\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n return normalized;\n })\n .filter(Boolean);\n\n if (cookies.length > 0) {\n await page.context().addCookies(cookies);\n }\n if (Object.keys(localStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.localStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, localStorage);\n }\n if (Object.keys(sessionStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.sessionStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, sessionStorage);\n }\n },\n\n // captureEnvPatch \u5728\u4EFB\u52A1\u7ED3\u675F\u65F6\u91C7\u96C6\u6700\u65B0\u73AF\u5883\u5FEB\u7167\uFF0C\u7528\u4E8E pushSuccess / pushFailed \u81EA\u52A8\u56DE\u5199\u3002\n async captureEnvPatch(page, source = {}, options = {}) {\n const state = normalizeRuntimeState(source, options?.actor || '');\n const baseline = RuntimeEnv.buildEnvPatch(state) || {};\n if (!page || typeof page.evaluate !== 'function' || typeof page.context !== 'function') {\n return Object.keys(baseline).length > 0 ? baseline : null;\n }\n\n try {\n const rawSnapshot = await captureRawSnapshotFromPage(page);\n const cookieUrls = collectCookieUrlsFromSnapshot(rawSnapshot);\n let cookies = [];\n try {\n cookies = cookieUrls.length > 0\n ? await page.context().cookies(cookieUrls)\n : await page.context().cookies();\n } catch {\n cookies = [];\n }\n const capturedPatch = RuntimeEnv.buildEnvPatchFromSnapshot(\n {\n ...rawSnapshot,\n cookies,\n },\n {\n browserProfileCore: state.browserProfileCore,\n },\n );\n return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);\n } catch {\n // ignore\n }\n return Object.keys(baseline).length > 0 ? baseline : null;\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('InternalUtils');\n\n/**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\nexport const parseCookies = (cookieString, domain) => {\n const cookies = [];\n const pairs = cookieString.split(';').map(c => c.trim());\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.split('=');\n if (name && valueParts.length > 0) {\n const cookie = {\n name: name.trim(),\n value: valueParts.join('=').trim(),\n path: '/',\n };\n if (domain) {\n cookie.domain = domain;\n }\n cookies.push(cookie);\n }\n }\n logger.success('parseCookies', `parsed ${cookies.length} cookies`);\n return cookies;\n};\n", "import { parseCookies as internalParseCookies } from './internals/utils.js';\n\nexport const Utils = {\n /**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\n parseCookies(cookieString, domain) {\n return internalParseCookies(cookieString, domain);\n },\n\n /**\n * \u4ECE\u5B57\u7B26\u4E32\u4E2D\u63D0\u53D6 URL \u94FE\u63A5\n * @param {string} text\n * @param {Object} [options]\n * @param {string} [options.prefix] - \u4EC5\u8FD4\u56DE\u6B64\u524D\u7F00\u5F00\u5934\uFF0C\u4E14\u524D\u7F00\u540E\u81F3\u5C11 1 \u4F4D\u5B57\u7B26\u7684\u94FE\u63A5\n * @returns {string[]}\n */\n parseLinks(text, options = {}) {\n const raw = String(text || '');\n if (!raw) return [];\n\n const opts = options && typeof options === 'object' ? options : {};\n const prefix = String(opts.prefix || '').trim();\n\n const matched = raw.match(/https?:\\/\\/[\\w\\-._~:/?#[\\]@!$&'()*+,;=%]+/g) || [];\n const unique = new Set();\n\n for (const item of matched) {\n const link = String(item || '').trim().replace(/[\"'\u201C\u201D\u2018\u2019>\\].,\uFF0C\u3002\uFF1B;!\uFF01?\uFF1F]+$/, '');\n if (!link || !/^https?:\\/\\//i.test(link)) continue;\n\n if (prefix) {\n if (!link.startsWith(prefix)) continue;\n if (link.length <= prefix.length) continue;\n }\n\n unique.add(link);\n }\n\n return Array.from(unique);\n },\n}\n", "import { createInternalLogger } from './internals/logger';\n\nconst logger = createInternalLogger('AntiCheat');\n\nconst BASE_CONFIG = Object.freeze({\n locale: 'zh-CN',\n acceptLanguage: 'zh-CN,zh;q=0.9',\n timezoneId: 'Asia/Shanghai',\n timezoneOffset: -480,\n geolocation: null,\n});\n\n// \u6700\u5C0F\u5316\u542F\u52A8\u53C2\u6570\uFF0C\u4F9D\u8D56 Crawlee/Playwright \u9ED8\u8BA4\u884C\u4E3A\nconst DEFAULT_LAUNCH_ARGS = [\n // '--disable-blink-features=AutomationControlled', // Crawlee \u53EF\u80FD\u4F1A\u81EA\u52A8\u5904\u7406\uFF0C\u8FC7\u591A\u5E72\u9884\u53CD\u800C\u4F1A\u88AB\u8BC6\u522B\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--window-position=0,0',\n];\n\nfunction buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVersion = 0 } = {}) {\n const normalizedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const browserDescriptor = normalizedBrowserMajorVersion > 0\n ? [{ name: 'chrome', minVersion: normalizedBrowserMajorVersion, maxVersion: normalizedBrowserMajorVersion }]\n : [{ name: 'chrome', minVersion: 110 }];\n\n return {\n browsers: browserDescriptor,\n devices: ['desktop'],\n operatingSystems: ['windows', 'macos', 'linux'],\n locales: [locale],\n };\n}\n\nexport const AntiCheat = {\n /**\n * \u83B7\u53D6\u7EDF\u4E00\u7684\u57FA\u7840\u914D\u7F6E\n */\n getBaseConfig() {\n return { ...BASE_CONFIG };\n },\n\n /**\n * \u7528\u4E8E Crawlee fingerprint generator \u7684\u7EDF\u4E00\u914D\u7F6E\uFF08\u684C\u9762\u7AEF\uFF09\u3002\n */\n getFingerprintGeneratorOptions(options = {}) {\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u83B7\u53D6\u57FA\u7840\u542F\u52A8\u53C2\u6570\u3002\n */\n getLaunchArgs(options = {}) {\n const locale = String(options?.locale || BASE_CONFIG.locale).trim() || BASE_CONFIG.locale;\n return [...DEFAULT_LAUNCH_ARGS, `--lang=${locale}`];\n },\n\n /**\n * \u4E3A got-scraping \u751F\u6210\u4E0E\u6D4F\u89C8\u5668\u4E00\u81F4\u7684 TLS \u6307\u7EB9\u914D\u7F6E\uFF08\u684C\u9762\u7AEF\uFF09\u3002\n */\n getTlsFingerprintOptions(userAgent = '', acceptLanguage = '') {\n // \u7B80\u5316\u903B\u8F91\uFF0C\u4E0D\u518D\u89E3\u6790 acceptLanguage\uFF0C\u4EC5\u63D0\u4F9B\u57FA\u7840\u6307\u7EB9\u914D\u7F6E\n return buildFingerprintOptions();\n },\n\n /**\n * \u89C4\u8303\u5316\u8BF7\u6C42\u5934\n */\n applyLocaleHeaders(headers, acceptLanguage = '') {\n if (!headers['accept-language']) {\n headers['accept-language'] = acceptLanguage || BASE_CONFIG.acceptLanguage;\n }\n return headers;\n },\n};\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Humanize');\n\n// \u5185\u90E8 cursor \u5B9E\u4F8B\u7F13\u5B58 (\u6BCF\u4E2A page \u4E00\u4E2A) - \u4E0D\u5BF9\u5916\u66B4\u9732\nconst $CursorWeakMap = new WeakMap();\n\n/**\n * \u5185\u90E8\u65B9\u6CD5\uFF1A\u83B7\u53D6\u9875\u9762\u7684 cursor\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u629B\u51FA\u9519\u8BEF\n */\nfunction $GetCursor(page) {\n const cursor = $CursorWeakMap.get(page);\n if (!cursor) {\n throw new Error('Cursor \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 Humanize.initializeCursor(page)');\n }\n return cursor;\n}\n\nexport const Humanize = {\n /**\n * \u751F\u6210\u5E26\u6296\u52A8\u7684\u6BEB\u79D2\u6570 - \u57FA\u4E8E\u57FA\u7840\u503C\u6DFB\u52A0\u968F\u673A\u6D6E\u52A8 (\u00B130% \u9ED8\u8BA4)\n * @param {number} base - \u57FA\u7840\u5EF6\u8FDF (ms)\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4 (0.3 = \u00B130%)\n * @returns {number} \u6296\u52A8\u540E\u7684\u6BEB\u79D2\u6570\n */\n jitterMs(base, jitterPercent = 0.3) {\n const jitter = base * jitterPercent * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(base + jitter));\n },\n\n /**\n * \u521D\u59CB\u5316\u9875\u9762\u7684 Ghost Cursor\uFF08\u5FC5\u987B\u5728\u4F7F\u7528\u5176\u4ED6 cursor \u76F8\u5173\u65B9\u6CD5\u524D\u8C03\u7528\uFF09\n * \n * @param {import('playwright').Page} page\n * @returns {Promise<void>}\n */\n async initializeCursor(page) {\n if ($CursorWeakMap.has(page)) {\n logger.debug('initializeCursor: cursor already exists, skipping');\n return;\n }\n logger.start('initializeCursor', 'creating cursor');\n const cursor = await createCursor(page);\n $CursorWeakMap.set(page, cursor);\n logger.success('initializeCursor', 'cursor initialized');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u9F20\u6807\u79FB\u52A8 - \u4F7F\u7528 ghost-cursor \u79FB\u52A8\u5230\u6307\u5B9A\u4F4D\u7F6E\u6216\u5143\u7D20\n * \n * @param {import('playwright').Page} page\n * @param {string|{x: number, y: number}|import('playwright').ElementHandle} target - CSS\u9009\u62E9\u5668\u3001\u5750\u6807\u5BF9\u8C61\u6216\u5143\u7D20\u53E5\u67C4\n */\n async humanMove(page, target) {\n const cursor = $GetCursor(page);\n logger.start('humanMove', `target=${typeof target === 'string' ? target : 'element/coords'}`);\n try {\n if (typeof target === 'string') {\n // CSS \u9009\u62E9\u5668\n const element = await page.$(target);\n if (!element) {\n logger.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);\n return false;\n }\n const box = await element.boundingBox();\n if (!box) {\n logger.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);\n return false;\n }\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n } else if (target && typeof target.x === 'number' && typeof target.y === 'number') {\n // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\n const box = await target.boundingBox();\n if (box) {\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n }\n }\n logger.success('humanMove');\n return true;\n } catch (error) {\n logger.fail('humanMove', error);\n throw error;\n }\n },\n\n /**\n * \u6E10\u8FDB\u5F0F\u6EDA\u52A8\u5230\u5143\u7D20\u53EF\u89C1\uFF08\u4EC5\u5904\u7406 Y \u8F74\u6EDA\u52A8\uFF09\n * \u8FD4\u56DE restore \u65B9\u6CD5\uFF0C\u7528\u4E8E\u5C06\u6EDA\u52A8\u5BB9\u5668\u6062\u590D\u5230\u539F\u4F4D\u7F6E\n * \n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} target - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\n * @param {Object} [options]\n * @param {number} [options.maxSteps=14] - \u6700\u5927\u6EDA\u52A8\u6B65\u6570\n * @param {number} [options.minStep=260] - \u5355\u6B21\u6EDA\u52A8\u6700\u5C0F\u6B65\u957F\n * @param {number} [options.maxStep=800] - \u5355\u6B21\u6EDA\u52A8\u6700\u5927\u6B65\u957F\n * @param {number} [options.maxDurationMs] - \u6700\u957F\u8017\u65F6\u4E0A\u9650 (\u9ED8\u8BA4\u968F maxSteps \u4F30\u7B97)\n */\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 14,\n minStep = 260,\n maxStep = 800,\n maxDurationMs = maxSteps * 220 + 800\n } = options;\n const targetDesc = typeof target === 'string' ? target : 'ElementHandle';\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);\n return { element: null, didScroll: false };\n }\n } else {\n element = target;\n }\n\n const cursor = $GetCursor(page);\n let didScroll = false;\n\n // \u8F85\u52A9\u51FD\u6570\uFF1A\u68C0\u67E5\u53EF\u89C1\u6027\u548C\u906E\u6321\n const checkVisibility = async () => {\n return await element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width === 0 || rect.height === 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6' };\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const viewH = window.innerHeight;\n const viewW = window.innerWidth;\n let isFixed = false;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && style.position === 'fixed') {\n isFixed = true;\n break;\n }\n }\n\n // 1. \u68C0\u67E5\u662F\u5426\u5728\u51E0\u4F55\u89C6\u53E3\u5185\n if (cy < 0 || cy > viewH || cx < 0 || cx > viewW) {\n // \u8BA1\u7B97\u6240\u9700\u65B9\u5411\n const direction = cy < 0 ? 'up' : (cy > viewH ? 'down' : 'unknown');\n return { code: 'OUT_OF_VIEWPORT', reason: '\u4E0D\u5728\u89C6\u53E3\u5185', direction, cy, viewH, isFixed };\n }\n\n // 2. \u68C0\u67E5\u906E\u6321\n const pointElement = document.elementFromPoint(cx, cy);\n if (pointElement && !el.contains(pointElement) && !pointElement.contains(el)) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n obstruction: {\n tag: pointElement.tagName,\n id: pointElement.id,\n className: pointElement.className\n },\n cy, // Return Center Y for smart direction calculation\n viewH,\n isFixed\n };\n }\n\n return { code: 'VISIBLE', isFixed };\n });\n };\n\n const getScrollableRect = async () => {\n return await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n };\n\n const startTime = Date.now();\n\n try {\n for (let i = 0; i < maxSteps; i++) {\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);\n return { element, didScroll };\n }\n\n const status = await checkVisibility();\n\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ''}`);\n\n if (status.code === 'OBSTRUCTED' && status.obstruction) {\n logger.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id=\"${status.obstruction.id}\">`);\n }\n\n const scrollRect = await getScrollableRect();\n if (!scrollRect && status.isFixed) {\n logger.warn('humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n\n // \u786E\u5B9A\u6EDA\u52A8\u65B9\u5411\u548C\u8DDD\u79BB\n let deltaY = 0;\n if (status.code === 'OUT_OF_VIEWPORT') {\n if (status.direction === 'down') {\n deltaY = stepMin + Math.random() * (stepMax - stepMin);\n } else if (status.direction === 'up') {\n deltaY = -(stepMin + Math.random() * (stepMax - stepMin));\n } else {\n // \u6C34\u5E73\u95EE\u9898\u6216\u5947\u602A\u72B6\u6001\uFF0C\u5C1D\u8BD5\u5411\u4E0B\u6EDA\u52A8\u4E00\u70B9\n deltaY = 100;\n }\n } else if (status.code === 'OBSTRUCTED') {\n // \u667A\u80FD\u907F\u8BA9\u906E\u6321\n // \u5982\u679C\u5143\u7D20\u5728\u89C6\u53E3\u4E0B\u534A\u90E8\u5206\u88AB\u906E\u6321\uFF0C\u901A\u5E38\u662F\u88AB\u5E95\u90E8\u56FA\u5B9A\u5143\u7D20\uFF08\u5982 Footer\uFF09\u906E\u6321 -> \u9700\u8981\u5411\u4E0B\u6EDA\u52A8\u66F4\u591A\uFF08\u5185\u5BB9\u4E0A\u79FB\uFF09\n // \u5982\u679C\u5143\u7D20\u5728\u89C6\u53E3\u4E0A\u534A\u90E8\u5206\u88AB\u906E\u6321\uFF0C\u901A\u5E38\u662F\u88AB\u9876\u90E8\u56FA\u5B9A\u5143\u7D20\uFF08\u5982 Header\uFF09\u906E\u6321 -> \u9700\u8981\u5411\u4E0A\u6EDA\u52A8\u66F4\u591A\uFF08\u5185\u5BB9\u4E0B\u79FB\uFF09\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n const isBottomHalf = status.cy > halfY;\n const direction = isBottomHalf ? 1 : -1;\n\n // \u57FA\u7840\u6EDA\u52A8\u91CF + \u968F\u673A\u6CE2\u52A8\n deltaY = direction * (stepMin + Math.random() * 50);\n }\n\n // \u5C06\u9F20\u6807\u79FB\u52A8\u5230\u53EF\u6EDA\u52A8\u5BB9\u5668\uFF08\u4F18\u5148\uFF09\uFF0C\u5426\u5219\u79FB\u52A8\u5230\u89C6\u53E3\u4E2D\u5FC3\n if (i === 0) {\n const viewSize = page.viewportSize();\n if (scrollRect) {\n const safeX = scrollRect.x + scrollRect.width * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.width * 0.4);\n const safeY = scrollRect.y + scrollRect.height * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.height * 0.4);\n await cursor.actions.move({ x: safeX, y: safeY });\n } else if (viewSize) {\n const safeX = viewSize.width * 0.5 + (Math.random() - 0.5) * 80;\n const safeY = viewSize.height * 0.5 + (Math.random() - 0.5) * 80;\n await cursor.actions.move({ x: safeX, y: safeY });\n }\n }\n\n // \u6267\u884C\u6EDA\u52A8\n await page.mouse.wheel(0, deltaY);\n didScroll = true;\n\n // \u7B49\u5F85\u6EDA\u52A8\u7A33\u5B9A - \u7D27\u51D1\u8282\u594F (20ms - 60ms)\n await delay(this.jitterMs(20 + Math.random() * 40, 0.2));\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll };\n\n } catch (error) {\n logger.fail('humanScroll', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u70B9\u51FB - \u4F7F\u7528 ghost-cursor \u6A21\u62DF\u4EBA\u7C7B\u9F20\u6807\u79FB\u52A8\u8F68\u8FF9\u5E76\u70B9\u51FB\n * \n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} [target] - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\u3002\u5982\u679C\u4E3A\u7A7A\uFF0C\u5219\u70B9\u51FB\u5F53\u524D\u9F20\u6807\u4F4D\u7F6E\n * @param {Object} [options]\n * @param {number} [options.reactionDelay=250] - \u53CD\u5E94\u5EF6\u8FDF\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B130% \u6296\u52A8\n * @param {boolean} [options.throwOnMissing=true] - \u5143\u7D20\u4E0D\u5B58\u5728\u65F6\u662F\u5426\u629B\u51FA\u9519\u8BEF\n * @param {boolean} [options.scrollIfNeeded=true] - \u5143\u7D20\u4E0D\u5728\u89C6\u53E3\u65F6\u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u589E\u52A0 restore \u9009\u9879\uFF0C\u9ED8\u8BA4 false (\u4E0D\u8FD8\u539F\u6EDA\u52A8\u4F4D\u7F6E)\n const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\n\n\n const restoreOnce = async () => {\n if (restoreOnce.restored) return;\n restoreOnce.restored = true;\n\n if (typeof restoreOnce.do !== 'function') return;\n try {\n await delay(this.jitterMs(1000));\n await restoreOnce.do();\n } catch (restoreError) {\n logger.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);\n }\n };\n\n\n try {\n // Case 1: \u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E (target \u4E3A null/undefined)\n if (target == null) {\n // \u4EC5\u6267\u884C\u53CD\u5E94\u5EF6\u8FDF + \u70B9\u51FB\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n logger.success('humanClick', 'Clicked current position');\n return true;\n }\n\n // Case 2: \u70B9\u51FB\u6307\u5B9A\u76EE\u6807\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);\n }\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);\n return false;\n }\n } else {\n element = target;\n }\n\n if (scrollIfNeeded) {\n const { restore: restoreFn, didScroll } = await this.humanScroll(page, element);\n // \u4EC5\u5728 didScroll \u4E3A true \u4E14 options.restore \u4E3A true \u65F6\u624D\u8FD8\u539F\n restoreOnce.do = (didScroll && restore) ? restoreFn : null;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n await restoreOnce();\n if (throwOnMissing) {\n throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n }\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.3;\n\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n await restoreOnce();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\n await restoreOnce();\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n /**\n * \u968F\u673A\u5EF6\u8FDF\u4E00\u6BB5\u6BEB\u79D2\u6570\uFF08\u5E26 \u00B130% \u6296\u52A8\uFF09\n * @param {number} baseMs - \u57FA\u7840\u5EF6\u8FDF\u6BEB\u79D2\u6570\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4\n */\n async randomSleep(baseMs, jitterPercent = 0.3) {\n const ms = this.jitterMs(baseMs, jitterPercent);\n logger.start('randomSleep', `base=${baseMs}, actual=${ms}ms`);\n await delay(ms);\n logger.success('randomSleep');\n },\n\n /**\n * \u6A21\u62DF\u4EBA\u7C7B\"\u6CE8\u89C6\"\u6216\"\u9605\u8BFB\"\u884C\u4E3A\uFF1A\u9F20\u6807\u5728\u9875\u9762\u4E0A\u968F\u673A\u5FAE\u52A8\n * @param {import('playwright').Page} page\n * @param {number} [baseDurationMs=2500] - \u57FA\u7840\u6301\u7EED\u65F6\u95F4 (\u00B140% \u6296\u52A8)\n */\n async simulateGaze(page, baseDurationMs = 2500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDurationMs, 0.4);\n logger.start('simulateGaze', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n while (Date.now() - startTime < durationMs) {\n // \u5728\u89C6\u53E3\u8303\u56F4\u5185\u968F\u673A\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n // \u6CE8\u89C6\u505C\u7559 300-1200ms\n await delay(this.jitterMs(600, 0.5));\n }\n logger.success('simulateGaze');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u8F93\u5165 - \u5E26\u8282\u594F\u53D8\u5316\uFF08\u5FEB-\u6162-\u505C\u987F-\u5076\u5C14\u52A0\u901F\uFF09\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n * @param {string} text - \u8981\u8F93\u5165\u7684\u6587\u672C\n * @param {Object} [options] \n * @param {number} [options.baseDelay=180] - \u57FA\u7840\u6309\u952E\u5EF6\u8FDF (ms)\uFF0C\u5B9E\u9645 \u00B140% \u6296\u52A8\n * @param {number} [options.pauseProbability=0.08] - \u505C\u987F\u6982\u7387 (0-1)\n * @param {number} [options.pauseBase=800] - \u505C\u987F\u65F6\u957F\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B150% \u6296\u52A8\n */\n async humanType(page, selector, text, options = {}) {\n logger.start('humanType', `selector=${selector}, textLen=${text.length}`);\n const {\n baseDelay = 180,\n pauseProbability = 0.08,\n pauseBase = 800\n } = options;\n\n try {\n const locator = page.locator(selector);\n await Humanize.humanClick(page, locator);\n\n // \u70B9\u51FB\u540E\u601D\u8003\u5EF6\u8FDF\n await delay(this.jitterMs(200, 0.4));\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n let charDelay;\n\n if (char === ' ') {\n // \u7A7A\u683C\u952E\u7A0D\u5FEB\n charDelay = this.jitterMs(baseDelay * 0.6, 0.3);\n } else if (/[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)) {\n // \u6807\u70B9\u7B26\u53F7\u540E\u7A0D\u6162\uFF08\u6A21\u62DF\u601D\u8003\uFF09\n charDelay = this.jitterMs(baseDelay * 1.5, 0.4);\n } else {\n // \u666E\u901A\u5B57\u7B26\n charDelay = this.jitterMs(baseDelay, 0.4);\n }\n\n await page.keyboard.type(char);\n await delay(charDelay);\n\n // \u968F\u673A\u505C\u987F\uFF08\u6A21\u62DF\u601D\u8003/\u56DE\u987E\uFF09\n if (Math.random() < pauseProbability && i < text.length - 1) {\n const pauseTime = this.jitterMs(pauseBase, 0.5);\n logger.debug(`\u505C\u987F ${pauseTime}ms...`);\n await delay(pauseTime);\n }\n }\n logger.success('humanType');\n } catch (error) {\n logger.fail('humanType', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6E05\u7A7A\u8F93\u5165\u6846 - \u6A21\u62DF\u4EBA\u7C7B\u5220\u9664\u6587\u672C\u7684\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n */\n async humanClear(page, selector) {\n logger.start('humanClear', `selector=${selector}`);\n try {\n const locator = page.locator(selector);\n await locator.click();\n await delay(this.jitterMs(200, 0.4));\n\n const currentValue = await locator.inputValue();\n if (!currentValue || currentValue.length === 0) {\n logger.success('humanClear', 'already empty');\n return;\n }\n\n // \u5168\u9009 + \u5220\u9664\n await page.keyboard.press('Meta+A');\n await delay(this.jitterMs(100, 0.4));\n await page.keyboard.press('Backspace');\n\n logger.success('humanClear');\n } catch (error) {\n logger.fail('humanClear', error);\n throw error;\n }\n },\n\n /**\n * \u9875\u9762\u9884\u70ED\u6D4F\u89C8 - \u6A21\u62DF\u4EBA\u7C7B\u8FDB\u5165\u9875\u9762\u540E\u7684\u63A2\u7D22\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {number} [baseDuration=3500] - \u9884\u70ED\u65F6\u957F\u57FA\u7840\u503C (\u00B140% \u6296\u52A8)\n */\n async warmUpBrowsing(page, baseDuration = 3500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDuration, 0.4);\n\n logger.start('warmUpBrowsing', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n try {\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n\n if (action < 0.4) {\n // \u9F20\u6807\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(350, 0.4));\n } else if (action < 0.7) {\n // \u6EDA\u52A8\n const scrollY = (Math.random() - 0.5) * 200;\n await page.mouse.wheel(0, scrollY);\n await delay(this.jitterMs(500, 0.4));\n } else {\n // \u505C\u987F/\u6CE8\u89C6\n await delay(this.jitterMs(800, 0.5));\n }\n }\n logger.success('warmUpBrowsing');\n } catch (error) {\n logger.fail('warmUpBrowsing', error);\n throw error;\n }\n },\n\n /**\n * \u81EA\u7136\u6EDA\u52A8 - \u5E26\u60EF\u6027\u3001\u51CF\u901F\u6548\u679C\u548C\u968F\u673A\u6296\u52A8\n * @param {import('playwright').Page} page\n * @param {'up' | 'down'} [direction='down'] - \u6EDA\u52A8\u65B9\u5411\n * @param {number} [distance=300] - \u603B\u6EDA\u52A8\u8DDD\u79BB\u57FA\u7840\u503C (px)\uFF0C\u00B115% \u6296\u52A8\n * @param {number} [baseSteps=5] - \u5206\u51E0\u6B65\u5B8C\u6210\u57FA\u7840\u503C\uFF0C\u00B11 \u968F\u673A\n */\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n // steps \u52A0\u968F\u673A\u6D6E\u52A8 \u00B11\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n // distance \u52A0\u6296\u52A8\n const actualDistance = this.jitterMs(distance, 0.15);\n\n logger.start('naturalScroll', `dir=${direction}, dist=${actualDistance}, steps=${steps}`);\n const sign = direction === 'down' ? 1 : -1;\n const stepDistance = actualDistance / steps;\n\n try {\n for (let i = 0; i < steps; i++) {\n // \u60EF\u6027\u51CF\u901F\u56E0\u5B50\n const factor = 1 - (i / steps) * 0.5;\n // \u6BCF\u6B65\u52A0 \u00B110% \u6296\u52A8\n const jitter = 0.9 + Math.random() * 0.2;\n const scrollAmount = stepDistance * factor * sign * jitter;\n\n await page.mouse.wheel(0, scrollAmount);\n\n // \u5EF6\u8FDF\u4E5F\u5E26\u6296\u52A8\n const baseDelay = 60 + i * 25;\n await delay(this.jitterMs(baseDelay, 0.3));\n }\n logger.success('naturalScroll');\n } catch (error) {\n logger.fail('naturalScroll', error);\n throw error;\n }\n }\n}\n", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u53CD\u722C\u53C2\u6570\u4E0E\u6307\u7EB9\u914D\u7F6E\u7EDF\u4E00\u7531 AntiCheat \u63D0\u4F9B\nimport { execFileSync } from 'node:child_process';\nimport { FingerprintGenerator } from 'fingerprint-generator';\nimport { FingerprintInjector } from 'fingerprint-injector';\nimport { AntiCheat } from './anti-cheat';\nimport { createInternalLogger } from './internals/logger';\nimport { ByPass } from './proxy-bypass';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('Launch');\nconst REQUEST_HOOK_FLAG = Symbol('playwright-toolkit-request-hook');\nconst injectedContexts = new WeakSet();\nconst browserMajorVersionCache = new Map();\n\nconst DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;\nconst DEFAULT_LOCALE = 'zh-CN';\n\nconst DEFAULT_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst fingerprintInjector = new FingerprintInjector();\n\nconst resolveProxyLaunchOptions = (proxyConfiguration = {}) => {\n const config = proxyConfiguration && typeof proxyConfiguration === 'object' && !Array.isArray(proxyConfiguration)\n ? proxyConfiguration\n : {};\n\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean' ? config.enable_proxy : proxyUrl !== '';\n\n if (!enableProxy || !proxyUrl) {\n return { byPassDomains: [], enableProxy, proxyUrl };\n }\n const byPassDomains = ByPass.normalizeByPassDomains(config.by_pass_domains);\n return { byPassDomains, enableProxy, proxyUrl };\n};\n\nconst parseChromeMajorVersion = (rawValue = '') => {\n const match = String(rawValue || '').match(/Chrome\\/(\\d+)/i);\n return match ? Number(match[1] || 0) : 0;\n};\n\nconst resolveLauncherExecutablePath = (launcher) => {\n if (!launcher || typeof launcher !== 'object') return '';\n if (typeof launcher.executablePath === 'function') {\n try {\n return String(launcher.executablePath() || '').trim();\n } catch {\n return '';\n }\n }\n return '';\n};\n\nconst detectBrowserMajorVersion = (launcher) => {\n\tconst executablePath = resolveLauncherExecutablePath(launcher);\n if (!executablePath) return 0;\n if (browserMajorVersionCache.has(executablePath)) {\n return browserMajorVersionCache.get(executablePath);\n }\n\n let detectedVersion = 0;\n try {\n const rawVersion = execFileSync(executablePath, ['--version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n detectedVersion = parseChromeMajorVersion(rawVersion);\n } catch (error) {\n logger.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);\n }\n\n\tbrowserMajorVersionCache.set(executablePath, detectedVersion);\n\treturn detectedVersion;\n};\n\n// buildFingerprintGenerator \u53EA\u5728\u201C\u6CA1\u6709\u53EF\u590D\u7528 core.fingerprint\u201D\u65F6\u515C\u5E95\u751F\u6210\u4E00\u6B21\u3002\nconst buildFingerprintGenerator = ({ locale, browserMajorVersion }) => {\n\treturn new FingerprintGenerator(\n AntiCheat.getFingerprintGeneratorOptions({\n locale,\n browserMajorVersion,\n }),\n\t);\n};\n\n// buildReplayableBrowserProfile \u8D1F\u8D23\u628A\u201C\u767B\u5F55\u6001 env\u201D\u63D0\u5347\u6210\u201C\u53EF\u8DE8\u673A\u5668\u590D\u7528\u7684\u6D4F\u89C8\u5668\u771F\u6E90\u201D\u3002\n// \u89C4\u5219\u662F\uFF1A\n// 1. \u6CA1\u6709\u767B\u5F55\u6001\u65F6\uFF0C\u4E0D\u5F3A\u6C42\u751F\u6210\u6301\u4E45\u5316\u6307\u7EB9\uFF1B\n// 2. \u6709\u767B\u5F55\u6001\u4F46\u6CA1\u6709 core.fingerprint \u65F6\uFF0C\u9996\u6B21\u751F\u6210\u5E76\u5199\u56DE runtimeState\uFF1B\n// 3. \u6D4F\u89C8\u5668\u5927\u7248\u672C\u53D8\u5316\u65F6\uFF0C\u5141\u8BB8\u91CD\u5EFA core\uFF0C\u907F\u514D\u65E7\u6307\u7EB9\u4E0E\u65B0\u5185\u6838\u4E0D\u517C\u5BB9\u3002\nconst buildReplayableBrowserProfile = (runtimeState, launcher) => {\n if (!runtimeState || !RuntimeEnv.hasLoginState(runtimeState)) {\n return { runtimeState, browserProfileCore: null };\n }\n\n let nextState = RuntimeEnv.rememberState(runtimeState);\n let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);\n const timezoneId = String(browserProfileCore?.timezone_id || '').trim() || AntiCheat.getBaseConfig().timezoneId;\n const locale = DEFAULT_LOCALE;\n const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);\n const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);\n const needsRebuild = !browserProfileCore?.fingerprint\n || Object.keys(browserProfileCore.fingerprint || {}).length === 0\n || (currentBrowserMajorVersion > 0 && storedBrowserMajorVersion > 0 && storedBrowserMajorVersion !== currentBrowserMajorVersion);\n\n if (needsRebuild) {\n const generator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: currentBrowserMajorVersion,\n });\n const fingerprint = generator.getFingerprint();\n const fingerprintBrowserMajorVersion = parseChromeMajorVersion(fingerprint?.fingerprint?.navigator?.userAgent || '');\n browserProfileCore = {\n fingerprint,\n timezone_id: timezoneId,\n locale,\n browser_major_version: currentBrowserMajorVersion > 0 ? currentBrowserMajorVersion : fingerprintBrowserMajorVersion,\n schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n };\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);\n logger.info(\n `\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || '-')} | version=${browserProfileCore.browser_major_version || '-'} | timezone=${timezoneId}`,\n );\n return { runtimeState: nextState, browserProfileCore };\n }\n\n const normalizedBrowserProfileCore = {\n ...browserProfileCore,\n timezone_id: timezoneId,\n locale,\n schema_version: Number(browserProfileCore.schema_version || 0) > 0\n ? Number(browserProfileCore.schema_version || 0)\n : DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n browser_major_version: currentBrowserMajorVersion > 0\n ? currentBrowserMajorVersion\n : Number(browserProfileCore.browser_major_version || 0),\n };\n\n const currentCoreRaw = JSON.stringify(browserProfileCore || {});\n const nextCoreRaw = JSON.stringify(normalizedBrowserProfileCore);\n if (currentCoreRaw !== nextCoreRaw) {\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, normalizedBrowserProfileCore);\n }\n\n return {\n runtimeState: nextState,\n browserProfileCore: normalizedBrowserProfileCore,\n\t};\n};\n\n// buildReplayBrowserPoolOptions \u8BA9 BrowserPool / Playwright / FingerprintInjector\n// \u90FD\u4ECE\u540C\u4E00\u4EFD core.fingerprint \u6D3E\u751F\u53C2\u6570\uFF0C\u907F\u514D UA / viewport / JS \u6307\u7EB9\u591A\u771F\u6E90\u51B2\u7A81\u3002\nconst buildReplayBrowserPoolOptions = (browserProfileCore) => {\n const fingerprintWithHeaders = browserProfileCore?.fingerprint;\n const fingerprint = fingerprintWithHeaders?.fingerprint;\n if (!fingerprintWithHeaders || !fingerprint) {\n return null;\n }\n\n return {\n useFingerprints: false,\n prePageCreateHooks: [\n (_pageId, _browserController, pageOptions = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n\n const screen = fingerprint.screen || {};\n const userAgent = String(fingerprint.navigator?.userAgent || '').trim();\n if (userAgent) {\n pageOptions.userAgent = userAgent;\n }\n if (Number(screen.width || 0) > 0 && Number(screen.height || 0) > 0) {\n pageOptions.viewport = {\n width: Number(screen.width),\n height: Number(screen.height),\n };\n pageOptions.screen = {\n width: Number(screen.width),\n height: Number(screen.height),\n };\n }\n if (browserProfileCore.locale) {\n pageOptions.locale = browserProfileCore.locale;\n }\n if (browserProfileCore.timezone_id) {\n pageOptions.timezoneId = browserProfileCore.timezone_id;\n }\n },\n ],\n postPageCreateHooks: [\n async (page) => {\n const context = page?.context?.();\n if (!context) return;\n if (!injectedContexts.has(context)) {\n await fingerprintInjector.attachFingerprintToPlaywright(context, fingerprintWithHeaders);\n injectedContexts.add(context);\n }\n },\n ],\n };\n};\n\nexport const Launch = {\n getPlaywrightCrawlerOptions(options = {}) {\n const normalizedOptions = Array.isArray(options) ? { customArgs: options } : (options || {});\n const {\n customArgs = [],\n proxyConfiguration = {},\n log: logOptions = null,\n runInHeadfulMode = false,\n debugMode = false,\n isRunningOnApify = false,\n launcher = null,\n preNavigationHooks = [],\n postNavigationHooks = [],\n runtimeState = null,\n } = normalizedOptions;\n\n const { byPassDomains, enableProxy, proxyUrl } = resolveProxyLaunchOptions(proxyConfiguration);\n const byPassRules = ByPass.buildByPassDomainRules(byPassDomains);\n const proxyMeter = enableProxy && proxyUrl\n ? ProxyMeterRuntime.startProxyMeter({ proxyUrl, debugMode })\n : null;\n const launchProxy = proxyMeter ? { server: proxyMeter.server } : null;\n if (launchProxy && byPassDomains.length > 0) {\n launchProxy.bypass = byPassDomains.join(',');\n }\n\n\t\t// \u542F\u52A8\u524D\u5148\u786E\u5B9A\u662F\u5426\u8D70\u201C\u7A33\u5B9A\u56DE\u653E\u6A21\u5F0F\u201D\u3002\n\t\tconst replayContext = buildReplayableBrowserProfile(runtimeState, launcher);\n\t\tconst replayBrowserPoolOptions = buildReplayBrowserPoolOptions(replayContext.browserProfileCore);\n\t\tconst launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;\n\n const launchOptions = {\n args: [\n ...AntiCheat.getLaunchArgs({ locale: launchLocale }),\n ...customArgs,\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n\n if (launchProxy) {\n launchOptions.proxy = launchProxy;\n }\n\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n if (enableByPassLogger && launchProxy) {\n let upstreamLabel = '';\n try {\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;\n } catch {}\n logger.info(\n `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || '-'} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(',')}`,\n );\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger && enableProxy && !launchProxy) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A');\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger && !enableProxy && proxyUrl) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E');\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n } else if (enableByPassLogger) {\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n }\n\n const onPageCreated = (page) => {\n const recommendedGotoOptions = {\n waitUntil: 'commit',\n };\n\n if (!page || typeof page.on !== 'function') {\n return recommendedGotoOptions;\n }\n if (page[REQUEST_HOOK_FLAG]) {\n return recommendedGotoOptions;\n }\n page[REQUEST_HOOK_FLAG] = true;\n\n const requestHandler = (req) => {\n const requestUrl = req.url();\n const resourceType = req.resourceType();\n const matched = byPassDomains.length > 0\n ? ByPass.findMatchedByPassRule(byPassRules, requestUrl)\n : null;\n if (launchProxy) {\n ProxyMeterRuntime.recordProxyMeterResourceType(requestUrl, resourceType);\n }\n if (!enableByPassLogger || byPassDomains.length === 0) return;\n if (!matched || !matched.rule) return;\n logger.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);\n };\n page.on('request', requestHandler);\n return recommendedGotoOptions;\n };\n\n const launchContext = {\n useIncognitoPages: true,\n launchOptions,\n };\n if (launcher) {\n launchContext.launcher = launcher;\n }\n\n const crawlerBaseOptions = {\n ...DEFAULT_CRAWLER_BASE_OPTIONS,\n headless: !runInHeadfulMode || isRunningOnApify,\n\t\t\t// \u6709 core.fingerprint \u65F6\u8D70\u56FA\u5B9A\u56DE\u653E\uFF1B\u5426\u5219\u9000\u56DE Crawlee \u9ED8\u8BA4\u6307\u7EB9\u6A21\u5F0F\u3002\n\t\t\tbrowserPoolOptions: replayBrowserPoolOptions || {\n\t\t\t\tuseFingerprints: true,\n\t\t\t\tfingerprintOptions: {\n fingerprintGeneratorOptions: AntiCheat.getFingerprintGeneratorOptions(),\n },\n },\n launchContext,\n };\n\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n const internalPreNavigationHook = async ({ page }, gotoOptions = {}) => {\n const recommendedGotoOptions = onPageCreated(page);\n if (recommendedGotoOptions && typeof recommendedGotoOptions === 'object') {\n Object.assign(gotoOptions, recommendedGotoOptions);\n }\n };\n\n return {\n ...crawlerBaseOptions,\n preNavigationHooks: [internalPreNavigationHook, ...normalizedPreNavigationHooks],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n },\n};\n", "import picomatch from 'picomatch';\n\nconst normalizeByPassDomains = (domains) => {\n if (!Array.isArray(domains)) return [];\n return domains\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n};\n\nconst normalizeHostname = (value = '') => String(value || '').trim().toLowerCase();\n\nconst buildByPassDomainRule = (rawPattern) => {\n const pattern = String(rawPattern || '').trim().toLowerCase();\n if (!pattern) return null;\n\n let matcher;\n try {\n matcher = picomatch(pattern, { nocase: true });\n } catch {\n return null;\n }\n\n return {\n pattern,\n test: (hostname) => matcher(String(hostname || '').toLowerCase()),\n };\n};\n\nconst buildByPassDomainRules = (domains = []) => {\n return normalizeByPassDomains(domains)\n .map((domain) => buildByPassDomainRule(domain))\n .filter(Boolean);\n};\n\nconst findMatchedByPassRule = (rules = [], requestUrl = '') => {\n let hostname = '';\n try {\n hostname = normalizeHostname(new URL(String(requestUrl || '')).hostname);\n } catch {\n return null;\n }\n\n for (const rule of rules) {\n if (rule && typeof rule.test === 'function' && rule.test(hostname)) {\n return {\n rule,\n hostname,\n };\n }\n }\n\n return {\n rule: null,\n hostname,\n };\n};\n\nconst isDomainCoveredByByPass = (domain = '', rules = []) => {\n const hostname = normalizeHostname(domain);\n if (!hostname) return false;\n\n for (const rule of rules || []) {\n if (!rule || typeof rule.test !== 'function') continue;\n if (rule.test(hostname)) return true;\n }\n\n return false;\n};\n\nconst resolveRouteByProxy = ({\n requestUrl = '',\n enableProxy = false,\n byPassRules = [],\n}) => {\n if (!enableProxy) {\n return { route: 'direct', matchedRule: null, hostname: '' };\n }\n\n const matched = findMatchedByPassRule(byPassRules, requestUrl);\n if (!matched) {\n return { route: 'proxy', matchedRule: null, hostname: '' };\n }\n\n if (matched.rule) {\n return { route: 'direct', matchedRule: matched.rule, hostname: matched.hostname };\n }\n\n return { route: 'proxy', matchedRule: null, hostname: matched.hostname };\n};\n\nexport const ByPass = {\n normalizeByPassDomains,\n normalizeHostname,\n buildByPassDomainRule,\n buildByPassDomainRules,\n findMatchedByPassRule,\n isDomainCoveredByByPass,\n resolveRouteByProxy,\n};\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\n\nconst logger = createInternalLogger('LiveView');\n\n/**\n * \u542F\u52A8\u4E00\u4E2A Web \u670D\u52A1\u5668\u4EE5\u5728 Live View \u9009\u9879\u5361\u4E2D\u663E\u793A\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\u3002\n */\nasync function startLiveViewServer(liveViewKey) {\n const app = express();\n\n app.get('/', async (req, res) => {\n try {\n // \u4ECE\u9ED8\u8BA4\u7684 Key-Value Store \u4E2D\u8BFB\u53D6\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\n const screenshotBuffer = await Actor.getValue(liveViewKey);\n\n if (!screenshotBuffer) {\n // \u5982\u679C\u8FD8\u6CA1\u6709\u622A\u56FE\uFF0C\u53D1\u9001\u4E00\u4E2A\u81EA\u52A8\u5237\u65B0\u7684\u5360\u4F4D\u9875\u9762\n res.send('<html><head><meta http-equiv=\"refresh\" content=\"2\"></head><body>\u7B49\u5F85\u7B2C\u4E00\u4E2A\u5C4F\u5E55\u622A\u56FE...</body></html>');\n return;\n }\n\n // \u5C06 Buffer \u8F6C\u6362\u4E3A Base64 \u5B57\u7B26\u4E32\n const screenshotBase64 = screenshotBuffer.toString('base64');\n\n // \u53D1\u9001\u4E00\u4E2A HTML \u9875\u9762\uFF0C\u8BE5\u9875\u9762\u6BCF 1 \u79D2\u81EA\u52A8\u5237\u65B0\u4E00\u6B21\uFF0C\u5E76\u663E\u793A\u622A\u56FE\n res.send(`\n <html>\n <head>\n <title>Live View (\u622A\u56FE)</title>\n <meta http-equiv=\"refresh\" content=\"1\">\n </head>\n <body style=\"margin:0; padding:0;\">\n <img src=\"data:image/png;base64,${screenshotBase64}\" \n alt=\"Live View Screenshot\" \n style=\"width: 100%; height: auto;\" />\n </body>\n </html>\n `);\n } catch (error) {\n logger.fail('Live View Server', error);\n res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);\n }\n });\n\n // \u76D1\u542C Apify \u5BB9\u5668\u7AEF\u53E3 \n const port = process.env.APIFY_CONTAINER_PORT || 4321;\n app.listen(port, () => { logger.success('startLiveViewServer', `\u76D1\u542C\u7AEF\u53E3 ${port}`); });\n}\n\n/**\n * \u62CD\u6444\u5F53\u524D\u9875\u9762\u7684\u5C4F\u5E55\u622A\u56FE\u5E76\u5C06\u5176\u4FDD\u5B58\u5230 Key-Value Store\u3002\n * @param {import('playwright').Page} page\n * @param {string} [logMessage] - \u53EF\u9009\u7684\u65E5\u5FD7\u6D88\u606F\u3002\n */\nasync function takeLiveScreenshot(liveViewKey, page, logMessage) {\n try {\n const buffer = await capturePageScreenshot(page, { type: 'png' });\n await Actor.setValue(liveViewKey, buffer, { contentType: 'image/png' });\n if (logMessage) {\n logger.info(`(\u622A\u56FE): ${logMessage}`);\n }\n } catch (e) {\n logger.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);\n }\n}\n\nconst useLiveView = (liveViewKey = PresetOfLiveViewKey) => {\n return {\n takeLiveScreenshot: async (page, logMessage) => {\n return await takeLiveScreenshot(liveViewKey, page, logMessage)\n },\n startLiveViewServer: async () => {\n return await startLiveViewServer(liveViewKey);\n }\n }\n}\n\nexport const LiveView = {\n useLiveView,\n};\n", "import { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\nimport { sloveCaptcha as solveBytedanceCaptchaStrategy } from './internals/captcha/bytedance.js';\n\nconst logger = createInternalLogger('Captcha');\nconst DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({\n token: 'eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI',\n apiUrl: 'https://api.jfbym.com/api/YmServer/customApi',\n});\n\nconst CAPTCHA_STRATEGIES = Object.freeze({\n bytedance: {\n sloveCaptcha: solveBytedanceCaptchaStrategy,\n },\n});\n\nconst mergeDefinedOptions = (...sources) => {\n const merged = {};\n\n for (const source of sources) {\n for (const [key, value] of Object.entries(source || {})) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n }\n\n return merged;\n};\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668\uFF0C\u652F\u6301\u57FA\u4E8E DOM \u6216 URL \u7684\u9A8C\u8BC1\u7801\u68C0\u6D4B\u3002\n *\n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector]\n * @param {string} [options.urlPattern]\n * @param {() => Promise<void>} options.onDetected\n */\nexport function useCaptchaMonitor(page, options) {\n const { domSelector, urlPattern, onDetected } = options;\n\n if (!domSelector && !urlPattern) {\n throw new Error('[CaptchaMonitor] \u5FC5\u987B\u63D0\u4F9B domSelector \u6216 urlPattern\u3002');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u51FD\u6570\u3002');\n }\n\n let isStopped = false;\n let isHandling = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isStopped || isHandling) return;\n isHandling = true;\n try {\n await onDetected();\n } finally {\n isHandling = false;\n }\n };\n\n const cleanupFns = [];\n\n if (domSelector) {\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u9875\u9762\u751F\u547D\u5468\u671F\u8FB9\u754C\u5BFC\u81F4\u7684\u91CD\u590D\u66B4\u9732\u9519\u8BEF\u3002\n });\n\n page.addInitScript(({ selector, callbackName, cleanerName: cleanupName }) => {\n (() => {\n /** @type {MutationObserver | null} */\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (!element) {\n return false;\n }\n\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n };\n\n checkAndReport();\n\n observer = new MutationObserver((mutations) => {\n const shouldCheck = mutations.some((mutation) => mutation.addedNodes.length > 0);\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n const mountObserver = () => {\n const target = document.documentElement;\n if (target && observer) {\n observer.observe(target, { childList: true, subtree: true });\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', mountObserver);\n } else {\n mountObserver();\n }\n\n window[cleanupName] = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n };\n })();\n }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });\n\n logger.success('useCaptchaMonitor', `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);\n\n cleanupFns.push(async () => {\n try {\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch {\n // \u5BFC\u822A\u6216\u9875\u9762\u5173\u95ED\u540E\u7684\u6E05\u7406\u9519\u8BEF\u53EF\u4EE5\u5FFD\u7565\u3002\n }\n });\n }\n\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame !== page.mainFrame()) {\n return;\n }\n\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);\n\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n return {\n stop: async () => {\n logger.info('\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isStopped = true;\n },\n };\n}\n\nexport const callCaptchaRecognitionApi = async (requestParams = {}) => {\n const { apiUrl, ...payload } = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n requestParams,\n );\n\n if (!apiUrl) {\n throw new Error('[Captcha] \u7F3A\u5C11\u9A8C\u8BC1\u7801\u8BC6\u522B\u63A5\u53E3\u5730\u5740 apiUrl\u3002');\n }\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Captcha API request failed with status ${response.status}`);\n }\n\n return await response.json();\n};\n\nexport async function solveCaptchaWithStrategy(strategyName, page, options = {}) {\n const strategy = CAPTCHA_STRATEGIES[strategyName];\n\n if (!strategy?.sloveCaptcha) {\n throw new Error(`[Captcha] \u672A\u627E\u5230\u9A8C\u8BC1\u7801\u7B56\u7565\uFF1A${strategyName}`);\n }\n\n const resolvedOptions = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n options,\n );\n\n return strategy.sloveCaptcha(page, resolvedOptions, {\n callCaptchaRecognitionApi,\n logger,\n });\n}\n\nexport const Captcha = {\n useCaptchaMonitor,\n solveCaptchaWithStrategy,\n};\n", "export const waitForVisible = async (locator, timeout) => {\n try {\n await locator.waitFor({\n state: 'visible',\n timeout,\n });\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isAnyCaptchaTextVisible = async (frame, texts, timeout) => {\n for (const text of texts || []) {\n if (!text) {\n continue;\n }\n\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const clickCaptchaAction = async (frame, texts, options) => {\n for (const text of texts || []) {\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (!isVisible) {\n continue;\n }\n\n await candidate.click();\n return true;\n }\n }\n\n return false;\n};\n\nexport const dragCaptchaWithMouse = async (page, sourceLocator, targetLocator) => {\n const sourceBox = await sourceLocator.boundingBox();\n const targetBox = await targetLocator.boundingBox();\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve captcha drag coordinates.');\n }\n\n const startX = sourceBox.x + sourceBox.width / 2;\n const startY = sourceBox.y + sourceBox.height / 2;\n const endX = targetBox.x + targetBox.width / 2;\n const endY = targetBox.y + targetBox.height / 2;\n const steps = 10;\n const liftOffsetX = Math.min(18, Math.max(8, sourceBox.width * 0.12));\n const liftOffsetY = Math.min(12, Math.max(4, sourceBox.height * 0.08));\n\n await page.mouse.move(startX, startY, { steps: 8 });\n await page.waitForTimeout(250);\n await page.mouse.down();\n await page.waitForTimeout(350);\n\n await page.mouse.move(startX + liftOffsetX, startY + liftOffsetY, { steps: 6 });\n await page.waitForTimeout(250);\n\n for (let step = 1; step <= steps; step++) {\n const progress = step / steps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n const currentX = startX + liftOffsetX + ((endX - startX - liftOffsetX) * easedProgress);\n const currentY = startY + liftOffsetY + ((endY - startY - liftOffsetY) * easedProgress);\n await page.mouse.move(currentX, currentY, { steps: 2 });\n await page.waitForTimeout(90);\n }\n\n await page.waitForTimeout(100);\n await page.mouse.up();\n await page.waitForTimeout(100);\n};\n", "import { createInternalLogger } from '../logger.js';\nimport {\n clickCaptchaAction,\n dragCaptchaWithMouse,\n isAnyCaptchaTextVisible,\n waitForVisible,\n} from './shared.js';\n\nconst logger = createInternalLogger('Captcha');\n\nconst DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({\n apiType: '31234',\n maxRetries: 3,\n containerSelector: '#captcha_container',\n iframeSelector: 'iframe[src*=\"verifycenter\"]',\n iframeFallbackSelector: 'iframe',\n sourceImageSelector: 'div.canvas-container',\n dropTargetContainerSelector: '#captcha_verify_image div',\n dropTargetTexts: ['\u62D6\u62FD\u5230\u8FD9\u91CC'],\n refreshTexts: ['\u5237\u65B0'],\n submitTexts: ['\u63D0\u4EA4'],\n recognitionSuccessCode: 10000,\n containerVisibleTimeoutMs: 2000,\n iframeVisibleTimeoutMs: 12000,\n iframeFallbackVisibleTimeoutMs: 4000,\n contentFrameResolveRetries: 5,\n contentFrameResolveDelayMs: 500,\n actionVisibleTimeoutMs: 1500,\n sourceImageVisibleTimeoutMs: 3000,\n challengeReadyTimeoutMs: 15000,\n challengeReadyRefreshTimeoutMs: 20000,\n challengeReadyPollMs: 300,\n loadingIndicatorVisibleTimeoutMs: 200,\n loadingTexts: ['\u52A0\u8F7D\u4E2D', '\u52A0\u8F7D\u4E2D...'],\n errorTexts: [\n '\u68C0\u6D4B\u5230\u60A8\u7684\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u8005\u7A0D\u540E\u518D\u8BD5',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u7A0D\u540E\u518D\u8BD5',\n '\u7A0D\u540E\u518D\u8BD5',\n ],\n recognitionDelayMs: 2000,\n refreshWaitMs: 3000,\n submitWaitMs: 3000,\n retryDelayBaseMs: 2000,\n retryDelayStepMs: 1000,\n});\n\nconst extractCaptchaSerialNumbers = (apiResponse) => {\n const serialNumbers = apiResponse?.data?.data?.serial_number;\n if (!Array.isArray(serialNumbers)) {\n return [];\n }\n\n return serialNumbers\n .map((value) => Number(value))\n .filter((value) => Number.isInteger(value) && value >= 0);\n};\n\nconst resolveContentFrame = async (page, iframeLocator, options) => {\n for (let attempt = 1; attempt <= options.contentFrameResolveRetries; attempt++) {\n const iframeHandle = await iframeLocator.elementHandle();\n const frame = await iframeHandle?.contentFrame();\n if (frame) {\n return frame;\n }\n\n if (attempt < options.contentFrameResolveRetries) {\n await page.waitForTimeout(options.contentFrameResolveDelayMs);\n }\n }\n\n return null;\n};\n\nconst getVerifycenterCaptchaContext = async (page, options) => {\n const captchaContainer = page.locator(options.containerSelector).first();\n const isContainerVisible = await waitForVisible(\n captchaContainer,\n options.containerVisibleTimeoutMs,\n );\n\n if (!isContainerVisible) {\n return null;\n }\n\n logger.info('\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002');\n\n let iframeLocator = page.locator(options.iframeSelector).first();\n let isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeVisibleTimeoutMs,\n );\n\n if (!isIframeVisible) {\n logger.warn('\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002');\n iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();\n isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeFallbackVisibleTimeoutMs,\n );\n }\n\n if (!isIframeVisible) {\n throw new Error('verifycenter iframe not found inside captcha container.');\n }\n\n logger.info('\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002');\n const frame = await resolveContentFrame(page, iframeLocator, options);\n if (!frame) {\n throw new Error('Failed to resolve verifycenter iframe content frame.');\n }\n\n return { iframeLocator, frame };\n};\n\nconst refreshCaptcha = async (page, frame, options) => {\n const clicked = await clickCaptchaAction(frame, options.refreshTexts, options).catch(() => false);\n if (!clicked) {\n logger.warn('Refresh button not found.');\n return false;\n }\n\n await page.waitForTimeout(options.refreshWaitMs);\n return true;\n};\n\nconst findCaptchaDropTarget = async (frame, options) => {\n for (const text of options.dropTargetTexts) {\n const candidates = [\n frame.locator(options.dropTargetContainerSelector).filter({ hasText: text }).first(),\n frame.getByText(text, { exact: false }).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (isVisible) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst waitForCaptchaChallengeReady = async (page, frame, options) => {\n const deadline = Date.now() + options.challengeReadyTimeoutMs;\n let refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n let hasSeenLoading = false;\n\n while (Date.now() < deadline) {\n const isLoadingVisible = await isAnyCaptchaTextVisible(\n frame,\n options.loadingTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n const hasErrorTextVisible = await isAnyCaptchaTextVisible(\n frame,\n options.errorTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n\n hasSeenLoading = hasSeenLoading || isLoadingVisible;\n\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const hasVisibleSourceImage = imageCount > 0\n ? await sourceImages.first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false)\n : false;\n\n if (!isLoadingVisible && hasVisibleSourceImage) {\n logger.info(hasSeenLoading ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002' : '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002');\n return;\n }\n\n if (hasErrorTextVisible) {\n logger.warn('\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002');\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n if (!hasVisibleSourceImage && Date.now() >= refreshDeadline) {\n logger.warn(`\u9A8C\u8BC1\u7801\u56FE\u7247\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51FA\u73B0\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n await page.waitForTimeout(options.challengeReadyPollMs);\n }\n\n throw new Error('Captcha challenge is still loading and did not become ready in time.');\n};\n\n/**\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ callCaptchaRecognitionApi?: (requestParams: Record<string, any>) => Promise<any> }} [dependencies]\n * @returns {Promise<boolean>}\n */\nexport async function solveCaptcha(page, options = {}, dependencies = {}) {\n const { callCaptchaRecognitionApi } = dependencies;\n\n if (typeof callCaptchaRecognitionApi !== 'function') {\n throw new Error('[Captcha] \u7F3A\u5C11\u901A\u7528\u8BC6\u522B\u8BF7\u6C42\u51FD\u6570 callCaptchaRecognitionApi\u3002');\n }\n\n const config = {\n ...DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS,\n ...options,\n };\n\n if (!config.token) {\n logger.warn('\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002');\n return false;\n }\n\n logger.info('\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C');\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt++) {\n logger.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);\n\n try {\n const captchaContext = await getVerifycenterCaptchaContext(page, config);\n if (!captchaContext) {\n logger.info('Captcha container is not visible anymore.');\n return true;\n }\n\n const { iframeLocator, frame } = captchaContext;\n await waitForCaptchaChallengeReady(page, frame, config);\n await page.waitForTimeout(config.recognitionDelayMs);\n\n const screenshotBuffer = await iframeLocator.screenshot();\n const apiResponse = await callCaptchaRecognitionApi({\n apiUrl: config.apiUrl,\n type: config.apiType,\n image: screenshotBuffer.toString('base64'),\n token: config.token,\n });\n const serialNumbers = extractCaptchaSerialNumbers(apiResponse);\n\n if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {\n logger.warn(\n `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || 'unknown'}`,\n );\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(', ')}`);\n\n const dropTarget = await findCaptchaDropTarget(frame, config);\n if (!dropTarget) {\n logger.warn('\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002');\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n const sourceImages = frame.locator(config.sourceImageSelector);\n const imageCount = await sourceImages.count();\n\n for (const rawIndex of serialNumbers) {\n let imageIndex = rawIndex;\n if (imageIndex >= imageCount && imageIndex > 0 && imageIndex - 1 < imageCount) {\n imageIndex -= 1;\n }\n\n if (imageIndex < 0 || imageIndex >= imageCount) {\n throw new Error(`Captcha image index ${rawIndex} is out of range. count=${imageCount}`);\n }\n\n const sourceImage = sourceImages.nth(imageIndex);\n await sourceImage.waitFor({\n state: 'visible',\n timeout: config.sourceImageVisibleTimeoutMs,\n });\n await dragCaptchaWithMouse(page, sourceImage, dropTarget);\n }\n\n const submitted = await clickCaptchaAction(frame, config.submitTexts, config).catch(() => false);\n if (!submitted) {\n logger.warn('\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002');\n }\n\n await page.waitForTimeout(config.submitWaitMs);\n\n const stillVisible = await iframeLocator\n .isVisible({ timeout: config.containerVisibleTimeoutMs })\n .catch(() => false);\n\n if (!stillVisible) {\n logger.info('\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002');\n return true;\n }\n\n logger.warn('\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002');\n await page.waitForTimeout(2000);\n await refreshCaptcha(page, frame, config);\n } catch (error) {\n logger.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);\n }\n\n if (attempt < config.maxRetries) {\n await page.waitForTimeout(config.retryDelayBaseMs + (attempt * config.retryDelayStepMs));\n }\n }\n\n logger.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);\n return false;\n}\n\nexport const sloveCaptcha = solveCaptcha;\n", "import { createHash } from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Mutation');\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\n/**\n * \u751F\u6210\u552F\u4E00\u7684 key \u540D\u79F0\uFF0C\u907F\u514D\u51B2\u7A81\n * @returns {string}\n */\nfunction generateKey(prefix) {\n return `__${prefix}_${uuidv4().replace(/-/g, '_')}`;\n}\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n /**\n * \u7B49\u5F85 DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u65E0\u53D8\u5316\uFF09\n * \u4F7F\u7528 MutationObserver \u76D1\u63A7\u6307\u5B9A\u5143\u7D20\uFF0C\u5F53\u5143\u7D20\u6301\u7EED\u4E00\u6BB5\u65F6\u95F4\u65E0\u53D8\u5316\u65F6 resolve\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 30000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 5000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 120000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => any\n * \u8FD4\u56DE null/undefined: \u6B63\u5E38\u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\n * \u8FD4\u56DE\u5176\u4ED6\u503C: \u6682\u505C\u7A33\u5B9A\u8BA1\u65F6\uFF08timeout \u4ECD\u7136\u751F\u6548\uFF09\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStable(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const initialTimeout = options.initialTimeout ?? 30 * 1000;\n const stableTime = options.stableTime ?? 5 * 1000;\n const timeout = options.timeout ?? 120 * 1000;\n const onMutation = options.onMutation;\n\n logger.start('waitForStable', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);\n\n if (initialTimeout > 0) {\n const selectorQuery = selectorList.join(',');\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n // \u751F\u6210\u552F\u4E00\u7684\u56DE\u8C03\u540D\n const callbackName = generateKey('pk_mut_cb');\n\n // \u5982\u679C\u6709 onMutation \u56DE\u8C03\uFF0C\u66B4\u9732\u51FD\u6570\u5E76\u8FD4\u56DE\u7ED3\u679C\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, async (context) => {\n try {\n const result = await onMutation(context);\n const paused = !(result === null || result === undefined);\n // \u8FD4\u56DE null/undefined \u8868\u793A\u6B63\u5E38\u8BA1\u65F6\uFF0C\u5176\u4ED6\u503C\u8868\u793A\u6682\u505C\n return paused ? '__PAUSE__' : '__CONTINUE__';\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u9ED8\u8BA4\u7EE7\u7EED\u8BA1\u65F6\n return '__CONTINUE__';\n }\n });\n logger.info('waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03');\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n const result = await page.evaluate(\n async ({ selectorList, stableTime, timeout, callbackName, hasCallback }) => {\n return new Promise((resolve, reject) => {\n let mutationCount = 0;\n let stableTimer = null;\n let timeoutTimer = null;\n let isPaused = false;\n let wasPaused = false;\n const observers = [];\n\n // \u6E05\u7406\u51FD\u6570\n const cleanup = () => {\n observers.forEach(obs => obs.disconnect());\n if (stableTimer) clearTimeout(stableTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n };\n\n // \u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\u5668\n const resetStableTimer = () => {\n if (stableTimer) clearTimeout(stableTimer);\n if (isPaused) return;\n stableTimer = setTimeout(() => {\n cleanup();\n resolve({ mutationCount, stableTime, wasPaused });\n }, stableTime);\n };\n\n const setPaused = (nextPaused) => {\n if (isPaused === nextPaused) return;\n isPaused = nextPaused;\n if (isPaused) {\n if (stableTimer) clearTimeout(stableTimer);\n stableTimer = null;\n wasPaused = true;\n return;\n }\n resetStableTimer();\n };\n\n // \u6574\u4F53\u8D85\u65F6\uFF08\u59CB\u7EC8\u751F\u6548\uFF0C\u4E0D\u53D7\u6682\u505C\u5F71\u54CD\uFF09\n timeoutTimer = setTimeout(() => {\n cleanup();\n reject(new Error(`waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`));\n }, timeout);\n\n // \u4E3A\u6BCF\u4E2A\u9009\u62E9\u5668\u521B\u5EFA MutationObserver\n selectorList.forEach(selector => {\n const elements = document.querySelectorAll(selector);\n elements.forEach(element => {\n const observer = new MutationObserver(async (mutations) => {\n mutationCount += mutations.length;\n\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u5143\u7D20\u5185\u5BB9\n const html = element.outerHTML || '';\n const text = element.innerText || element.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount,\n html,\n text,\n mutationNodes\n });\n\n const shouldPause = signal === '__PAUSE__';\n setPaused(shouldPause);\n if (!shouldPause) {\n resetStableTimer();\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\u8BA1\u65F6\n setPaused(false);\n resetStableTimer();\n }\n } else {\n // \u6CA1\u6709\u56DE\u8C03\uFF0C\u4FDD\u6301\u539F\u6709\u884C\u4E3A\n resetStableTimer();\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true\n });\n\n observers.push(observer);\n });\n });\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4EFB\u4F55\u5143\u7D20\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (observers.length === 0) {\n cleanup();\n resolve({ mutationCount: 0, stableTime: 0, wasPaused: false });\n return;\n }\n\n // \u521D\u59CB\u68C0\u67E5\uFF1A\u6302\u8F7D\u540E\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u56DE\u8C03\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u6682\u505C\n const runInitialCheck = async () => {\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u76D1\u63A7\u5143\u7D20\u7684\u5185\u5BB9\n const firstSelector = selectorList[0];\n const firstElement = document.querySelector(firstSelector);\n if (firstElement) {\n const html = firstElement.outerHTML || '';\n const text = firstElement.innerText || firstElement.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount: 0,\n html,\n text,\n mutationNodes\n });\n\n if (signal === '__PAUSE__') {\n setPaused(true);\n return; // \u6682\u505C\u65F6\u4E0D\u542F\u52A8\u521D\u59CB\u8BA1\u65F6\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\n }\n }\n }\n // \u542F\u52A8\u521D\u59CB\u7A33\u5B9A\u8BA1\u65F6\u5668\n resetStableTimer();\n };\n\n runInitialCheck();\n });\n },\n { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }\n );\n\n if (result.mutationCount === 0 && result.stableTime === 0) {\n logger.warning('waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n }\n logger.success('waitForStable', `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return result;\n },\n /**\n * \u7B49\u5F85\u8DE8 root DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u4E3B\u6587\u6863 + iframe \u5185\u5BB9\uFF09\n * \u901A\u8FC7\u8F6E\u8BE2\u5FEB\u7167\u68C0\u6D4B\u53D8\u5316\uFF0C\u9002\u914D iframe / shadow \u573A\u666F\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\uFF08\u5EFA\u8BAE\u4F20 iframe \u9009\u62E9\u5668\uFF09\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u7B7E\u540D\u4E0E waitForStable \u4FDD\u6301\u4E00\u81F4\uFF09\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 60000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 10000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 180000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStableAcrossRoots(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const selectorQuery = selectorList.join(',');\n const initialTimeout = options.initialTimeout ?? 60 * 1000;\n const waitForStableTime = options.stableTime ?? 10 * 1000;\n const overallTimeout = options.timeout ?? 180 * 1000;\n const onMutation = options.onMutation;\n const pollInterval = 500;\n\n const sleep = (ms) => new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n const truncate = (value, max = 800) => {\n const text = String(value || '');\n if (text.length <= max) return text;\n return `${text.slice(0, max)}...`;\n };\n\n const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim();\n const normalizeHtml = (value) => String(value || '').trim();\n const hashSnapshot = (value) => createHash('sha256').update(String(value || '')).digest('hex');\n\n const buildState = async () => {\n const items = [];\n const describeElement = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const tagName = String(node?.tagName || '').toUpperCase();\n return {\n tagName,\n id: String(node?.id || '').trim(),\n name: String(node?.getAttribute?.('name') || '').trim(),\n };\n });\n };\n\n const readElementSnapshot = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const text = String(node?.innerText || node?.textContent || '');\n const html = String(node?.innerHTML || node?.outerHTML || '');\n return {\n text,\n html,\n };\n });\n };\n\n const readFrameSnapshot = async (frame) => {\n return await frame.evaluate(() => {\n const root = document.documentElement || document.body;\n const text = String(root?.innerText || root?.textContent || '');\n const html = String(root?.innerHTML || '');\n return {\n text,\n html,\n url: window.location.href,\n readyState: document.readyState,\n };\n });\n };\n\n for (const selector of selectorList) {\n let handles = [];\n try {\n handles = await page.locator(selector).elementHandles();\n } catch {\n continue;\n }\n\n for (let index = 0; index < handles.length; index += 1) {\n const handle = handles[index];\n try {\n const descriptor = await describeElement(handle);\n const tagName = descriptor?.tagName || '';\n const isFrameElement = tagName === 'IFRAME' || tagName === 'FRAME';\n const nodeName = descriptor?.id || descriptor?.name || 'no-id';\n let source = 'main';\n let path = `${selector}[${index}]`;\n let text = '';\n let html = '';\n let frameUrl = '';\n let readyState = '';\n\n if (isFrameElement) {\n source = 'iframe';\n path = `${selector}[${index}]::iframe(${nodeName})`;\n\n const frame = await handle.contentFrame();\n if (frame) {\n try {\n const frameSnapshot = await readFrameSnapshot(frame);\n text = normalizeText(frameSnapshot?.text || '');\n html = normalizeHtml(frameSnapshot?.html || '');\n frameUrl = String(frameSnapshot?.url || '').trim();\n readyState = String(frameSnapshot?.readyState || '').trim();\n } catch (error) {\n source = 'iframe-unreadable';\n readyState = error?.name || 'unreadable';\n }\n } else {\n source = 'iframe-detached';\n }\n } else {\n try {\n const elementSnapshot = await readElementSnapshot(handle);\n text = normalizeText(elementSnapshot?.text || '');\n html = normalizeHtml(elementSnapshot?.html || '');\n } catch (error) {\n source = 'main-unreadable';\n readyState = error?.name || 'unreadable';\n }\n }\n\n const snapshot = text;\n items.push({\n selector,\n source,\n path,\n text,\n html,\n frameUrl,\n readyState,\n snapshot,\n });\n } finally {\n await handle.dispose().catch(() => { });\n }\n }\n }\n\n const serializedSnapshot = items\n .map((item) => JSON.stringify({\n path: item.path,\n source: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n snapshot: item.snapshot,\n }))\n .join('||');\n const summaryText = items.map((item) => item.text).join('\\n').trim();\n const summaryHtml = items.map((item) => item.html).join('\\n');\n const hasMatched = items.length > 0;\n const primary = items.length > 0 ? items[items.length - 1] : null;\n\n return {\n hasMatched,\n snapshotKey: hashSnapshot(serializedSnapshot),\n text: summaryText,\n html: summaryHtml,\n snapshotLength: serializedSnapshot.length,\n itemCount: items.length,\n primaryPath: primary?.path || '',\n mutationNodes: items.map((item) => ({\n html: item.html,\n text: item.text,\n mutationType: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n })),\n };\n };\n\n const invokeMutationCallback = async (context) => {\n if (!onMutation) return '__CONTINUE__';\n try {\n const result = await onMutation(context);\n return (result === null || result === undefined) ? '__CONTINUE__' : '__PAUSE__';\n } catch {\n return '__CONTINUE__';\n }\n };\n\n logger.start(\n 'waitForStableAcrossRoots',\n `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`\n );\n\n if (initialTimeout > 0) {\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n let state = await buildState();\n if (!state?.hasMatched) {\n logger.warning('waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n return { mutationCount: 0, stableTime: 0, wasPaused: false };\n }\n\n let mutationCount = 0;\n let stableSince = 0;\n let isPaused = false;\n let wasPaused = false;\n let lastSnapshotKey = state.snapshotKey;\n\n const applyPauseSignal = (signal) => {\n const nextPaused = signal === '__PAUSE__';\n if (nextPaused) {\n if (!isPaused) wasPaused = true;\n isPaused = true;\n stableSince = 0;\n return;\n }\n\n isPaused = false;\n stableSince = Date.now();\n };\n\n const initialSignal = await invokeMutationCallback({\n mutationCount: 0,\n html: state.html || '',\n text: state.text || '',\n mutationNodes: state.mutationNodes || [],\n });\n applyPauseSignal(initialSignal);\n\n const deadline = Date.now() + overallTimeout;\n let lastState = state;\n\n while (Date.now() < deadline) {\n await sleep(pollInterval);\n lastState = await buildState();\n\n if (!lastState?.hasMatched) {\n continue;\n }\n\n if (lastState.snapshotKey !== lastSnapshotKey) {\n lastSnapshotKey = lastState.snapshotKey;\n mutationCount += 1;\n\n logger.info(\n `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || 'unknown'}, preview=\"${truncate(lastState.text, 120)}\"`\n );\n\n const signal = await invokeMutationCallback({\n mutationCount,\n html: lastState.html || '',\n text: lastState.text || '',\n mutationNodes: lastState.mutationNodes || [],\n });\n applyPauseSignal(signal);\n continue;\n }\n\n if (!isPaused && stableSince > 0 && (Date.now() - stableSince) >= waitForStableTime) {\n logger.success('waitForStableAcrossRoots', `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return {\n mutationCount,\n stableTime: waitForStableTime,\n wasPaused,\n };\n }\n }\n\n throw new Error(`waitForStableAcrossRoots \u8D85\u65F6 (${overallTimeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`);\n },\n\n /**\n * \u521B\u5EFA\u4E00\u4E2A\u6301\u7EED\u76D1\u63A7 DOM \u53D8\u5316\u7684\u76D1\u63A7\u5668\uFF08\u9ED8\u8BA4\u4EC5\u76D1\u542C\u65B0\u589E DOM\uFF09\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u652F\u6301 'document.documentElement'\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => void\n * \u6240\u6709\u6A21\u5F0F\u90FD\u8FD4\u56DE\u672C\u6B21\u5168\u90E8\u53D8\u5316\u8282\u70B9\u5FEB\u7167 mutationNodes\n * @param {'added' | 'changed' | 'all'} [options.mode='added'] - \u76D1\u63A7\u6A21\u5F0F\n * @returns {Promise<{ stop: () => Promise<{ totalMutations: number }> }>} - \u8FD4\u56DE\u505C\u6B62\u51FD\u6570\n */\n async useMonitor(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const onMutation = options.onMutation;\n const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();\n const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode)\n ? rawMode\n : MUTATION_MONITOR_MODE.Added;\n\n logger.start('useMonitor', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);\n\n const monitorKey = generateKey('pk_mon');\n const callbackName = generateKey('pk_mon_cb');\n const cleanerName = generateKey('pk_mon_clean');\n\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, (payload) => {\n try {\n onMutation(payload);\n } catch (e) {\n // \u5FFD\u7565\u56DE\u8C03\u9519\u8BEF\n }\n });\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n await page.evaluate(({ selectorList, monitorKey, callbackName, cleanerName, hasCallback, mode }) => {\n const monitor = {\n observers: [],\n totalMutations: 0,\n running: true,\n };\n\n const resolveTargets = (selector) => {\n const key = String(selector || '').trim();\n if (!key) return [];\n\n if (key === 'document.documentElement' || key === 'documentElement' || key === 'document') {\n return document.documentElement ? [document.documentElement] : [];\n }\n\n if (key === 'document.body') {\n return document.body ? [document.body] : [];\n }\n\n return Array.from(document.querySelectorAll(key));\n };\n\n const serializeNode = (node, mutationType = 'unknown') => {\n if (!node) {\n return { html: '', text: '', mutationType };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n return {\n html: node.outerHTML || '',\n text: node.innerText || node.textContent || '',\n mutationType,\n };\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n }\n\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const nodes = Array.from(node.childNodes || []);\n const html = nodes\n .map(item => item?.nodeType === Node.ELEMENT_NODE ? (item.outerHTML || '') : (item?.textContent || ''))\n .join('\\n');\n const text = node.textContent || '';\n return { html: html || text, text, mutationType };\n }\n\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n };\n\n const collectMutationNodes = (mutations) => {\n const mutationNodes = [];\n\n for (const mutation of mutations) {\n if (mode === 'added') {\n if (mutation.type !== 'childList') continue;\n const added = Array.from(mutation.addedNodes || []);\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n continue;\n }\n\n if (mode === 'changed') {\n if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n }\n continue;\n }\n\n if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n } else if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else {\n mutationNodes.push(serializeNode(mutation.target, mutation.type || 'unknown'));\n }\n }\n\n return mutationNodes;\n };\n\n selectorList.forEach(selector => {\n const elements = resolveTargets(selector);\n elements.forEach(element => {\n const observer = new MutationObserver((mutations) => {\n if (!monitor.running) return;\n\n const mutationNodes = collectMutationNodes(mutations);\n if (mutationNodes.length <= 0) return;\n\n monitor.totalMutations += mutationNodes.length;\n\n if (hasCallback && window[callbackName]) {\n const html = mutationNodes.map(item => item.html || '').join('\\n');\n const text = mutationNodes.map(item => item.text || '').join('\\n');\n\n window[callbackName]({\n mutationCount: monitor.totalMutations,\n html,\n text,\n mutationNodes,\n });\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: mode !== 'added',\n attributes: mode !== 'added',\n });\n\n monitor.observers.push(observer);\n });\n });\n\n window[monitorKey] = monitor;\n window[cleanerName] = () => {\n monitor.running = false;\n monitor.observers.forEach(obs => obs.disconnect());\n const total = monitor.totalMutations;\n delete window[monitorKey];\n delete window[cleanerName];\n return total;\n };\n }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });\n\n logger.success('useMonitor', '\u76D1\u63A7\u5668\u5DF2\u542F\u52A8');\n\n return {\n stop: async () => {\n let totalMutations = 0;\n try {\n totalMutations = await page.evaluate((cleanerName) => {\n if (window[cleanerName]) {\n return window[cleanerName]();\n }\n return 0;\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\uFF0C\u5FFD\u7565\n }\n logger.success('useMonitor.stop', `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);\n return { totalMutations };\n }\n };\n }\n};\n", "export const Display = {\n parseTokenDisplayName(value) {\n if (!value) {\n return { owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const owner = (parts[0] || '').trim();\n const envType = (parts[1] || '').trim();\n const note = parts.length > 2 ? parts.slice(2).join(':').trim() : '';\n return { owner, envType, note };\n },\n\n parseEnvDisplayName(value) {\n if (!value) {\n return { env: '', owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const env = (parts[0] || '').trim();\n const owner = (parts[1] || '').trim();\n const envType = (parts[2] || '').trim();\n const note = parts.length > 3 ? parts.slice(3).join(':').trim() : '';\n return { env, owner, envType, note };\n },\n\n buildTokenDisplayName({ owner, envType, note } = {}) {\n const trimmedOwner = owner?.trim() || '';\n const trimmedType = envType?.trim() || '';\n const trimmedNote = note?.trim() || '';\n const parts = [trimmedOwner, trimmedType];\n if (trimmedNote) {\n parts.push(trimmedNote);\n }\n return parts.filter(Boolean).join(':');\n },\n\n shortId(value, max = 8) {\n const clean = String(value || '').trim();\n if (!clean) return '';\n if (clean.length <= max) return clean;\n return clean.slice(0, max);\n },\n\n resolveTokenIdentity(displayName, tokenId) {\n const cleanName = String(displayName || '').trim();\n const cleanId = String(tokenId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = cleanName !== '' && cleanName !== cleanId;\n const primary = hasName ? cleanName : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, fullId: cleanId, shortId: short };\n },\n\n resolveEnvIdentity(displayName, envId) {\n const parts = this.parseEnvDisplayName(displayName);\n const cleanId = String(envId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = parts.env !== '' && parts.env !== cleanId;\n const primary = hasName ? parts.env : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, parts, fullId: cleanId, shortId: short };\n },\n};\n", "import { createBaseLogger, setDefaultLogger } from './internals/logger.js';\n\nexport const stripAnsi = (input) => {\n if (!input) return '';\n return String(input).replace(/\\x1b\\[[0-9;]*m/g, '');\n};\n\n// =============================================================================\n// Log Templates & Definitions\n// =============================================================================\n\nconst STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst STEP_EMOJIS = [\n { match: '\u4EFB\u52A1', emoji: '\uD83E\uDDED' },\n { match: '\u8FD0\u884C\u6A21\u5F0F', emoji: '\uD83E\uDDE9' },\n { match: '\u6A21\u677F\u8BC6\u522B', emoji: '\uD83E\uDDF1' },\n { match: '\u767B\u5F55', emoji: '\uD83D\uDD10' },\n { match: '\u73AF\u5883', emoji: '\uD83E\uDDEA' },\n { match: '\u8F93\u5165', emoji: '\u2328\uFE0F' },\n { match: '\u53D1\u9001', emoji: '\uD83D\uDCE4' },\n { match: '\u54CD\u5E94\u76D1\u542C', emoji: '\uD83D\uDCE1' },\n { match: '\u7B49\u5F85\u54CD\u5E94', emoji: '\u23F3' },\n { match: '\u6D41\u5F0F', emoji: '\uD83E\uDDF5' },\n { match: '\u5F15\u7528', emoji: '\uD83D\uDCCE' },\n { match: '\u622A\u56FE', emoji: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB\u94FE\u63A5', emoji: '\uD83D\uDD17' },\n { match: '\u6570\u636E\u63A8\u9001', emoji: '\uD83D\uDCE6' },\n { match: '\u5F39\u7A97', emoji: '\uD83E\uDE9F' },\n];\nconst STATUS_EMOJIS = [\n { match: '\u5F00\u59CB', emoji: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', emoji: '\u2705' },\n { match: '\u6210\u529F', emoji: '\u2705' },\n { match: '\u5931\u8D25', emoji: '\u274C' },\n { match: '\u8DF3\u8FC7', emoji: '\u23ED\uFE0F' },\n { match: '\u8D85\u65F6', emoji: '\u23F1\uFE0F' },\n { match: '\u91CD\u8BD5', emoji: '\uD83D\uDD01' },\n { match: '\u7ED3\u675F', emoji: '\uD83C\uDFC1' },\n { match: '\u5DF2\u914D\u7F6E', emoji: '\uD83E\uDDF7' },\n { match: '\u5DF2\u68C0\u6D4B', emoji: '\uD83D\uDD0E' },\n];\n\nconst toErrorMessage = (error) => {\n if (!error) return '';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst decorateLabel = (label, mappings) => {\n if (!label) return '';\n const mapping = mappings.find((item) => label.includes(item.match));\n if (!mapping) return label;\n return `${mapping.emoji} ${label}`;\n};\n\nconst normalizeSnippet = (snippet, maxLen = 120) => {\n if (!snippet) return '';\n const text = String(snippet).replace(/\\s+/g, ' ').trim();\n if (!text) return '';\n const cleaned = text.replace(/\"/g, \"'\");\n if (cleaned.length <= maxLen) return cleaned;\n return `${cleaned.slice(0, maxLen)}...`;\n};\n\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\n\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `\u6B65\u9AA4: .*${escapeRegExp(step)}`;\n if (status) {\n pattern += `.*${escapeRegExp(status)}`;\n }\n return new RegExp(pattern);\n};\n\nconst buildDefinitionPatterns = (definition) => {\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n if (Array.isArray(definition.extraPatterns)) {\n patterns.push(...definition.extraPatterns);\n }\n return patterns;\n};\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\n\nconst LOG_DEFINITIONS = [\n {\n key: 'task_start',\n method: 'taskStart',\n label: '\u4EFB\u52A1\u5F00\u59CB',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (url) => [url ? `url=${url}` : ''],\n },\n {\n key: 'task_success',\n method: 'taskSuccess',\n label: '\u4EFB\u52A1\u5B8C\u6210',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'task_fail',\n method: 'taskFail',\n label: '\u4EFB\u52A1\u5931\u8D25',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (url, err) => [\n url ? `url=${url}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'runtime_headless',\n method: 'runtimeHeadless',\n label: '\u8FD0\u884C\u6A21\u5F0F\u5F3A\u5236\u65E0\u5934',\n group: '\u8FD0\u884C\u6A21\u5F0F',\n step: '\u8FD0\u884C\u6A21\u5F0F',\n status: 'Apify \u73AF\u5883\u5F3A\u5236\u65E0\u5934',\n level: 'warning',\n attention: 'medium',\n },\n {\n key: 'login_inject_success',\n method: 'loginInjectSuccess',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_inject_skip',\n method: 'loginInjectSkip',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_inject_fail',\n method: 'loginInjectFail',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'login_verify_success',\n method: 'loginVerifySuccess',\n label: '\u767B\u5F55\u9A8C\u8BC1\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_verify_skip',\n method: 'loginVerifySkip',\n label: '\u767B\u5F55\u9A8C\u8BC1\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_verify_fail',\n method: 'loginVerifyFail',\n label: '\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'env_check_success',\n method: 'envCheckSuccess',\n label: '\u73AF\u5883\u68C0\u67E5\u6210\u529F',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'env_check_fail',\n method: 'envCheckFail',\n label: '\u73AF\u5883\u68C0\u67E5\u5931\u8D25',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'input_query_start',\n method: 'inputQuery',\n label: '\u8F93\u5165\u67E5\u8BE2\u5F00\u59CB',\n group: '\u8F93\u5165',\n step: '\u8F93\u5165\u67E5\u8BE2',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (query) => [query ? `query=${query}` : ''],\n },\n {\n key: 'send_action',\n method: 'sendAction',\n label: '\u53D1\u9001\u8BF7\u6C42',\n group: '\u53D1\u9001',\n step: '\u53D1\u9001\u8BF7\u6C42',\n status: '\u70B9\u51FB\u53D1\u9001',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'response_listen_start',\n method: 'responseListenStart',\n label: '\u54CD\u5E94\u76D1\u542C\u5F00\u59CB',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label, timeoutSec) => [\n label ? `\u76EE\u6807=${label}` : '',\n timeoutSec ? `timeout=${timeoutSec}s` : ''\n ],\n },\n {\n key: 'response_listen_ready',\n method: 'responseListenReady',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u914D\u7F6E',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u914D\u7F6E',\n level: 'info',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_detected',\n method: 'responseListenDetected',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u68C0\u6D4B',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u68C0\u6D4B',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_timeout',\n method: 'responseListenTimeout',\n label: '\u54CD\u5E94\u76D1\u542C\u8D85\u65F6',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u8D85\u65F6',\n level: 'error',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_listen_end',\n method: 'responseListenEnd',\n label: '\u54CD\u5E94\u76D1\u542C\u7ED3\u675F',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_start',\n method: 'responseWaitStart',\n label: '\u7B49\u5F85\u54CD\u5E94\u5F00\u59CB',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_success',\n method: 'responseWaitSuccess',\n label: '\u7B49\u5F85\u54CD\u5E94\u5B8C\u6210',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_fail',\n method: 'responseWaitFail',\n label: '\u7B49\u5F85\u54CD\u5E94\u5931\u8D25',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_wait_retry',\n method: 'responseWaitRetry',\n label: '\u7B49\u5F85\u54CD\u5E94\u91CD\u8BD5',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (label, attempt) => [\n label ? `\u76EE\u6807=${label}` : '',\n attempt !== undefined ? `\u5C1D\u8BD5=${attempt}` : ''\n ],\n },\n {\n key: 'dom_wait_start',\n method: 'domWaitStart',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5F00\u59CB',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'dom_wait_fail',\n method: 'domWaitFail',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5931\u8D25',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'dom_chunk',\n method: 'domChunk',\n label: 'DOM\u7247\u6BB5',\n group: 'DOM',\n step: 'DOM\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'dom-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet, paused) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : '',\n paused ? 'paused=1' : ''\n ],\n },\n {\n key: 'dom_wait_success',\n method: 'domWaitSuccess',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5B8C\u6210',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (mutationCount, stableTime, wasPaused) => [\n mutationCount !== undefined ? `mutations=${mutationCount}` : '',\n stableTime !== undefined ? `stableTime=${stableTime}ms` : '',\n wasPaused ? 'paused=1' : ''\n ],\n },\n {\n key: 'stream_chunk',\n method: 'streamChunk',\n label: '\u6D41\u5F0F\u7247\u6BB5',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : ''\n ],\n },\n {\n key: 'stream_events_parsed',\n method: 'streamEventsParsed',\n label: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790\u5B8C\u6210',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790',\n status: '\u5B8C\u6210',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-events',\n throttleMs: 4000,\n buildDetails: (count) => [count !== undefined ? `count=${count}` : ''],\n },\n {\n key: 'stream_complete_event',\n method: 'streamCompleteEvent',\n label: '\u6D41\u5F0F\u5B8C\u6210\u4E8B\u4EF6\u6355\u83B7',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6',\n status: '\u5B8C\u6210\u4E8B\u4EF6\u5DF2\u6355\u83B7',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'stream_end',\n method: 'streamEnd',\n label: '\u6D41\u5F0F\u54CD\u5E94\u7ED3\u675F',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u54CD\u5E94',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'reference_expand_start',\n method: 'referenceExpandStart',\n label: '\u5F15\u7528\u5C55\u5F00\u5F00\u59CB',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'reference_expand_fail',\n method: 'referenceExpandFail',\n label: '\u5F15\u7528\u5C55\u5F00\u5931\u8D25',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'screenshot_start',\n method: 'screenshotStart',\n label: '\u622A\u56FE\u5F00\u59CB',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'screenshot_success',\n method: 'screenshotSuccess',\n label: '\u622A\u56FE\u6210\u529F',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'screenshot_fail',\n method: 'screenshotFail',\n label: '\u622A\u56FE\u5931\u8D25',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u94FE\u63A5\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'share_progress',\n method: 'shareProgress',\n label: '\u5206\u4EAB\u94FE\u63A5\u6B65\u9AA4',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6B65\u9AA4',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u6B65\u9AA4=${label}` : ''],\n },\n {\n key: 'share_dom_hit',\n method: 'shareDomHit',\n label: '\u5206\u4EAB\u94FE\u63A5DOM\u547D\u4E2D',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: 'DOM\u547D\u4E2D',\n level: 'info',\n attention: 'low',\n buildDetails: (link, domSnapshot) => [\n link ? `\u94FE\u63A5=${link}` : '',\n domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_source',\n method: 'shareSource',\n label: '\u5206\u4EAB\u94FE\u63A5\u6765\u6E90',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6765\u6E90',\n level: 'info',\n attention: 'low',\n buildDetails: (source, link, domSnapshot) => [\n source ? `\u6765\u6E90=${source}` : '',\n link ? `\u94FE\u63A5=${link}` : '',\n source === 'dom' && domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u94FE\u63A5\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (link) => [link ? `\u94FE\u63A5=${link}` : ''],\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u94FE\u63A5\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_skip',\n method: 'shareSkip',\n label: '\u5206\u4EAB\u94FE\u63A5\u8DF3\u8FC7',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'ai_search_card_detect_attempt',\n method: 'aiSearchCardDetectAttempt',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u5C1D\u8BD5',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u5C1D\u8BD5',\n level: 'info',\n attention: 'low',\n buildDetails: (attempt = 1, maxAttempts = 1, url = '') => [\n `attempt=${attempt}/${maxAttempts}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_detect_success',\n method: 'aiSearchCardDetectSuccess',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (cardType = '', attempts = 1, refreshCount = 0, url = '') => [\n cardType ? `cardType=${cardType}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_empty_result_success',\n method: 'aiSearchCardEmptyResultSuccess',\n label: 'AI Search \u7A7A\u7ED3\u679C\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u7A7A\u7ED3\u679C',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (contentLeftTpls = [], targetTpls = [], url = '', attempts = 0, refreshCount = 0) => [\n Array.isArray(contentLeftTpls) ? `contentLeftTpls=${normalizeSnippet(contentLeftTpls.join(','), 200)}` : '',\n Array.isArray(targetTpls) ? `targetTpls=${normalizeSnippet(targetTpls.join(','), 200)}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'data_push_success',\n method: 'dataPushSuccess',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u8BF4\u660E=${label}` : ''],\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'popup_detected',\n method: 'popupDetected',\n label: '\u5F39\u7A97\u68C0\u6D4B',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u68C0\u6D4B\u5230\u906E\u7F69',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_attempt',\n method: 'popupCloseAttempt',\n label: '\u5F39\u7A97\u5173\u95ED\u5C1D\u8BD5',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5C1D\u8BD5\u5173\u95ED',\n level: 'info',\n attention: 'low',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_success',\n method: 'popupCloseSuccess',\n label: '\u5F39\u7A97\u5173\u95ED\u5B8C\u6210',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'popup_close_fail',\n method: 'popupCloseFail',\n label: '\u5F39\u7A97\u5173\u95ED\u5931\u8D25',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n];\n\nexport const LOG_TEMPLATES = LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const defaultSelected = attentionRank >= DEFAULT_ATTENTION_RANK;\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns: buildDefinitionPatterns(definition),\n defaultSelected,\n };\n});\n\nconst buildStepLine = (step, status, details = []) => {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_EMOJIS) : '';\n const base = decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX;\n parts.push(base.trim());\n if (status) parts.push(decorateLabel(status, STATUS_EMOJIS));\n const detailParts = details.filter(Boolean);\n if (detailParts.length > 0) {\n parts.push(...detailParts);\n }\n return parts.join(STEP_SEPARATOR);\n};\n\nconst createThrottle = () => {\n const lastMap = new Map();\n return (key, intervalMs, fn) => {\n const now = Date.now();\n const last = lastMap.get(key) || 0;\n if (now - last >= intervalMs) {\n lastMap.set(key, now);\n fn();\n }\n };\n};\n\nexport const createTemplateLogger = (baseLogger = createBaseLogger()) => {\n const throttle = createThrottle();\n\n const info = (line) => baseLogger.info(line);\n const success = (line) => baseLogger.success(line);\n const warning = (line) => baseLogger.warning(line);\n const error = (line) => baseLogger.error(line);\n const debug = (line) => baseLogger.debug(line);\n const start = (line) => baseLogger.start(line);\n\n const stepInfo = (step, status, details = []) => info(buildStepLine(step, status, details));\n const stepSuccess = (step, status, details = []) => success(buildStepLine(step, status, details));\n const stepWarn = (step, status, details = []) => warning(buildStepLine(step, status, details));\n const stepError = (step, status, details = []) => error(buildStepLine(step, status, details));\n const stepStart = (step, status, details = []) => start(buildStepLine(step, status, details));\n\n const stepHandlers = {\n info: stepInfo,\n success: stepSuccess,\n warning: stepWarn,\n error: stepError,\n start: stepStart,\n };\n\n const logFromDefinition = (definition, details = []) => {\n const handler = stepHandlers[definition.level] || stepInfo;\n const payload = [...details, buildLogTag(definition.key)];\n const emit = () => handler(definition.step, definition.status, payload);\n if (definition.throttleMs) {\n throttle(definition.throttleKey || definition.key, definition.throttleMs, emit);\n return;\n }\n emit();\n };\n\n const definitionMethods = {};\n LOG_DEFINITIONS.forEach((definition) => {\n if (!definition.method) return;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n logFromDefinition(definition, details);\n };\n });\n\n return {\n step: (step, status, details, level = 'info') => {\n if (level === 'error') return stepError(step, status, details);\n if (level === 'warn' || level === 'warning') return stepWarn(step, status, details);\n if (level === 'start') return stepStart(step, status, details);\n if (level === 'success') return stepSuccess(step, status, details);\n return stepInfo(step, status, details);\n },\n info: (message) => info(message),\n success: (message) => success(message),\n warning: (message) => warning(message),\n warn: (message) => warning(message),\n error: (message) => error(message),\n debug: (message) => debug(message),\n start: (message) => start(message),\n ...definitionMethods,\n };\n};\n\nconst getDefaultBaseLogger = () => createBaseLogger('');\n\nexport const Logger = {\n setLogger: (logger) => setDefaultLogger(logger),\n info: (message) => getDefaultBaseLogger().info(message),\n success: (message) => getDefaultBaseLogger().success(message),\n warning: (message) => getDefaultBaseLogger().warning(message),\n warn: (message) => getDefaultBaseLogger().warning(message),\n error: (message) => getDefaultBaseLogger().error(message),\n debug: (message) => getDefaultBaseLogger().debug(message),\n start: (message) => getDefaultBaseLogger().start(message),\n useTemplate: (logger) => {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger();\n },\n};\n", "import delay from 'delay';\nimport { Utils } from './utils.js';\nimport { Mutation } from './mutation.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\nimport {\n normalizeScreenshotWatermarkify,\n resolveScreenshotWatermarkifyMeta,\n watermarkifyScreenshotBuffer,\n} from './internals/watermarkify.js';\nimport { createInternalLogger } from './internals/logger.js';\nimport { capturePageScreenshot } from './internals/screenshot.js';\nimport { resolveCurrentViewportSize } from './internals/viewport.js';\n\nconst logger = createInternalLogger('Share');\n\nconst DEFAULT_TIMEOUT_MS = 50 * 1000;\nconst DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;\nconst DEFAULT_POLL_INTERVAL_MS = 120;\n\nconst normalizePrefix = (value) => value == null ? undefined : String(value).trim();\n\nconst toSnapshot = (value, maxLen) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toInline = (value, maxLen = 200) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toJsonInline = (value, maxLen = 260) => {\n try {\n return toInline(JSON.stringify(value), maxLen);\n } catch {\n return '[\u4E0D\u53EF\u5E8F\u5217\u5316]';\n }\n};\n\nconst normalizeXurl = (value) => {\n if (!Array.isArray(value)) return [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const raw = String(input || '').trim();\n if (!raw) return [];\n\n return raw\n .split('.')\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const normalized = [];\n\n const apiMatchers = normalizeMatcherList(value[0]);\n if (apiMatchers.length > 0) {\n normalized.push(apiMatchers);\n }\n\n const flattenedPath = [];\n const extraPaths = [];\n\n value.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flattenedPath.push(...segments);\n }\n });\n\n if (flattenedPath.length > 0) {\n normalized.push(flattenedPath);\n }\n\n if (extraPaths.length > 0) {\n normalized.push(...extraPaths);\n }\n\n return normalized;\n};\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n const modeRaw = String(source.mode || 'dom').trim().toLowerCase();\n const mode = modeRaw === 'response' ? 'response' : 'dom';\n\n return {\n mode,\n prefix: normalizePrefix(source.prefix),\n xurl: normalizeXurl(source.xurl),\n };\n};\n\nconst resolveCaptureScreenWatermarkify = (page, optionValue) => {\n if (optionValue === false) {\n return normalizeScreenshotWatermarkify(false);\n }\n\n const runtimeQuery = String(page?.[PageRuntimeStateKey]?.query || '').trim();\n if (optionValue == null || optionValue === true) {\n return normalizeScreenshotWatermarkify(runtimeQuery ? { query: runtimeQuery } : true);\n }\n\n const optionSource = optionValue && typeof optionValue === 'object' ? optionValue : {};\n return normalizeScreenshotWatermarkify({\n ...(runtimeQuery ? { query: runtimeQuery } : {}),\n ...optionSource,\n });\n};\n\nconst getByPathSegments = (source, pathSegments) => {\n if (!Array.isArray(pathSegments) || pathSegments.length === 0) return undefined;\n\n let current = source;\n\n for (const rawSegment of pathSegments) {\n const segment = String(rawSegment || '').trim();\n if (!segment) return undefined;\n if (current == null) return undefined;\n\n if (Array.isArray(current) && /^\\d+$/.test(segment)) {\n current = current[Number(segment)];\n continue;\n }\n\n current = current[segment];\n }\n\n return current;\n};\n\nconst buildShareLink = (prefix, value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw;\n }\n\n const safePrefix = normalizePrefix(prefix);\n if (!safePrefix) return '';\n\n const valueNoSlash = raw.replace(/^\\/+/, '');\n\n if (/[?&=]$/.test(safePrefix)) {\n return `${safePrefix}${valueNoSlash}`;\n }\n\n const prefixNoSlash = safePrefix.replace(/\\/+$/, '');\n return `${prefixNoSlash}/${valueNoSlash}`;\n};\n\nconst parseJsonSafely = (text) => {\n const raw = String(text || '').trim();\n if (!raw) return null;\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst createDomShareMonitor = async (page, options = {}) => {\n const prefix = normalizePrefix(options.prefix);\n const selectors = options.selectors ?? 'html';\n const mode = options.mode ?? Mutation.Mode.All;\n const onMatch = typeof options.onMatch === 'function' ? options.onMatch : null;\n const onTelemetry = typeof options.onTelemetry === 'function' ? options.onTelemetry : null;\n\n let matched = false;\n\n logger.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);\n\n const monitor = await Mutation.useMonitor(page, selectors, {\n mode,\n onMutation: (context = {}) => {\n if (matched) return;\n\n const mutationCount = Number(context.mutationCount || 0);\n const mutationNodes = Array.isArray(context.mutationNodes) ? context.mutationNodes : [];\n const html = String(context.html || '');\n const text = String(context.text || '');\n const rawDom = `${html}\\n${text}`;\n\n if (onTelemetry) {\n onTelemetry({\n mutationCount,\n mutationNodesCount: mutationNodes.length,\n });\n }\n\n if (mutationCount <= 5 || mutationCount % 50 === 0) {\n logger.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);\n }\n\n const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];\n if (!candidate) return;\n\n matched = true;\n logger.success('captureLink.domHit', `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);\n\n if (onMatch) {\n onMatch({\n link: candidate,\n rawDom,\n mutationCount,\n html,\n text,\n mutationNodes,\n });\n }\n },\n });\n\n return {\n stop: async () => {\n const result = await monitor.stop();\n logger.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);\n return result;\n },\n };\n};\n\nexport const Share = {\n /**\n * \u6355\u83B7\u5206\u4EAB\u94FE\u63A5\uFF08\u5355\u6A21\u5F0F\uFF09\n * - mode='dom': \u4EC5 DOM \u76D1\u542C\n * - mode='response': \u4EC5\u63A5\u53E3\u76D1\u542C\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ mode?: 'dom' | 'response', prefix: string, xurl?: Array<string | string[]> }} options.share\n * @param {number} [options.timeoutMs=50000]\n * @param {number} [options.payloadSnapshotMaxLen=500]\n * @param {string | string[]} [options.domSelectors='html']\n * @param {'added' | 'changed' | 'all'} [options.domMode='all']\n * @param {() => Promise<void>} [options.performActions]\n * @returns {Promise<{ link: string | null; payloadText: string; payloadSnapshot: string; source: 'dom' | 'response' | 'none' }>}\n */\n async captureLink(page, options = {}) {\n const share = normalizeShare(options.share);\n const timeoutMs = Math.max(0, Number(options.timeoutMs ?? DEFAULT_TIMEOUT_MS) || 0);\n const payloadSnapshotMaxLen = options.payloadSnapshotMaxLen ?? DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN;\n const domSelectors = options.domSelectors ?? 'html';\n const domMode = options.domMode ?? Mutation.Mode.All;\n const performActions = typeof options.performActions === 'function' ? options.performActions : async () => { };\n\n if (share.prefix === undefined) {\n throw new Error('Share.captureLink requires options.share.prefix');\n }\n\n if (share.mode !== 'dom' && share.mode !== 'response') {\n throw new Error(`Share.captureLink unsupported share.mode: ${share.mode}`);\n }\n\n const apiMatchers = share.mode === 'response' ? (share.xurl[0] || []) : [];\n const fieldPaths = share.mode === 'response' ? share.xurl.slice(1) : [];\n\n if (share.mode === 'response' && apiMatchers.length === 0) {\n throw new Error('Share.captureLink requires share.xurl[0] api matcher when mode=response');\n }\n\n logger.start('captureLink', `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);\n logger.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);\n\n const stats = {\n actionTimedOut: false,\n domMutationCount: 0,\n domMutationNodes: 0,\n responseObserved: 0,\n responseMatched: 0,\n responseResolved: 0,\n lastMatchedUrl: '',\n responseSampleUrls: [],\n };\n\n const candidates = {\n dom: null,\n response: null,\n };\n\n const setCandidate = (source, link, payloadText = '') => {\n const safe = String(link || '').trim();\n if (!safe) return false;\n\n const [validated] = Utils.parseLinks(safe, { prefix: share.prefix }) || [];\n if (!validated) return false;\n\n if (candidates[source]?.link) return false;\n\n candidates[source] = {\n link: validated,\n payloadText: String(payloadText || ''),\n };\n\n logger.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);\n return true;\n };\n\n const resolveResponseCandidate = (responseText) => {\n const rawText = String(responseText || '');\n if (!rawText) return null;\n\n const [direct] = Utils.parseLinks(rawText, { prefix: share.prefix }) || [];\n if (direct) {\n return { link: direct, payloadText: rawText };\n }\n\n if (fieldPaths.length === 0) return null;\n\n const payload = parseJsonSafely(rawText);\n if (!payload || typeof payload !== 'object') return null;\n\n for (const pathSegments of fieldPaths) {\n const value = getByPathSegments(payload, pathSegments);\n if (value == null || value === '') continue;\n\n const composed = buildShareLink(share.prefix, value);\n if (!composed) continue;\n\n const [validated] = Utils.parseLinks(composed, { prefix: share.prefix }) || [];\n if (!validated) continue;\n\n return {\n link: validated,\n payloadText: rawText,\n };\n }\n\n return null;\n };\n\n let domMonitor = null;\n\n const stopDomMonitor = async () => {\n if (!domMonitor) return;\n const monitor = domMonitor;\n domMonitor = null;\n try {\n await monitor.stop();\n } catch (error) {\n logger.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n const onResponse = async (response) => {\n if (share.mode !== 'response') return;\n if (candidates.response?.link) return;\n\n stats.responseObserved += 1;\n\n try {\n const url = String(response.url() || '');\n\n if (url && stats.responseSampleUrls.length < 8 && !stats.responseSampleUrls.includes(url)) {\n stats.responseSampleUrls.push(url);\n }\n\n if (stats.responseObserved <= 5) {\n logger.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);\n }\n\n if (!apiMatchers.some((matcher) => url.includes(matcher))) return;\n\n stats.responseMatched += 1;\n stats.lastMatchedUrl = url;\n logger.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);\n\n const text = await response.text();\n const hit = resolveResponseCandidate(text);\n if (!hit?.link) {\n if (stats.responseMatched <= 3) {\n logger.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);\n }\n return;\n }\n\n stats.responseResolved += 1;\n logger.success('captureLink.responseHit', `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);\n setCandidate('response', hit.link, hit.payloadText);\n } catch (error) {\n logger.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n if (share.mode === 'dom') {\n logger.info('\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C');\n domMonitor = await createDomShareMonitor(page, {\n prefix: share.prefix,\n selectors: domSelectors,\n mode: domMode,\n onTelemetry: ({ mutationCount, mutationNodesCount }) => {\n stats.domMutationCount = mutationCount;\n stats.domMutationNodes = mutationNodesCount;\n },\n onMatch: ({ link, rawDom }) => {\n setCandidate('dom', link, rawDom);\n },\n });\n }\n\n if (share.mode === 'response') {\n logger.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);\n page.on('response', onResponse);\n }\n\n const deadline = Date.now() + timeoutMs;\n const getRemainingMs = () => Math.max(0, deadline - Date.now());\n\n try {\n const actionTimeout = getRemainingMs();\n logger.start('captureLink.performActions', `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);\n\n if (actionTimeout > 0) {\n let timer = null;\n let actionError = null;\n\n const actionPromise = Promise.resolve()\n .then(() => performActions())\n .then(() => '__ACTION_DONE__')\n .catch((error) => {\n actionError = error;\n return '__ACTION_ERROR__';\n });\n\n const timeoutPromise = new Promise((resolve) => {\n timer = setTimeout(() => resolve('__ACTION_TIMEOUT__'), actionTimeout);\n });\n\n const actionResult = await Promise.race([actionPromise, timeoutPromise]);\n if (timer) clearTimeout(timer);\n\n if (actionResult === '__ACTION_ERROR__') {\n logger.fail('captureLink.performActions', actionError);\n throw actionError;\n }\n\n if (actionResult === '__ACTION_TIMEOUT__') {\n stats.actionTimedOut = true;\n logger.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);\n } else {\n logger.success('captureLink.performActions', '\u6267\u884C\u52A8\u4F5C\u5B8C\u6210');\n }\n }\n\n let nextProgressLogTs = Date.now() + 3000;\n\n while (true) {\n const selected = share.mode === 'dom' ? candidates.dom : candidates.response;\n if (selected?.link) {\n logger.success('captureLink', `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);\n return {\n link: selected.link,\n payloadText: selected.payloadText,\n payloadSnapshot: toSnapshot(selected.payloadText, payloadSnapshotMaxLen),\n source: share.mode,\n };\n }\n\n const remaining = getRemainingMs();\n if (remaining <= 0) break;\n\n const now = Date.now();\n if (now >= nextProgressLogTs) {\n logger.info(\n `captureLink \u7B49\u5F85\u4E2D: remaining=${remaining}ms, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`\n );\n nextProgressLogTs = now + 5000;\n }\n\n await delay(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));\n }\n\n if (share.mode === 'response' && stats.responseMatched === 0) {\n logger.warning(\n `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`\n );\n }\n\n logger.warning(\n `captureLink \u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || 'none'}`\n );\n\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: '',\n source: 'none',\n };\n } finally {\n if (share.mode === 'response') {\n page.off('response', onResponse);\n logger.info('response \u76D1\u542C\u5DF2\u5378\u8F7D');\n }\n await stopDomMonitor();\n }\n },\n\n\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\uFF08\u57FA\u7840\u80FD\u529B\uFF09\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {number} [options.buffer]\n * @param {boolean} [options.restore]\n * @param {number} [options.maxHeight]\n * @returns {Promise<string>} base64 png\n */\n async captureScreen(page, options = {}) {\n const originalViewport = await resolveCurrentViewportSize(page);\n const defaultBuffer = Math.round((originalViewport.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n const restore = options.restore ?? false;\n const maxHeight = options.maxHeight ?? 8000;\n const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);\n\n try {\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n\n el.dataset.pkOrigOverflow = el.style.overflow;\n el.dataset.pkOrigHeight = el.style.height;\n el.dataset.pkOrigMaxHeight = el.style.maxHeight;\n el.classList.add('__pk_expanded__');\n\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n const targetHeight = Math.min(maxScrollHeight + buffer, maxHeight);\n\n await page.setViewportSize({\n width: originalViewport.width,\n height: targetHeight,\n });\n\n await delay(1000);\n\n const capturedAt = new Date();\n const rawBuffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'png',\n maxClipHeight: targetHeight,\n });\n\n if (!screenshotWatermarkify.enabled) {\n return rawBuffer.toString('base64');\n }\n\n const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {\n ...screenshotWatermarkify,\n capturedAt,\n });\n const buffer_ = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);\n\n return buffer_.toString('base64');\n } finally {\n if (restore) {\n await page.evaluate(() => {\n document.querySelectorAll('.__pk_expanded__').forEach(el => {\n el.style.overflow = el.dataset.pkOrigOverflow || '';\n el.style.height = el.dataset.pkOrigHeight || '';\n el.style.maxHeight = el.dataset.pkOrigMaxHeight || '';\n\n delete el.dataset.pkOrigOverflow;\n delete el.dataset.pkOrigHeight;\n delete el.dataset.pkOrigMaxHeight;\n el.classList.remove('__pk_expanded__');\n });\n });\n\n await page.setViewportSize(originalViewport);\n }\n }\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 8;\nconst DEFAULT_RESOLVER_TIMEOUT_MS = 180;\nconst DEFAULT_IP_LOOKUP_TIMEOUT_MS = 10000;\nconst DEFAULT_WATERMARK_OPACITY = 0.156;\nconst DEFAULT_WATERMARK_ROTATE_DEG = -16;\nconst DEFAULT_WATERMARK_CELL_WIDTH = 860;\nconst DEFAULT_WATERMARK_CELL_HEIGHT = 330;\nconst DEFAULT_STRIP_LOGO_URL = 'https://static.heartbitai.com/geo/icon/favicon.png';\nconst DEFAULT_IP_LOOKUP_URL = 'https://myip.ipip.net/json';\nconst DEFAULT_LOGO_FETCH_TIMEOUT_MS = 2500;\nconst DEFAULT_STRIP_ONE_LINE_HEIGHT = 78;\nconst DEFAULT_STRIP_WRAPPED_MIN_HEIGHT = 108;\nconst DEFAULT_STRIP_PADDING_LEFT = 22;\nconst DEFAULT_STRIP_PADDING_RIGHT = 28;\nconst DEFAULT_STRIP_GAP = 18;\nconst DEFAULT_STRIP_LABEL_WIDTH = 56;\nconst DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS = 180;\nconst DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH = 320;\nconst DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO = 0.58;\nconst DEFAULT_STRIP_ZONE_GAP = 18;\nconst DEFAULT_STRIP_PROMPT_TRAILING_PADDING = 16;\nconst DEFAULT_STRIP_LABEL_FONT_SIZE = 14.5;\nconst DEFAULT_STRIP_VALUE_FONT_SIZE = 15.5;\nconst DEFAULT_STRIP_VALUE_PADDING = 10;\nconst DEFAULT_STRIP_LABEL_PADDING = 14;\nconst DEFAULT_STRIP_SECTION_GAP = DEFAULT_STRIP_GAP + 16;\nconst DEFAULT_STRIP_LINE_HEIGHT_RATIO = 1.28;\nconst DEFAULT_STRIP_PROMPT_MAX_LINES = 3;\nconst DEFAULT_STRIP_CONTENT_SAFE_PADDING_X = 12;\nconst DEFAULT_STRIP_TEXT_WIDTH_SAFETY = 10;\nconst DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT = 1200;\n\nconst WEAK_LOCATION_VALUES = new Set(['cn', '\u4E2D\u56FD']);\nconst LOCATION_NETWORK_SUFFIX_PATTERNS = [\n /(?:\u4E2D\u56FD)?\u79FB\u52A8$/i,\n /(?:\u4E2D\u56FD)?\u8054\u901A$/i,\n /(?:\u4E2D\u56FD)?\u7535\u4FE1$/i,\n /\u94C1\u901A$/i,\n /\u6559\u80B2\u7F51$/i,\n /\u5E7F\u7535$/i,\n /\u9E4F\u535A\u58EB$/i,\n /\u963F\u91CC\u4E91$/i,\n /\u817E\u8BAF\u4E91$/i,\n /\u767E\u5EA6\u4E91$/i,\n /\u534E\u4E3A\u4E91$/i,\n /cloudflare$/i,\n /amazon$/i,\n /aws$/i,\n /azure$/i,\n /google$/i,\n /oracle$/i,\n /linode$/i,\n /vultr$/i,\n /digitalocean$/i,\n];\n\nlet cachedStripLogoSrcPromise = null;\nconst cachedEnrichmentByContext = new WeakMap();\nconst logger = createInternalLogger('Watermarkify');\n\nconst normalizeText = (value) => String(value || '').trim();\n\nconst toInline = (value, maxLen = 200) => {\n const text = normalizeText(value);\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst shortenTail = (value, maxLen = 80) => {\n const text = toInline(value, Math.max(maxLen * 2, maxLen + 8));\n if (!text || text.length <= maxLen) return text;\n return `${text.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;\n};\n\nconst shortenByCharacters = (value, maxChars = 80) => {\n const text = normalizeWhitespace(value);\n if (!text) return '';\n\n const chars = Array.from(text);\n if (chars.length <= maxChars) {\n return text;\n }\n\n return `${chars.slice(0, Math.max(0, maxChars - 1)).join('').trimEnd()}\u2026`;\n};\n\nconst padDatePart = (value) => String(value).padStart(2, '0');\n\nconst formatUtcOffsetLabel = (offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const sign = offsetHours >= 0 ? '+' : '-';\n const absolute = Math.abs(offsetHours);\n const hours = Math.trunc(absolute);\n const minutes = Math.round((absolute - hours) * 60);\n\n if (!minutes) {\n return `UTC${sign}${hours}`;\n }\n\n return `UTC${sign}${hours}:${padDatePart(minutes)}`;\n};\n\nconst formatTimestampForUtcOffset = (date, offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const source = date instanceof Date ? date : new Date(date || Date.now());\n const shifted = new Date(source.getTime() + offsetHours * 60 * 60 * 1000);\n\n return [\n `${shifted.getUTCFullYear()}-${padDatePart(shifted.getUTCMonth() + 1)}-${padDatePart(shifted.getUTCDate())}`,\n `${padDatePart(shifted.getUTCHours())}:${padDatePart(shifted.getUTCMinutes())}:${padDatePart(shifted.getUTCSeconds())}`,\n formatUtcOffsetLabel(offsetHours),\n ].join(' ');\n};\n\nconst normalizeWhitespace = (value) => String(value || '')\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\nconst stripLocationNetworkSuffix = (value) => {\n const parts = normalizeWhitespace(value).split(' ').filter(Boolean);\n if (parts.length <= 1) {\n return normalizeWhitespace(value);\n }\n\n const last = parts[parts.length - 1];\n if (!LOCATION_NETWORK_SUFFIX_PATTERNS.some((pattern) => pattern.test(last))) {\n return parts.join(' ');\n }\n\n return parts.slice(0, -1).join(' ').trim();\n};\n\nconst isWeakLocationValue = (value) => {\n const text = normalizeWhitespace(value).toLowerCase();\n if (!text) return true;\n if (WEAK_LOCATION_VALUES.has(text)) return true;\n return /^[a-z]{2,3}$/i.test(text);\n};\n\nconst pickHeaderValue = async (response, names = []) => {\n if (!response || typeof response.headerValue !== 'function') return '';\n\n for (const name of names) {\n const value = await response.headerValue(name).catch(() => null);\n const text = normalizeText(value);\n if (text) return text;\n }\n\n return '';\n};\n\nconst parseIpIpJsonResponse = (rawText) => {\n const text = normalizeWhitespace(rawText);\n if (!text || (!text.startsWith('{') && !text.startsWith('['))) {\n return null;\n }\n\n try {\n const payload = JSON.parse(text);\n const ip = toInline(payload?.data?.ip || payload?.ip, 80);\n const locationParts = Array.isArray(payload?.data?.location)\n ? payload.data.location.map((item) => normalizeWhitespace(item)).filter(Boolean)\n : [];\n const location = toInline(\n stripLocationNetworkSuffix(locationParts.join(' ')),\n 80,\n );\n\n if (!ip && !location) {\n return null;\n }\n\n return { ip, location };\n } catch {\n return null;\n }\n};\n\nconst fillEnrichment = (target, source) => {\n if (!target || !source || typeof source !== 'object') {\n return target;\n }\n\n if (!target.ip && source.ip) {\n target.ip = toInline(source.ip, 80);\n }\n if (!target.location && source.location) {\n target.location = toInline(source.location, 80);\n }\n\n return target;\n};\n\nconst readCachedEnrichment = (page) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context) {\n return null;\n }\n\n const cached = cachedEnrichmentByContext.get(context);\n return cached && typeof cached === 'object' ? cached : null;\n};\n\nconst writeCachedEnrichment = (page, source) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context || !source || typeof source !== 'object') {\n return;\n }\n\n const current = cachedEnrichmentByContext.get(context) || {};\n const next = {\n ip: toInline(source.ip || current.ip, 80),\n location: toInline(source.location || current.location, 80),\n };\n\n if (!next.ip && !next.location) {\n return;\n }\n\n cachedEnrichmentByContext.set(context, next);\n};\n\nconst getHostname = (url) => {\n try {\n const parsed = new URL(url);\n return parsed.hostname || parsed.host || '\u672C\u5730\u9875\u9762';\n } catch {\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n\n return '\u672C\u5730\u9875\u9762';\n }\n};\n\nconst withTimeout = async (promise, timeoutMs) => {\n const safeTimeoutMs = Math.max(0, Number(timeoutMs) || 0);\n if (!safeTimeoutMs) {\n return promise;\n }\n\n let timer = null;\n try {\n return await Promise.race([\n promise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve(null), safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst fetchAsDataUrl = async (url, timeoutMs = DEFAULT_LOGO_FETCH_TIMEOUT_MS) => {\n if (typeof fetch !== 'function') {\n return '';\n }\n\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n const safeTimeoutMs = Math.max(300, Number(timeoutMs) || DEFAULT_LOGO_FETCH_TIMEOUT_MS);\n const timer = controller\n ? setTimeout(() => controller.abort(), safeTimeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n redirect: 'follow',\n signal: controller?.signal,\n });\n\n if (!response?.ok) {\n return '';\n }\n\n const contentType = normalizeText(response.headers?.get?.('content-type')) || 'image/png';\n if (!/^image\\//i.test(contentType)) {\n return '';\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (!buffer.length) {\n return '';\n }\n\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n } catch {\n return '';\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst resolveStripLogoSrc = async () => {\n if (!cachedStripLogoSrcPromise) {\n cachedStripLogoSrcPromise = (async () => {\n const dataUrl = await fetchAsDataUrl(DEFAULT_STRIP_LOGO_URL);\n return dataUrl || DEFAULT_STRIP_LOGO_URL;\n })();\n }\n\n const resolved = await cachedStripLogoSrcPromise.catch(() => DEFAULT_STRIP_LOGO_URL);\n return normalizeText(resolved) || DEFAULT_STRIP_LOGO_URL;\n};\n\nconst normalizeLayer = (value, defaults) => {\n if (value === false) {\n return {\n ...defaults,\n enabled: false,\n };\n }\n\n if (value && typeof value === 'object') {\n return {\n ...defaults,\n ...value,\n enabled: value.enabled !== false,\n };\n }\n\n return {\n ...defaults,\n enabled: true,\n };\n};\n\nconst resolveWithCustomResolver = async (page, baseMeta, options = {}) => {\n const resolver = typeof options.resolver === 'function'\n ? options.resolver\n : null;\n if (!resolver) {\n return null;\n }\n\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const serverAddr = response && typeof response.serverAddr === 'function'\n ? await response.serverAddr().catch(() => null)\n : null;\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n\n try {\n const resolved = await withTimeout(\n Promise.resolve(resolver({\n page,\n response,\n url: baseMeta.url,\n hostname: baseMeta.hostname,\n title: baseMeta.title,\n prompt: baseMeta.prompt,\n query: baseMeta.query,\n serverAddr,\n signal: controller?.signal,\n })).catch(() => null),\n options.resolverTimeoutMs ?? DEFAULT_RESOLVER_TIMEOUT_MS,\n );\n\n if (!resolved || typeof resolved !== 'object') {\n return null;\n }\n\n const enrichment = {\n ip: toInline(resolved.ip, 80),\n location: toInline(resolved.location, 80),\n };\n if (enrichment.ip || enrichment.location) {\n logger.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || '-'}, loc=${enrichment.location || '-'}`);\n } else {\n logger.warning('\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc');\n }\n\n return enrichment;\n } finally {\n controller?.abort();\n }\n};\n\nconst openProbePage = async (page) => {\n if (!page || typeof page.context !== 'function') {\n return null;\n }\n\n const context = page.context();\n if (!context) {\n return null;\n }\n\n const browser = typeof context.browser === 'function'\n ? context.browser()\n : null;\n\n if (browser && typeof browser.newContext === 'function') {\n const probeContext = await browser.newContext().catch(() => null);\n if (probeContext && typeof probeContext.newPage === 'function') {\n const probePage = await probeContext.newPage().catch(async () => {\n await probeContext.close().catch(() => { });\n return null;\n });\n if (probePage) {\n return {\n page: probePage,\n close: async () => {\n await probeContext.close().catch(() => { });\n },\n };\n }\n } else {\n await probeContext?.close?.().catch(() => { });\n }\n }\n\n if (typeof context.newPage === 'function') {\n try {\n const probePage = await context.newPage();\n return {\n page: probePage,\n close: async () => {\n await probePage.close().catch(() => { });\n },\n };\n } catch {\n // \u67D0\u4E9B\u6258\u7BA1\u4E0A\u4E0B\u6587\u4E0D\u5141\u8BB8\u76F4\u63A5 newPage\uFF0C\u8FD9\u91CC\u8FD4\u56DE null \u8BA9\u4E0A\u5C42\u9000\u5316\u3002\n }\n }\n\n return null;\n};\n\nconst readPngDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 24) {\n return { width: 0, height: 0 };\n }\n\n const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let index = 0; index < pngSignature.length; index += 1) {\n if (buffer[index] !== pngSignature[index]) {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n};\n\nconst readJpegDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 4 || buffer[0] !== 0xff || buffer[1] !== 0xd8) {\n return { width: 0, height: 0 };\n }\n\n let offset = 2;\n while (offset + 9 <= buffer.length) {\n if (buffer[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = buffer[offset + 1];\n offset += 2;\n\n if (marker === 0xd8 || marker === 0xd9) {\n continue;\n }\n\n if (marker === 0xda) {\n break;\n }\n\n if (offset + 2 > buffer.length) {\n break;\n }\n\n const segmentLength = buffer.readUInt16BE(offset);\n if (segmentLength < 2 || offset + segmentLength > buffer.length) {\n break;\n }\n\n const isStartOfFrame = (\n marker >= 0xc0\n && marker <= 0xcf\n && marker !== 0xc4\n && marker !== 0xc8\n && marker !== 0xcc\n );\n\n if (isStartOfFrame && offset + 7 <= buffer.length) {\n return {\n height: buffer.readUInt16BE(offset + 3),\n width: buffer.readUInt16BE(offset + 5),\n };\n }\n\n offset += segmentLength;\n }\n\n return { width: 0, height: 0 };\n};\n\nconst readImageInfo = (buffer) => {\n const png = readPngDimensions(buffer);\n if (png.width && png.height) {\n return {\n mimeType: 'image/png',\n width: png.width,\n height: png.height,\n };\n }\n\n const jpeg = readJpegDimensions(buffer);\n if (jpeg.width && jpeg.height) {\n return {\n mimeType: 'image/jpeg',\n width: jpeg.width,\n height: jpeg.height,\n };\n }\n\n return {\n mimeType: '',\n width: 0,\n height: 0,\n };\n};\n\nconst buildWatermarkifyRenderHtml = ({ imageSrc, overlaySvg, width, height }) => {\n const safeWidth = Math.max(1, Number(width) || 1);\n const safeHeight = Math.max(1, Number(height) || 1);\n\n return `\n <!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <style>\n html, body {\n margin: 0;\n padding: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n background: #ffffff;\n }\n\n body {\n position: relative;\n }\n\n #pk-stage {\n position: relative;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n }\n\n #pk-base-image {\n position: absolute;\n inset: 0;\n display: block;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n }\n\n #pk-overlay {\n position: absolute;\n inset: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n pointer-events: none;\n }\n </style>\n </head>\n <body>\n <div id=\"pk-stage\">\n <img id=\"pk-base-image\" src=\"${escapeHtmlAttribute(imageSrc)}\" alt=\"\" />\n <div id=\"pk-overlay\">${overlaySvg}</div>\n </div>\n </body>\n </html>\n `;\n};\n\nconst composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}) => {\n if (!page || typeof page.context !== 'function') {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page');\n return buffer;\n }\n\n const renderScope = await openProbePage(page);\n if (!renderScope?.page) {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page');\n return buffer;\n }\n\n try {\n const renderPage = renderScope.page;\n const safeWidth = Math.max(1, Number(imageInfo.width) || 1);\n const safeHeight = Math.max(1, Number(imageInfo.height) || 1);\n const viewportHeight = Math.max(\n 1,\n Math.min(safeHeight, DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT),\n );\n\n await renderPage.setViewportSize({\n width: safeWidth,\n height: viewportHeight,\n }).catch(() => { });\n\n await renderPage.setContent(buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n }), {\n waitUntil: 'load',\n });\n\n await renderPage.waitForFunction(() => {\n const image = document.getElementById('pk-base-image');\n return image instanceof HTMLImageElement\n && image.complete\n && image.naturalWidth > 0\n && image.naturalHeight > 0;\n }, {\n timeout: 5000,\n }).catch(() => { });\n\n await renderPage.evaluate(async () => {\n if (document.fonts?.ready) {\n await document.fonts.ready.catch(() => { });\n }\n }).catch(() => { });\n\n const composed = await renderPage.screenshot({\n type: 'png',\n fullPage: true,\n animations: 'disabled',\n }).catch((error) => {\n logger.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (Buffer.isBuffer(composed) && composed.length > 0) {\n return composed;\n }\n\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C');\n return buffer;\n } finally {\n await renderScope.close().catch(() => { });\n }\n};\n\nconst resolveWithIpLookup = async (page, options = {}) => {\n if (!page || typeof page.context !== 'function' || options.ipLookup === false) {\n return null;\n }\n\n const probeScope = await openProbePage(page);\n if (!probeScope?.page) {\n logger.warning('ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page');\n return null;\n }\n\n const timeoutMs = Math.max(\n 300,\n Number(options.ipLookupTimeoutMs) || DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n );\n try {\n const probePage = probeScope.page;\n logger.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);\n\n const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {\n waitUntil: 'commit',\n timeout: timeoutMs,\n }).catch((error) => {\n logger.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n const status = response && typeof response.status === 'function'\n ? response.status()\n : 0;\n const contentType = normalizeText(await pickHeaderValue(response, ['content-type']));\n let rawText = '';\n\n if (response && typeof response.text === 'function') {\n rawText = String(await withTimeout(\n response.text().catch(() => ''),\n timeoutMs,\n ) || '');\n }\n\n if (!rawText) {\n rawText = String(await withTimeout(\n probePage.evaluate(() => {\n return document.body?.innerText\n || document.documentElement?.innerText\n || '';\n }).catch(() => ''),\n Math.min(timeoutMs, 500),\n ) || '');\n }\n\n const parsed = parseIpIpJsonResponse(rawText);\n if (parsed?.ip || parsed?.location) {\n logger.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, ip=${parsed.ip || '-'}, loc=${parsed.location || '-'}`);\n return parsed;\n }\n\n logger.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, preview=${shortenTail(rawText, 120) || '[empty]'}`);\n return null;\n } catch (error) {\n logger.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n } finally {\n await probeScope.close().catch(() => { });\n }\n};\n\nconst resolveEnrichment = async (page, baseMeta, options) => {\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const cached = readCachedEnrichment(page);\n\n const merged = {\n ip: toInline(options.ip, 80),\n location: toInline(options.location, 80),\n };\n\n logger.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || '-'}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);\n\n if (!merged.ip || !merged.location) {\n if (cached?.ip || cached?.location) {\n logger.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || '-'}, loc=${cached.location || '-'}`);\n }\n fillEnrichment(merged, cached);\n }\n\n if (!merged.ip || !merged.location) {\n fillEnrichment(\n merged,\n await resolveWithCustomResolver(page, baseMeta, options),\n );\n }\n\n if ((!merged.ip || !merged.location) && options.ipLookup !== false) {\n fillEnrichment(\n merged,\n await resolveWithIpLookup(page, options),\n );\n }\n\n if (!merged.location || isWeakLocationValue(merged.location)) {\n const headerLocation = toInline(await pickHeaderValue(response, [\n 'cf-ipcountry',\n 'x-vercel-ip-country',\n 'x-country-code',\n 'x-geo-country',\n ]), 80);\n if (!merged.location || (isWeakLocationValue(merged.location) && headerLocation)) {\n logger.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || '-'}`);\n merged.location = headerLocation || merged.location;\n }\n }\n\n writeCachedEnrichment(page, merged);\n if (merged.ip || merged.location) {\n logger.info(`enrichment \u5B8C\u6210: ip=${merged.ip || '-'}, loc=${merged.location || '-'}`);\n } else {\n logger.warning('enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc');\n }\n\n return merged;\n};\n\nconst buildWatermarkStamp = ({ prompt, captureTime, ip, location }) => {\n const parts = [\n `Prompt ${shortenTail(prompt, 40) || '-'}`,\n `Time ${captureTime}`,\n `Loc ${shortenTail(location, 20) || '-'}`,\n `IP ${toInline(ip, 24) || '-'}`,\n ];\n\n return parts.join(' | ');\n};\n\nconst buildStripSegments = ({ prompt, captureTime, ip, location }) => {\n const promptValue = shortenByCharacters(\n normalizeWhitespace(prompt) || '-',\n DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS,\n ) || '-';\n const ipValue = normalizeWhitespace(ip) || '-';\n const locationValue = normalizeWhitespace(location) || '-';\n\n return [\n {\n kind: 'prompt',\n label: 'Prompt',\n value: promptValue,\n rawValue: promptValue,\n },\n {\n kind: 'time',\n label: 'Time',\n value: captureTime,\n rawValue: captureTime,\n },\n {\n kind: 'location',\n label: 'Loc',\n value: locationValue,\n rawValue: locationValue,\n },\n {\n kind: 'ip',\n label: 'IP',\n value: ipValue,\n rawValue: ipValue,\n },\n ];\n};\n\nconst escapeXml = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst escapeHtmlAttribute = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\nconst estimateTextWidth = (value, fontSize = 16) => {\n const text = String(value || '');\n let width = 0;\n\n for (const char of text) {\n if (/\\s/.test(char)) {\n width += fontSize * 0.34;\n } else if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf\\u3040-\\u30ff\\uac00-\\ud7af]/.test(char)) {\n width += fontSize * 0.92;\n } else if (/[A-Z0-9]/.test(char)) {\n width += fontSize * 0.62;\n } else {\n width += fontSize * 0.56;\n }\n }\n\n return Math.ceil(width);\n};\n\nconst resolvePromptFields = (options = {}, fallbackTitle = '') => {\n const query = normalizeText(options.query);\n const prompt = query\n || normalizeText(options.prompt)\n || normalizeText(fallbackTitle)\n || '\u672A\u63D0\u4F9B Prompt';\n\n return {\n prompt,\n query: query || prompt,\n };\n};\n\nconst createBaseWatermarkifyOptions = () => ({\n enabled: true,\n timezoneOffsetHours: DEFAULT_TIMEZONE_OFFSET,\n response: null,\n ip: '',\n location: '',\n prompt: '',\n query: '',\n ipLookup: true,\n ipLookupTimeoutMs: DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: null,\n resolverTimeoutMs: DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(undefined, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(undefined, {}),\n});\n\nconst createDisabledWatermarkifyOptions = () => ({\n ...createBaseWatermarkifyOptions(),\n enabled: false,\n watermark: normalizeLayer(false, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(false, {}),\n});\n\nexport const normalizeScreenshotWatermarkify = (value) => {\n const base = createBaseWatermarkifyOptions();\n\n if (value === false) {\n return createDisabledWatermarkifyOptions();\n }\n\n if (value == null || value === true) {\n return base;\n }\n\n const source = value && typeof value === 'object' ? value : {};\n const timezoneOffsetHoursRaw = Number(source.timezoneOffsetHours);\n const ipLookupTimeoutMsRaw = Number(source.ipLookupTimeoutMs);\n const resolverTimeoutMsRaw = Number(source.resolverTimeoutMs);\n\n return {\n ...base,\n enabled: source.enabled !== false,\n timezoneOffsetHours: Number.isFinite(timezoneOffsetHoursRaw)\n ? timezoneOffsetHoursRaw\n : DEFAULT_TIMEZONE_OFFSET,\n response: source.response ?? null,\n ip: normalizeText(source.ip),\n location: normalizeText(source.location),\n prompt: normalizeWhitespace(source.prompt),\n query: normalizeWhitespace(source.query),\n ipLookup: source.ipLookup !== false,\n ipLookupTimeoutMs: Number.isFinite(ipLookupTimeoutMsRaw)\n ? ipLookupTimeoutMsRaw\n : DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: typeof source.resolver === 'function' ? source.resolver : null,\n resolverTimeoutMs: Number.isFinite(resolverTimeoutMsRaw)\n ? resolverTimeoutMsRaw\n : DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(source.watermark, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(source.strip, {}),\n };\n};\n\nexport const resolveScreenshotWatermarkifyMeta = async (page, options = {}) => {\n const timezoneOffsetHours = options.timezoneOffsetHours ?? DEFAULT_TIMEZONE_OFFSET;\n const url = normalizeText(page?.url?.()) || 'about:blank';\n const title = normalizeText(await page.title().catch(() => '')) || '\u672A\u547D\u540D\u9875\u9762';\n const hostname = getHostname(url);\n const { prompt, query } = resolvePromptFields(options, title);\n const capturedAt = options.capturedAt instanceof Date\n ? options.capturedAt\n : new Date(options.capturedAt || Date.now());\n const captureTime = formatTimestampForUtcOffset(capturedAt, timezoneOffsetHours);\n\n const [enrichment, stripLogoSrc] = await Promise.all([\n resolveEnrichment(page, {\n url,\n hostname,\n title,\n prompt,\n query,\n }, options),\n resolveStripLogoSrc(),\n ]);\n\n const ip = enrichment.ip || '-';\n const location = enrichment.location || '-';\n\n return {\n watermarkText: buildWatermarkStamp({\n prompt,\n captureTime,\n ip,\n location,\n }),\n stripSegments: buildStripSegments({\n prompt,\n captureTime,\n ip,\n location,\n }),\n watermark: options.watermark,\n strip: options.strip,\n stripLogoSrc,\n };\n};\n\nconst buildFontFamily = () => 'MiSans, \"SF Pro Display\", \"PingFang SC\", \"Helvetica Neue\", Arial, sans-serif';\n\nconst buildStripSegmentLayout = (segment, options = {}) => {\n const label = normalizeWhitespace(segment?.label || '');\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const rawValueWidth = Math.max(\n 24,\n estimateTextWidth(rawValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING,\n );\n const maxValueWidth = Math.max(0, Number(options.valueMaxWidth) || 0);\n const renderValue = maxValueWidth > 0\n ? fitTextWithEllipsis(rawValue, Math.max(18, maxValueWidth - DEFAULT_STRIP_VALUE_PADDING), valueFontSize)\n : rawValue;\n const valueWidth = maxValueWidth > 0\n ? Math.max(24, Math.min(maxValueWidth, estimateTextWidth(renderValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING))\n : rawValueWidth;\n\n return {\n ...segment,\n label,\n rawValue,\n renderValue,\n labelFontSize,\n valueFontSize,\n labelWidth,\n valueWidth,\n segmentWidth: labelWidth + valueWidth,\n rowHeight: Math.round(Math.max(labelFontSize, valueFontSize) * 1.42),\n };\n};\n\nconst buildStripRowLayout = (segments, overrides = {}) => {\n const safeSegments = Array.isArray(segments) ? segments : [];\n const sectionGap = DEFAULT_STRIP_SECTION_GAP;\n const layouts = safeSegments.map((segment, index) => buildStripSegmentLayout(segment, {\n valueMaxWidth: overrides?.valueMaxWidths?.[index],\n }));\n const totalWidth = layouts.reduce((sum, segment) => sum + segment.segmentWidth, 0)\n + Math.max(0, layouts.length - 1) * sectionGap;\n const rowHeight = layouts.reduce((max, segment) => Math.max(max, segment.rowHeight || 0), 0);\n\n return {\n sectionGap,\n layouts,\n totalWidth,\n rowHeight,\n };\n};\n\nconst fitTextWithEllipsis = (chars, maxWidth, fontSize) => {\n const safeChars = Array.isArray(chars) ? chars.slice() : Array.from(String(chars || ''));\n if (!safeChars.length) {\n return '-';\n }\n\n if (estimateTextWidth(safeChars.join(''), fontSize) <= maxWidth) {\n return safeChars.join('').trim() || '-';\n }\n\n while (safeChars.length > 1 && estimateTextWidth(`${safeChars.join('').trimEnd()}\u2026`, fontSize) > maxWidth) {\n safeChars.pop();\n }\n\n return `${safeChars.join('').trimEnd()}\u2026` || '\u2026';\n};\n\nconst splitTextToLines = (value, maxWidth, fontSize, maxLines = 2) => {\n const chars = Array.from(normalizeWhitespace(value) || '-');\n const safeMaxWidth = Math.max(18, maxWidth - DEFAULT_STRIP_TEXT_WIDTH_SAFETY);\n if (!chars.length) {\n return { lines: ['-'], truncated: false };\n }\n\n const lines = [];\n let cursor = 0;\n let truncated = false;\n\n while (cursor < chars.length && lines.length < maxLines) {\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (cursor >= chars.length) {\n break;\n }\n\n const isLastLine = lines.length === maxLines - 1;\n const lineChars = [];\n\n while (cursor < chars.length) {\n const nextChars = [...lineChars, chars[cursor]];\n const remaining = cursor < chars.length - 1;\n const previewText = nextChars.join('') + (isLastLine && remaining ? '\u2026' : '');\n\n if (estimateTextWidth(previewText, fontSize) <= safeMaxWidth || lineChars.length === 0) {\n lineChars.push(chars[cursor]);\n cursor += 1;\n continue;\n }\n\n break;\n }\n\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (isLastLine && cursor < chars.length) {\n lines.push(fitTextWithEllipsis([...lineChars, ...chars.slice(cursor)], safeMaxWidth, fontSize));\n truncated = true;\n cursor = chars.length;\n continue;\n }\n\n lines.push(lineChars.join('').trim() || '-');\n }\n\n return {\n lines: lines.length > 0 ? lines : ['-'],\n truncated,\n };\n};\n\nconst resolveMetadataMinValueWidth = (segment) => {\n switch (segment?.kind) {\n case 'time':\n return Math.max(148, estimateTextWidth('2026-04-23 21:27:16 UTC+8', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'ip':\n return Math.max(108, estimateTextWidth('255.255.255.255', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'location':\n return 76;\n default:\n return 56;\n }\n};\n\nconst buildMetadataRowLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const naturalRow = buildStripRowLayout(safeSegments);\n\n if (!safeSegments.length || naturalRow.totalWidth <= contentWidth) {\n return naturalRow;\n }\n\n const sectionGap = naturalRow.sectionGap;\n const totalLabelWidth = naturalRow.layouts.reduce((sum, segment) => sum + segment.labelWidth, 0);\n const availableValueWidth = Math.max(\n 72,\n Math.floor(contentWidth - totalLabelWidth - Math.max(0, safeSegments.length - 1) * sectionGap),\n );\n const minValueWidths = naturalRow.layouts.map((segment) => resolveMetadataMinValueWidth(segment));\n const naturalValueWidths = naturalRow.layouts.map((segment) => segment.valueWidth);\n const valueWidths = naturalValueWidths.slice();\n let overflow = naturalRow.totalWidth - contentWidth;\n const shrinkOrder = ['location', 'ip', 'time'];\n\n shrinkOrder.forEach((kind) => {\n if (overflow <= 0) return;\n\n naturalRow.layouts.forEach((segment, index) => {\n if (overflow <= 0 || segment.kind !== kind) return;\n const minWidth = minValueWidths[index];\n const reducible = Math.max(0, valueWidths[index] - minWidth);\n if (!reducible) return;\n const reduction = Math.min(reducible, overflow);\n valueWidths[index] -= reduction;\n overflow -= reduction;\n });\n });\n\n if (overflow > 0) {\n const minTotalWidth = minValueWidths.reduce((sum, width) => sum + width, 0);\n if (minTotalWidth > availableValueWidth) {\n const flexibleIndexes = naturalRow.layouts\n .map((segment, index) => ({ segment, index }))\n .filter(({ segment }) => segment.kind !== 'time');\n let extraOverflow = minTotalWidth - availableValueWidth;\n\n flexibleIndexes.forEach(({ index }) => {\n if (extraOverflow <= 0) return;\n const minFloor = 40;\n const reducible = Math.max(0, minValueWidths[index] - minFloor);\n if (!reducible) return;\n const reduction = Math.min(reducible, extraOverflow);\n valueWidths[index] -= reduction;\n extraOverflow -= reduction;\n });\n }\n }\n\n return buildStripRowLayout(safeSegments, {\n valueMaxWidths: valueWidths,\n });\n};\n\nconst buildPromptWrapLayout = (segment, contentWidth) => {\n const label = normalizeWhitespace(segment?.label || 'Prompt') || 'Prompt';\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const safeTotalWidth = Math.max(labelWidth + 56, Number(contentWidth) || 0);\n const valueWidth = Math.max(\n 56,\n safeTotalWidth - labelWidth - DEFAULT_STRIP_CONTENT_SAFE_PADDING_X,\n );\n const result = splitTextToLines(rawValue, valueWidth, valueFontSize, DEFAULT_STRIP_PROMPT_MAX_LINES);\n const lineHeight = Math.max(18, Math.round(valueFontSize * DEFAULT_STRIP_LINE_HEIGHT_RATIO));\n const lineWidths = result.lines.map((line) => estimateTextWidth(line, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING);\n const measuredValueWidth = Math.min(\n valueWidth,\n Math.max(56, ...lineWidths),\n );\n const rowHeight = Math.round(Math.max(labelFontSize, valueFontSize) * 1.42);\n\n return {\n mode: result.lines.length === 1 ? 'single' : 'wrapped',\n label,\n rawValue,\n labelFontSize,\n labelWidth,\n valueFontSize,\n valueWidth,\n lines: result.lines,\n truncated: result.truncated,\n lineHeight,\n blockHeight: result.lines.length === 1\n ? rowHeight\n : Math.max(lineHeight, result.lines.length * lineHeight),\n totalWidth: labelWidth + measuredValueWidth,\n };\n};\n\nconst buildStripLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const promptSegment = safeSegments.find((segment) => segment.kind === 'prompt') || safeSegments[0] || null;\n const metadataSegments = safeSegments.filter((segment) => segment !== promptSegment);\n const zoneGap = DEFAULT_STRIP_ZONE_GAP;\n let metadataRow = buildMetadataRowLayout(\n metadataSegments,\n Math.max(220, contentWidth),\n );\n let metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n let promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n\n if (promptAvailableWidth < DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH && metadataSegments.length > 0) {\n const tighterMetadataWidth = Math.max(180, contentWidth - DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH - zoneGap);\n metadataRow = buildMetadataRowLayout(metadataSegments, tighterMetadataWidth);\n metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n }\n\n const preferredPromptWidth = Math.min(\n promptAvailableWidth,\n Math.max(280, Math.round(contentWidth * DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO)),\n );\n let promptRow = buildPromptWrapLayout(promptSegment, preferredPromptWidth);\n\n if (promptRow?.truncated && promptAvailableWidth > preferredPromptWidth + 24) {\n promptRow = buildPromptWrapLayout(promptSegment, promptAvailableWidth);\n }\n\n const contentHeight = Math.max(\n promptRow?.blockHeight || 0,\n metadataRow?.rowHeight || 0,\n 24,\n );\n const verticalPadding = contentHeight > (metadataRow?.rowHeight || 0) ? 18 : 16;\n const stripHeight = Math.max(\n contentHeight > (metadataRow?.rowHeight || 0)\n ? DEFAULT_STRIP_WRAPPED_MIN_HEIGHT\n : DEFAULT_STRIP_ONE_LINE_HEIGHT,\n Math.ceil(contentHeight + verticalPadding * 2),\n );\n\n return {\n mode: 'zoned',\n height: stripHeight,\n contentHeight,\n promptRow,\n promptStartX: 0,\n metadataRow,\n metadataStartX,\n };\n};\n\nconst renderStripRow = (row, options = {}) => {\n const startX = Number(options.startX) || 0;\n const centerY = Number(options.centerY) || 0;\n const fontFamily = String(options.fontFamily || '');\n const showDividers = options.showDividers !== false;\n const layouts = Array.isArray(row?.layouts) ? row.layouts : [];\n\n if (!layouts.length) {\n return '';\n }\n\n const rowHeight = Math.max(18, Number(row?.rowHeight) || 18);\n const dividerHalfHeight = Math.max(12, Math.round(rowHeight * 0.56));\n const sectionGap = Math.max(0, Number(row?.sectionGap) || 0);\n const svgSegments = [];\n let currentX = startX;\n\n layouts.forEach((segment, index) => {\n const label = escapeXml(segment.label || '');\n const value = escapeXml(segment.renderValue || '-');\n const labelX = currentX;\n const valueX = currentX + segment.labelWidth;\n\n svgSegments.push(`\n <text\n x=\"${labelX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${label}</text>\n <text\n x=\"${valueX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.valueFontSize}\"\n font-weight=\"${segment.kind === 'prompt' ? 760 : 710}\"\n dominant-baseline=\"middle\"\n >${value}</text>\n `);\n\n currentX += segment.segmentWidth;\n\n if (showDividers && index < layouts.length - 1) {\n const lineX = currentX + Math.round(sectionGap / 2);\n svgSegments.push(`\n <line\n x1=\"${lineX}\"\n y1=\"${centerY - dividerHalfHeight}\"\n x2=\"${lineX}\"\n y2=\"${centerY + dividerHalfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `);\n currentX += sectionGap;\n }\n });\n\n return svgSegments.join('');\n};\n\nconst renderStripDivider = (x, centerY, height) => {\n const safeX = Number(x) || 0;\n const safeCenterY = Number(centerY) || 0;\n const safeHeight = Math.max(18, Number(height) || 18);\n const halfHeight = Math.max(12, Math.round(safeHeight * 0.56));\n\n return `\n <line\n x1=\"${safeX}\"\n y1=\"${safeCenterY - halfHeight}\"\n x2=\"${safeX}\"\n y2=\"${safeCenterY + halfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `;\n};\n\nconst buildWatermarkifySvg = (meta, imageWidth, imageHeight) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!hasWatermark && !hasStrip) {\n return '';\n }\n\n const width = Math.max(1, Number(imageWidth) || 1);\n const height = Math.max(1, Number(imageHeight) || 1);\n const fontFamily = escapeXml(buildFontFamily());\n const parts = [];\n\n if (hasWatermark) {\n const stampText = escapeXml(normalizeText(meta.watermarkText));\n const cellWidth = Math.max(680, Number(meta.watermark?.cellWidth) || DEFAULT_WATERMARK_CELL_WIDTH);\n const cellHeight = Math.max(260, Number(meta.watermark?.cellHeight) || DEFAULT_WATERMARK_CELL_HEIGHT);\n const rotateDeg = Number(meta.watermark?.rotateDeg) || DEFAULT_WATERMARK_ROTATE_DEG;\n const opacity = Math.min(0.22, Math.max(0.05, Number(meta.watermark?.opacity) || DEFAULT_WATERMARK_OPACITY));\n const rowOffset = Math.round(cellWidth * 0.24);\n const startX = -Math.round(cellWidth * 0.16);\n const startY = -Math.round(cellHeight * 0.12);\n const cols = Math.ceil((width + cellWidth * 1.1) / cellWidth) + 1;\n const rows = Math.ceil((height + cellHeight * 0.9) / cellHeight) + 1;\n const stamps = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let col = 0; col < cols; col += 1) {\n const x = startX + col * cellWidth + (row % 2 ? rowOffset : 0);\n const y = startY + row * cellHeight + (row % 2 ? 14 : -8);\n stamps.push(`\n <g transform=\"translate(${x} ${y}) rotate(${rotateDeg})\">\n <text\n x=\"0\"\n y=\"0\"\n fill=\"#111111\"\n fill-opacity=\"${opacity}\"\n stroke=\"#ffffff\"\n stroke-opacity=\"0.12\"\n stroke-width=\"0.22\"\n font-family=\"${fontFamily}\"\n font-size=\"19\"\n font-weight=\"720\"\n letter-spacing=\"0.6\"\n >${stampText}</text>\n </g>\n `);\n }\n }\n\n parts.push(`<g id=\"watermarks\">${stamps.join('')}</g>`);\n }\n\n if (hasStrip) {\n const logoSize = 28;\n const logoX = DEFAULT_STRIP_PADDING_LEFT;\n const contentStartX = logoX + logoSize + DEFAULT_STRIP_GAP;\n const contentWidth = width - contentStartX - DEFAULT_STRIP_PADDING_RIGHT;\n const stripLayout = buildStripLayout(meta.stripSegments, contentWidth);\n const stripHeight = stripLayout.height;\n const stripY = height - stripHeight;\n const logoY = Number((stripY + ((stripHeight - logoSize) / 2)).toFixed(2));\n let stripContentSvg = '';\n const centerY = stripY + stripHeight / 2 + 1;\n const promptRow = stripLayout.promptRow;\n const metadataRow = stripLayout.metadataRow;\n const promptParts = [];\n const hasPrompt = Boolean(promptRow?.label);\n const hasMetadata = Array.isArray(metadataRow?.layouts) && metadataRow.layouts.length > 0;\n const zoneDividerX = hasPrompt && hasMetadata\n ? contentStartX + stripLayout.metadataStartX - (DEFAULT_STRIP_ZONE_GAP / 2)\n : null;\n\n if (promptRow?.mode === 'single') {\n promptParts.push(renderStripRow({\n layouts: [\n {\n kind: 'prompt',\n label: promptRow.label,\n renderValue: promptRow.lines[0] || '-',\n labelFontSize: promptRow.labelFontSize,\n valueFontSize: promptRow.valueFontSize,\n labelWidth: promptRow.labelWidth,\n segmentWidth: promptRow.labelWidth + promptRow.valueWidth,\n },\n ],\n sectionGap: 0,\n rowHeight: promptRow.blockHeight,\n }, {\n startX: contentStartX + stripLayout.promptStartX,\n centerY,\n fontFamily,\n showDividers: false,\n }));\n } else if (promptRow) {\n const promptStartX = contentStartX + stripLayout.promptStartX;\n const labelX = promptStartX;\n const valueX = promptStartX + promptRow.labelWidth;\n const blockTop = centerY - (promptRow.blockHeight / 2);\n const labelY = centerY;\n\n promptParts.push(`\n <text\n x=\"${labelX}\"\n y=\"${labelY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(promptRow.label)}</text>\n `);\n\n promptRow.lines.forEach((line, index) => {\n const lineY = blockTop + (index * promptRow.lineHeight) + (promptRow.lineHeight / 2);\n promptParts.push(`\n <text\n x=\"${valueX}\"\n y=\"${lineY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.valueFontSize}\"\n font-weight=\"760\"\n dominant-baseline=\"middle\"\n >${escapeXml(line)}</text>\n `);\n });\n }\n\n stripContentSvg = [\n promptParts.join(''),\n zoneDividerX == null\n ? ''\n : renderStripDivider(\n zoneDividerX,\n centerY,\n Math.max(promptRow?.blockHeight || 0, metadataRow?.rowHeight || 0),\n ),\n renderStripRow(metadataRow, {\n startX: contentStartX + stripLayout.metadataStartX,\n centerY,\n fontFamily,\n showDividers: true,\n }),\n ].join('');\n\n parts.push(`\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${DEFAULT_STRIP_PADDING_LEFT}\" y=\"${stripY}\" width=\"${Math.max(120, Math.round(width * 0.42))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${meta.stripLogoSrc ? `<image href=\"${escapeXml(meta.stripLogoSrc)}\" x=\"${logoX}\" y=\"${logoY}\" width=\"${logoSize}\" height=\"${logoSize}\" />` : ''}\n ${stripContentSvg}\n </g>\n `);\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n};\n\nexport const watermarkifyScreenshotBuffer = async (buffer, meta, page = null) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!Buffer.isBuffer(buffer) || !meta || (!hasWatermark && !hasStrip)) {\n return buffer;\n }\n\n const imageInfo = readImageInfo(buffer);\n if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {\n logger.warning('watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F');\n return buffer;\n }\n\n const overlaySvg = buildWatermarkifySvg(meta, imageInfo.width, imageInfo.height);\n if (!overlaySvg) {\n return buffer;\n }\n\n return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, imageInfo);\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["normalizeShare", "segments", "protocol", "domain", "path", "logger", "import_serialize_error", "logger", "a", "path", "path", "frameUrls", "runtime", "logger", "Actor", "logger", "logger", "logger", "delay", "picomatch", "logger", "logger", "express", "logger", "callCaptchaRecognitionApi", "logger", "uuidv4", "import_uuid", "logger", "uuidv4", "result", "selectorList", "stableTime", "timeout", "callbackName", "normalizeText", "path", "monitorKey", "cleanerName", "mode", "text", "logger", "import_delay", "logger", "logger", "DEFAULT_TIMEOUT_MS", "toInline", "segments", "delay", "maxHeight", "crawleeLog"]
|
|
7
7
|
}
|