@bryce3310687963/android-toolkit 1.0.51 → 1.0.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/apify-kit.js", "../src/constants.js", "../src/context.js", "../src/device.js", "../src/errors.js", "../src/logger.js", "../src/device-input.js", "../src/device-view.js", "../src/device-sqlite.js", "../src/launch.js", "../src/webview.js", "../src/mutation.js", "../src/network-capture.js", "../src/share.js", "../src/internals/compression.js", "../entrys/node.js"],
4
- "sourcesContent": ["import fs from 'node:fs';\nimport cycle from 'json-cycle';\n\nimport { Code, Status, StoragePath } from './constants.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { CrawlerError, serializeError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst { decycle } = cycle;\nlet instance = null;\n\nexport const ApifyKit = {\n useApifyKit,\n};\n\nasync function useApifyKit(options = {}) {\n if (!instance || options.reset) {\n instance = createApifyKit(options);\n }\n return instance;\n}\n\nfunction createApifyKit(options = {}) {\n const inputPath = StoragePath.Input;\n const outputPath = options.outputPath || StoragePath.Output;\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n const logTemplate = Logger.useTemplate();\n let pushed = false;\n\n return {\n ctx,\n input,\n inputPath,\n outputPath,\n async runStep(step, target, actionFn, options = {}) {\n const { failActor = true, retry = {} } = options;\n const retryTimes = Math.max(0, Number(retry.times || 0));\n const startedAt = Date.now();\n let lastError = null;\n\n for (let attempt = 0; attempt <= retryTimes; attempt += 1) {\n const attemptLabel = attempt > 0 ? ` (\u91CD\u8BD5 #${attempt})` : '';\n if (attempt > 0) logTemplate.stepRetry(step, attempt);\n logTemplate.stepStart(`${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n logTemplate.stepSuccess(`${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n logTemplate.stepFail(`${step}${attemptLabel}`, error);\n if (attempt < retryTimes) {\n if (typeof retry.before === 'function') {\n await retry.before(ctx, attempt + 1);\n } else {\n await sleep(3000);\n }\n }\n }\n }\n\n if (failActor) {\n let base64 = '';\n try {\n base64 = await Device.screenshotBase64(ctx);\n } catch (error) {\n base64 = `\u622A\u56FE\u5931\u8D25: ${error?.message || String(error)}`;\n }\n await this.pushFailed(lastError, { step, base64, retryAttempts: retryTimes });\n }\n throw lastError;\n },\n async runStepLoose(step, target, actionFn, options = {}) {\n return this.runStep(step, target, actionFn, { ...options, failActor: false });\n },\n async pushSuccess(data = {}, options = {}) {\n pushed = true;\n appendOutput(outputPath, {\n code: Number.isFinite(Number(options.code)) ? Number(options.code) : Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n logTemplate.dataPush({ type: 'success', outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n logTemplate.dataPush({ type: 'artifact', outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushFailed(error, meta = {}) {\n const normalized = CrawlerError.isCrawlerError(error)\n ? error\n : CrawlerError.from(error, { code: Code.UnknownError, context: meta });\n pushed = true;\n appendOutput(outputPath, {\n code: normalized.code,\n status: Status.Failed,\n error: sanitizeData(serializeError(normalized)),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n logTemplate.dataPush({ type: 'failed', outputPath, code: normalized.code, message: normalized.message });\n },\n hasPushed() {\n return pushed;\n },\n };\n}\n\nfunction appendOutput(outputPath, item) {\n const items = readOutputArray(outputPath);\n items.push(item);\n fs.writeFileSync(outputPath, JSON.stringify(items, null, 2) + '\\n', 'utf8');\n}\n\nfunction readOutputArray(outputPath) {\n if (!fs.existsSync(outputPath)) return [];\n const raw = fs.readFileSync(outputPath, 'utf8').trim();\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) throw new Error(`Android output must be a JSON array: ${outputPath}`);\n return parsed;\n}\n\nfunction stepDetail(target) {\n if (!target) return {};\n if (typeof target === 'string') return { target };\n if (typeof target === 'object') {\n return {\n serial: target.serial,\n packageName: target.packageName,\n runId: target.runId,\n };\n }\n return { target: String(target) };\n}\n\nfunction sanitizeData(value) {\n return decycle(prepareForJson(value, new WeakMap()));\n}\n\nfunction prepareForJson(value, seen) {\n if (value == null) return value;\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return value.toString();\n if (type === 'function' || type === 'symbol') return undefined;\n if (type !== 'object') return String(value);\n\n if (seen.has(value)) return seen.get(value);\n if (value instanceof Date) return value.toISOString();\n\n if (value instanceof Error) {\n const out = {};\n seen.set(value, out);\n copyEntries(out, serializeError(value), seen);\n return out;\n }\n\n if (Array.isArray(value)) {\n const out = [];\n seen.set(value, out);\n for (const item of value) {\n const safe = prepareForJson(item, seen);\n out.push(safe === undefined ? null : safe);\n }\n return out;\n }\n\n if (value instanceof Map) {\n const out = [];\n seen.set(value, out);\n for (const [key, item] of value.entries()) {\n out.push([prepareForJson(key, seen), prepareForJson(item, seen)]);\n }\n return out;\n }\n\n if (value instanceof Set) {\n const out = [];\n seen.set(value, out);\n for (const item of value.values()) {\n const safe = prepareForJson(item, seen);\n out.push(safe === undefined ? null : safe);\n }\n return out;\n }\n\n const out = {};\n seen.set(value, out);\n copyEntries(out, value, seen);\n return out;\n}\n\nfunction copyEntries(out, value, seen) {\n for (const [key, item] of Object.entries(value)) {\n const safe = prepareForJson(item, seen);\n if (safe !== undefined) out[key] = safe;\n }\n}\n", "export const Code = Object.freeze({\n Success: 0,\n EmptySuccess: 1,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n AccountFreeze: 30000006,\n InvalidRequest: 30010001,\n AdbUnavailable: 30010002,\n ContentUnavailable: 30010003,\n SourceExtractionFailed: 30010004,\n AutomationFailed: 30010005,\n AppRuntimeUnavailable: 30010008,\n AppNotInstalled: 30010009,\n});\n\nexport const Status = Object.freeze({\n Success: 'SUCCESS',\n Failed: 'FAILED',\n});\n\nexport const StoragePath = Object.freeze({\n Input: '/apify_storage/input.json',\n Output: '/apify_storage/output.json',\n});\n\nexport const UnicodeIme = Object.freeze({\n packageName: 'io.appium.settings',\n component: 'io.appium.settings/.UnicodeIME',\n inputAction: 'ADB_INPUT_TEXT',\n});\n\nexport const AppiumSettings = Object.freeze({\n packageName: 'io.appium.settings',\n clipboardReceiver: 'io.appium.settings/.receivers.ClipboardReceiver',\n clipboardGetAction: 'io.appium.settings.clipboard.get',\n});\n\nexport const WebViewBridge = Object.freeze({\n packageName: 'com.heartbit.apify.android.bridge',\n actionCommand: 'com.heartbit.apify.android.bridge.COMMAND',\n cacheDir: 'apify-webview-bridge',\n hookConfigFile: 'hook.json',\n commandDir: 'commands',\n resultDir: 'results',\n});\n\nexport const ActorKey = Object.freeze({\n DoubaoAndroid: 'doubao.android',\n ErineAndroid: 'erine.android',\n WechatAndroid: 'wechat.android',\n QwenAndroid: 'qwen.android',\n YuanbaoAndroid: 'yuanbao.android',\n XhsAndroid: 'xhs.android',\n});\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n return {\n mode: 'clipboard',\n prefix: String(source.prefix || '').trim(),\n xurl: Array.isArray(source.xurl) ? source.xurl : [],\n };\n};\n\nconst createActorInfo = (info) => {\n const key = String(info.key || '').trim();\n return Object.freeze({\n key,\n name: String(info.name || key),\n icon: String(info.icon || `https://static.heartbitai.com/general/actors/${key}.png`),\n webviews: Object.freeze(Array.isArray(info.webviews) ? info.webviews : []),\n share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n [ActorKey.DoubaoAndroid]: createActorInfo({\n key: ActorKey.DoubaoAndroid,\n name: '\u8C46\u5305 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['www.doubao.com'],\n }],\n share: {\n prefix: 'https://www.doubao.com/thread/',\n xurl: [],\n },\n }),\n [ActorKey.ErineAndroid]: createActorInfo({\n key: ActorKey.ErineAndroid,\n name: '\u6587\u5C0F\u8A00 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['yiyanapp.baidu.com'],\n }],\n share: {\n prefix: 'https://mr.baidu.com/r/',\n xurl: [],\n },\n }),\n [ActorKey.WechatAndroid]: createActorInfo({\n key: ActorKey.WechatAndroid,\n name: '\u5FAE\u4FE1 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['websearch/template'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.QwenAndroid]: createActorInfo({\n key: ActorKey.QwenAndroid,\n name: '\u5343\u95EE Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['www.qianwen.com', 'chat2.qianwen.com'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.XhsAndroid]: createActorInfo({\n key: ActorKey.XhsAndroid,\n name: '\u5C0F\u7EA2\u4E66 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['xiaohongshu.com', 'xhslink.com'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.YuanbaoAndroid]: createActorInfo({\n key: ActorKey.YuanbaoAndroid,\n name: '\u5143\u5B9D Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['yuanbao.tencent.com', 'hunyuan.tencent.com', 'yb.tencent.com'],\n }],\n share: {\n prefix: 'https://yb.tencent.com/s/',\n xurl: [],\n },\n }),\n});\n", "export const Context = {\n createAndroidContext,\n firstNonEmpty,\n requireNonEmpty,\n};\n\nfunction createAndroidContext(input = {}, defaults = {}) {\n const runtime = input.runtime && typeof input.runtime === 'object' ? input.runtime : {};\n const device = runtime.device && typeof runtime.device === 'object'\n ? runtime.device\n : {};\n\n return {\n runId: firstNonEmpty(defaults.runId, runtime.runId, input.runId),\n query: String(firstNonEmpty(defaults.query, input.query) || '').trim(),\n serial: firstNonEmpty(defaults.serial, device.serial),\n packageName: firstNonEmpty(defaults.packageName, device.packageName),\n adbPath: firstNonEmpty(defaults.adbPath, process.env.ANDROID_TOOLKIT_ADB_PATH),\n appVersion: firstNonEmpty(defaults.appVersion, device.appVersion),\n slotKey: firstNonEmpty(defaults.slotKey, device.slotKey),\n instanceId: firstNonEmpty(defaults.instanceId, device.instanceId),\n externalIp: firstNonEmpty(defaults.externalIp, device.externalIp),\n };\n}\n\nfunction firstNonEmpty(...values) {\n for (const value of values) {\n const clean = String(value ?? '').trim();\n if (clean) return clean;\n }\n return '';\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new Error(`${name} is required`);\n return clean;\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { AppiumSettings, Code, UnicodeIme, WebViewBridge } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_ADB_ATTEMPTS = 3;\nconst DEFAULT_ADB_RETRY_DELAY_MS = 500;\n\nexport const Device = {\n adbExec,\n adbShell,\n writeCacheFile,\n forceStopApp,\n clearAppCache,\n startActivity,\n startLauncher,\n resolveLauncherActivity,\n focusedActivity,\n waitForActivity,\n waitForForeground,\n screenSize,\n screenDensity,\n tapAbsolute,\n swipe,\n pressKey,\n pressBack,\n pressEnter,\n typeText,\n screenshotPng,\n screenshotBase64,\n dumpUiXml,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\n currentInputMethod,\n restoreInputMethod,\n};\n\nasync function adbExec(ctx, args, options = {}) {\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const startedAt = Date.now();\n try {\n const { stdout } = await execAdbWithRetry(adbPath, args, options);\n Logger.useTemplate().adbExec({ duration: Logger.duration(startedAt), args: compactArgs(args) });\n return stdout;\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { args: compactArgs(args), adbPath },\n });\n }\n throw error;\n }\n}\n\nasync function adbShell(ctx, args, options = {}) {\n const serial = requireDeviceField(ctx, 'serial');\n return adbExec(ctx, ['-s', serial, 'shell', ...args], options);\n}\n\nasync function writeCacheFile(ctx, options = {}) {\n const dataDir = appDataDir(ctx);\n const dirPath = `${dataDir}/cache/${cleanCachePathName(options.dirName, 'dirName')}`;\n const filePath = `${dirPath}/${cleanCachePathName(options.fileName, 'fileName')}`;\n const command = [\n `owner=$(stat -c %u:%g ${shellQuoteForRemote(dataDir)})`,\n `mkdir -p ${shellQuoteForRemote(dirPath)}`,\n `printf %s ${shellQuoteForRemote(String(options.text ?? ''))} > ${shellQuoteForRemote(filePath)}`,\n `chown \"$owner\" ${shellQuoteForRemote(dirPath)} ${shellQuoteForRemote(filePath)}`,\n `chmod 2775 ${shellQuoteForRemote(dirPath)}`,\n `chmod 664 ${shellQuoteForRemote(filePath)}`,\n ].join(' && ');\n await Device.adbShell(ctx, [`su -c ${shellQuoteForRemote(command)}`], {\n timeoutMs: Number(options.timeoutMs || 10000),\n maxBuffer: Number(options.maxBuffer || 1024),\n });\n return filePath;\n}\n\nasync function adbInput(ctx, args, options = {}) {\n return adbShell(ctx, ['input', ...args], options);\n}\n\nasync function forceStopApp(ctx, packageName = ctx.packageName) {\n await adbShell(ctx, ['am', 'force-stop', requireValue(packageName, 'packageName')], { timeoutMs: 15000 });\n}\n\nasync function clearAppCache(ctx, packageName = ctx.packageName) {\n const targetPackage = requireValue(packageName, 'packageName');\n if (!/^[A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)+$/.test(targetPackage)) {\n throw new CrawlerError({ message: 'invalid_request: invalid packageName for cache cleanup', code: Code.InvalidRequest });\n }\n const dataDir = `/data/data/${targetPackage}`;\n const cacheDirs = [`${dataDir}/cache`, `${dataDir}/code_cache`, `/sdcard/Android/data/${targetPackage}/cache`];\n // Launch \u5DF2\u5199\u5165\u7684\u6865\u63A5\u914D\u7F6E\u548C\u6293\u5305\u89C4\u5219\u4E5F\u5728 cache \u4E2D\uFF0C\u5FC5\u987B\u4FDD\u7559\u3002\n const command = [\n 'set -e',\n `test -d ${shellQuoteForRemote(dataDir)}`,\n `for cache_dir in ${cacheDirs.map(shellQuoteForRemote).join(' ')}; do`,\n ' if [ -L \"$cache_dir\" ]; then echo \"refusing symlink cache directory: $cache_dir\" >&2; exit 1; fi',\n ' if [ -d \"$cache_dir\" ]; then',\n ` find \"$cache_dir\" -mindepth 1 -maxdepth 1 ! -name ${shellQuoteForRemote(WebViewBridge.cacheDir)} ! -name 'network-capture' -exec rm -rf -- {} +`,\n ' fi',\n 'done',\n ].join('\\n');\n await Device.adbShell(ctx, [`su -c ${shellQuoteForRemote(command)}`], {\n timeoutMs: 30_000,\n maxBuffer: 4096,\n }).catch((error) => {\n throw CrawlerError.from(error, { code: Code.AutomationFailed, context: { packageName: targetPackage } });\n });\n Logger.useTemplate().info('App \u4E34\u65F6\u7F13\u5B58\u5DF2\u6E05\u7406', { packageName: targetPackage });\n}\n\nasync function startActivity(ctx, component, args = []) {\n const target = requireValue(component, 'component');\n const output = await adbShell(ctx, ['am', 'start', '-W', '-n', target, ...args], { timeoutMs: 20000 });\n assertActivityStartOk(output, target);\n await sleep(1500);\n return output;\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n const targetPackage = requireValue(packageName, 'packageName');\n const component = launcherActivity\n ? `${targetPackage}/${requireValue(launcherActivity, 'launcherActivity')}`\n : await resolveLauncherActivity(ctx, targetPackage);\n return startActivity(ctx, component, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\n}\n\nasync function resolveLauncherActivity(ctx, packageName = ctx.packageName) {\n const targetPackage = requireValue(packageName, 'packageName');\n const output = await adbShell(ctx, [\n 'cmd',\n 'package',\n 'resolve-activity',\n '--brief',\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n targetPackage,\n ], { timeoutMs: 15000 });\n const component = parseResolvedLauncherComponent(output, targetPackage);\n if (!component) {\n throw new CrawlerError({\n message: `automation_failed: cannot resolve launcher activity packageName=${targetPackage} output=${compactOutput(output)}`,\n code: Code.AutomationFailed,\n context: { packageName: targetPackage, output: compactOutput(output, 2000) },\n });\n }\n return component;\n}\n\nasync function focusedActivity(ctx) {\n const resumed = await resumedActivity(ctx).catch(() => '');\n if (resumed) return resumed;\n const out = await adbShell(ctx, ['dumpsys', 'window'], { timeoutMs: 15000, maxBuffer: 12 * 1024 * 1024 });\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mCurrentFocus=Window') && !trimmed.includes('=null')) return trimmed;\n }\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mFocusedApp=AppWindowToken') && !trimmed.includes('=null')) return trimmed;\n }\n return '';\n}\n\nasync function resumedActivity(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'activity', 'activities'], {\n timeoutMs: 15000,\n maxBuffer: 12 * 1024 * 1024,\n });\n let fallback = '';\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.includes('ActivityRecord') || !trimmed.includes('/')) continue;\n if (trimmed.includes('mTopResumedActivity') ||\n trimmed.includes('topResumedActivity') ||\n trimmed.startsWith('ResumedActivity:') ||\n trimmed.startsWith('Resumed:')) {\n return trimmed;\n }\n if (trimmed.includes('mResumedActivity')) fallback = trimmed;\n }\n return fallback;\n}\n\nasync function waitForActivity(ctx, predicate, timeoutMs = 15000, intervalMs = 700) {\n const deadline = Date.now() + Number(timeoutMs);\n let lastFocused = '';\n while (Date.now() < deadline) {\n lastFocused = await focusedActivity(ctx).catch((error) => `ERROR: ${error?.message || String(error)}`);\n if (predicate(lastFocused)) return lastFocused;\n await sleep(intervalMs);\n }\n throw new CrawlerError({\n message: `automation_failed: waitForActivity timeout focused=${lastFocused}`,\n code: Code.AutomationFailed,\n });\n}\n\nasync function waitForForeground(ctx, packageName = ctx.packageName, timeoutMs = 6000) {\n const target = requireValue(packageName, 'packageName');\n return waitForActivity(ctx, (value) => String(value || '').includes(target), timeoutMs, 500);\n}\n\nasync function screenSize(ctx) {\n const out = await adbShell(ctx, ['wm', 'size'], { timeoutMs: 15000 });\n const match = /(\\d+)x(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen size: ${out}`, code: Code.AdbUnavailable });\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nasync function screenDensity(ctx) {\n const out = await adbShell(ctx, ['wm', 'density'], { timeoutMs: 15000 });\n const match = /(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen density: ${out}`, code: Code.AdbUnavailable });\n return Number(match[1]);\n}\n\nasync function tapAbsolute(ctx, x, y) {\n await adbInput(ctx, ['tap', Math.round(Number(x)), Math.round(Number(y))], { timeoutMs: 15000 });\n}\n\nasync function swipe(ctx, from, to, durationMs = 360) {\n const args = [\n 'swipe',\n Math.round(Number(from?.x)),\n Math.round(Number(from?.y)),\n Math.round(Number(to?.x)),\n Math.round(Number(to?.y)),\n Math.round(Number(durationMs)),\n ];\n await adbInput(ctx, args, { timeoutMs: 30000 });\n}\n\nasync function pressKey(ctx, key) {\n await adbInput(ctx, ['keyevent', String(key)], { timeoutMs: 15000 });\n}\n\nasync function pressBack(ctx) {\n await pressKey(ctx, 'BACK');\n}\n\nasync function pressEnter(ctx) {\n await pressKey(ctx, 'KEYCODE_ENTER');\n}\n\nasync function typeText(ctx, text) {\n await ensureUnicodeIme(ctx);\n const value = String(text ?? '');\n if (!value) return;\n\n await sendUnicodeImeText(ctx, encodeUnicodeImeText(value), {\n timeoutMs: Math.max(15000, value.length * 300),\n });\n await sleep(1200);\n}\n\nasync function ensureUnicodeIme(ctx) {\n const out = await adbShell(ctx, ['ime', 'list', '-s'], { timeoutMs: 15000 });\n if (!String(out || '').split(/\\s+/).includes(UnicodeIme.component)) {\n throw new CrawlerError({\n message: `adb_unavailable: UnicodeIME \u672A\u5B89\u88C5\u6216\u4E0D\u53EF\u7528 ${UnicodeIme.component}`,\n code: Code.AdbUnavailable,\n context: { component: UnicodeIme.component },\n });\n }\n await adbShell(ctx, ['ime', 'set', UnicodeIme.component], { timeoutMs: 15000 });\n}\n\nasync function currentInputMethod(ctx) {\n const value = await adbShell(ctx, ['settings', 'get', 'secure', 'default_input_method'], { timeoutMs: 15000 });\n return String(value || '').trim();\n}\n\nasync function restoreInputMethod(ctx, component) {\n const value = String(component || '').trim();\n if (!value || value === 'null' || value === UnicodeIme.component) return false;\n await adbShell(ctx, ['ime', 'set', value], { timeoutMs: 15000 });\n return true;\n}\n\nasync function screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n try {\n const { stdout } = await execAdbWithRetry(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeoutMs: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n label: 'screencap',\n });\n return Buffer.from(stdout);\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: screencap failed ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { serial, adbPath },\n });\n }\n throw new CrawlerError({\n message: `source_extraction_failed: screencap failed ${error?.message || String(error)}`,\n code: Code.SourceExtractionFailed,\n context: { serial },\n });\n }\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nexport async function readClipboardForShare(ctx) {\n const out = await adbShell(ctx, [\n 'am',\n 'broadcast',\n '-n',\n AppiumSettings.clipboardReceiver,\n '-a',\n AppiumSettings.clipboardGetAction,\n ], {\n timeoutMs: 8000,\n maxBuffer: 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `source_extraction_failed: Appium Settings clipboard receiver unavailable ${error?.message || String(error)}`,\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver },\n });\n });\n const text = normalizeAppiumClipboardBroadcast(out);\n if (!text) {\n throw new CrawlerError({\n message: 'source_extraction_failed: ADB clipboard is empty',\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver, output: String(out || '').slice(0, 1000) },\n });\n }\n return text;\n}\n\nasync function dumpUiXml(ctx) {\n let lastError = null;\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const dumpPath = `/data/local/tmp/android-toolkit-window-${Date.now()}-${Math.random().toString(16).slice(2)}.xml`;\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n try {\n await adbShell(ctx, ['uiautomator', 'dump', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 4 * 1024 * 1024,\n });\n const raw = await adbShell(ctx, ['cat', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 16 * 1024 * 1024,\n });\n const start = String(raw || '').indexOf('<?xml');\n if (start < 0) throw new CrawlerError({ message: `automation_failed: uiautomator dump missing xml: ${raw}`, code: Code.AutomationFailed });\n return String(raw || '').slice(start).trim();\n } catch (error) {\n lastError = error;\n Logger.useTemplate().adbRetry({ label: 'uiautomator dump', attempt, message: error?.message || String(error) });\n await sleep(350 * attempt);\n } finally {\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n }\n }\n throw CrawlerError.isCrawlerError(lastError)\n ? lastError\n : new CrawlerError({\n message: `automation_failed: uiautomator dump failed ${lastError?.message || String(lastError || '')}`.trim(),\n code: Code.AutomationFailed,\n context: { lastError: lastError?.message || String(lastError || '') },\n });\n}\n\nasync function wakeAndUnlock(ctx) {\n await pressKey(ctx, 'KEYCODE_WAKEUP').catch(() => {});\n await sleep(300);\n await pressKey(ctx, 'MENU').catch(() => {});\n await sleep(300);\n const size = await screenSize(ctx);\n await swipe(ctx, { x: size.width * 0.5, y: size.height * 0.82 }, { x: size.width * 0.5, y: size.height * 0.25 }, 350).catch(() => {});\n await sleep(600);\n}\n\nasync function isKeyboardVisible(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'input_method'], { timeoutMs: 15000, maxBuffer: 4 * 1024 * 1024 });\n return /mInputShown=true|mIsInputViewShown=true|inputShown=true/i.test(String(out || ''));\n}\n\nasync function hideKeyboard(ctx, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || 2)));\n for (let i = 0; i < attempts; i += 1) {\n if (!await isKeyboardVisible(ctx).catch(() => false)) return true;\n await pressBack(ctx).catch(() => {});\n await sleep(Number(options.settleMs || 400));\n }\n return !await isKeyboardVisible(ctx).catch(() => false);\n}\n\nasync function execAdbWithRetry(adbPath, args, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || DEFAULT_ADB_ATTEMPTS)));\n const delayMs = Math.max(0, Number(options.retryDelayMs || DEFAULT_ADB_RETRY_DELAY_MS));\n const commandArgs = args.map(String);\n let lastError = null;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await execFileAsync(adbPath, commandArgs, {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isRetryableAdbError(error)) {\n throw error;\n }\n Logger.useTemplate().adbRetry({\n label: options.label || 'adb',\n attempt,\n attempts,\n args: compactArgs(args),\n message: error?.message || String(error),\n });\n await sleep(delayMs * attempt);\n }\n }\n throw lastError;\n}\n\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\n}\n\nfunction appDataDir(ctx) {\n return `/data/data/${requireDeviceField(ctx, 'packageName')}`;\n}\n\nfunction cleanCachePathName(value, name) {\n const text = requireValue(value, name);\n if (text.includes('/') || text.includes('\\\\') || text === '.' || text === '..') {\n throw new CrawlerError({ message: `invalid_request: invalid cache ${name}`, code: Code.InvalidRequest });\n }\n return text;\n}\n\nfunction requireValue(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction isAdbUnavailableError(error) {\n const message = String(error?.message || error || '');\n return /ENOENT|spawn .*adb|device .* not found|no devices|offline/i.test(message);\n}\n\nfunction isAdbInputTimeout(error) {\n const message = String(error?.message || error || '');\n return /timed out|timeout|SIGTERM|killed/i.test(message)\n || error?.signal === 'SIGTERM'\n || error?.killed === true;\n}\n\nfunction isRetryableAdbError(error) {\n const message = String(error?.message || error || '');\n return isAdbInputTimeout(error) ||\n /device .* not found|no devices|offline|closed|broken pipe|protocol fault|transport/i.test(message);\n}\n\nfunction compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\n}\n\nfunction parseResolvedLauncherComponent(output, packageName) {\n const prefix = `${packageName}/`;\n const lines = String(output || '').replace(/\\r/g, '').split('\\n').map((line) => line.trim()).filter(Boolean);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (line.startsWith(prefix) && /^[^\\s/]+\\/[^\\s/]+$/.test(line)) return line;\n }\n return '';\n}\n\nfunction assertActivityStartOk(output, component) {\n const text = String(output || '');\n const status = /^\\s*Status:\\s*([^\\s]+)/im.exec(text)?.[1];\n const failed = /(^|\\n)\\s*(Error type \\d+|Error:|Exception occurred|SecurityException|java\\.[A-Za-z.]*Exception)/i.test(text)\n || (status && status.toLowerCase() !== 'ok');\n if (!failed) return;\n throw new CrawlerError({\n message: `automation_failed: am start failed component=${component} output=${compactOutput(text)}`,\n code: Code.AutomationFailed,\n context: { component, output: compactOutput(text, 2000) },\n });\n}\n\nfunction compactOutput(value, maxLength = 500) {\n return String(value || '').replace(/\\s+/g, ' ').trim().slice(0, maxLength);\n}\n\nfunction encodeUnicodeImeText(text) {\n let out = '';\n let buffer = '';\n const flush = () => {\n if (!buffer) return;\n const bytes = Buffer.alloc(buffer.length * 2);\n for (let index = 0; index < buffer.length; index += 1) {\n bytes.writeUInt16BE(buffer.charCodeAt(index), index * 2);\n }\n out += `&${bytes.toString('base64').replace(/\\//g, ',').replace(/=+$/g, '')}-`;\n buffer = '';\n };\n for (const char of String(text || '')) {\n const code = char.charCodeAt(0);\n if (code >= 0x20 && code <= 0x7e) {\n flush();\n out += char === '&' ? '&-' : char;\n } else {\n buffer += char;\n }\n }\n flush();\n return out;\n}\n\nasync function sendUnicodeImeText(ctx, encoded, options = {}) {\n await adbShell(ctx, ['input', 'text', shellQuoteForRemote(encoded)], options);\n}\n\nfunction shellQuoteForRemote(value) {\n return `'${String(value ?? '').replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction normalizeAppiumClipboardBroadcast(value) {\n const out = String(value || '');\n if (!/Broadcast completed:\\s*result=-1\\b/.test(out)) return '';\n const match = /data=\"([^\"]*)\"/.exec(out) || /data=([^\\s]+)/.exec(out);\n const base64 = match ? String(match[1] || '').trim() : '';\n if (!base64) return '';\n try {\n return Buffer.from(base64, 'base64').toString('utf8').trim();\n } catch {\n return '';\n }\n}\n\nexport const $DeviceInternalsForTest = Object.freeze({\n isAdbInputTimeout,\n isRetryableAdbError,\n encodeUnicodeImeText,\n shellQuoteForRemote,\n});\n", "import { Code } from './constants.js';\n\nexport class CrawlerError extends Error {\n constructor(input = {}, options = {}) {\n const payload = typeof input === 'string' ? { message: input } : input;\n super(payload.message || 'Android crawler error', options);\n this.name = 'CrawlerError';\n this.code = payload.code || Code.UnknownError;\n this.context = payload.context || {};\n }\n\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n static from(error, fallback = {}) {\n if (CrawlerError.isCrawlerError(error)) return error;\n return new CrawlerError({\n message: error?.message || String(error),\n code: fallback.code || Code.UnknownError,\n context: fallback.context || {},\n });\n }\n}\n\nexport function serializeError(error) {\n if (!error) return { message: '' };\n return {\n name: error.name || 'Error',\n message: error.message || String(error),\n stack: error.stack || '',\n code: error.code || '',\n context: error.context || undefined,\n };\n}\n", "const defaultLogger = {\n info: (...args) => console.error(...args),\n warning: (...args) => console.error(...args),\n warn: (...args) => console.error(...args),\n error: (...args) => console.error(...args),\n debug: (...args) => console.error(...args),\n};\n\nlet activeLogger = defaultLogger;\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 STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst STEP_ICONS = [\n { match: '\u4EFB\u52A1', icon: '\uD83E\uDDED' },\n { match: 'Launch', icon: '\uD83D\uDE80' },\n { match: 'Step', icon: '\uD83E\uDDF1' },\n { match: '\u8F93\u5165\u6CD5', icon: '\u2328\uFE0F' },\n { match: 'ADB', icon: '\uD83D\uDD0C' },\n { match: 'Mutation', icon: '\uD83D\uDCE1' },\n { match: 'WebView', icon: '\uD83C\uDF10' },\n { match: '\u622A\u56FE', icon: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB', icon: '\uD83D\uDD17' },\n { match: '\u6570\u636E', icon: '\uD83D\uDCE6' },\n];\n\nconst STATUS_ICONS = [\n { match: '\u5F00\u59CB', icon: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', icon: '\u2705' },\n { match: '\u6210\u529F', icon: '\u2705' },\n { match: '\u5931\u8D25', icon: '\u274C' },\n { match: '\u8DF3\u8FC7', icon: '\u23ED\uFE0F' },\n { match: '\u91CD\u8BD5', icon: '\uD83D\uDD01' },\n { match: '\u7A33\u5B9A', icon: '\uD83D\uDFE2' },\n];\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\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 detailToParts = (detail) => {\n if (detail == null || detail === '') return [];\n if (detail instanceof Error) return [`err=${detail.message}`];\n if (typeof detail === 'string') return [detail];\n if (Array.isArray(detail)) return detail.flatMap(detailToParts).filter(Boolean);\n if (typeof detail === 'object') {\n return Object.entries(detail)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${typeof value === 'object' ? safeJson(value) : String(value)}`);\n }\n return [String(detail)];\n};\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: (detail) => detailToParts(detail),\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 buildDetails: (detail) => detailToParts(detail),\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: (detail, error) => [...detailToParts(detail), error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'launch_start',\n method: 'launchStart',\n label: 'Launch \u5F00\u59CB',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'launch_success',\n method: 'launchSuccess',\n label: 'Launch \u5B8C\u6210',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'launch_fail',\n method: 'launchFail',\n label: 'Launch \u5931\u8D25',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (detail, error) => [...detailToParts(detail), error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'input_method_snapshot_fail',\n method: 'inputMethodSnapshotFail',\n label: '\u8F93\u5165\u6CD5\u5FEB\u7167\u5931\u8D25',\n group: '\u8F93\u5165\u6CD5',\n step: '\u8F93\u5165\u6CD5\u5FEB\u7167',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'input_method_restore_fail',\n method: 'inputMethodRestoreFail',\n label: '\u8F93\u5165\u6CD5\u6062\u590D\u5931\u8D25',\n group: '\u8F93\u5165\u6CD5',\n step: '\u8F93\u5165\u6CD5\u6062\u590D',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'step_start',\n method: 'stepStart',\n label: '\u6B65\u9AA4\u5F00\u59CB',\n group: 'Step',\n step: 'Step',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (step, detail) => [step ? `name=${step}` : '', ...detailToParts(detail)],\n },\n {\n key: 'step_success',\n method: 'stepSuccess',\n label: '\u6B65\u9AA4\u5B8C\u6210',\n group: 'Step',\n step: 'Step',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n buildDetails: (step, detail) => [step ? `name=${step}` : '', ...detailToParts(detail)],\n },\n {\n key: 'step_fail',\n method: 'stepFail',\n label: '\u6B65\u9AA4\u5931\u8D25',\n group: 'Step',\n step: 'Step',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (step, error) => [step ? `name=${step}` : '', error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'step_retry',\n method: 'stepRetry',\n label: '\u6B65\u9AA4\u91CD\u8BD5',\n group: 'Step',\n step: 'Step',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (step, attempt) => [step ? `name=${step}` : '', attempt !== undefined ? `attempt=${attempt}` : ''],\n },\n {\n key: 'adb_exec',\n method: 'adbExec',\n label: 'ADB \u6267\u884C',\n group: 'ADB',\n step: 'ADB',\n status: '\u5B8C\u6210',\n level: 'debug',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'adb_retry',\n method: 'adbRetry',\n label: 'ADB \u91CD\u8BD5',\n group: 'ADB',\n step: 'ADB',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_start',\n method: 'mutationWaitStart',\n label: 'Mutation \u7B49\u5F85\u5F00\u59CB',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_success',\n method: 'mutationWaitSuccess',\n label: 'Mutation \u7A33\u5B9A',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u7A33\u5B9A',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_warn',\n method: 'mutationWaitWarn',\n label: 'Mutation \u7B49\u5F85\u544A\u8B66',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_command',\n method: 'webViewCommand',\n label: 'WebView \u547D\u4EE4',\n group: 'WebView',\n step: 'WebView',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_success',\n method: 'webViewSuccess',\n label: 'WebView \u5B8C\u6210',\n group: 'WebView',\n step: 'WebView',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_warn',\n method: 'webViewWarn',\n label: 'WebView \u544A\u8B66',\n group: 'WebView',\n step: 'WebView',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_fail',\n method: 'webViewFail',\n label: 'WebView \u5931\u8D25',\n group: 'WebView',\n step: 'WebView',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\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 buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'screenshot_success',\n method: 'screenshotDone',\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 buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'data_push_success',\n method: 'dataPush',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n];\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `${STEP_PREFIX} .*${escapeRegExp(step)}`;\n if (status) pattern += `.*${escapeRegExp(status)}`;\n return new RegExp(pattern);\n};\n\nexport const LOG_TEMPLATES = Object.freeze(LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns,\n defaultSelected: attentionRank >= DEFAULT_ATTENTION_RANK,\n };\n}));\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? String(scope) : '';\n return {\n start: (message, detail) => createBaseLogger(prefix).start(formatMessage(message, detail)),\n success: (message, detail) => createBaseLogger(prefix).success(formatMessage(message, detail)),\n fail: (message, error) => createBaseLogger(prefix).error(formatMessage(message, error?.message || error)),\n warn: (message, detail) => createBaseLogger(prefix).warning(formatMessage(message, detail)),\n warning: (message, detail) => createBaseLogger(prefix).warning(formatMessage(message, detail)),\n info: (message, detail) => createBaseLogger(prefix).info(formatMessage(message, detail)),\n debug: (message, detail) => createBaseLogger(prefix).debug(formatMessage(message, detail)),\n useTemplate: () => createTemplateLogger(createBaseLogger(prefix)),\n };\n },\n useTemplate(logger) {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger(createBaseLogger(''));\n },\n start(message, detail = '') {\n createBaseLogger('').start(formatMessage(message, detail));\n },\n success(message, detail = '') {\n createBaseLogger('').success(formatMessage(message, detail));\n },\n fail(message, error = '') {\n createBaseLogger('').error(formatMessage(message, error?.message || error));\n },\n warn(message, detail = '') {\n createBaseLogger('').warning(formatMessage(message, detail));\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n error(message, detail = '') {\n createBaseLogger('').error(formatMessage(message, detail));\n },\n info(message, detail = '') {\n createBaseLogger('').info(formatMessage(message, detail));\n },\n debug(message, detail = '') {\n createBaseLogger('').debug(formatMessage(message, detail));\n },\n duration(startedAt) {\n return `${((Date.now() - startedAt) / 1000).toFixed(2)}s`;\n },\n};\n\nexport function stripAnsi(value) {\n return String(value || '').replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction createBaseLogger(prefix = '', explicitLogger = null) {\n const name = prefix ? String(prefix) : '';\n const dispatch = (methodName, icon, message, color) => {\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n const writer = resolveLogMethod(resolveLogger(explicitLogger), methodName);\n writer(`${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\nfunction createTemplateLogger(baseLogger) {\n const handlers = {\n info: (line) => baseLogger.info(line),\n success: (line) => baseLogger.success(line),\n warning: (line) => baseLogger.warning(line),\n warn: (line) => baseLogger.warning(line),\n error: (line) => baseLogger.error(line),\n debug: (line) => baseLogger.debug(line),\n start: (line) => baseLogger.start(line),\n };\n\n const emitDefinition = (definition, details = []) => {\n const handler = handlers[definition.level] || handlers.info;\n handler(buildStepLine(definition.step, definition.status, [...details, buildLogTag(definition.key)]));\n };\n\n const definitionMethods = {};\n for (const definition of LOG_DEFINITIONS) {\n if (!definition.method) continue;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n emitDefinition(definition, details.filter(Boolean));\n };\n }\n\n return {\n step: (step, status, details, level = 'info') => {\n const handler = handlers[level] || handlers.info;\n handler(buildStepLine(step, status, detailToParts(details)));\n },\n info: (message, detail) => baseLogger.info(formatMessage(message, detail)),\n success: (message, detail) => baseLogger.success(formatMessage(message, detail)),\n warning: (message, detail) => baseLogger.warning(formatMessage(message, detail)),\n warn: (message, detail) => baseLogger.warning(formatMessage(message, detail)),\n error: (message, detail) => baseLogger.error(formatMessage(message, detail)),\n debug: (message, detail) => baseLogger.debug(formatMessage(message, detail)),\n start: (message, detail) => baseLogger.start(formatMessage(message, detail)),\n ...definitionMethods,\n };\n}\n\nfunction buildStepLine(step, status, details = []) {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_ICONS) : '';\n parts.push(decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX);\n if (status) parts.push(decorateLabel(status, STATUS_ICONS));\n const detailParts = details.flatMap(detailToParts).filter(Boolean);\n parts.push(...detailParts);\n return parts.join(STEP_SEPARATOR);\n}\n\nfunction decorateLabel(label, mappings) {\n if (!label) return '';\n const mapping = mappings.find((item) => String(label).includes(item.match));\n if (!mapping) return label;\n return `${mapping.icon} ${label}`;\n}\n\nfunction resolveLogger(explicitLogger) {\n if (explicitLogger && typeof explicitLogger.info === 'function') return explicitLogger;\n return activeLogger || defaultLogger;\n}\n\nfunction resolveLogMethod(logger, name) {\n if (logger && typeof logger[name] === 'function') return logger[name].bind(logger);\n if (name === 'warning' && logger && typeof logger.warn === 'function') return logger.warn.bind(logger);\n return defaultLogger[name] || defaultLogger.info;\n}\n\nfunction 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\nfunction formatMessage(message, detail = '') {\n const detailText = formatDetail(detail);\n return detailText ? `${message} ${detailText}` : String(message || '');\n}\n\nfunction formatTimestamp(date = new Date()) {\n const pad = (value, size = 2) => String(value).padStart(size, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`;\n}\n\nfunction formatDetail(detail) {\n return detailToParts(detail).join(' ');\n}\n\nfunction colorize(text, color) {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n}\n\nfunction safeJson(value) {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst SCROLL_MAX_SWIPES = 24;\nconst SCROLL_STABLE_ROUNDS = 1;\nconst SCROLL_SWIPE_RATIO = 0.72;\nconst SCROLL_DURATION_MS = 360;\nconst SCROLL_SETTLE_MS = 500;\nconst SCROLL_HASH_SOURCE = 'screenshot';\nconst SCROLL_IDLE_SETTLE_MS = 900;\n\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\n scrollStep,\n scrollToEnd,\n scrollToTop,\n};\n\nasync function click(ctx, selectorOrPoint, options = {}) {\n if (isPoint(selectorOrPoint)) {\n await Device.tapAbsolute(ctx, selectorOrPoint.x, selectorOrPoint.y);\n await sleep(Number(options.settleMs || 250));\n return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { point };\n }\n const target = await DeviceView.find(ctx, selectorOrPoint, options);\n const actual = nearestClickable(target);\n if (!actual) {\n throw new CrawlerError({\n message: `automation_failed: View \u4E0D\u53EF\u70B9\u51FB ${JSON.stringify(selectorOrPoint)}`,\n code: Code.AutomationFailed,\n context: { selector: selectorOrPoint, target: simplifyNode(target) },\n });\n }\n const point = centerOf(actual.bounds);\n Logger.info('DeviceInput.click', {\n selector: selectorOrPoint,\n target: simplifyNode(target),\n actual: simplifyNode(actual),\n point,\n });\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { target, actual, point };\n}\n\nasync function fill(ctx, selector, text, options = {}) {\n const value = String(text ?? '');\n const clicked = await click(ctx, selector, {\n ...options,\n settleMs: Number(options.focusSettleMs || 350),\n });\n try {\n await Device.typeText(ctx, value);\n } catch (error) {\n throw new CrawlerError({\n message: `automation_failed: View \u5199\u5165\u6587\u672C\u5931\u8D25 ${JSON.stringify(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, error: error?.message || String(error) },\n });\n }\n Logger.info('DeviceInput.fill', {\n selector,\n target: simplifyNode(clicked.actual || clicked.target),\n chars: value.length,\n });\n await sleep(Number(options.settleMs || 350));\n return { target: clicked.actual || clicked.target, chars: value.length };\n}\n\nasync function press(ctx, key) {\n await Device.pressKey(ctx, key);\n}\n\nasync function pressEnter(ctx) {\n await Device.pressEnter(ctx);\n}\n\nasync function scroll(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n await scrollBounds(ctx, node.bounds, direction, {});\n}\n\nasync function scrollStep(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n await scrollBounds(ctx, node.bounds, direction, options);\n}\n\nasync function scrollBounds(ctx, bounds, direction, options = {}) {\n const box = bounds;\n const ratio = Number(options.swipeRatio || SCROLL_SWIPE_RATIO);\n const durationMs = Number(options.durationMs || SCROLL_DURATION_MS);\n const x = box.centerX;\n const distance = Math.max(40, box.height * ratio);\n const down = String(direction || '').toLowerCase() === 'down';\n const from = {\n x,\n y: down ? box.top + box.height * 0.25 : box.bottom - box.height * 0.25,\n };\n const to = {\n x,\n y: down ? Math.min(box.bottom - 10, from.y + distance) : Math.max(box.top + 10, from.y - distance),\n };\n await Device.swipe(ctx, from, to, durationMs);\n await sleep(Number(options.settleMs || SCROLL_SETTLE_MS));\n}\n\nasync function scrollToEnd(ctx, selector, options = {}) {\n // Android \u91CC\u201C\u6EDA\u5230\u5E95\u201D\u5BF9\u5E94\u624B\u6307\u4E0A\u6ED1\uFF0C\u5185\u5BB9\u7EE7\u7EED\u5411\u56DE\u7B54\u5E95\u90E8\u63A8\u8FDB\u3002\n return scrollUntilStable(ctx, selector, 'up', options);\n}\n\nasync function scrollToTop(ctx, selector, options = {}) {\n // Android \u91CC\u201C\u56DE\u9876\u90E8\u201D\u5BF9\u5E94\u624B\u6307\u4E0B\u6ED1\uFF0C\u5185\u5BB9\u56DE\u5230\u56DE\u7B54\u5F00\u5934\u3002\n return scrollUntilStable(ctx, selector, 'down', options);\n}\n\nasync function scrollUntilStable(ctx, selector, direction, options = {}) {\n const maxSwipes = SCROLL_MAX_SWIPES;\n const stableRoundsTarget = SCROLL_STABLE_ROUNDS;\n const node = await DeviceView.find(ctx, selector, options);\n const bounds = node.bounds;\n // View-tree hash \u5BF9\u865A\u62DF\u5217\u8868\u548C fixed \u533A\u57DF\u4E0D\u53EF\u9760\uFF1B\u7EDF\u4E00\u7528\u6574\u5C4F\u622A\u56FE hash \u5224\u65AD\u662F\u5426\u5DF2\u7ECF\u6EDA\u4E0D\u52A8\u3002\n let lastHash = await scrollStateHash(ctx);\n let stableRounds = 0;\n for (let index = 0; index < maxSwipes; index += 1) {\n await scrollBounds(ctx, bounds, direction, options);\n const currentHash = await scrollStateHash(ctx);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index + 1, stableRounds, hash: currentHash, hashSource: SCROLL_HASH_SOURCE, capped: false };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n }\n const idle = await confirmScrollIdle(ctx, lastHash, options);\n if (idle.stable) {\n return {\n swipes: maxSwipes,\n stableRounds: stableRoundsTarget,\n hash: idle.hash,\n hashSource: `${SCROLL_HASH_SOURCE}:idle`,\n capped: false,\n inferredBoundary: true,\n };\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash, hashSource: SCROLL_HASH_SOURCE, capped: true };\n}\n\nasync function scrollStateHash(ctx) {\n const png = await Device.screenshotPng(ctx);\n return createHash('sha256').update(png).digest('hex');\n}\n\nasync function confirmScrollIdle(ctx, previousHash, options = {}) {\n const settleMs = Number(options.idleSettleMs || SCROLL_IDLE_SETTLE_MS);\n await sleep(settleMs);\n const hash = await scrollStateHash(ctx);\n if (hash !== previousHash) return { stable: false, hash };\n return { stable: true, hash };\n}\n\nfunction nearestClickable(node) {\n let current = node;\n while (current) {\n if (current.visible && current.enabled && current.clickable) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isPoint(value) {\n return value && typeof value === 'object' && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));\n}\n\nfunction isBounds(value) {\n return value && typeof value === 'object'\n && Number.isFinite(Number(value.left))\n && Number.isFinite(Number(value.top))\n && Number.isFinite(Number(value.right))\n && Number.isFinite(Number(value.bottom));\n}\n\nfunction centerOf(bounds) {\n return {\n x: (Number(bounds.left) + Number(bounds.right)) / 2,\n y: (Number(bounds.top) + Number(bounds.bottom)) / 2,\n };\n}\n\nfunction simplifyNode(node) {\n if (!node) return null;\n return {\n id: node.id,\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n clickable: node.clickable,\n enabled: node.enabled,\n bounds: node.bounds,\n };\n}\n", "import { createHash } from 'node:crypto';\n\nimport { XMLParser } from 'fast-xml-parser';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { sleep } from './logger.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '',\n allowBooleanAttributes: true,\n});\n\nexport const DeviceView = {\n snapshot,\n find,\n findAll,\n waitFor,\n bounds,\n text,\n exists,\n isScrollable,\n hashNode,\n normalizeSelector,\n};\n\nasync function snapshot(ctx, options = {}) {\n const xml = options.xml || await Device.dumpUiXml(ctx);\n const parsed = parser.parse(xml);\n const roots = toArray(parsed?.hierarchy?.node).map((node) => normalizeNode(node, null, 0));\n const flat = [];\n for (const root of roots) collectFlat(root, flat);\n return { xml, tree: roots, roots, flat, nodes: flat };\n}\n\nasync function find(ctx, selector, options = {}) {\n const nodes = await findAll(ctx, selector, options);\n if (nodes.length > 0) return nodes[0];\n if (options.optional) return null;\n throw new CrawlerError({\n message: `automation_failed: View \u672A\u627E\u5230 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector },\n });\n}\n\nasync function findAll(ctx, selector, options = {}) {\n const view = options.snapshot || await snapshot(ctx, options);\n const normalized = normalizeSelector(selector);\n return view.flat.filter((node) => matchesSelector(node, normalized, options));\n}\n\nasync function waitFor(ctx, selector, options = {}) {\n const timeoutMs = Number(options.timeoutMs || options.timeout || 30000);\n const intervalMs = Number(options.intervalMs || options.pollIntervalMs || 500);\n const deadline = Date.now() + timeoutMs;\n let lastError = null;\n let sawCleanPoll = false;\n while (Date.now() < deadline) {\n try {\n const node = await find(ctx, selector, { ...options, optional: true });\n sawCleanPoll = true;\n lastError = null;\n if (node) return node;\n } catch (error) {\n lastError = error;\n }\n await sleep(intervalMs);\n }\n if (lastError && !sawCleanPoll) throw lastError;\n throw new CrawlerError({\n message: `automation_failed: \u7B49\u5F85 View \u8D85\u65F6 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, timeoutMs },\n });\n}\n\nasync function bounds(ctx, selector, options = {}) {\n return (await find(ctx, selector, options)).bounds;\n}\n\nasync function text(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return node.text || node.contentDesc || '';\n}\n\nasync function exists(ctx, selector, options = {}) {\n return Boolean(await find(ctx, selector, { ...options, optional: true }));\n}\n\nasync function isScrollable(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return Boolean(node.scrollable);\n}\n\nfunction normalizeSelector(selector) {\n if (!selector || typeof selector !== 'object' || Array.isArray(selector)) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector must be an object',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n const out = {};\n for (const key of ['id', 'text', 'textContains', 'contentDesc', 'className']) {\n if (selector[key] != null && String(selector[key]).trim()) out[key] = String(selector[key]).trim();\n }\n if (Object.keys(out).length === 0) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector requires id/text/textContains/contentDesc/className',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n return out;\n}\n\nfunction hashNode(node) {\n return createHash('sha256').update(stableNodeString(node)).digest('hex');\n}\n\nfunction normalizeNode(raw, parent, index) {\n const childrenRaw = toArray(raw?.node);\n const bounds = parseBounds(raw?.bounds);\n const node = {\n resourceId: String(raw?.['resource-id'] || ''),\n id: shortResourceId(raw?.['resource-id']),\n text: String(raw?.text || ''),\n contentDesc: String(raw?.['content-desc'] || ''),\n className: String(raw?.class || ''),\n packageName: String(raw?.package || ''),\n bounds,\n clickable: toBoolean(raw?.clickable),\n enabled: toBoolean(raw?.enabled),\n focusable: toBoolean(raw?.focusable),\n focused: toBoolean(raw?.focused),\n scrollable: toBoolean(raw?.scrollable),\n visible: bounds.right > bounds.left && bounds.bottom > bounds.top,\n index: Number(raw?.index ?? index),\n parent: null,\n children: [],\n };\n node.parent = parent || null;\n node.children = childrenRaw.map((child, childIndex) => normalizeNode(child, node, childIndex));\n return node;\n}\n\nfunction matchesSelector(node, selector, options = {}) {\n if (options.visibleOnly !== false && !node.visible) return false;\n if (options.enabledOnly === true && !node.enabled) return false;\n if (selector.id && !matchesId(node, selector.id)) return false;\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n if (selector.className && node.className !== selector.className) return false;\n return true;\n}\n\nfunction matchesId(node, expected) {\n const actual = node.resourceId || '';\n if (!actual) return false;\n if (actual === expected) return true;\n return actual.endsWith(`:id/${expected}`) || node.id === expected;\n}\n\nfunction collectFlat(node, out) {\n out.push(node);\n for (const child of node.children) collectFlat(child, out);\n}\n\nfunction toArray(value) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction parseBounds(value) {\n const match = /\\[(\\d+),(\\d+)]\\[(\\d+),(\\d+)]/.exec(String(value || ''));\n if (!match) return { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0, centerX: 0, centerY: 0 };\n const left = Number(match[1]);\n const top = Number(match[2]);\n const right = Number(match[3]);\n const bottom = Number(match[4]);\n return {\n left,\n top,\n right,\n bottom,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n centerX: (left + right) / 2,\n centerY: (top + bottom) / 2,\n };\n}\n\nfunction shortResourceId(value) {\n const raw = String(value || '');\n const marker = ':id/';\n const index = raw.indexOf(marker);\n return index >= 0 ? raw.slice(index + marker.length) : raw;\n}\n\nfunction toBoolean(value) {\n return value === true || String(value).toLowerCase() === 'true';\n}\n\nfunction stableNodeString(node) {\n if (!node) return '';\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n clickable: node.clickable,\n enabled: node.enabled,\n focusable: node.focusable,\n focused: node.focused,\n scrollable: node.scrollable,\n children: node.children.map((child) => JSON.parse(stableNodeString(child) || '{}')),\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { execFile } from 'node:child_process';\nimport { mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const DeviceSQLite = {\n query,\n health,\n};\n\nasync function query(ctx, options = {}) {\n if (!options.sql) {\n throw new CrawlerError({\n message: 'invalid_request: sql is required',\n code: Code.InvalidRequest,\n });\n }\n const config = {\n dbPath: String(options.dbPath || ''),\n dbDir: String(options.dbDir || ''),\n dbNamePrefix: String(options.dbNamePrefix || ''),\n dbNameIncludes: String(options.dbNameIncludes || ''),\n dbNameExcludes: normalizeStringArray(options.dbNameExcludes),\n sql: String(options.sql || ''),\n args: normalizeStringArray(options.args),\n maxRows: Math.max(1, Number(options.maxRows || 200)),\n label: String(options.label || 'query-sqlite'),\n };\n if (!config.dbPath && !config.dbDir) {\n throw new CrawlerError({\n message: 'invalid_request: dbPath or dbDir is required',\n code: Code.InvalidRequest,\n });\n }\n\n const startedAt = Date.now();\n const dir = await mkdtemp(path.join(tmpdir(), 'android-toolkit-sqlite-'));\n try {\n const dbPaths = await resolveDeviceDbPaths(ctx, config);\n if (dbPaths.length === 0) {\n throw new CrawlerError({\n message: 'app_runtime_unavailable: sqlite database not found',\n code: Code.AppRuntimeUnavailable,\n context: { dbDir: config.dbDir, dbPath: config.dbPath, dbNamePrefix: config.dbNamePrefix },\n });\n }\n const databases = [];\n for (const dbPath of dbPaths) {\n const localDbPath = await pullDatabaseSnapshot(ctx, dbPath, dir);\n const result = await queryLocalSQLite(localDbPath, config);\n databases.push({\n dbPath,\n columns: result.columns,\n rows: result.rows,\n rowCount: result.rows.length,\n truncated: result.truncated,\n });\n }\n Logger.info('DeviceSQLite.query', {\n label: config.label,\n databaseCount: databases.length,\n rowCount: databases.reduce((total, item) => total + item.rowCount, 0),\n duration: Logger.duration(startedAt),\n });\n return { ok: true, databases, rows: databases.length === 1 ? databases[0].rows : [] };\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nasync function health(ctx, options = {}) {\n const packageName = String(options.packageName || ctx?.packageName || '').trim();\n if (!packageName) {\n throw new CrawlerError({\n message: 'invalid_request: packageName is required',\n code: Code.InvalidRequest,\n });\n }\n await adbSuShell(ctx, `test -d ${shellQuote(`/data/data/${packageName}`)}`, {\n timeoutMs: Number(options.timeoutMs || 10_000),\n });\n return { ok: true, packageName };\n}\n\nasync function resolveDeviceDbPaths(ctx, config) {\n if (config.dbPath) return [config.dbPath];\n const command = `cd ${shellQuote(config.dbDir)} || exit 1; for file in *; do [ -f \"$file\" ] || continue; case \"$file\" in *-wal|*-shm) continue ;; esac; printf \"%s\\\\n\" \"$file\"; done`;\n const out = await adbSuShell(ctx, command, {\n timeoutMs: 15_000,\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: sqlite dbDir unavailable ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { dbDir: config.dbDir },\n });\n });\n return String(out || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((name) => matchesName(name, config))\n .map((name) => `${config.dbDir.replace(/\\/+$/, '')}/${name}`)\n .sort();\n}\n\nasync function pullDatabaseSnapshot(ctx, dbPath, localDir) {\n const baseName = path.basename(dbPath);\n const remoteDir = `/data/local/tmp/android-toolkit-sqlite-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n const remoteDb = `${remoteDir}/${baseName}`;\n const localDb = path.join(localDir, baseName);\n const copyCommand = [\n `rm -rf ${shellQuote(remoteDir)}`,\n `mkdir -p ${shellQuote(remoteDir)}`,\n `cp ${shellQuote(dbPath)} ${shellQuote(remoteDb)}`,\n `[ -f ${shellQuote(`${dbPath}-wal`)} ] && cp ${shellQuote(`${dbPath}-wal`)} ${shellQuote(`${remoteDb}-wal`)} || true`,\n `[ -f ${shellQuote(`${dbPath}-shm`)} ] && cp ${shellQuote(`${dbPath}-shm`)} ${shellQuote(`${remoteDb}-shm`)} || true`,\n `chmod 644 ${shellQuote(remoteDir)}/*`,\n ].join(' && ');\n try {\n await adbSuShell(ctx, copyCommand, { timeoutMs: 30_000, maxBuffer: 4 * 1024 * 1024 });\n await adbPull(ctx, remoteDb, localDb).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: sqlite snapshot pull failed ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { dbPath },\n });\n });\n await adbPullOptional(ctx, `${remoteDb}-wal`, `${localDb}-wal`);\n await adbPullOptional(ctx, `${remoteDb}-shm`, `${localDb}-shm`);\n return localDb;\n } finally {\n await adbSuShell(ctx, `rm -rf ${shellQuote(remoteDir)}`, { timeoutMs: 10_000 }).catch(() => {});\n }\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nasync function queryLocalSQLite(dbPath, config) {\n const payloadPath = `${dbPath}.query.json`;\n const outputPath = `${dbPath}.rows.json`;\n await writeFile(payloadPath, JSON.stringify({\n dbPath,\n sql: config.sql,\n args: config.args,\n maxRows: config.maxRows,\n outputPath,\n }), 'utf8');\n const code = `\nconst fs = require('node:fs');\nconst { DatabaseSync } = require('node:sqlite');\nconst payload = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));\nconst db = new DatabaseSync(payload.dbPath, { open: true, readOnly: true });\ntry {\n const stmt = db.prepare(payload.sql);\n const columns = stmt.columns().map((column) => String(column.name || ''));\n const rows = [];\n let truncated = false;\n for (const row of stmt.iterate(...payload.args)) {\n if (rows.length >= payload.maxRows) { truncated = true; break; }\n const out = {};\n for (const column of columns) out[column] = row[column] == null ? '' : String(row[column]);\n rows.push(out);\n }\n fs.writeFileSync(payload.outputPath, JSON.stringify({ columns, rows, truncated }), 'utf8');\n} finally {\n db.close();\n}\n`;\n await execFileAsync(process.execPath, ['-e', code, payloadPath], {\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n encoding: 'utf8',\n });\n return JSON.parse(await import('node:fs/promises').then((fs) => fs.readFile(outputPath, 'utf8')));\n}\n\nasync function adbPull(ctx, remotePath, localPath) {\n const serial = requireNonEmpty(ctx?.serial, 'serial');\n await Device.adbExec(ctx, ['-s', serial, 'pull', remotePath, localPath], {\n timeoutMs: 30_000,\n maxBuffer: 8 * 1024 * 1024,\n label: 'adb pull',\n });\n}\n\nasync function adbPullOptional(ctx, remotePath, localPath) {\n await adbPull(ctx, remotePath, localPath).catch(() => {});\n}\n\nfunction matchesName(name, config) {\n if (config.dbNamePrefix && !name.startsWith(config.dbNamePrefix)) return false;\n if (config.dbNameIncludes && !name.includes(config.dbNameIncludes)) return false;\n for (const item of config.dbNameExcludes || []) {\n if (item && name.includes(item)) return false;\n }\n return true;\n}\n\nfunction normalizeStringArray(value) {\n if (Array.isArray(value)) return value.map((item) => String(item ?? ''));\n if (value == null) return [];\n return [String(value)];\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n", "import fs from 'node:fs';\n\nimport { ApifyKit } from './apify-kit.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceSQLite } from './device-sqlite.js';\nimport { DeviceView } from './device-view.js';\nimport { Logger } from './logger.js';\nimport { Mutation } from './mutation.js';\nimport { NetworkCapture } from './network-capture.js';\nimport { Share } from './share.js';\nimport { WebView } from './webview.js';\nimport { ActorInfo, StoragePath } from './constants.js';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const logTemplate = Logger.useTemplate();\n const inputPath = StoragePath.Input;\n const outputPath = StoragePath.Output;\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n ctx.runId = ctx.runId || input.run_id || input.runId || input.runtime?.run_id || input.runtime?.runId || '';\n ctx.actorKey = ctx.actorKey || options.actorKey || input.actorKey || input.actor_name || input.actorName || '';\n const actorInfo = options.actorInfo || ActorInfo[ctx.actorKey] || null;\n const originalInputMethod = await Device.currentInputMethod(ctx).catch((error) => {\n logTemplate.inputMethodSnapshotFail(error);\n return '';\n });\n\n const apifyKit = await ApifyKit.useApifyKit({\n reset: true,\n input,\n ctx,\n inputPath,\n outputPath,\n });\n\n const kit = {\n Launch,\n ApifyKit: apifyKit,\n Device,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Share,\n Mutation,\n NetworkCapture,\n WebView,\n Logger,\n Context,\n };\n\n try {\n logTemplate.launchStart({\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\n });\n if (await WebView.configureHook(ctx, actorInfo)) {\n await Device.forceStopApp(ctx);\n }\n if (typeof options.hooks?.preNavigation === 'function') {\n await options.hooks.preNavigation({ input, ctx, kit, ApifyKit: apifyKit });\n }\n await handler({ input, ctx, kit, ApifyKit: apifyKit });\n if (typeof options.hooks?.postRun === 'function') {\n await options.hooks.postRun({ input, ctx, kit, ApifyKit: apifyKit });\n }\n logTemplate.launchSuccess({ duration: Logger.duration(startedAt) });\n } catch (error) {\n logTemplate.launchFail({ duration: Logger.duration(startedAt) }, error);\n if (typeof options.hooks?.onError === 'function') {\n await options.hooks.onError(error, { input, ctx, kit, ApifyKit: apifyKit });\n }\n if (!apifyKit.hasPushed()) await apifyKit.pushFailed(error);\n throw error;\n } finally {\n await Device.restoreInputMethod(ctx, originalInputMethod).catch((error) => {\n logTemplate.inputMethodRestoreFail(error);\n });\n }\n}\n", "import { randomUUID, createHash } from 'node:crypto';\n\nimport { Code, WebViewBridge } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst DEFAULT_TIMEOUT_MS = 10000;\nconst DEFAULT_STABLE_TIME_MS = 5000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nexport const WebView = {\n configureHook,\n evaluate,\n list,\n snapshot,\n waitForStable,\n click,\n};\n\nasync function configureHook(ctx, actorInfo, options = {}) {\n const webviews = Array.isArray(actorInfo?.webviews) ? actorInfo.webviews : [];\n if (webviews.length === 0) return false;\n\n const packageName = requireNonEmpty(ctx?.packageName, 'packageName');\n const dataDir = appDataDir(packageName);\n const baseDir = `${dataDir}/cache/${WebViewBridge.cacheDir}`;\n const configPath = `${baseDir}/${WebViewBridge.hookConfigFile}`;\n const configJson = JSON.stringify({ webviews });\n\n await Device.writeCacheFile(ctx, {\n dirName: WebViewBridge.cacheDir,\n fileName: WebViewBridge.hookConfigFile,\n text: configJson,\n timeoutMs: Math.max(5000, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView hook \u914D\u7F6E\u5199\u5165\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { configPath },\n });\n });\n return true;\n}\n\nasync function list(ctx, options = {}) {\n const command = {\n id: String(options.id || randomUUID()),\n action: 'list',\n urlIncludes: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews),\n timeoutMs: Math.max(1, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n };\n const result = normalizeBridgeResult(await runBridgeCommand(ctx, command, options));\n if (!result.ok) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u5217\u8868\u8BFB\u53D6\u5931\u8D25 ${result.error || 'unknown error'}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id },\n });\n }\n const value = parseBridgeValue(result.value);\n return Array.isArray(value) ? value : [];\n}\n\nasync function evaluate(ctx, js, options = {}) {\n const command = {\n id: String(options.id || randomUUID()),\n action: 'evaluate',\n urlIncludes: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews),\n js: String(js || ''),\n timeoutMs: Math.max(1, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n };\n if (!command.js.trim()) {\n throw new CrawlerError({\n message: 'invalid_request: WebView.evaluate \u7F3A\u5C11 js',\n code: Code.InvalidRequest,\n });\n }\n\n const result = normalizeBridgeResult(await runBridgeCommand(ctx, command, options));\n if (!result.ok) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u6267\u884C\u5931\u8D25 ${result.error || 'unknown error'}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, url: result.url || '', title: result.title || '' },\n });\n }\n return result;\n}\n\nasync function snapshot(ctx, options = {}) {\n const result = await evaluate(ctx, `(() => ({\n url: location.href,\n title: document.title,\n text: document.body ? document.body.innerText : '',\n html: document.documentElement ? document.documentElement.outerHTML : ''\n }))()`, options);\n const value = parseBridgeValue(result.value);\n const out = value && typeof value === 'object' ? value : {};\n return {\n url: String(out.url || result.url || ''),\n title: String(out.title || result.title || ''),\n text: String(out.text || ''),\n html: String(out.html || ''),\n raw: result,\n };\n}\n\nasync function waitForStable(ctx, options = {}) {\n const timeout = Math.max(0, Number(options.timeout ?? options.timeoutMs ?? 120000));\n const stableTime = Math.max(0, Number(options.stableTime ?? DEFAULT_STABLE_TIME_MS));\n const pollIntervalMs = Math.max(1, Number(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS));\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let snapshotErrorCount = 0;\n let lastSnapshotError = null;\n const logTemplate = Logger.useTemplate();\n\n logTemplate.webViewCommand({\n action: 'waitForStable',\n webviews: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n while (Date.now() < deadline) {\n const current = await snapshot(ctx, options).catch((error) => {\n snapshotErrorCount += 1;\n lastSnapshotError = error;\n if (snapshotErrorCount === 1 || snapshotErrorCount % 5 === 0) {\n logTemplate.webViewWarn({\n action: 'waitForStable.snapshot',\n snapshotErrorCount,\n message: error?.message || String(error),\n });\n }\n return null;\n });\n if (!current) {\n await sleep(pollIntervalMs);\n continue;\n }\n\n const hash = hashSnapshot(current);\n const changed = !lastSnapshot || hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = { ...current, hash };\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n html: current.html,\n text: current.text,\n url: current.url,\n title: current.title,\n mutationNodes: [{\n html: current.html,\n text: current.text,\n mutationType: 'stable',\n url: current.url,\n title: current.title,\n }],\n };\n logTemplate.webViewSuccess({\n action: 'waitForStable',\n duration: Logger.duration(startedAt),\n mutationCount,\n textChars: current.text.length,\n htmlChars: current.html.length,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView DOM \u7A33\u5B9A\u7B49\u5F85\u8D85\u65F6 (${timeout}ms), snapshotErrorCount=${snapshotErrorCount}, lastSnapshotError=${lastSnapshotError?.message || ''}`,\n code: Code.AppRuntimeUnavailable,\n });\n}\n\nasync function click(ctx, target, options = {}) {\n const request = target && typeof target === 'object' && !Array.isArray(target) ? target : { selector: target };\n const js = request.js || options.js || buildClickScript(request.selector, {\n textContains: request.textContains || options.textContains,\n last: request.last ?? options.last,\n });\n const result = await evaluate(ctx, js, options);\n const value = parseBridgeValue(result.value);\n if (value === false || value?.ok === false) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView \u70B9\u51FB\u5931\u8D25 ${value?.reason || value?.error || options.label || request.selector || ''}`.trim(),\n code: Code.AppRuntimeUnavailable,\n context: { value },\n });\n }\n Logger.useTemplate().webViewSuccess({\n action: 'click',\n label: options.label || request.selector || '',\n value: typeof value === 'object' ? value : undefined,\n });\n return value ?? result.value;\n}\n\nasync function runBridgeCommand(ctx, command, options = {}) {\n if (typeof options.commandRunner === 'function') return options.commandRunner(ctx, command);\n\n const packageName = requireNonEmpty(ctx?.packageName, 'packageName');\n const dataDir = appDataDir(packageName);\n const baseDir = `${dataDir}/cache/${WebViewBridge.cacheDir}`;\n const commandPath = `${baseDir}/${WebViewBridge.commandDir}/${command.id}.json`;\n const resultPath = `${baseDir}/${WebViewBridge.resultDir}/${command.id}.json`;\n const commandJson = JSON.stringify(command);\n\n await adbSuShell(ctx, [\n `owner=$(stat -c %u:%g ${shellQuote(dataDir)})`,\n `mkdir -p ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `chown \"$owner\" ${shellQuote(baseDir)} ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `chmod 2775 ${shellQuote(baseDir)} ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `rm -f ${shellQuote(resultPath)}`,\n `printf %s ${shellQuote(commandJson)} > ${shellQuote(commandPath)}`,\n `chown \"$owner\" ${shellQuote(commandPath)}`,\n `chmod 664 ${shellQuote(commandPath)}`,\n ].join(' && '), {\n timeoutMs: Math.max(5000, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u547D\u4EE4\u5199\u5165\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { commandPath },\n });\n });\n\n await Device.adbShell(ctx, [\n 'am',\n 'broadcast',\n '-a',\n WebViewBridge.actionCommand,\n '--es',\n 'id',\n command.id,\n '-p',\n packageName,\n ], {\n timeoutMs: 8000,\n maxBuffer: 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u5E7F\u64AD\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { action: WebViewBridge.actionCommand, id: command.id },\n });\n });\n\n const deadline = Date.now() + Math.max(1, Number(options.timeoutMs || command.timeoutMs || DEFAULT_TIMEOUT_MS));\n let lastRaw = '';\n while (Date.now() < deadline) {\n lastRaw = await adbSuShell(ctx, `[ -f ${shellQuote(resultPath)} ] && cat ${shellQuote(resultPath)} || true`, {\n timeoutMs: 5000,\n maxBuffer: Number(options.maxBuffer || 4 * 1024 * 1024),\n }).catch(() => '');\n if (String(lastRaw || '').trim()) {\n await adbSuShell(ctx, `rm -f ${shellQuote(commandPath)} ${shellQuote(resultPath)}`, { timeoutMs: 5000 }).catch(() => {});\n try {\n return JSON.parse(lastRaw);\n } catch (error) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u8FD4\u56DE\u4E86\u65E0\u6548 JSON ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, resultPath, raw: String(lastRaw || '').slice(0, 1000) },\n });\n }\n }\n await sleep(Math.max(100, Number(options.resultPollIntervalMs || 250)));\n }\n\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u672A\u8FD4\u56DE\u7ED3\u679C (${command.timeoutMs}ms)`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, resultPath, lastRaw: String(lastRaw || '').slice(0, 500) },\n });\n}\n\nfunction buildClickScript(selector, options = {}) {\n const selectorJson = JSON.stringify(String(selector || 'button,a,[role=\"button\"],[onclick],[aria-label],[title]'));\n const textJson = JSON.stringify(String(options.textContains || ''));\n const useLast = options.last !== false;\n return `(() => {\n const selector = ${selectorJson};\n const textContains = ${textJson};\n const visible = (el) => {\n const rect = el.getBoundingClientRect();\n const style = getComputedStyle(el);\n return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden';\n };\n const inViewport = (el) => {\n const rect = el.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0 && rect.bottom > 0 && rect.right > 0 && rect.top < window.innerHeight && rect.left < window.innerWidth;\n };\n const label = (el) => [el.innerText, el.textContent, el.getAttribute('aria-label'), el.getAttribute('title'), el.getAttribute('class')]\n .filter(Boolean).join(' ').trim();\n const elements = Array.from(document.querySelectorAll(selector))\n .map((el) => el.closest('button,a,[role=\"button\"],[onclick]') || el)\n .filter((el, index, arr) => el && arr.indexOf(el) === index && visible(el))\n .filter((el) => !textContains || label(el).includes(textContains));\n const el = elements[${useLast ? 'elements.length - 1' : '0'}];\n if (!el) return { ok: false, reason: 'element_not_found', selector, textContains, candidateCount: elements.length };\n el.scrollIntoView({ block: 'center', inline: 'center' });\n if (!inViewport(el)) return { ok: false, reason: 'element_out_of_viewport', selector, textContains, candidateCount: elements.length };\n el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));\n if (typeof el.click === 'function') el.click();\n const rect = el.getBoundingClientRect();\n return { ok: true, selector, text: label(el).slice(0, 120), rect: { left: rect.left, top: rect.top, width: rect.width, height: rect.height }, candidateCount: elements.length };\n })()`;\n}\n\nfunction normalizeBridgeResult(value) {\n const result = value && typeof value === 'object' ? value : {};\n return {\n id: String(result.id || ''),\n ok: result.ok !== false,\n url: String(result.url || ''),\n title: String(result.title || ''),\n value: result.value,\n error: String(result.error || ''),\n };\n}\n\nfunction parseBridgeValue(value) {\n let current = value;\n for (let i = 0; i < 2; i += 1) {\n if (typeof current !== 'string') return current;\n const text = current.trim();\n if (!text) return '';\n try {\n current = JSON.parse(text);\n } catch {\n return current;\n }\n }\n return current;\n}\n\nfunction hashSnapshot(value) {\n return createHash('sha256')\n .update(String(value?.url || ''))\n .update('\\n')\n .update(String(value?.title || ''))\n .update('\\n')\n .update(String(value?.html || value?.text || ''))\n .digest('hex');\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nfunction appDataDir(packageName) {\n return `/data/data/${String(packageName || '').trim()}`;\n}\n\nfunction normalizeStringArray(value) {\n const result = [];\n const add = (item) => {\n if (Array.isArray(item)) {\n item.forEach(add);\n return;\n }\n if (item && typeof item === 'object') {\n add(item.value);\n return;\n }\n const text = String(item ?? '').trim();\n if (text) result.push(text);\n };\n add(value);\n return result;\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.js';\nimport { WebView } from './webview.js';\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n waitForStable,\n waitForStableAcrossRoots,\n useMonitor,\n};\n\nasync function waitForStable(ctx, selectors, options = {}) {\n if (options.mode === 'webView') {\n return WebView.waitForStable(ctx, options);\n }\n\n const selectorList = normalizeSelectors(selectors);\n const initialTimeout = Math.max(0, Number(options.initialTimeout ?? 30000));\n const stableTime = Math.max(0, Number(options.stableTime ?? 5000));\n const timeout = Math.max(0, Number(options.timeout ?? 120000));\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n const initialDeadline = initialTimeout === 0 ? startedAt : startedAt + initialTimeout;\n\n const logTemplate = Logger.useTemplate();\n logTemplate.mutationWaitStart({\n selectors: selectorList.map(selectorLabel).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n let foundInitial = false;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let wasPaused = false;\n let snapshotErrorCount = 0;\n let lastSnapshotError = null;\n\n while (Date.now() < deadline) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch((error) => {\n snapshotErrorCount += 1;\n lastSnapshotError = error;\n if (snapshotErrorCount === 1 || snapshotErrorCount % 5 === 0) {\n logTemplate.mutationWaitWarn({\n snapshotErrorCount,\n message: error?.message || String(error),\n });\n }\n return null;\n });\n if (!snapshot) {\n await sleep(pollIntervalMs);\n continue;\n }\n\n if (!foundInitial) {\n if (snapshot.found || Date.now() >= initialDeadline) {\n foundInitial = true;\n if (!snapshot.found) logTemplate.mutationWaitWarn({ message: '\u521D\u59CB\u7B49\u5F85\u672A\u627E\u5230\u8282\u70B9', initialTimeout });\n } else {\n await sleep(pollIntervalMs);\n continue;\n }\n }\n\n const changed = !lastSnapshot || snapshot.hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = snapshot;\n }\n\n let paused = false;\n if ((changed || !stableSince) && onMutation) {\n const signal = await onMutation({\n mutationCount,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n paused = !(signal === null || signal === undefined);\n wasPaused = wasPaused || paused;\n }\n\n if (paused) {\n stableSince = 0;\n } else if (changed || !stableSince) {\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n wasPaused,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n };\n logTemplate.mutationWaitSuccess({\n duration: Logger.duration(startedAt),\n mutationCount,\n wasPaused,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new Error(`Mutation.waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, snapshotErrorCount=${snapshotErrorCount}, lastSnapshotError=${lastSnapshotError?.message || ''}`);\n}\n\nasync function waitForStableAcrossRoots(ctx, selectors, options = {}) {\n return waitForStable(ctx, selectors, options);\n}\n\nasync function useMonitor(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n let stopped = false;\n let totalMutations = 0;\n let lastHash = '';\n\n const loop = async () => {\n while (!stopped) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch(() => null);\n if (snapshot && snapshot.hash !== lastHash) {\n if (lastHash) totalMutations += 1;\n lastHash = snapshot.hash;\n if (onMutation) {\n await onMutation({\n mutationCount: totalMutations,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n }\n }\n await sleep(pollIntervalMs);\n }\n };\n loop();\n\n return {\n stop: async () => {\n stopped = true;\n return { totalMutations };\n },\n };\n}\n\nasync function captureSnapshot(ctx, selectors, options = {}) {\n const view = await DeviceView.snapshot(ctx, options);\n const matched = selectors.length\n ? selectors.flatMap((selector) => view.flat.filter((node) => matchesSelector(node, selector, options)))\n : view.flat;\n const unique = uniqueNodes(matched);\n const mutationNodes = unique.map((node) => ({\n html: nodeToText(node),\n text: [node.text, node.contentDesc].filter(Boolean).join(' ').trim(),\n mutationType: 'stable',\n resourceId: node.resourceId,\n className: node.className,\n bounds: node.bounds,\n }));\n const html = mutationNodes.map((node) => node.html).join('\\n');\n const text = mutationNodes.map((node) => node.text).filter(Boolean).join('\\n');\n return {\n found: unique.length > 0,\n html,\n text,\n mutationNodes,\n hash: unique.map((node) => DeviceView.hashNode(node)).join('|'),\n };\n}\n\nfunction normalizeSelectors(selectors) {\n if (selectors == null) return [];\n const values = Array.isArray(selectors) ? selectors : [selectors];\n return values.map(normalizeSelector).filter(Boolean);\n}\n\nfunction normalizeSelector(selector) {\n if (selector === '*' || selector == null) return null;\n if (typeof selector === 'object') return selector;\n const text = String(selector || '').trim();\n if (!text) return null;\n return { id: text.replace(/^#/, '') };\n}\n\nfunction matchesSelector(node, selector, options) {\n if (!selector) return true;\n if (options.visibleOnly !== false && !node.visible) return false;\n if (selector.id) {\n const id = String(selector.id || '');\n if (node.resourceId !== id && node.id !== id && !node.resourceId.endsWith(`:id/${id}`)) return false;\n }\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction uniqueNodes(nodes) {\n const seen = new Set();\n const out = [];\n for (const node of nodes) {\n const key = `${node.resourceId}|${node.bounds.left},${node.bounds.top},${node.bounds.right},${node.bounds.bottom}|${node.text}|${node.contentDesc}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(node);\n }\n return out;\n}\n\nfunction nodeToText(node) {\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n children: node.children?.length || 0,\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { Device } from './device.js';\n\nconst CAPTURE_DIR_NAME = 'network-capture';\nconst RULES_FILE = 'rules.json';\nconst DEFAULT_MAX_BYTES = 8 * 1024 * 1024;\n\nexport const NetworkCapture = {\n path,\n clear,\n writeRules,\n readText,\n};\n\nfunction path(ctx, fileName = '') {\n const base = `${appDataDir(ctx)}/cache/${CAPTURE_DIR_NAME}`;\n return fileName ? `${base}/${cleanFileName(fileName)}` : base;\n}\n\nasync function clear(ctx, options = {}) {\n const dirPath = options.dirPath || path(ctx);\n await adbSuShell(ctx, `rm -rf ${shellQuote(dirPath)}`, {\n timeoutMs: 10_000,\n maxBuffer: 1024,\n });\n return true;\n}\n\nasync function writeRules(ctx, { rulesJson } = {}) {\n const text = typeof rulesJson === 'string' ? rulesJson : JSON.stringify(rulesJson || { rules: [] });\n await Device.writeCacheFile(ctx, {\n dirName: CAPTURE_DIR_NAME,\n fileName: RULES_FILE,\n text,\n timeoutMs: 10_000,\n maxBuffer: 2 * 1024 * 1024,\n });\n return true;\n}\n\nasync function readText(ctx, fileName, options = {}) {\n return adbSuShell(ctx, `cat ${shellQuote(path(ctx, fileName))} 2>/dev/null || true`, {\n timeoutMs: 10_000,\n maxBuffer: Number(options.maxBuffer || DEFAULT_MAX_BYTES),\n }).catch(() => '');\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nfunction appDataDir(ctx) {\n const packageName = String(ctx?.packageName || '').trim();\n if (!packageName) throw new Error('packageName is required');\n return `/data/data/${packageName}`;\n}\n\nfunction cleanFileName(value) {\n const text = String(value || '').trim();\n if (!text || text.includes('/') || text.includes('\\\\') || text === '.' || text === '..') {\n throw new Error('invalid network capture file name');\n }\n return text;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { Device, readClipboardForShare } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { compressImageBufferToResult, resolveImageCompression } from './internals/compression.js';\nimport { Logger, sleep } from './logger.js';\n\n// Android \u622A\u56FE\u662F sprite \u56FE\uFF1A\u6BCF\u5E27\u90FD\u662F\u4E00\u6B21\u771F\u5B9E\u5C4F\u5E55\u622A\u56FE\uFF0C\u4E0D\u505A\u65E0\u7F1D\u957F\u56FE\u62FC\u63A5\u3002\nconst DEFAULT_CAPTURE_COUNT = 9;\n// \u4E00\u6392\u4E09\u5F20\uFF0C\u907F\u514D\u957F\u56FE\u8FC7\u9AD8\uFF0C\u4E5F\u65B9\u4FBF\u4EBA\u5DE5\u6A2A\u5411\u6BD4\u5BF9\u3002\nconst DEFAULT_COLUMNS = 3;\nconst DEFAULT_SETTLE_MS = 550;\nconst DEFAULT_TIMEOUT_MS = 50000;\nconst DEFAULT_POLL_INTERVAL_MS = 800;\n// \u6BCF\u6B21\u53EA\u63A8\u8FDB\u7EA6\u534A\u5C4F\uFF0C\u4FDD\u7559\u660E\u663E\u91CD\u53E0\uFF0C\u907F\u514D\u4E24\u5E27\u4E4B\u95F4\u4E22\u6587\u5B57\u3002\nconst CAPTURE_SCROLL_STEP_RATIO = 0.56;\nconst CAPTURE_SCROLL_DURATION_MS = 360;\nconst SPRITE_GAP = 16;\n// \u53BB\u91CD\u53EA\u770B\u56DE\u7B54\u5217\u8868\u5185\u5BB9\u533A\u57DF\uFF0C\u907F\u5F00\u72B6\u6001\u680F\u3001\u8F93\u5165\u680F\u3001toast \u8FD9\u7C7B\u975E\u5185\u5BB9\u53D8\u5316\u3002\nconst FRAME_SIGNATURE_WIDTH = 320;\nconst FRAME_SIGNATURE_QUALITY = 35;\n\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const logTemplate = Logger.useTemplate();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n const stopSelector = options.stopSelector || null;\n const resetToTop = options.resetToTop !== false;\n const maxFrames = clampInt(options.maxFrames, 1, DEFAULT_CAPTURE_COUNT, DEFAULT_CAPTURE_COUNT);\n const direction = String(options.direction || 'up').toLowerCase() === 'down' ? 'down' : 'up';\n let topResult = null;\n let stoppedBySelector = false;\n\n logTemplate.screenshotStart({ selector: targetSelector, resetToTop, direction, stopSelector });\n\n if (resetToTop) {\n topResult = await DeviceInput.scrollToTop(ctx, targetSelector, { settleMs: 400 });\n Logger.info('captureScreen scrollToTop', {\n swipes: topResult?.swipes,\n stableRounds: topResult?.stableRounds,\n hashSource: topResult?.hashSource,\n capped: topResult?.capped === true,\n inferredBoundary: topResult?.inferredBoundary === true,\n });\n if (topResult?.capped === true && options.requireTop === true) {\n throw new CrawlerError({\n message: `source_extraction_failed: \u622A\u56FE\u524D\u672A\u80FD\u786E\u8BA4\u56DE\u5230\u9876\u90E8 swipes=${topResult.swipes} stableRounds=${topResult.stableRounds}`,\n code: Code.SourceExtractionFailed,\n context: {\n selector: targetSelector,\n swipes: topResult.swipes,\n stableRounds: topResult.stableRounds,\n hashSource: topResult.hashSource,\n },\n });\n } else if (topResult?.capped === true) {\n Logger.warn('captureScreen \u672A\u80FD\u786E\u8BA4\u56DE\u5230\u9876\u90E8\uFF0C\u7EE7\u7EED\u91C7\u96C6\u5F53\u524D\u9875\u9762', {\n swipes: topResult.swipes,\n stableRounds: topResult.stableRounds,\n hashSource: topResult.hashSource,\n });\n }\n }\n\n for (let index = 0; index < maxFrames; index += 1) {\n await sleep(DEFAULT_SETTLE_MS);\n const target = await DeviceView.find(ctx, targetSelector, { optional: true }).catch(() => null);\n const png = await Device.screenshotPng(ctx);\n const hash = await frameSignature(png, target?.bounds);\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (stopSelector && await DeviceView.exists(ctx, stopSelector, { timeoutMs: 300 }).catch(() => false)) {\n stoppedBySelector = true;\n break;\n }\n if (index >= maxFrames - 1) break;\n await DeviceInput.scrollStep(ctx, targetSelector, direction, {\n swipeRatio: CAPTURE_SCROLL_STEP_RATIO,\n durationMs: CAPTURE_SCROLL_DURATION_MS,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const spriteBuffers = options.reverseFrames ? [...frameBuffers].reverse() : frameBuffers;\n const sprite = await composeSprite(spriteBuffers, { columns: DEFAULT_COLUMNS, gap: SPRITE_GAP });\n const compression = resolveImageCompression(options);\n const imageResult = await compressImageBufferToResult(sprite, compression);\n logTemplate.screenshotDone({\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n scrollStepRatio: CAPTURE_SCROLL_STEP_RATIO,\n resetToTop,\n topCapped: topResult?.capped === true,\n topInferredBoundary: topResult?.inferredBoundary === true,\n format: imageResult.format,\n base64Bytes: Math.ceil(imageResult.base64.length),\n uniqueFrameCount: seen.size,\n stoppedBySelector,\n });\n return `data:${imageResult.mimeType};base64,${imageResult.base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\n const logTemplate = Logger.useTemplate();\n const actorInfo = resolveActorInfo(options.actorInfo || options.actorKey || ctx.actorKey);\n const share = actorInfo?.share || {};\n if (share.mode !== 'clipboard') {\n throw new CrawlerError({\n message: `source_extraction_failed: unsupported Android share mode ${share.mode || ''}`,\n code: Code.SourceExtractionFailed,\n });\n }\n\n const timeoutMs = Number(options.timeoutMs || DEFAULT_TIMEOUT_MS);\n const prefix = String(share.prefix || '').trim();\n\n logTemplate.shareStart({ actor: actorInfo.key, prefix, timeoutMs });\n const beforeEvent = await readClipboard(ctx).catch(() => null);\n const beforeLink = beforeEvent ? selectLink(beforeEvent, prefix) : '';\n if (beforeLink) Logger.info('Share.captureLink baseline', { beforeLink });\n\n if (typeof options.performActions === 'function') {\n await options.performActions();\n }\n\n const deadline = Date.now() + timeoutMs;\n let lastEvent = null;\n while (Date.now() < deadline) {\n const event = await readClipboard(ctx).catch((error) => ({ ok: false, error: error?.message || String(error) }));\n lastEvent = event;\n const link = selectLink(event, prefix);\n if (link) {\n if (link === beforeLink) {\n Logger.info('Share.captureLink ignore baseline link', { link });\n await sleep(DEFAULT_POLL_INTERVAL_MS);\n continue;\n }\n logTemplate.shareSuccess({ link, source: event.source || 'clipboard' });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n await sleep(DEFAULT_POLL_INTERVAL_MS);\n }\n\n throw new CrawlerError({\n message: 'source_extraction_failed: \u672A\u6355\u83B7\u5206\u4EAB\u94FE\u63A5',\n code: Code.SourceExtractionFailed,\n context: { prefix, lastEvent },\n });\n}\n\nasync function readClipboard(ctx) {\n const payload = await readClipboardForShare(ctx);\n const candidates = extractLinks(payload).map((link) => ({\n source: 'adb.clipboard',\n link,\n payload: payload.slice(0, 1000),\n }));\n return {\n ok: candidates.length > 0,\n link: candidates[0]?.link || '',\n source: 'adb.clipboard',\n candidates,\n payloadSnapshot: payload.slice(0, 500),\n };\n}\n\nasync function composeSprite(buffers, options = {}) {\n if (!buffers.length) {\n throw new CrawlerError({ message: 'source_extraction_failed: no screenshots captured', code: Code.SourceExtractionFailed });\n }\n const images = [];\n for (const buffer of buffers) images.push(await Jimp.read(buffer));\n const columns = Math.max(1, Number(options.columns || DEFAULT_COLUMNS));\n const gap = Math.max(0, Number(options.gap || 0));\n const cellWidth = Math.max(...images.map((image) => image.bitmap.width));\n const cellHeight = Math.max(...images.map((image) => image.bitmap.height));\n const rows = Math.ceil(images.length / columns);\n const width = columns * cellWidth + (columns - 1) * gap;\n const height = rows * cellHeight + (rows - 1) * gap;\n const sprite = new Jimp({ width, height, color: 0xffffffff });\n images.forEach((image, index) => {\n const x = (index % columns) * (cellWidth + gap);\n const y = Math.floor(index / columns) * (cellHeight + gap);\n sprite.composite(image, x, y);\n });\n return sprite.getBuffer(JimpMime.png);\n}\n\nasync function frameSignature(buffer, bounds) {\n const image = await Jimp.read(buffer);\n const area = normalizeCaptureBounds(bounds, image.bitmap.width, image.bitmap.height);\n const target = image.crop(area);\n const scale = Math.min(1, FRAME_SIGNATURE_WIDTH / Math.max(1, target.bitmap.width));\n if (scale < 1) {\n target.resize({\n w: Math.max(1, Math.round(target.bitmap.width * scale)),\n h: Math.max(1, Math.round(target.bitmap.height * scale)),\n });\n }\n const normalized = await target.getBuffer(JimpMime.jpeg, { quality: FRAME_SIGNATURE_QUALITY });\n return createHash('sha256').update(normalized).digest('hex');\n}\n\nfunction normalizeCaptureBounds(bounds, imageWidth, imageHeight) {\n const left = clampInt(bounds?.left, 0, imageWidth - 1, 0);\n const top = clampInt(bounds?.top, 0, imageHeight - 1, 0);\n const right = clampInt(bounds?.right, left + 1, imageWidth, imageWidth);\n const bottom = clampInt(bounds?.bottom, top + 1, imageHeight, imageHeight);\n return {\n x: left,\n y: top,\n w: Math.max(1, right - left),\n h: Math.max(1, bottom - top),\n };\n}\n\nfunction clampInt(value, min, max, fallback) {\n const number = Math.round(Number(value));\n if (!Number.isFinite(number)) return fallback;\n return Math.min(max, Math.max(min, number));\n}\n\nfunction resolveActorInfo(value) {\n if (value && typeof value === 'object') return value;\n const key = String(value || '').trim();\n const info = ActorInfo[key];\n if (!info) {\n throw new CrawlerError({\n message: `invalid_request: unknown actorInfo ${key}`,\n code: Code.InvalidRequest,\n });\n }\n return info;\n}\n\nfunction selectLink(event, prefix) {\n const candidates = [];\n if (event?.link) candidates.push(event.link);\n if (Array.isArray(event?.candidates)) {\n for (const candidate of event.candidates) {\n if (candidate?.link) candidates.push(candidate.link);\n }\n }\n return candidates.find((link) => !prefix || String(link).startsWith(prefix)) || '';\n}\n\nfunction extractLinks(value) {\n const text = String(value || '');\n const matches = text.match(/https?:\\/\\/[^\\s\"'<>\uFF0C\u3002]+/g) || [];\n return matches.map((link) => link.replace(/[)\\].,\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]+$/g, ''));\n}\n", "import { Jimp, JimpMime, ResizeStrategy } from 'jimp';\n\nimport { Logger } from '../logger.js';\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY,\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY),\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES,\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType,\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE,\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, { quality });\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst rawPngResult = (buffer) => ({\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n format: 'png',\n mimeType: 'image/png',\n withinLimit: true,\n});\n\nconst mimeTypeForFormat = (format) => (format === 'jpeg' ? 'image/jpeg' : 'image/png');\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) smallest = candidate;\n if (candidate.bytes <= compression.maxBytes) {\n return { ...candidate, mimeType: mimeTypeForFormat(candidate.format), withinLimit: true };\n }\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94),\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) break;\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return {\n ...fallback,\n mimeType: mimeTypeForFormat(fallback.format),\n withinLimit: fallback.bytes <= compression.maxBytes,\n };\n};\n\nexport const compressImageBufferToResult = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n const raw = rawPngResult(buffer);\n return {\n ...raw,\n base64: raw.buffer.toString('base64'),\n };\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n Logger.warn('captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE', { message: error?.message || String(error) });\n return null;\n });\n\n if (!result?.buffer) {\n const raw = rawPngResult(buffer);\n return {\n ...raw,\n base64: raw.buffer.toString('base64'),\n };\n }\n\n if (result.withinLimit) {\n Logger.info('captureScreen \u5DF2\u538B\u7F29', {\n originalBytes,\n outputBytes: result.bytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n size: `${result.width}x${result.height}`,\n });\n } else {\n Logger.warn('captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807', {\n originalBytes,\n outputBytes: result.bytes,\n maxBytes: compression.maxBytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n });\n }\n\n return {\n ...result,\n base64: result.buffer.toString('base64'),\n };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const result = await compressImageBufferToResult(buffer, compression);\n return result.base64;\n};\n", "import { ApifyKit } from '../src/apify-kit.js';\nimport { Context } from '../src/context.js';\nimport { Device } from '../src/device.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceSQLite } from '../src/device-sqlite.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Launch } from '../src/launch.js';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { NetworkCapture } from '../src/network-capture.js';\nimport { Share } from '../src/share.js';\nimport { WebView } from '../src/webview.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\n\nconst ToolkitMode = Object.freeze({\n default: 'default',\n});\n\nexport const useAndroidToolKit = () => {\n return {\n Launch,\n ApifyKit,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Device,\n Mutation,\n NetworkCapture,\n Share,\n WebView,\n Constants,\n Errors,\n Logger,\n LOG_TEMPLATES,\n $Internals: { LOG_TEMPLATES, stripAnsi },\n Context,\n };\n};\n\nuseAndroidToolKit.Mode = ToolkitMode;\n"],
5
- "mappings": "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",
6
- "names": ["text", "text", "options", "out", "createHash", "bounds", "pressEnter", "point", "text", "bounds", "createHash", "execFile", "promisify", "execFileAsync", "promisify", "execFile", "fs", "requireNonEmpty", "fs", "createHash", "snapshot", "click", "requireNonEmpty", "appDataDir", "normalizeStringArray", "adbSuShell", "shellQuote", "text", "createHash", "waitForStable", "selectorLabel", "snapshot", "matchesSelector", "text", "normalizeSelector", "path", "appDataDir", "adbSuShell", "shellQuote", "text", "createHash", "Jimp", "JimpMime", "DEFAULT_TIMEOUT_MS", "DEFAULT_POLL_INTERVAL_MS", "Jimp", "JimpMime", "bounds", "createHash", "text", "fs"]
4
+ "sourcesContent": ["import fs from 'node:fs';\nimport cycle from 'json-cycle';\n\nimport { Code, Status, StoragePath } from './constants.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { CrawlerError, serializeError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst { decycle } = cycle;\nlet instance = null;\n\nexport const ApifyKit = {\n useApifyKit,\n};\n\nasync function useApifyKit(options = {}) {\n if (!instance || options.reset) {\n instance = createApifyKit(options);\n }\n return instance;\n}\n\nfunction createApifyKit(options = {}) {\n const inputPath = StoragePath.Input;\n const outputPath = options.outputPath || StoragePath.Output;\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n const logTemplate = Logger.useTemplate();\n let pushed = false;\n\n return {\n ctx,\n input,\n inputPath,\n outputPath,\n async runStep(step, target, actionFn, options = {}) {\n const { failActor = true, retry = {} } = options;\n const retryTimes = Math.max(0, Number(retry.times || 0));\n const startedAt = Date.now();\n let lastError = null;\n\n for (let attempt = 0; attempt <= retryTimes; attempt += 1) {\n const attemptLabel = attempt > 0 ? ` (\u91CD\u8BD5 #${attempt})` : '';\n if (attempt > 0) logTemplate.stepRetry(step, attempt);\n logTemplate.stepStart(`${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n logTemplate.stepSuccess(`${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n logTemplate.stepFail(`${step}${attemptLabel}`, error);\n if (attempt < retryTimes) {\n if (typeof retry.before === 'function') {\n await retry.before(ctx, attempt + 1);\n } else {\n await sleep(3000);\n }\n }\n }\n }\n\n if (failActor) {\n let base64 = '';\n try {\n base64 = await Device.screenshotBase64(ctx);\n } catch (error) {\n base64 = `\u622A\u56FE\u5931\u8D25: ${error?.message || String(error)}`;\n }\n await this.pushFailed(lastError, { step, base64, retryAttempts: retryTimes });\n }\n throw lastError;\n },\n async runStepLoose(step, target, actionFn, options = {}) {\n return this.runStep(step, target, actionFn, { ...options, failActor: false });\n },\n async pushSuccess(data = {}, options = {}) {\n pushed = true;\n appendOutput(outputPath, {\n code: Number.isFinite(Number(options.code)) ? Number(options.code) : Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n logTemplate.dataPush({ type: 'success', outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n logTemplate.dataPush({ type: 'artifact', outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushFailed(error, meta = {}) {\n const normalized = CrawlerError.isCrawlerError(error)\n ? error\n : CrawlerError.from(error, { code: Code.UnknownError, context: meta });\n pushed = true;\n appendOutput(outputPath, {\n code: normalized.code,\n status: Status.Failed,\n error: sanitizeData(serializeError(normalized)),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n logTemplate.dataPush({ type: 'failed', outputPath, code: normalized.code, message: normalized.message });\n },\n hasPushed() {\n return pushed;\n },\n };\n}\n\nfunction appendOutput(outputPath, item) {\n const items = readOutputArray(outputPath);\n items.push(item);\n fs.writeFileSync(outputPath, JSON.stringify(items, null, 2) + '\\n', 'utf8');\n}\n\nfunction readOutputArray(outputPath) {\n if (!fs.existsSync(outputPath)) return [];\n const raw = fs.readFileSync(outputPath, 'utf8').trim();\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) throw new Error(`Android output must be a JSON array: ${outputPath}`);\n return parsed;\n}\n\nfunction stepDetail(target) {\n if (!target) return {};\n if (typeof target === 'string') return { target };\n if (typeof target === 'object') {\n return {\n serial: target.serial,\n packageName: target.packageName,\n runId: target.runId,\n };\n }\n return { target: String(target) };\n}\n\nfunction sanitizeData(value) {\n return decycle(prepareForJson(value, new WeakMap()));\n}\n\nfunction prepareForJson(value, seen) {\n if (value == null) return value;\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return value.toString();\n if (type === 'function' || type === 'symbol') return undefined;\n if (type !== 'object') return String(value);\n\n if (seen.has(value)) return seen.get(value);\n if (value instanceof Date) return value.toISOString();\n\n if (value instanceof Error) {\n const out = {};\n seen.set(value, out);\n copyEntries(out, serializeError(value), seen);\n return out;\n }\n\n if (Array.isArray(value)) {\n const out = [];\n seen.set(value, out);\n for (const item of value) {\n const safe = prepareForJson(item, seen);\n out.push(safe === undefined ? null : safe);\n }\n return out;\n }\n\n if (value instanceof Map) {\n const out = [];\n seen.set(value, out);\n for (const [key, item] of value.entries()) {\n out.push([prepareForJson(key, seen), prepareForJson(item, seen)]);\n }\n return out;\n }\n\n if (value instanceof Set) {\n const out = [];\n seen.set(value, out);\n for (const item of value.values()) {\n const safe = prepareForJson(item, seen);\n out.push(safe === undefined ? null : safe);\n }\n return out;\n }\n\n const out = {};\n seen.set(value, out);\n copyEntries(out, value, seen);\n return out;\n}\n\nfunction copyEntries(out, value, seen) {\n for (const [key, item] of Object.entries(value)) {\n const safe = prepareForJson(item, seen);\n if (safe !== undefined) out[key] = safe;\n }\n}\n", "export const Code = Object.freeze({\n Success: 0,\n EmptySuccess: 1,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n AccountFreeze: 30000006,\n InvalidRequest: 30010001,\n AdbUnavailable: 30010002,\n ContentUnavailable: 30010003,\n SourceExtractionFailed: 30010004,\n AutomationFailed: 30010005,\n AppRuntimeUnavailable: 30010008,\n AppNotInstalled: 30010009,\n});\n\nexport const Status = Object.freeze({\n Success: 'SUCCESS',\n Failed: 'FAILED',\n});\n\nexport const StoragePath = Object.freeze({\n Input: '/apify_storage/input.json',\n Output: '/apify_storage/output.json',\n});\n\nexport const UnicodeIme = Object.freeze({\n packageName: 'io.appium.settings',\n component: 'io.appium.settings/.UnicodeIME',\n inputAction: 'ADB_INPUT_TEXT',\n});\n\nexport const AppiumSettings = Object.freeze({\n packageName: 'io.appium.settings',\n clipboardReceiver: 'io.appium.settings/.receivers.ClipboardReceiver',\n clipboardGetAction: 'io.appium.settings.clipboard.get',\n});\n\nexport const WebViewBridge = Object.freeze({\n packageName: 'com.heartbit.apify.android.bridge',\n actionCommand: 'com.heartbit.apify.android.bridge.COMMAND',\n cacheDir: 'apify-webview-bridge',\n hookConfigFile: 'hook.json',\n commandDir: 'commands',\n resultDir: 'results',\n});\n\nexport const ActorKey = Object.freeze({\n DoubaoAndroid: 'doubao.android',\n ErineAndroid: 'erine.android',\n WechatAndroid: 'wechat.android',\n QwenAndroid: 'qwen.android',\n YuanbaoAndroid: 'yuanbao.android',\n XhsAndroid: 'xhs.android',\n});\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n return {\n mode: 'clipboard',\n prefix: String(source.prefix || '').trim(),\n xurl: Array.isArray(source.xurl) ? source.xurl : [],\n };\n};\n\nconst createActorInfo = (info) => {\n const key = String(info.key || '').trim();\n return Object.freeze({\n key,\n name: String(info.name || key),\n icon: String(info.icon || `https://static.heartbitai.com/general/actors/${key}.png`),\n webviews: Object.freeze(Array.isArray(info.webviews) ? info.webviews : []),\n share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n [ActorKey.DoubaoAndroid]: createActorInfo({\n key: ActorKey.DoubaoAndroid,\n name: '\u8C46\u5305 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['www.doubao.com'],\n }],\n share: {\n prefix: 'https://www.doubao.com/thread/',\n xurl: [],\n },\n }),\n [ActorKey.ErineAndroid]: createActorInfo({\n key: ActorKey.ErineAndroid,\n name: '\u6587\u5C0F\u8A00 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['yiyanapp.baidu.com'],\n }],\n share: {\n prefix: 'https://mr.baidu.com/r/',\n xurl: [],\n },\n }),\n [ActorKey.WechatAndroid]: createActorInfo({\n key: ActorKey.WechatAndroid,\n name: '\u5FAE\u4FE1 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['websearch/template'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.QwenAndroid]: createActorInfo({\n key: ActorKey.QwenAndroid,\n name: '\u5343\u95EE Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['www.qianwen.com', 'chat2.qianwen.com'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.XhsAndroid]: createActorInfo({\n key: ActorKey.XhsAndroid,\n name: '\u5C0F\u7EA2\u4E66 Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['xiaohongshu.com', 'xhslink.com'],\n }],\n share: {\n prefix: '',\n xurl: [],\n },\n }),\n [ActorKey.YuanbaoAndroid]: createActorInfo({\n key: ActorKey.YuanbaoAndroid,\n name: '\u5143\u5B9D Android',\n webviews: [{\n name: [\n 'android.webkit.WebView',\n 'com.baidu.webkit.sdk.WebView',\n 'com.tencent.smtt.sdk.WebView',\n 'com.tencent.xweb.WebView',\n 'com.tencent.xweb.pinus.PSWebview',\n ],\n value: ['yuanbao.tencent.com', 'hunyuan.tencent.com', 'yb.tencent.com'],\n }],\n share: {\n prefix: 'https://yb.tencent.com/s/',\n xurl: [],\n },\n }),\n});\n", "export const Context = {\n createAndroidContext,\n firstNonEmpty,\n requireNonEmpty,\n};\n\nfunction createAndroidContext(input = {}, defaults = {}) {\n const runtime = input.runtime && typeof input.runtime === 'object' ? input.runtime : {};\n const device = runtime.device && typeof runtime.device === 'object'\n ? runtime.device\n : {};\n\n return {\n runId: firstNonEmpty(defaults.runId, runtime.runId, input.runId),\n query: String(firstNonEmpty(defaults.query, input.query) || '').trim(),\n serial: firstNonEmpty(defaults.serial, device.serial),\n packageName: firstNonEmpty(defaults.packageName, device.packageName),\n adbPath: firstNonEmpty(defaults.adbPath, process.env.ANDROID_TOOLKIT_ADB_PATH),\n appVersion: firstNonEmpty(defaults.appVersion, device.appVersion),\n slotKey: firstNonEmpty(defaults.slotKey, device.slotKey),\n instanceId: firstNonEmpty(defaults.instanceId, device.instanceId),\n externalIp: firstNonEmpty(defaults.externalIp, device.externalIp),\n };\n}\n\nfunction firstNonEmpty(...values) {\n for (const value of values) {\n const clean = String(value ?? '').trim();\n if (clean) return clean;\n }\n return '';\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new Error(`${name} is required`);\n return clean;\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { AppiumSettings, Code, UnicodeIme, WebViewBridge } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_ADB_ATTEMPTS = 3;\nconst DEFAULT_ADB_RETRY_DELAY_MS = 500;\n\nexport const Device = {\n adbExec,\n adbShell,\n writeCacheFile,\n forceStopApp,\n clearAppCache,\n startActivity,\n startLauncher,\n resolveLauncherActivity,\n focusedActivity,\n waitForActivity,\n waitForForeground,\n screenSize,\n screenDensity,\n tapAbsolute,\n swipe,\n pressKey,\n pressBack,\n pressEnter,\n typeText,\n screenshotPng,\n screenshotBase64,\n dumpUiXml,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\n currentInputMethod,\n restoreInputMethod,\n};\n\nasync function adbExec(ctx, args, options = {}) {\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const startedAt = Date.now();\n try {\n const { stdout } = await execAdbWithRetry(adbPath, args, options);\n Logger.useTemplate().adbExec({ duration: Logger.duration(startedAt), args: compactArgs(args) });\n return stdout;\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { args: compactArgs(args), adbPath },\n });\n }\n throw error;\n }\n}\n\nasync function adbShell(ctx, args, options = {}) {\n const serial = requireDeviceField(ctx, 'serial');\n return adbExec(ctx, ['-s', serial, 'shell', ...args], options);\n}\n\nasync function writeCacheFile(ctx, options = {}) {\n const dataDir = appDataDir(ctx);\n const dirPath = `${dataDir}/cache/${cleanCachePathName(options.dirName, 'dirName')}`;\n const filePath = `${dirPath}/${cleanCachePathName(options.fileName, 'fileName')}`;\n const command = [\n `owner=$(stat -c %u:%g ${shellQuoteForRemote(dataDir)})`,\n `mkdir -p ${shellQuoteForRemote(dirPath)}`,\n `printf %s ${shellQuoteForRemote(String(options.text ?? ''))} > ${shellQuoteForRemote(filePath)}`,\n `chown \"$owner\" ${shellQuoteForRemote(dirPath)} ${shellQuoteForRemote(filePath)}`,\n `chmod 2775 ${shellQuoteForRemote(dirPath)}`,\n `chmod 664 ${shellQuoteForRemote(filePath)}`,\n ].join(' && ');\n await Device.adbShell(ctx, [`su -c ${shellQuoteForRemote(command)}`], {\n timeoutMs: Number(options.timeoutMs || 10000),\n maxBuffer: Number(options.maxBuffer || 1024),\n });\n return filePath;\n}\n\nasync function adbInput(ctx, args, options = {}) {\n return adbShell(ctx, ['input', ...args], options);\n}\n\nasync function forceStopApp(ctx, packageName = ctx.packageName) {\n await adbShell(ctx, ['am', 'force-stop', requireValue(packageName, 'packageName')], { timeoutMs: 15000 });\n}\n\nasync function clearAppCache(ctx, packageName = ctx.packageName) {\n const targetPackage = requireValue(packageName, 'packageName');\n if (!/^[A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)+$/.test(targetPackage)) {\n throw new CrawlerError({ message: 'invalid_request: invalid packageName for cache cleanup', code: Code.InvalidRequest });\n }\n const dataDir = `/data/data/${targetPackage}`;\n const cacheDirs = [`${dataDir}/cache`, `${dataDir}/code_cache`, `/sdcard/Android/data/${targetPackage}/cache`];\n // Launch \u5DF2\u5199\u5165\u7684\u6865\u63A5\u914D\u7F6E\u548C\u6293\u5305\u89C4\u5219\u4E5F\u5728 cache \u4E2D\uFF0C\u5FC5\u987B\u4FDD\u7559\u3002\n const command = [\n 'set -e',\n `test -d ${shellQuoteForRemote(dataDir)}`,\n `for cache_dir in ${cacheDirs.map(shellQuoteForRemote).join(' ')}; do`,\n ' if [ -L \"$cache_dir\" ]; then echo \"refusing symlink cache directory: $cache_dir\" >&2; exit 1; fi',\n ' if [ -d \"$cache_dir\" ]; then',\n ` find \"$cache_dir\" -mindepth 1 -maxdepth 1 ! -name ${shellQuoteForRemote(WebViewBridge.cacheDir)} ! -name 'network-capture' -exec rm -rf -- {} +`,\n ' fi',\n 'done',\n ].join('\\n');\n await Device.adbShell(ctx, [`su -c ${shellQuoteForRemote(command)}`], {\n timeoutMs: 30_000,\n maxBuffer: 4096,\n }).catch((error) => {\n throw CrawlerError.from(error, { code: Code.AutomationFailed, context: { packageName: targetPackage } });\n });\n Logger.useTemplate().info('App \u4E34\u65F6\u7F13\u5B58\u5DF2\u6E05\u7406', { packageName: targetPackage });\n}\n\nasync function startActivity(ctx, component, args = []) {\n const target = requireValue(component, 'component');\n const output = await adbShell(ctx, ['am', 'start', '-W', '-n', target, ...args], { timeoutMs: 20000 });\n assertActivityStartOk(output, target);\n await sleep(1500);\n return output;\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n const targetPackage = requireValue(packageName, 'packageName');\n const component = launcherActivity\n ? `${targetPackage}/${requireValue(launcherActivity, 'launcherActivity')}`\n : await resolveLauncherActivity(ctx, targetPackage);\n return startActivity(ctx, component, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\n}\n\nasync function resolveLauncherActivity(ctx, packageName = ctx.packageName) {\n const targetPackage = requireValue(packageName, 'packageName');\n const output = await adbShell(ctx, [\n 'cmd',\n 'package',\n 'resolve-activity',\n '--brief',\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n targetPackage,\n ], { timeoutMs: 15000 });\n const component = parseResolvedLauncherComponent(output, targetPackage);\n if (!component) {\n throw new CrawlerError({\n message: `automation_failed: cannot resolve launcher activity packageName=${targetPackage} output=${compactOutput(output)}`,\n code: Code.AutomationFailed,\n context: { packageName: targetPackage, output: compactOutput(output, 2000) },\n });\n }\n return component;\n}\n\nasync function focusedActivity(ctx) {\n const resumed = await resumedActivity(ctx).catch(() => '');\n if (resumed) return resumed;\n const out = await adbShell(ctx, ['dumpsys', 'window'], { timeoutMs: 15000, maxBuffer: 12 * 1024 * 1024 });\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mCurrentFocus=Window') && !trimmed.includes('=null')) return trimmed;\n }\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mFocusedApp=AppWindowToken') && !trimmed.includes('=null')) return trimmed;\n }\n return '';\n}\n\nasync function resumedActivity(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'activity', 'activities'], {\n timeoutMs: 15000,\n maxBuffer: 12 * 1024 * 1024,\n });\n let fallback = '';\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.includes('ActivityRecord') || !trimmed.includes('/')) continue;\n if (trimmed.includes('mTopResumedActivity') ||\n trimmed.includes('topResumedActivity') ||\n trimmed.startsWith('ResumedActivity:') ||\n trimmed.startsWith('Resumed:')) {\n return trimmed;\n }\n if (trimmed.includes('mResumedActivity')) fallback = trimmed;\n }\n return fallback;\n}\n\nasync function waitForActivity(ctx, predicate, timeoutMs = 15000, intervalMs = 700) {\n const deadline = Date.now() + Number(timeoutMs);\n let lastFocused = '';\n while (Date.now() < deadline) {\n lastFocused = await focusedActivity(ctx).catch((error) => `ERROR: ${error?.message || String(error)}`);\n if (predicate(lastFocused)) return lastFocused;\n await sleep(intervalMs);\n }\n throw new CrawlerError({\n message: `automation_failed: waitForActivity timeout focused=${lastFocused}`,\n code: Code.AutomationFailed,\n });\n}\n\nasync function waitForForeground(ctx, packageName = ctx.packageName, timeoutMs = 6000) {\n const target = requireValue(packageName, 'packageName');\n return waitForActivity(ctx, (value) => String(value || '').includes(target), timeoutMs, 500);\n}\n\nasync function screenSize(ctx) {\n const out = await adbShell(ctx, ['wm', 'size'], { timeoutMs: 15000 });\n const match = /(\\d+)x(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen size: ${out}`, code: Code.AdbUnavailable });\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nasync function screenDensity(ctx) {\n const out = await adbShell(ctx, ['wm', 'density'], { timeoutMs: 15000 });\n const match = /(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen density: ${out}`, code: Code.AdbUnavailable });\n return Number(match[1]);\n}\n\nasync function tapAbsolute(ctx, x, y) {\n await adbInput(ctx, ['tap', Math.round(Number(x)), Math.round(Number(y))], { timeoutMs: 15000 });\n}\n\nasync function swipe(ctx, from, to, durationMs = 360) {\n const args = [\n 'swipe',\n Math.round(Number(from?.x)),\n Math.round(Number(from?.y)),\n Math.round(Number(to?.x)),\n Math.round(Number(to?.y)),\n Math.round(Number(durationMs)),\n ];\n await adbInput(ctx, args, { timeoutMs: 30000 });\n}\n\nasync function pressKey(ctx, key) {\n await adbInput(ctx, ['keyevent', String(key)], { timeoutMs: 15000 });\n}\n\nasync function pressBack(ctx) {\n await pressKey(ctx, 'BACK');\n}\n\nasync function pressEnter(ctx) {\n await pressKey(ctx, 'KEYCODE_ENTER');\n}\n\nasync function typeText(ctx, text) {\n await ensureUnicodeIme(ctx);\n const value = String(text ?? '');\n if (!value) return;\n\n await sendUnicodeImeText(ctx, encodeUnicodeImeText(value), {\n timeoutMs: Math.max(15000, value.length * 300),\n });\n await sleep(1200);\n}\n\nasync function ensureUnicodeIme(ctx) {\n const out = await adbShell(ctx, ['ime', 'list', '-s'], { timeoutMs: 15000 });\n if (!String(out || '').split(/\\s+/).includes(UnicodeIme.component)) {\n throw new CrawlerError({\n message: `adb_unavailable: UnicodeIME \u672A\u5B89\u88C5\u6216\u4E0D\u53EF\u7528 ${UnicodeIme.component}`,\n code: Code.AdbUnavailable,\n context: { component: UnicodeIme.component },\n });\n }\n await adbShell(ctx, ['ime', 'set', UnicodeIme.component], { timeoutMs: 15000 });\n}\n\nasync function currentInputMethod(ctx) {\n const value = await adbShell(ctx, ['settings', 'get', 'secure', 'default_input_method'], { timeoutMs: 15000 });\n return String(value || '').trim();\n}\n\nasync function restoreInputMethod(ctx, component) {\n const value = String(component || '').trim();\n if (!value || value === 'null' || value === UnicodeIme.component) return false;\n await adbShell(ctx, ['ime', 'set', value], { timeoutMs: 15000 });\n return true;\n}\n\nasync function screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n try {\n const { stdout } = await execAdbWithRetry(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeoutMs: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n label: 'screencap',\n });\n return Buffer.from(stdout);\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: screencap failed ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { serial, adbPath },\n });\n }\n throw new CrawlerError({\n message: `source_extraction_failed: screencap failed ${error?.message || String(error)}`,\n code: Code.SourceExtractionFailed,\n context: { serial },\n });\n }\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nexport async function readClipboardForShare(ctx) {\n const out = await adbShell(ctx, [\n 'am',\n 'broadcast',\n '-n',\n AppiumSettings.clipboardReceiver,\n '-a',\n AppiumSettings.clipboardGetAction,\n ], {\n timeoutMs: 8000,\n maxBuffer: 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `source_extraction_failed: Appium Settings clipboard receiver unavailable ${error?.message || String(error)}`,\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver },\n });\n });\n const text = normalizeAppiumClipboardBroadcast(out);\n if (!text) {\n throw new CrawlerError({\n message: 'source_extraction_failed: ADB clipboard is empty',\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver, output: String(out || '').slice(0, 1000) },\n });\n }\n return text;\n}\n\nasync function dumpUiXml(ctx) {\n let lastError = null;\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const dumpPath = `/data/local/tmp/android-toolkit-window-${Date.now()}-${Math.random().toString(16).slice(2)}.xml`;\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n try {\n await adbShell(ctx, ['uiautomator', 'dump', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 4 * 1024 * 1024,\n });\n const raw = await adbShell(ctx, ['cat', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 16 * 1024 * 1024,\n });\n const start = String(raw || '').indexOf('<?xml');\n if (start < 0) throw new CrawlerError({ message: `automation_failed: uiautomator dump missing xml: ${raw}`, code: Code.AutomationFailed });\n return String(raw || '').slice(start).trim();\n } catch (error) {\n lastError = error;\n Logger.useTemplate().adbRetry({ label: 'uiautomator dump', attempt, message: error?.message || String(error) });\n await sleep(350 * attempt);\n } finally {\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n }\n }\n throw CrawlerError.isCrawlerError(lastError)\n ? lastError\n : new CrawlerError({\n message: `automation_failed: uiautomator dump failed ${lastError?.message || String(lastError || '')}`.trim(),\n code: Code.AutomationFailed,\n context: { lastError: lastError?.message || String(lastError || '') },\n });\n}\n\nasync function wakeAndUnlock(ctx) {\n await pressKey(ctx, 'KEYCODE_WAKEUP').catch(() => {});\n await sleep(300);\n await pressKey(ctx, 'MENU').catch(() => {});\n await sleep(300);\n const size = await screenSize(ctx);\n await swipe(ctx, { x: size.width * 0.5, y: size.height * 0.82 }, { x: size.width * 0.5, y: size.height * 0.25 }, 350).catch(() => {});\n await sleep(600);\n}\n\nasync function isKeyboardVisible(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'input_method'], { timeoutMs: 15000, maxBuffer: 4 * 1024 * 1024 });\n return /mInputShown=true|mIsInputViewShown=true|inputShown=true/i.test(String(out || ''));\n}\n\nasync function hideKeyboard(ctx, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || 2)));\n for (let i = 0; i < attempts; i += 1) {\n if (!await isKeyboardVisible(ctx).catch(() => false)) return true;\n await pressBack(ctx).catch(() => {});\n await sleep(Number(options.settleMs || 400));\n }\n return !await isKeyboardVisible(ctx).catch(() => false);\n}\n\nasync function execAdbWithRetry(adbPath, args, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || DEFAULT_ADB_ATTEMPTS)));\n const delayMs = Math.max(0, Number(options.retryDelayMs || DEFAULT_ADB_RETRY_DELAY_MS));\n const commandArgs = args.map(String);\n let lastError = null;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await execFileAsync(adbPath, commandArgs, {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isRetryableAdbError(error)) {\n throw error;\n }\n Logger.useTemplate().adbRetry({\n label: options.label || 'adb',\n attempt,\n attempts,\n args: compactArgs(args),\n message: error?.message || String(error),\n });\n await sleep(delayMs * attempt);\n }\n }\n throw lastError;\n}\n\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\n}\n\nfunction appDataDir(ctx) {\n return `/data/data/${requireDeviceField(ctx, 'packageName')}`;\n}\n\nfunction cleanCachePathName(value, name) {\n const text = requireValue(value, name);\n if (text.includes('/') || text.includes('\\\\') || text === '.' || text === '..') {\n throw new CrawlerError({ message: `invalid_request: invalid cache ${name}`, code: Code.InvalidRequest });\n }\n return text;\n}\n\nfunction requireValue(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction isAdbUnavailableError(error) {\n const message = String(error?.message || error || '');\n return /ENOENT|spawn .*adb|device .* not found|no devices|offline/i.test(message);\n}\n\nfunction isAdbInputTimeout(error) {\n const message = String(error?.message || error || '');\n return /timed out|timeout|SIGTERM|killed/i.test(message)\n || error?.signal === 'SIGTERM'\n || error?.killed === true;\n}\n\nfunction isRetryableAdbError(error) {\n const message = String(error?.message || error || '');\n return isAdbInputTimeout(error) ||\n /device .* not found|no devices|offline|closed|broken pipe|protocol fault|transport/i.test(message);\n}\n\nfunction compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\n}\n\nfunction parseResolvedLauncherComponent(output, packageName) {\n const prefix = `${packageName}/`;\n const lines = String(output || '').replace(/\\r/g, '').split('\\n').map((line) => line.trim()).filter(Boolean);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (line.startsWith(prefix) && /^[^\\s/]+\\/[^\\s/]+$/.test(line)) return line;\n }\n return '';\n}\n\nfunction assertActivityStartOk(output, component) {\n const text = String(output || '');\n const status = /^\\s*Status:\\s*([^\\s]+)/im.exec(text)?.[1];\n const failed = /(^|\\n)\\s*(Error type \\d+|Error:|Exception occurred|SecurityException|java\\.[A-Za-z.]*Exception)/i.test(text)\n || (status && status.toLowerCase() !== 'ok');\n if (!failed) return;\n throw new CrawlerError({\n message: `automation_failed: am start failed component=${component} output=${compactOutput(text)}`,\n code: Code.AutomationFailed,\n context: { component, output: compactOutput(text, 2000) },\n });\n}\n\nfunction compactOutput(value, maxLength = 500) {\n return String(value || '').replace(/\\s+/g, ' ').trim().slice(0, maxLength);\n}\n\nfunction encodeUnicodeImeText(text) {\n let out = '';\n let buffer = '';\n const flush = () => {\n if (!buffer) return;\n const bytes = Buffer.alloc(buffer.length * 2);\n for (let index = 0; index < buffer.length; index += 1) {\n bytes.writeUInt16BE(buffer.charCodeAt(index), index * 2);\n }\n out += `&${bytes.toString('base64').replace(/\\//g, ',').replace(/=+$/g, '')}-`;\n buffer = '';\n };\n for (const char of String(text || '')) {\n const code = char.charCodeAt(0);\n if (code >= 0x20 && code <= 0x7e) {\n flush();\n out += char === '&' ? '&-' : char;\n } else {\n buffer += char;\n }\n }\n flush();\n return out;\n}\n\nasync function sendUnicodeImeText(ctx, encoded, options = {}) {\n await adbShell(ctx, ['input', 'text', shellQuoteForRemote(encoded)], options);\n}\n\nfunction shellQuoteForRemote(value) {\n return `'${String(value ?? '').replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction normalizeAppiumClipboardBroadcast(value) {\n const out = String(value || '');\n if (!/Broadcast completed:\\s*result=-1\\b/.test(out)) return '';\n const match = /data=\"([^\"]*)\"/.exec(out) || /data=([^\\s]+)/.exec(out);\n const base64 = match ? String(match[1] || '').trim() : '';\n if (!base64) return '';\n try {\n return Buffer.from(base64, 'base64').toString('utf8').trim();\n } catch {\n return '';\n }\n}\n\nexport const $DeviceInternalsForTest = Object.freeze({\n isAdbInputTimeout,\n isRetryableAdbError,\n encodeUnicodeImeText,\n shellQuoteForRemote,\n});\n", "import { Code } from './constants.js';\n\nexport class CrawlerError extends Error {\n constructor(input = {}, options = {}) {\n const payload = typeof input === 'string' ? { message: input } : input;\n super(payload.message || 'Android crawler error', options);\n this.name = 'CrawlerError';\n this.code = payload.code || Code.UnknownError;\n this.context = payload.context || {};\n }\n\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n static from(error, fallback = {}) {\n if (CrawlerError.isCrawlerError(error)) return error;\n return new CrawlerError({\n message: error?.message || String(error),\n code: fallback.code || Code.UnknownError,\n context: fallback.context || {},\n });\n }\n}\n\nexport function serializeError(error) {\n if (!error) return { message: '' };\n return {\n name: error.name || 'Error',\n message: error.message || String(error),\n stack: error.stack || '',\n code: error.code || '',\n context: error.context || undefined,\n };\n}\n", "const defaultLogger = {\n info: (...args) => console.error(...args),\n warning: (...args) => console.error(...args),\n warn: (...args) => console.error(...args),\n error: (...args) => console.error(...args),\n debug: (...args) => console.error(...args),\n};\n\nlet activeLogger = defaultLogger;\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 STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst STEP_ICONS = [\n { match: '\u4EFB\u52A1', icon: '\uD83E\uDDED' },\n { match: 'Launch', icon: '\uD83D\uDE80' },\n { match: 'Step', icon: '\uD83E\uDDF1' },\n { match: '\u8F93\u5165\u6CD5', icon: '\u2328\uFE0F' },\n { match: 'ADB', icon: '\uD83D\uDD0C' },\n { match: 'Mutation', icon: '\uD83D\uDCE1' },\n { match: 'WebView', icon: '\uD83C\uDF10' },\n { match: '\u622A\u56FE', icon: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB', icon: '\uD83D\uDD17' },\n { match: '\u6570\u636E', icon: '\uD83D\uDCE6' },\n];\n\nconst STATUS_ICONS = [\n { match: '\u5F00\u59CB', icon: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', icon: '\u2705' },\n { match: '\u6210\u529F', icon: '\u2705' },\n { match: '\u5931\u8D25', icon: '\u274C' },\n { match: '\u8DF3\u8FC7', icon: '\u23ED\uFE0F' },\n { match: '\u91CD\u8BD5', icon: '\uD83D\uDD01' },\n { match: '\u7A33\u5B9A', icon: '\uD83D\uDFE2' },\n];\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\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 detailToParts = (detail) => {\n if (detail == null || detail === '') return [];\n if (detail instanceof Error) return [`err=${detail.message}`];\n if (typeof detail === 'string') return [detail];\n if (Array.isArray(detail)) return detail.flatMap(detailToParts).filter(Boolean);\n if (typeof detail === 'object') {\n return Object.entries(detail)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${typeof value === 'object' ? safeJson(value) : String(value)}`);\n }\n return [String(detail)];\n};\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: (detail) => detailToParts(detail),\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 buildDetails: (detail) => detailToParts(detail),\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: (detail, error) => [...detailToParts(detail), error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'launch_start',\n method: 'launchStart',\n label: 'Launch \u5F00\u59CB',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'launch_success',\n method: 'launchSuccess',\n label: 'Launch \u5B8C\u6210',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'launch_fail',\n method: 'launchFail',\n label: 'Launch \u5931\u8D25',\n group: 'Launch',\n step: 'Launch.run',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (detail, error) => [...detailToParts(detail), error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'input_method_snapshot_fail',\n method: 'inputMethodSnapshotFail',\n label: '\u8F93\u5165\u6CD5\u5FEB\u7167\u5931\u8D25',\n group: '\u8F93\u5165\u6CD5',\n step: '\u8F93\u5165\u6CD5\u5FEB\u7167',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'input_method_restore_fail',\n method: 'inputMethodRestoreFail',\n label: '\u8F93\u5165\u6CD5\u6062\u590D\u5931\u8D25',\n group: '\u8F93\u5165\u6CD5',\n step: '\u8F93\u5165\u6CD5\u6062\u590D',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'step_start',\n method: 'stepStart',\n label: '\u6B65\u9AA4\u5F00\u59CB',\n group: 'Step',\n step: 'Step',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (step, detail) => [step ? `name=${step}` : '', ...detailToParts(detail)],\n },\n {\n key: 'step_success',\n method: 'stepSuccess',\n label: '\u6B65\u9AA4\u5B8C\u6210',\n group: 'Step',\n step: 'Step',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n buildDetails: (step, detail) => [step ? `name=${step}` : '', ...detailToParts(detail)],\n },\n {\n key: 'step_fail',\n method: 'stepFail',\n label: '\u6B65\u9AA4\u5931\u8D25',\n group: 'Step',\n step: 'Step',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (step, error) => [step ? `name=${step}` : '', error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'step_retry',\n method: 'stepRetry',\n label: '\u6B65\u9AA4\u91CD\u8BD5',\n group: 'Step',\n step: 'Step',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (step, attempt) => [step ? `name=${step}` : '', attempt !== undefined ? `attempt=${attempt}` : ''],\n },\n {\n key: 'adb_exec',\n method: 'adbExec',\n label: 'ADB \u6267\u884C',\n group: 'ADB',\n step: 'ADB',\n status: '\u5B8C\u6210',\n level: 'debug',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'adb_retry',\n method: 'adbRetry',\n label: 'ADB \u91CD\u8BD5',\n group: 'ADB',\n step: 'ADB',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_start',\n method: 'mutationWaitStart',\n label: 'Mutation \u7B49\u5F85\u5F00\u59CB',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_success',\n method: 'mutationWaitSuccess',\n label: 'Mutation \u7A33\u5B9A',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u7A33\u5B9A',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'mutation_wait_warn',\n method: 'mutationWaitWarn',\n label: 'Mutation \u7B49\u5F85\u544A\u8B66',\n group: 'Mutation',\n step: 'Mutation',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_command',\n method: 'webViewCommand',\n label: 'WebView \u547D\u4EE4',\n group: 'WebView',\n step: 'WebView',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_success',\n method: 'webViewSuccess',\n label: 'WebView \u5B8C\u6210',\n group: 'WebView',\n step: 'WebView',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_warn',\n method: 'webViewWarn',\n label: 'WebView \u544A\u8B66',\n group: 'WebView',\n step: 'WebView',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'webview_fail',\n method: 'webViewFail',\n label: 'WebView \u5931\u8D25',\n group: 'WebView',\n step: 'WebView',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\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 buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'screenshot_success',\n method: 'screenshotDone',\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 buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n {\n key: 'data_push_success',\n method: 'dataPush',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => detailToParts(detail),\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (error) => [error ? `err=${toErrorMessage(error)}` : ''],\n },\n];\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `${STEP_PREFIX} .*${escapeRegExp(step)}`;\n if (status) pattern += `.*${escapeRegExp(status)}`;\n return new RegExp(pattern);\n};\n\nexport const LOG_TEMPLATES = Object.freeze(LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns,\n defaultSelected: attentionRank >= DEFAULT_ATTENTION_RANK,\n };\n}));\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? String(scope) : '';\n return {\n start: (message, detail) => createBaseLogger(prefix).start(formatMessage(message, detail)),\n success: (message, detail) => createBaseLogger(prefix).success(formatMessage(message, detail)),\n fail: (message, error) => createBaseLogger(prefix).error(formatMessage(message, error?.message || error)),\n warn: (message, detail) => createBaseLogger(prefix).warning(formatMessage(message, detail)),\n warning: (message, detail) => createBaseLogger(prefix).warning(formatMessage(message, detail)),\n info: (message, detail) => createBaseLogger(prefix).info(formatMessage(message, detail)),\n debug: (message, detail) => createBaseLogger(prefix).debug(formatMessage(message, detail)),\n useTemplate: () => createTemplateLogger(createBaseLogger(prefix)),\n };\n },\n useTemplate(logger) {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger(createBaseLogger(''));\n },\n start(message, detail = '') {\n createBaseLogger('').start(formatMessage(message, detail));\n },\n success(message, detail = '') {\n createBaseLogger('').success(formatMessage(message, detail));\n },\n fail(message, error = '') {\n createBaseLogger('').error(formatMessage(message, error?.message || error));\n },\n warn(message, detail = '') {\n createBaseLogger('').warning(formatMessage(message, detail));\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n error(message, detail = '') {\n createBaseLogger('').error(formatMessage(message, detail));\n },\n info(message, detail = '') {\n createBaseLogger('').info(formatMessage(message, detail));\n },\n debug(message, detail = '') {\n createBaseLogger('').debug(formatMessage(message, detail));\n },\n duration(startedAt) {\n return `${((Date.now() - startedAt) / 1000).toFixed(2)}s`;\n },\n};\n\nexport function stripAnsi(value) {\n return String(value || '').replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction createBaseLogger(prefix = '', explicitLogger = null) {\n const name = prefix ? String(prefix) : '';\n const dispatch = (methodName, icon, message, color) => {\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n const writer = resolveLogMethod(resolveLogger(explicitLogger), methodName);\n writer(`${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\nfunction createTemplateLogger(baseLogger) {\n const handlers = {\n info: (line) => baseLogger.info(line),\n success: (line) => baseLogger.success(line),\n warning: (line) => baseLogger.warning(line),\n warn: (line) => baseLogger.warning(line),\n error: (line) => baseLogger.error(line),\n debug: (line) => baseLogger.debug(line),\n start: (line) => baseLogger.start(line),\n };\n\n const emitDefinition = (definition, details = []) => {\n const handler = handlers[definition.level] || handlers.info;\n handler(buildStepLine(definition.step, definition.status, [...details, buildLogTag(definition.key)]));\n };\n\n const definitionMethods = {};\n for (const definition of LOG_DEFINITIONS) {\n if (!definition.method) continue;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n emitDefinition(definition, details.filter(Boolean));\n };\n }\n\n return {\n step: (step, status, details, level = 'info') => {\n const handler = handlers[level] || handlers.info;\n handler(buildStepLine(step, status, detailToParts(details)));\n },\n info: (message, detail) => baseLogger.info(formatMessage(message, detail)),\n success: (message, detail) => baseLogger.success(formatMessage(message, detail)),\n warning: (message, detail) => baseLogger.warning(formatMessage(message, detail)),\n warn: (message, detail) => baseLogger.warning(formatMessage(message, detail)),\n error: (message, detail) => baseLogger.error(formatMessage(message, detail)),\n debug: (message, detail) => baseLogger.debug(formatMessage(message, detail)),\n start: (message, detail) => baseLogger.start(formatMessage(message, detail)),\n ...definitionMethods,\n };\n}\n\nfunction buildStepLine(step, status, details = []) {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_ICONS) : '';\n parts.push(decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX);\n if (status) parts.push(decorateLabel(status, STATUS_ICONS));\n const detailParts = details.flatMap(detailToParts).filter(Boolean);\n parts.push(...detailParts);\n return parts.join(STEP_SEPARATOR);\n}\n\nfunction decorateLabel(label, mappings) {\n if (!label) return '';\n const mapping = mappings.find((item) => String(label).includes(item.match));\n if (!mapping) return label;\n return `${mapping.icon} ${label}`;\n}\n\nfunction resolveLogger(explicitLogger) {\n if (explicitLogger && typeof explicitLogger.info === 'function') return explicitLogger;\n return activeLogger || defaultLogger;\n}\n\nfunction resolveLogMethod(logger, name) {\n if (logger && typeof logger[name] === 'function') return logger[name].bind(logger);\n if (name === 'warning' && logger && typeof logger.warn === 'function') return logger.warn.bind(logger);\n return defaultLogger[name] || defaultLogger.info;\n}\n\nfunction 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\nfunction formatMessage(message, detail = '') {\n const detailText = formatDetail(detail);\n return detailText ? `${message} ${detailText}` : String(message || '');\n}\n\nfunction formatTimestamp(date = new Date()) {\n const pad = (value, size = 2) => String(value).padStart(size, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`;\n}\n\nfunction formatDetail(detail) {\n return detailToParts(detail).join(' ');\n}\n\nfunction colorize(text, color) {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n}\n\nfunction safeJson(value) {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst SCROLL_MAX_SWIPES = 24;\nconst SCROLL_STABLE_ROUNDS = 1;\nconst SCROLL_SWIPE_RATIO = 0.72;\nconst SCROLL_DURATION_MS = 360;\nconst SCROLL_SETTLE_MS = 500;\nconst SCROLL_HASH_SOURCE = 'screenshot';\nconst SCROLL_IDLE_SETTLE_MS = 900;\n\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\n scrollStep,\n scrollToEnd,\n scrollToTop,\n};\n\nasync function click(ctx, selectorOrPoint, options = {}) {\n if (isPoint(selectorOrPoint)) {\n await Device.tapAbsolute(ctx, selectorOrPoint.x, selectorOrPoint.y);\n await sleep(Number(options.settleMs || 250));\n return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { point };\n }\n const target = await DeviceView.find(ctx, selectorOrPoint, options);\n const actual = nearestClickable(target);\n if (!actual) {\n throw new CrawlerError({\n message: `automation_failed: View \u4E0D\u53EF\u70B9\u51FB ${JSON.stringify(selectorOrPoint)}`,\n code: Code.AutomationFailed,\n context: { selector: selectorOrPoint, target: simplifyNode(target) },\n });\n }\n const point = centerOf(actual.bounds);\n Logger.info('DeviceInput.click', {\n selector: selectorOrPoint,\n target: simplifyNode(target),\n actual: simplifyNode(actual),\n point,\n });\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { target, actual, point };\n}\n\nasync function fill(ctx, selector, text, options = {}) {\n const value = String(text ?? '');\n const clicked = await click(ctx, selector, {\n ...options,\n settleMs: Number(options.focusSettleMs || 350),\n });\n try {\n await Device.typeText(ctx, value);\n } catch (error) {\n throw new CrawlerError({\n message: `automation_failed: View \u5199\u5165\u6587\u672C\u5931\u8D25 ${JSON.stringify(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, error: error?.message || String(error) },\n });\n }\n Logger.info('DeviceInput.fill', {\n selector,\n target: simplifyNode(clicked.actual || clicked.target),\n chars: value.length,\n });\n await sleep(Number(options.settleMs || 350));\n return { target: clicked.actual || clicked.target, chars: value.length };\n}\n\nasync function press(ctx, key) {\n await Device.pressKey(ctx, key);\n}\n\nasync function pressEnter(ctx) {\n await Device.pressEnter(ctx);\n}\n\nasync function scroll(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n await scrollBounds(ctx, node.bounds, direction, {});\n}\n\nasync function scrollStep(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n await scrollBounds(ctx, node.bounds, direction, options);\n}\n\nasync function scrollBounds(ctx, bounds, direction, options = {}) {\n const box = bounds;\n const ratio = Number(options.swipeRatio || SCROLL_SWIPE_RATIO);\n const durationMs = Number(options.durationMs || SCROLL_DURATION_MS);\n const x = box.centerX;\n const distance = Math.max(40, box.height * ratio);\n const down = String(direction || '').toLowerCase() === 'down';\n const from = {\n x,\n y: down ? box.top + box.height * 0.25 : box.bottom - box.height * 0.25,\n };\n const to = {\n x,\n y: down ? Math.min(box.bottom - 10, from.y + distance) : Math.max(box.top + 10, from.y - distance),\n };\n await Device.swipe(ctx, from, to, durationMs);\n await sleep(Number(options.settleMs || SCROLL_SETTLE_MS));\n}\n\nasync function scrollToEnd(ctx, selector, options = {}) {\n // Android \u91CC\u201C\u6EDA\u5230\u5E95\u201D\u5BF9\u5E94\u624B\u6307\u4E0A\u6ED1\uFF0C\u5185\u5BB9\u7EE7\u7EED\u5411\u56DE\u7B54\u5E95\u90E8\u63A8\u8FDB\u3002\n return scrollUntilStable(ctx, selector, 'up', options);\n}\n\nasync function scrollToTop(ctx, selector, options = {}) {\n // Android \u91CC\u201C\u56DE\u9876\u90E8\u201D\u5BF9\u5E94\u624B\u6307\u4E0B\u6ED1\uFF0C\u5185\u5BB9\u56DE\u5230\u56DE\u7B54\u5F00\u5934\u3002\n return scrollUntilStable(ctx, selector, 'down', options);\n}\n\nasync function scrollUntilStable(ctx, selector, direction, options = {}) {\n const maxSwipes = SCROLL_MAX_SWIPES;\n const stableRoundsTarget = SCROLL_STABLE_ROUNDS;\n const node = await DeviceView.find(ctx, selector, options);\n const bounds = node.bounds;\n // View-tree hash \u5BF9\u865A\u62DF\u5217\u8868\u548C fixed \u533A\u57DF\u4E0D\u53EF\u9760\uFF1B\u7EDF\u4E00\u7528\u6574\u5C4F\u622A\u56FE hash \u5224\u65AD\u662F\u5426\u5DF2\u7ECF\u6EDA\u4E0D\u52A8\u3002\n let lastHash = await scrollStateHash(ctx);\n let stableRounds = 0;\n for (let index = 0; index < maxSwipes; index += 1) {\n await scrollBounds(ctx, bounds, direction, options);\n const currentHash = await scrollStateHash(ctx);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index + 1, stableRounds, hash: currentHash, hashSource: SCROLL_HASH_SOURCE, capped: false };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n }\n const idle = await confirmScrollIdle(ctx, lastHash, options);\n if (idle.stable) {\n return {\n swipes: maxSwipes,\n stableRounds: stableRoundsTarget,\n hash: idle.hash,\n hashSource: `${SCROLL_HASH_SOURCE}:idle`,\n capped: false,\n inferredBoundary: true,\n };\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash, hashSource: SCROLL_HASH_SOURCE, capped: true };\n}\n\nasync function scrollStateHash(ctx) {\n const png = await Device.screenshotPng(ctx);\n return createHash('sha256').update(png).digest('hex');\n}\n\nasync function confirmScrollIdle(ctx, previousHash, options = {}) {\n const settleMs = Number(options.idleSettleMs || SCROLL_IDLE_SETTLE_MS);\n await sleep(settleMs);\n const hash = await scrollStateHash(ctx);\n if (hash !== previousHash) return { stable: false, hash };\n return { stable: true, hash };\n}\n\nfunction nearestClickable(node) {\n let current = node;\n while (current) {\n if (current.visible && current.enabled && current.clickable) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isPoint(value) {\n return value && typeof value === 'object' && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));\n}\n\nfunction isBounds(value) {\n return value && typeof value === 'object'\n && Number.isFinite(Number(value.left))\n && Number.isFinite(Number(value.top))\n && Number.isFinite(Number(value.right))\n && Number.isFinite(Number(value.bottom));\n}\n\nfunction centerOf(bounds) {\n return {\n x: (Number(bounds.left) + Number(bounds.right)) / 2,\n y: (Number(bounds.top) + Number(bounds.bottom)) / 2,\n };\n}\n\nfunction simplifyNode(node) {\n if (!node) return null;\n return {\n id: node.id,\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n clickable: node.clickable,\n enabled: node.enabled,\n bounds: node.bounds,\n };\n}\n", "import { createHash } from 'node:crypto';\n\nimport { XMLParser } from 'fast-xml-parser';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { sleep } from './logger.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '',\n allowBooleanAttributes: true,\n});\n\nexport const DeviceView = {\n snapshot,\n find,\n findAll,\n waitFor,\n bounds,\n text,\n exists,\n isScrollable,\n hashNode,\n normalizeSelector,\n};\n\nasync function snapshot(ctx, options = {}) {\n const xml = options.xml || await Device.dumpUiXml(ctx);\n const parsed = parser.parse(xml);\n const roots = toArray(parsed?.hierarchy?.node).map((node) => normalizeNode(node, null, 0));\n const flat = [];\n for (const root of roots) collectFlat(root, flat);\n return { xml, tree: roots, roots, flat, nodes: flat };\n}\n\nasync function find(ctx, selector, options = {}) {\n const nodes = await findAll(ctx, selector, options);\n if (nodes.length > 0) return nodes[0];\n if (options.optional) return null;\n throw new CrawlerError({\n message: `automation_failed: View \u672A\u627E\u5230 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector },\n });\n}\n\nasync function findAll(ctx, selector, options = {}) {\n const view = options.snapshot || await snapshot(ctx, options);\n const normalized = normalizeSelector(selector);\n return view.flat.filter((node) => matchesSelector(node, normalized, options));\n}\n\nasync function waitFor(ctx, selector, options = {}) {\n const timeoutMs = Number(options.timeoutMs || options.timeout || 30000);\n const intervalMs = Number(options.intervalMs || options.pollIntervalMs || 500);\n const deadline = Date.now() + timeoutMs;\n let lastError = null;\n let sawCleanPoll = false;\n while (Date.now() < deadline) {\n try {\n const node = await find(ctx, selector, { ...options, optional: true });\n sawCleanPoll = true;\n lastError = null;\n if (node) return node;\n } catch (error) {\n lastError = error;\n }\n await sleep(intervalMs);\n }\n if (lastError && !sawCleanPoll) throw lastError;\n throw new CrawlerError({\n message: `automation_failed: \u7B49\u5F85 View \u8D85\u65F6 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, timeoutMs },\n });\n}\n\nasync function bounds(ctx, selector, options = {}) {\n return (await find(ctx, selector, options)).bounds;\n}\n\nasync function text(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return node.text || node.contentDesc || '';\n}\n\nasync function exists(ctx, selector, options = {}) {\n return Boolean(await find(ctx, selector, { ...options, optional: true }));\n}\n\nasync function isScrollable(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return Boolean(node.scrollable);\n}\n\nfunction normalizeSelector(selector) {\n if (!selector || typeof selector !== 'object' || Array.isArray(selector)) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector must be an object',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n const out = {};\n for (const key of ['id', 'text', 'textContains', 'contentDesc', 'className']) {\n if (selector[key] != null && String(selector[key]).trim()) out[key] = String(selector[key]).trim();\n }\n if (Object.keys(out).length === 0) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector requires id/text/textContains/contentDesc/className',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n return out;\n}\n\nfunction hashNode(node) {\n return createHash('sha256').update(stableNodeString(node)).digest('hex');\n}\n\nfunction normalizeNode(raw, parent, index) {\n const childrenRaw = toArray(raw?.node);\n const bounds = parseBounds(raw?.bounds);\n const node = {\n resourceId: String(raw?.['resource-id'] || ''),\n id: shortResourceId(raw?.['resource-id']),\n text: String(raw?.text || ''),\n contentDesc: String(raw?.['content-desc'] || ''),\n className: String(raw?.class || ''),\n packageName: String(raw?.package || ''),\n bounds,\n clickable: toBoolean(raw?.clickable),\n enabled: toBoolean(raw?.enabled),\n focusable: toBoolean(raw?.focusable),\n focused: toBoolean(raw?.focused),\n scrollable: toBoolean(raw?.scrollable),\n visible: bounds.right > bounds.left && bounds.bottom > bounds.top,\n index: Number(raw?.index ?? index),\n parent: null,\n children: [],\n };\n node.parent = parent || null;\n node.children = childrenRaw.map((child, childIndex) => normalizeNode(child, node, childIndex));\n return node;\n}\n\nfunction matchesSelector(node, selector, options = {}) {\n if (options.visibleOnly !== false && !node.visible) return false;\n if (options.enabledOnly === true && !node.enabled) return false;\n if (selector.id && !matchesId(node, selector.id)) return false;\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n if (selector.className && node.className !== selector.className) return false;\n return true;\n}\n\nfunction matchesId(node, expected) {\n const actual = node.resourceId || '';\n if (!actual) return false;\n if (actual === expected) return true;\n return actual.endsWith(`:id/${expected}`) || node.id === expected;\n}\n\nfunction collectFlat(node, out) {\n out.push(node);\n for (const child of node.children) collectFlat(child, out);\n}\n\nfunction toArray(value) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction parseBounds(value) {\n const match = /\\[(\\d+),(\\d+)]\\[(\\d+),(\\d+)]/.exec(String(value || ''));\n if (!match) return { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0, centerX: 0, centerY: 0 };\n const left = Number(match[1]);\n const top = Number(match[2]);\n const right = Number(match[3]);\n const bottom = Number(match[4]);\n return {\n left,\n top,\n right,\n bottom,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n centerX: (left + right) / 2,\n centerY: (top + bottom) / 2,\n };\n}\n\nfunction shortResourceId(value) {\n const raw = String(value || '');\n const marker = ':id/';\n const index = raw.indexOf(marker);\n return index >= 0 ? raw.slice(index + marker.length) : raw;\n}\n\nfunction toBoolean(value) {\n return value === true || String(value).toLowerCase() === 'true';\n}\n\nfunction stableNodeString(node) {\n if (!node) return '';\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n clickable: node.clickable,\n enabled: node.enabled,\n focusable: node.focusable,\n focused: node.focused,\n scrollable: node.scrollable,\n children: node.children.map((child) => JSON.parse(stableNodeString(child) || '{}')),\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { execFile } from 'node:child_process';\nimport { mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const DeviceSQLite = {\n query,\n health,\n reset,\n};\n\nasync function reset(ctx, options = {}) {\n const packageName = requireNonEmpty(ctx?.packageName, 'packageName');\n const dbNamePrefix = requireNonEmpty(options.dbNamePrefix, 'dbNamePrefix');\n if (!/^[A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)+$/.test(packageName)\n || !/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(dbNamePrefix)) {\n throw new CrawlerError({ message: 'invalid_request: invalid database reset target', code: Code.InvalidRequest });\n }\n const command = [\n 'set -e',\n `db_dir=${shellQuote(`/data/data/${packageName}/databases`)}`,\n 'if [ -L \"$db_dir\" ]; then echo \"refusing symlink database directory\" >&2; exit 1; fi',\n 'if [ ! -d \"$db_dir\" ]; then exit 0; fi',\n `for db_file in \"$db_dir\"/${shellQuote(dbNamePrefix)}*; do`,\n ' [ -e \"$db_file\" ] || [ -L \"$db_file\" ] || continue',\n ' if [ -L \"$db_file\" ] || [ ! -f \"$db_file\" ]; then echo \"refusing unexpected database entry: $db_file\" >&2; exit 1; fi',\n 'done',\n // \u4E3B\u5E93\u548C WAL/SHM/journal \u4E00\u8D77\u5220\u9664\uFF0C\u907F\u514D\u65E7\u65E5\u5FD7\u5728\u91CD\u5EFA\u65F6\u6062\u590D\u804A\u5929\u8BB0\u5F55\u3002\n `rm -f -- \"$db_dir\"/${shellQuote(dbNamePrefix)}*`,\n ].join('\\n');\n await adbSuShell(ctx, command, { timeoutMs: 30_000, maxBuffer: 4096 }).catch((error) => {\n throw CrawlerError.from(error, { code: Code.AutomationFailed, context: { packageName, dbNamePrefix } });\n });\n Logger.info('DeviceSQLite.reset', { packageName, dbNamePrefix });\n}\n\nasync function query(ctx, options = {}) {\n if (!options.sql) {\n throw new CrawlerError({\n message: 'invalid_request: sql is required',\n code: Code.InvalidRequest,\n });\n }\n const config = {\n dbPath: String(options.dbPath || ''),\n dbDir: String(options.dbDir || ''),\n dbNamePrefix: String(options.dbNamePrefix || ''),\n dbNameIncludes: String(options.dbNameIncludes || ''),\n dbNameExcludes: normalizeStringArray(options.dbNameExcludes),\n sql: String(options.sql || ''),\n args: normalizeStringArray(options.args),\n maxRows: Math.max(1, Number(options.maxRows || 200)),\n label: String(options.label || 'query-sqlite'),\n };\n if (!config.dbPath && !config.dbDir) {\n throw new CrawlerError({\n message: 'invalid_request: dbPath or dbDir is required',\n code: Code.InvalidRequest,\n });\n }\n\n const startedAt = Date.now();\n const dir = await mkdtemp(path.join(tmpdir(), 'android-toolkit-sqlite-'));\n try {\n const dbPaths = await resolveDeviceDbPaths(ctx, config);\n if (dbPaths.length === 0) {\n throw new CrawlerError({\n message: 'app_runtime_unavailable: sqlite database not found',\n code: Code.AppRuntimeUnavailable,\n context: { dbDir: config.dbDir, dbPath: config.dbPath, dbNamePrefix: config.dbNamePrefix },\n });\n }\n const databases = [];\n for (const dbPath of dbPaths) {\n const localDbPath = await pullDatabaseSnapshot(ctx, dbPath, dir);\n const result = await queryLocalSQLite(localDbPath, config);\n databases.push({\n dbPath,\n columns: result.columns,\n rows: result.rows,\n rowCount: result.rows.length,\n truncated: result.truncated,\n });\n }\n Logger.info('DeviceSQLite.query', {\n label: config.label,\n databaseCount: databases.length,\n rowCount: databases.reduce((total, item) => total + item.rowCount, 0),\n duration: Logger.duration(startedAt),\n });\n return { ok: true, databases, rows: databases.length === 1 ? databases[0].rows : [] };\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nasync function health(ctx, options = {}) {\n const packageName = String(options.packageName || ctx?.packageName || '').trim();\n if (!packageName) {\n throw new CrawlerError({\n message: 'invalid_request: packageName is required',\n code: Code.InvalidRequest,\n });\n }\n await adbSuShell(ctx, `test -d ${shellQuote(`/data/data/${packageName}`)}`, {\n timeoutMs: Number(options.timeoutMs || 10_000),\n });\n return { ok: true, packageName };\n}\n\nasync function resolveDeviceDbPaths(ctx, config) {\n if (config.dbPath) return [config.dbPath];\n const command = `cd ${shellQuote(config.dbDir)} || exit 1; for file in *; do [ -f \"$file\" ] || continue; case \"$file\" in *-wal|*-shm) continue ;; esac; printf \"%s\\\\n\" \"$file\"; done`;\n const out = await adbSuShell(ctx, command, {\n timeoutMs: 15_000,\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: sqlite dbDir unavailable ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { dbDir: config.dbDir },\n });\n });\n return String(out || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((name) => matchesName(name, config))\n .map((name) => `${config.dbDir.replace(/\\/+$/, '')}/${name}`)\n .sort();\n}\n\nasync function pullDatabaseSnapshot(ctx, dbPath, localDir) {\n const baseName = path.basename(dbPath);\n const remoteDir = `/data/local/tmp/android-toolkit-sqlite-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n const remoteDb = `${remoteDir}/${baseName}`;\n const localDb = path.join(localDir, baseName);\n const copyCommand = [\n `rm -rf ${shellQuote(remoteDir)}`,\n `mkdir -p ${shellQuote(remoteDir)}`,\n `cp ${shellQuote(dbPath)} ${shellQuote(remoteDb)}`,\n `[ -f ${shellQuote(`${dbPath}-wal`)} ] && cp ${shellQuote(`${dbPath}-wal`)} ${shellQuote(`${remoteDb}-wal`)} || true`,\n `[ -f ${shellQuote(`${dbPath}-shm`)} ] && cp ${shellQuote(`${dbPath}-shm`)} ${shellQuote(`${remoteDb}-shm`)} || true`,\n `chmod 644 ${shellQuote(remoteDir)}/*`,\n ].join(' && ');\n try {\n await adbSuShell(ctx, copyCommand, { timeoutMs: 30_000, maxBuffer: 4 * 1024 * 1024 });\n await adbPull(ctx, remoteDb, localDb).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: sqlite snapshot pull failed ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { dbPath },\n });\n });\n await adbPullOptional(ctx, `${remoteDb}-wal`, `${localDb}-wal`);\n await adbPullOptional(ctx, `${remoteDb}-shm`, `${localDb}-shm`);\n return localDb;\n } finally {\n await adbSuShell(ctx, `rm -rf ${shellQuote(remoteDir)}`, { timeoutMs: 10_000 }).catch(() => {});\n }\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nasync function queryLocalSQLite(dbPath, config) {\n const payloadPath = `${dbPath}.query.json`;\n const outputPath = `${dbPath}.rows.json`;\n await writeFile(payloadPath, JSON.stringify({\n dbPath,\n sql: config.sql,\n args: config.args,\n maxRows: config.maxRows,\n outputPath,\n }), 'utf8');\n const code = `\nconst fs = require('node:fs');\nconst { DatabaseSync } = require('node:sqlite');\nconst payload = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));\nconst db = new DatabaseSync(payload.dbPath, { open: true, readOnly: true });\ntry {\n const stmt = db.prepare(payload.sql);\n const columns = stmt.columns().map((column) => String(column.name || ''));\n const rows = [];\n let truncated = false;\n for (const row of stmt.iterate(...payload.args)) {\n if (rows.length >= payload.maxRows) { truncated = true; break; }\n const out = {};\n for (const column of columns) out[column] = row[column] == null ? '' : String(row[column]);\n rows.push(out);\n }\n fs.writeFileSync(payload.outputPath, JSON.stringify({ columns, rows, truncated }), 'utf8');\n} finally {\n db.close();\n}\n`;\n await execFileAsync(process.execPath, ['-e', code, payloadPath], {\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n encoding: 'utf8',\n });\n return JSON.parse(await import('node:fs/promises').then((fs) => fs.readFile(outputPath, 'utf8')));\n}\n\nasync function adbPull(ctx, remotePath, localPath) {\n const serial = requireNonEmpty(ctx?.serial, 'serial');\n await Device.adbExec(ctx, ['-s', serial, 'pull', remotePath, localPath], {\n timeoutMs: 30_000,\n maxBuffer: 8 * 1024 * 1024,\n label: 'adb pull',\n });\n}\n\nasync function adbPullOptional(ctx, remotePath, localPath) {\n await adbPull(ctx, remotePath, localPath).catch(() => {});\n}\n\nfunction matchesName(name, config) {\n if (config.dbNamePrefix && !name.startsWith(config.dbNamePrefix)) return false;\n if (config.dbNameIncludes && !name.includes(config.dbNameIncludes)) return false;\n for (const item of config.dbNameExcludes || []) {\n if (item && name.includes(item)) return false;\n }\n return true;\n}\n\nfunction normalizeStringArray(value) {\n if (Array.isArray(value)) return value.map((item) => String(item ?? ''));\n if (value == null) return [];\n return [String(value)];\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n", "import fs from 'node:fs';\n\nimport { ApifyKit } from './apify-kit.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceSQLite } from './device-sqlite.js';\nimport { DeviceView } from './device-view.js';\nimport { Logger } from './logger.js';\nimport { Mutation } from './mutation.js';\nimport { NetworkCapture } from './network-capture.js';\nimport { Share } from './share.js';\nimport { WebView } from './webview.js';\nimport { ActorInfo, StoragePath } from './constants.js';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const logTemplate = Logger.useTemplate();\n const inputPath = StoragePath.Input;\n const outputPath = StoragePath.Output;\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n ctx.runId = ctx.runId || input.run_id || input.runId || input.runtime?.run_id || input.runtime?.runId || '';\n ctx.actorKey = ctx.actorKey || options.actorKey || input.actorKey || input.actor_name || input.actorName || '';\n const actorInfo = options.actorInfo || ActorInfo[ctx.actorKey] || null;\n const originalInputMethod = await Device.currentInputMethod(ctx).catch((error) => {\n logTemplate.inputMethodSnapshotFail(error);\n return '';\n });\n\n const apifyKit = await ApifyKit.useApifyKit({\n reset: true,\n input,\n ctx,\n inputPath,\n outputPath,\n });\n\n const kit = {\n Launch,\n ApifyKit: apifyKit,\n Device,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Share,\n Mutation,\n NetworkCapture,\n WebView,\n Logger,\n Context,\n };\n\n try {\n logTemplate.launchStart({\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\n });\n if (await WebView.configureHook(ctx, actorInfo)) {\n await Device.forceStopApp(ctx);\n }\n if (typeof options.hooks?.preNavigation === 'function') {\n await options.hooks.preNavigation({ input, ctx, kit, ApifyKit: apifyKit });\n }\n await handler({ input, ctx, kit, ApifyKit: apifyKit });\n if (typeof options.hooks?.postRun === 'function') {\n await options.hooks.postRun({ input, ctx, kit, ApifyKit: apifyKit });\n }\n logTemplate.launchSuccess({ duration: Logger.duration(startedAt) });\n } catch (error) {\n logTemplate.launchFail({ duration: Logger.duration(startedAt) }, error);\n if (typeof options.hooks?.onError === 'function') {\n await options.hooks.onError(error, { input, ctx, kit, ApifyKit: apifyKit });\n }\n if (!apifyKit.hasPushed()) await apifyKit.pushFailed(error);\n throw error;\n } finally {\n await Device.restoreInputMethod(ctx, originalInputMethod).catch((error) => {\n logTemplate.inputMethodRestoreFail(error);\n });\n }\n}\n", "import { randomUUID, createHash } from 'node:crypto';\n\nimport { Code, WebViewBridge } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst DEFAULT_TIMEOUT_MS = 10000;\nconst DEFAULT_STABLE_TIME_MS = 5000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nexport const WebView = {\n configureHook,\n evaluate,\n list,\n snapshot,\n waitForStable,\n click,\n};\n\nasync function configureHook(ctx, actorInfo, options = {}) {\n const webviews = Array.isArray(actorInfo?.webviews) ? actorInfo.webviews : [];\n if (webviews.length === 0) return false;\n\n const packageName = requireNonEmpty(ctx?.packageName, 'packageName');\n const dataDir = appDataDir(packageName);\n const baseDir = `${dataDir}/cache/${WebViewBridge.cacheDir}`;\n const configPath = `${baseDir}/${WebViewBridge.hookConfigFile}`;\n const configJson = JSON.stringify({ webviews });\n\n await Device.writeCacheFile(ctx, {\n dirName: WebViewBridge.cacheDir,\n fileName: WebViewBridge.hookConfigFile,\n text: configJson,\n timeoutMs: Math.max(5000, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView hook \u914D\u7F6E\u5199\u5165\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { configPath },\n });\n });\n return true;\n}\n\nasync function list(ctx, options = {}) {\n const command = {\n id: String(options.id || randomUUID()),\n action: 'list',\n urlIncludes: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews),\n timeoutMs: Math.max(1, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n };\n const result = normalizeBridgeResult(await runBridgeCommand(ctx, command, options));\n if (!result.ok) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u5217\u8868\u8BFB\u53D6\u5931\u8D25 ${result.error || 'unknown error'}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id },\n });\n }\n const value = parseBridgeValue(result.value);\n return Array.isArray(value) ? value : [];\n}\n\nasync function evaluate(ctx, js, options = {}) {\n const command = {\n id: String(options.id || randomUUID()),\n action: 'evaluate',\n urlIncludes: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews),\n js: String(js || ''),\n timeoutMs: Math.max(1, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n };\n if (!command.js.trim()) {\n throw new CrawlerError({\n message: 'invalid_request: WebView.evaluate \u7F3A\u5C11 js',\n code: Code.InvalidRequest,\n });\n }\n\n const result = normalizeBridgeResult(await runBridgeCommand(ctx, command, options));\n if (!result.ok) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u6267\u884C\u5931\u8D25 ${result.error || 'unknown error'}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, url: result.url || '', title: result.title || '' },\n });\n }\n return result;\n}\n\nasync function snapshot(ctx, options = {}) {\n const result = await evaluate(ctx, `(() => ({\n url: location.href,\n title: document.title,\n text: document.body ? document.body.innerText : '',\n html: document.documentElement ? document.documentElement.outerHTML : ''\n }))()`, options);\n const value = parseBridgeValue(result.value);\n const out = value && typeof value === 'object' ? value : {};\n return {\n url: String(out.url || result.url || ''),\n title: String(out.title || result.title || ''),\n text: String(out.text || ''),\n html: String(out.html || ''),\n raw: result,\n };\n}\n\nasync function waitForStable(ctx, options = {}) {\n const timeout = Math.max(0, Number(options.timeout ?? options.timeoutMs ?? 120000));\n const stableTime = Math.max(0, Number(options.stableTime ?? DEFAULT_STABLE_TIME_MS));\n const pollIntervalMs = Math.max(1, Number(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS));\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let snapshotErrorCount = 0;\n let lastSnapshotError = null;\n const logTemplate = Logger.useTemplate();\n\n logTemplate.webViewCommand({\n action: 'waitForStable',\n webviews: normalizeStringArray(options.webviews || options.urlIncludes || options.actorInfo?.webviews).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n while (Date.now() < deadline) {\n const current = await snapshot(ctx, options).catch((error) => {\n snapshotErrorCount += 1;\n lastSnapshotError = error;\n if (snapshotErrorCount === 1 || snapshotErrorCount % 5 === 0) {\n logTemplate.webViewWarn({\n action: 'waitForStable.snapshot',\n snapshotErrorCount,\n message: error?.message || String(error),\n });\n }\n return null;\n });\n if (!current) {\n await sleep(pollIntervalMs);\n continue;\n }\n\n const hash = hashSnapshot(current);\n const changed = !lastSnapshot || hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = { ...current, hash };\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n html: current.html,\n text: current.text,\n url: current.url,\n title: current.title,\n mutationNodes: [{\n html: current.html,\n text: current.text,\n mutationType: 'stable',\n url: current.url,\n title: current.title,\n }],\n };\n logTemplate.webViewSuccess({\n action: 'waitForStable',\n duration: Logger.duration(startedAt),\n mutationCount,\n textChars: current.text.length,\n htmlChars: current.html.length,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView DOM \u7A33\u5B9A\u7B49\u5F85\u8D85\u65F6 (${timeout}ms), snapshotErrorCount=${snapshotErrorCount}, lastSnapshotError=${lastSnapshotError?.message || ''}`,\n code: Code.AppRuntimeUnavailable,\n });\n}\n\nasync function click(ctx, target, options = {}) {\n const request = target && typeof target === 'object' && !Array.isArray(target) ? target : { selector: target };\n const js = request.js || options.js || buildClickScript(request.selector, {\n textContains: request.textContains || options.textContains,\n last: request.last ?? options.last,\n });\n const result = await evaluate(ctx, js, options);\n const value = parseBridgeValue(result.value);\n if (value === false || value?.ok === false) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView \u70B9\u51FB\u5931\u8D25 ${value?.reason || value?.error || options.label || request.selector || ''}`.trim(),\n code: Code.AppRuntimeUnavailable,\n context: { value },\n });\n }\n Logger.useTemplate().webViewSuccess({\n action: 'click',\n label: options.label || request.selector || '',\n value: typeof value === 'object' ? value : undefined,\n });\n return value ?? result.value;\n}\n\nasync function runBridgeCommand(ctx, command, options = {}) {\n if (typeof options.commandRunner === 'function') return options.commandRunner(ctx, command);\n\n const packageName = requireNonEmpty(ctx?.packageName, 'packageName');\n const dataDir = appDataDir(packageName);\n const baseDir = `${dataDir}/cache/${WebViewBridge.cacheDir}`;\n const commandPath = `${baseDir}/${WebViewBridge.commandDir}/${command.id}.json`;\n const resultPath = `${baseDir}/${WebViewBridge.resultDir}/${command.id}.json`;\n const commandJson = JSON.stringify(command);\n\n await adbSuShell(ctx, [\n `owner=$(stat -c %u:%g ${shellQuote(dataDir)})`,\n `mkdir -p ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `chown \"$owner\" ${shellQuote(baseDir)} ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `chmod 2775 ${shellQuote(baseDir)} ${shellQuote(`${baseDir}/${WebViewBridge.commandDir}`)} ${shellQuote(`${baseDir}/${WebViewBridge.resultDir}`)}`,\n `rm -f ${shellQuote(resultPath)}`,\n `printf %s ${shellQuote(commandJson)} > ${shellQuote(commandPath)}`,\n `chown \"$owner\" ${shellQuote(commandPath)}`,\n `chmod 664 ${shellQuote(commandPath)}`,\n ].join(' && '), {\n timeoutMs: Math.max(5000, Number(options.timeoutMs || DEFAULT_TIMEOUT_MS)),\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u547D\u4EE4\u5199\u5165\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { commandPath },\n });\n });\n\n await Device.adbShell(ctx, [\n 'am',\n 'broadcast',\n '-a',\n WebViewBridge.actionCommand,\n '--es',\n 'id',\n command.id,\n '-p',\n packageName,\n ], {\n timeoutMs: 8000,\n maxBuffer: 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u5E7F\u64AD\u5931\u8D25 ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { action: WebViewBridge.actionCommand, id: command.id },\n });\n });\n\n const deadline = Date.now() + Math.max(1, Number(options.timeoutMs || command.timeoutMs || DEFAULT_TIMEOUT_MS));\n let lastRaw = '';\n while (Date.now() < deadline) {\n lastRaw = await adbSuShell(ctx, `[ -f ${shellQuote(resultPath)} ] && cat ${shellQuote(resultPath)} || true`, {\n timeoutMs: 5000,\n maxBuffer: Number(options.maxBuffer || 4 * 1024 * 1024),\n }).catch(() => '');\n if (String(lastRaw || '').trim()) {\n await adbSuShell(ctx, `rm -f ${shellQuote(commandPath)} ${shellQuote(resultPath)}`, { timeoutMs: 5000 }).catch(() => {});\n try {\n return JSON.parse(lastRaw);\n } catch (error) {\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u8FD4\u56DE\u4E86\u65E0\u6548 JSON ${error?.message || String(error)}`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, resultPath, raw: String(lastRaw || '').slice(0, 1000) },\n });\n }\n }\n await sleep(Math.max(100, Number(options.resultPollIntervalMs || 250)));\n }\n\n throw new CrawlerError({\n message: `app_runtime_unavailable: WebView bridge \u672A\u8FD4\u56DE\u7ED3\u679C (${command.timeoutMs}ms)`,\n code: Code.AppRuntimeUnavailable,\n context: { id: command.id, resultPath, lastRaw: String(lastRaw || '').slice(0, 500) },\n });\n}\n\nfunction buildClickScript(selector, options = {}) {\n const selectorJson = JSON.stringify(String(selector || 'button,a,[role=\"button\"],[onclick],[aria-label],[title]'));\n const textJson = JSON.stringify(String(options.textContains || ''));\n const useLast = options.last !== false;\n return `(() => {\n const selector = ${selectorJson};\n const textContains = ${textJson};\n const visible = (el) => {\n const rect = el.getBoundingClientRect();\n const style = getComputedStyle(el);\n return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden';\n };\n const inViewport = (el) => {\n const rect = el.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0 && rect.bottom > 0 && rect.right > 0 && rect.top < window.innerHeight && rect.left < window.innerWidth;\n };\n const label = (el) => [el.innerText, el.textContent, el.getAttribute('aria-label'), el.getAttribute('title'), el.getAttribute('class')]\n .filter(Boolean).join(' ').trim();\n const elements = Array.from(document.querySelectorAll(selector))\n .map((el) => el.closest('button,a,[role=\"button\"],[onclick]') || el)\n .filter((el, index, arr) => el && arr.indexOf(el) === index && visible(el))\n .filter((el) => !textContains || label(el).includes(textContains));\n const el = elements[${useLast ? 'elements.length - 1' : '0'}];\n if (!el) return { ok: false, reason: 'element_not_found', selector, textContains, candidateCount: elements.length };\n el.scrollIntoView({ block: 'center', inline: 'center' });\n if (!inViewport(el)) return { ok: false, reason: 'element_out_of_viewport', selector, textContains, candidateCount: elements.length };\n el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));\n if (typeof el.click === 'function') el.click();\n const rect = el.getBoundingClientRect();\n return { ok: true, selector, text: label(el).slice(0, 120), rect: { left: rect.left, top: rect.top, width: rect.width, height: rect.height }, candidateCount: elements.length };\n })()`;\n}\n\nfunction normalizeBridgeResult(value) {\n const result = value && typeof value === 'object' ? value : {};\n return {\n id: String(result.id || ''),\n ok: result.ok !== false,\n url: String(result.url || ''),\n title: String(result.title || ''),\n value: result.value,\n error: String(result.error || ''),\n };\n}\n\nfunction parseBridgeValue(value) {\n let current = value;\n for (let i = 0; i < 2; i += 1) {\n if (typeof current !== 'string') return current;\n const text = current.trim();\n if (!text) return '';\n try {\n current = JSON.parse(text);\n } catch {\n return current;\n }\n }\n return current;\n}\n\nfunction hashSnapshot(value) {\n return createHash('sha256')\n .update(String(value?.url || ''))\n .update('\\n')\n .update(String(value?.title || ''))\n .update('\\n')\n .update(String(value?.html || value?.text || ''))\n .digest('hex');\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nfunction appDataDir(packageName) {\n return `/data/data/${String(packageName || '').trim()}`;\n}\n\nfunction normalizeStringArray(value) {\n const result = [];\n const add = (item) => {\n if (Array.isArray(item)) {\n item.forEach(add);\n return;\n }\n if (item && typeof item === 'object') {\n add(item.value);\n return;\n }\n const text = String(item ?? '').trim();\n if (text) result.push(text);\n };\n add(value);\n return result;\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.js';\nimport { WebView } from './webview.js';\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n waitForStable,\n waitForStableAcrossRoots,\n useMonitor,\n};\n\nasync function waitForStable(ctx, selectors, options = {}) {\n if (options.mode === 'webView') {\n return WebView.waitForStable(ctx, options);\n }\n\n const selectorList = normalizeSelectors(selectors);\n const initialTimeout = Math.max(0, Number(options.initialTimeout ?? 30000));\n const stableTime = Math.max(0, Number(options.stableTime ?? 5000));\n const timeout = Math.max(0, Number(options.timeout ?? 120000));\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n const initialDeadline = initialTimeout === 0 ? startedAt : startedAt + initialTimeout;\n\n const logTemplate = Logger.useTemplate();\n logTemplate.mutationWaitStart({\n selectors: selectorList.map(selectorLabel).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n let foundInitial = false;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let wasPaused = false;\n let snapshotErrorCount = 0;\n let lastSnapshotError = null;\n\n while (Date.now() < deadline) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch((error) => {\n snapshotErrorCount += 1;\n lastSnapshotError = error;\n if (snapshotErrorCount === 1 || snapshotErrorCount % 5 === 0) {\n logTemplate.mutationWaitWarn({\n snapshotErrorCount,\n message: error?.message || String(error),\n });\n }\n return null;\n });\n if (!snapshot) {\n await sleep(pollIntervalMs);\n continue;\n }\n\n if (!foundInitial) {\n if (snapshot.found || Date.now() >= initialDeadline) {\n foundInitial = true;\n if (!snapshot.found) logTemplate.mutationWaitWarn({ message: '\u521D\u59CB\u7B49\u5F85\u672A\u627E\u5230\u8282\u70B9', initialTimeout });\n } else {\n await sleep(pollIntervalMs);\n continue;\n }\n }\n\n const changed = !lastSnapshot || snapshot.hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = snapshot;\n }\n\n let paused = false;\n if ((changed || !stableSince) && onMutation) {\n const signal = await onMutation({\n mutationCount,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n paused = !(signal === null || signal === undefined);\n wasPaused = wasPaused || paused;\n }\n\n if (paused) {\n stableSince = 0;\n } else if (changed || !stableSince) {\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n wasPaused,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n };\n logTemplate.mutationWaitSuccess({\n duration: Logger.duration(startedAt),\n mutationCount,\n wasPaused,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new Error(`Mutation.waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, snapshotErrorCount=${snapshotErrorCount}, lastSnapshotError=${lastSnapshotError?.message || ''}`);\n}\n\nasync function waitForStableAcrossRoots(ctx, selectors, options = {}) {\n return waitForStable(ctx, selectors, options);\n}\n\nasync function useMonitor(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n let stopped = false;\n let totalMutations = 0;\n let lastHash = '';\n\n const loop = async () => {\n while (!stopped) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch(() => null);\n if (snapshot && snapshot.hash !== lastHash) {\n if (lastHash) totalMutations += 1;\n lastHash = snapshot.hash;\n if (onMutation) {\n await onMutation({\n mutationCount: totalMutations,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n }\n }\n await sleep(pollIntervalMs);\n }\n };\n loop();\n\n return {\n stop: async () => {\n stopped = true;\n return { totalMutations };\n },\n };\n}\n\nasync function captureSnapshot(ctx, selectors, options = {}) {\n const view = await DeviceView.snapshot(ctx, options);\n const matched = selectors.length\n ? selectors.flatMap((selector) => view.flat.filter((node) => matchesSelector(node, selector, options)))\n : view.flat;\n const unique = uniqueNodes(matched);\n const mutationNodes = unique.map((node) => ({\n html: nodeToText(node),\n text: [node.text, node.contentDesc].filter(Boolean).join(' ').trim(),\n mutationType: 'stable',\n resourceId: node.resourceId,\n className: node.className,\n bounds: node.bounds,\n }));\n const html = mutationNodes.map((node) => node.html).join('\\n');\n const text = mutationNodes.map((node) => node.text).filter(Boolean).join('\\n');\n return {\n found: unique.length > 0,\n html,\n text,\n mutationNodes,\n hash: unique.map((node) => DeviceView.hashNode(node)).join('|'),\n };\n}\n\nfunction normalizeSelectors(selectors) {\n if (selectors == null) return [];\n const values = Array.isArray(selectors) ? selectors : [selectors];\n return values.map(normalizeSelector).filter(Boolean);\n}\n\nfunction normalizeSelector(selector) {\n if (selector === '*' || selector == null) return null;\n if (typeof selector === 'object') return selector;\n const text = String(selector || '').trim();\n if (!text) return null;\n return { id: text.replace(/^#/, '') };\n}\n\nfunction matchesSelector(node, selector, options) {\n if (!selector) return true;\n if (options.visibleOnly !== false && !node.visible) return false;\n if (selector.id) {\n const id = String(selector.id || '');\n if (node.resourceId !== id && node.id !== id && !node.resourceId.endsWith(`:id/${id}`)) return false;\n }\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction uniqueNodes(nodes) {\n const seen = new Set();\n const out = [];\n for (const node of nodes) {\n const key = `${node.resourceId}|${node.bounds.left},${node.bounds.top},${node.bounds.right},${node.bounds.bottom}|${node.text}|${node.contentDesc}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(node);\n }\n return out;\n}\n\nfunction nodeToText(node) {\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n children: node.children?.length || 0,\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { Device } from './device.js';\n\nconst CAPTURE_DIR_NAME = 'network-capture';\nconst RULES_FILE = 'rules.json';\nconst DEFAULT_MAX_BYTES = 8 * 1024 * 1024;\n\nexport const NetworkCapture = {\n path,\n clear,\n writeRules,\n readText,\n};\n\nfunction path(ctx, fileName = '') {\n const base = `${appDataDir(ctx)}/cache/${CAPTURE_DIR_NAME}`;\n return fileName ? `${base}/${cleanFileName(fileName)}` : base;\n}\n\nasync function clear(ctx, options = {}) {\n const dirPath = options.dirPath || path(ctx);\n await adbSuShell(ctx, `rm -rf ${shellQuote(dirPath)}`, {\n timeoutMs: 10_000,\n maxBuffer: 1024,\n });\n return true;\n}\n\nasync function writeRules(ctx, { rulesJson } = {}) {\n const text = typeof rulesJson === 'string' ? rulesJson : JSON.stringify(rulesJson || { rules: [] });\n await Device.writeCacheFile(ctx, {\n dirName: CAPTURE_DIR_NAME,\n fileName: RULES_FILE,\n text,\n timeoutMs: 10_000,\n maxBuffer: 2 * 1024 * 1024,\n });\n return true;\n}\n\nasync function readText(ctx, fileName, options = {}) {\n return adbSuShell(ctx, `cat ${shellQuote(path(ctx, fileName))} 2>/dev/null || true`, {\n timeoutMs: 10_000,\n maxBuffer: Number(options.maxBuffer || DEFAULT_MAX_BYTES),\n }).catch(() => '');\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nfunction appDataDir(ctx) {\n const packageName = String(ctx?.packageName || '').trim();\n if (!packageName) throw new Error('packageName is required');\n return `/data/data/${packageName}`;\n}\n\nfunction cleanFileName(value) {\n const text = String(value || '').trim();\n if (!text || text.includes('/') || text.includes('\\\\') || text === '.' || text === '..') {\n throw new Error('invalid network capture file name');\n }\n return text;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { Device, readClipboardForShare } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { compressImageBufferToResult, resolveImageCompression } from './internals/compression.js';\nimport { Logger, sleep } from './logger.js';\n\n// Android \u622A\u56FE\u662F sprite \u56FE\uFF1A\u6BCF\u5E27\u90FD\u662F\u4E00\u6B21\u771F\u5B9E\u5C4F\u5E55\u622A\u56FE\uFF0C\u4E0D\u505A\u65E0\u7F1D\u957F\u56FE\u62FC\u63A5\u3002\nconst DEFAULT_CAPTURE_COUNT = 9;\n// \u4E00\u6392\u4E09\u5F20\uFF0C\u907F\u514D\u957F\u56FE\u8FC7\u9AD8\uFF0C\u4E5F\u65B9\u4FBF\u4EBA\u5DE5\u6A2A\u5411\u6BD4\u5BF9\u3002\nconst DEFAULT_COLUMNS = 3;\nconst DEFAULT_SETTLE_MS = 550;\nconst DEFAULT_TIMEOUT_MS = 50000;\nconst DEFAULT_POLL_INTERVAL_MS = 800;\n// \u6BCF\u6B21\u53EA\u63A8\u8FDB\u7EA6\u534A\u5C4F\uFF0C\u4FDD\u7559\u660E\u663E\u91CD\u53E0\uFF0C\u907F\u514D\u4E24\u5E27\u4E4B\u95F4\u4E22\u6587\u5B57\u3002\nconst CAPTURE_SCROLL_STEP_RATIO = 0.56;\nconst CAPTURE_SCROLL_DURATION_MS = 360;\nconst SPRITE_GAP = 16;\n// \u53BB\u91CD\u53EA\u770B\u56DE\u7B54\u5217\u8868\u5185\u5BB9\u533A\u57DF\uFF0C\u907F\u5F00\u72B6\u6001\u680F\u3001\u8F93\u5165\u680F\u3001toast \u8FD9\u7C7B\u975E\u5185\u5BB9\u53D8\u5316\u3002\nconst FRAME_SIGNATURE_WIDTH = 320;\nconst FRAME_SIGNATURE_QUALITY = 35;\n\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const logTemplate = Logger.useTemplate();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n const stopSelector = options.stopSelector || null;\n const resetToTop = options.resetToTop !== false;\n const maxFrames = clampInt(options.maxFrames, 1, DEFAULT_CAPTURE_COUNT, DEFAULT_CAPTURE_COUNT);\n const direction = String(options.direction || 'up').toLowerCase() === 'down' ? 'down' : 'up';\n let topResult = null;\n let stoppedBySelector = false;\n\n logTemplate.screenshotStart({ selector: targetSelector, resetToTop, direction, stopSelector });\n\n if (resetToTop) {\n topResult = await DeviceInput.scrollToTop(ctx, targetSelector, { settleMs: 400 });\n Logger.info('captureScreen scrollToTop', {\n swipes: topResult?.swipes,\n stableRounds: topResult?.stableRounds,\n hashSource: topResult?.hashSource,\n capped: topResult?.capped === true,\n inferredBoundary: topResult?.inferredBoundary === true,\n });\n if (topResult?.capped === true && options.requireTop === true) {\n throw new CrawlerError({\n message: `source_extraction_failed: \u622A\u56FE\u524D\u672A\u80FD\u786E\u8BA4\u56DE\u5230\u9876\u90E8 swipes=${topResult.swipes} stableRounds=${topResult.stableRounds}`,\n code: Code.SourceExtractionFailed,\n context: {\n selector: targetSelector,\n swipes: topResult.swipes,\n stableRounds: topResult.stableRounds,\n hashSource: topResult.hashSource,\n },\n });\n } else if (topResult?.capped === true) {\n Logger.warn('captureScreen \u672A\u80FD\u786E\u8BA4\u56DE\u5230\u9876\u90E8\uFF0C\u7EE7\u7EED\u91C7\u96C6\u5F53\u524D\u9875\u9762', {\n swipes: topResult.swipes,\n stableRounds: topResult.stableRounds,\n hashSource: topResult.hashSource,\n });\n }\n }\n\n for (let index = 0; index < maxFrames; index += 1) {\n await sleep(DEFAULT_SETTLE_MS);\n const target = await DeviceView.find(ctx, targetSelector, { optional: true }).catch(() => null);\n const png = await Device.screenshotPng(ctx);\n const hash = await frameSignature(png, target?.bounds);\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (stopSelector && await DeviceView.exists(ctx, stopSelector, { timeoutMs: 300 }).catch(() => false)) {\n stoppedBySelector = true;\n break;\n }\n if (index >= maxFrames - 1) break;\n await DeviceInput.scrollStep(ctx, targetSelector, direction, {\n swipeRatio: CAPTURE_SCROLL_STEP_RATIO,\n durationMs: CAPTURE_SCROLL_DURATION_MS,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const spriteBuffers = options.reverseFrames ? [...frameBuffers].reverse() : frameBuffers;\n const sprite = await composeSprite(spriteBuffers, { columns: DEFAULT_COLUMNS, gap: SPRITE_GAP });\n const compression = resolveImageCompression(options);\n const imageResult = await compressImageBufferToResult(sprite, compression);\n logTemplate.screenshotDone({\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n scrollStepRatio: CAPTURE_SCROLL_STEP_RATIO,\n resetToTop,\n topCapped: topResult?.capped === true,\n topInferredBoundary: topResult?.inferredBoundary === true,\n format: imageResult.format,\n base64Bytes: Math.ceil(imageResult.base64.length),\n uniqueFrameCount: seen.size,\n stoppedBySelector,\n });\n return `data:${imageResult.mimeType};base64,${imageResult.base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\n const logTemplate = Logger.useTemplate();\n const actorInfo = resolveActorInfo(options.actorInfo || options.actorKey || ctx.actorKey);\n const share = actorInfo?.share || {};\n if (share.mode !== 'clipboard') {\n throw new CrawlerError({\n message: `source_extraction_failed: unsupported Android share mode ${share.mode || ''}`,\n code: Code.SourceExtractionFailed,\n });\n }\n\n const timeoutMs = Number(options.timeoutMs || DEFAULT_TIMEOUT_MS);\n const prefix = String(share.prefix || '').trim();\n\n logTemplate.shareStart({ actor: actorInfo.key, prefix, timeoutMs });\n const beforeEvent = await readClipboard(ctx).catch(() => null);\n const beforeLink = beforeEvent ? selectLink(beforeEvent, prefix) : '';\n if (beforeLink) Logger.info('Share.captureLink baseline', { beforeLink });\n\n if (typeof options.performActions === 'function') {\n await options.performActions();\n }\n\n const deadline = Date.now() + timeoutMs;\n let lastEvent = null;\n while (Date.now() < deadline) {\n const event = await readClipboard(ctx).catch((error) => ({ ok: false, error: error?.message || String(error) }));\n lastEvent = event;\n const link = selectLink(event, prefix);\n if (link) {\n if (link === beforeLink) {\n Logger.info('Share.captureLink ignore baseline link', { link });\n await sleep(DEFAULT_POLL_INTERVAL_MS);\n continue;\n }\n logTemplate.shareSuccess({ link, source: event.source || 'clipboard' });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n await sleep(DEFAULT_POLL_INTERVAL_MS);\n }\n\n throw new CrawlerError({\n message: 'source_extraction_failed: \u672A\u6355\u83B7\u5206\u4EAB\u94FE\u63A5',\n code: Code.SourceExtractionFailed,\n context: { prefix, lastEvent },\n });\n}\n\nasync function readClipboard(ctx) {\n const payload = await readClipboardForShare(ctx);\n const candidates = extractLinks(payload).map((link) => ({\n source: 'adb.clipboard',\n link,\n payload: payload.slice(0, 1000),\n }));\n return {\n ok: candidates.length > 0,\n link: candidates[0]?.link || '',\n source: 'adb.clipboard',\n candidates,\n payloadSnapshot: payload.slice(0, 500),\n };\n}\n\nasync function composeSprite(buffers, options = {}) {\n if (!buffers.length) {\n throw new CrawlerError({ message: 'source_extraction_failed: no screenshots captured', code: Code.SourceExtractionFailed });\n }\n const images = [];\n for (const buffer of buffers) images.push(await Jimp.read(buffer));\n const columns = Math.max(1, Number(options.columns || DEFAULT_COLUMNS));\n const gap = Math.max(0, Number(options.gap || 0));\n const cellWidth = Math.max(...images.map((image) => image.bitmap.width));\n const cellHeight = Math.max(...images.map((image) => image.bitmap.height));\n const rows = Math.ceil(images.length / columns);\n const width = columns * cellWidth + (columns - 1) * gap;\n const height = rows * cellHeight + (rows - 1) * gap;\n const sprite = new Jimp({ width, height, color: 0xffffffff });\n images.forEach((image, index) => {\n const x = (index % columns) * (cellWidth + gap);\n const y = Math.floor(index / columns) * (cellHeight + gap);\n sprite.composite(image, x, y);\n });\n return sprite.getBuffer(JimpMime.png);\n}\n\nasync function frameSignature(buffer, bounds) {\n const image = await Jimp.read(buffer);\n const area = normalizeCaptureBounds(bounds, image.bitmap.width, image.bitmap.height);\n const target = image.crop(area);\n const scale = Math.min(1, FRAME_SIGNATURE_WIDTH / Math.max(1, target.bitmap.width));\n if (scale < 1) {\n target.resize({\n w: Math.max(1, Math.round(target.bitmap.width * scale)),\n h: Math.max(1, Math.round(target.bitmap.height * scale)),\n });\n }\n const normalized = await target.getBuffer(JimpMime.jpeg, { quality: FRAME_SIGNATURE_QUALITY });\n return createHash('sha256').update(normalized).digest('hex');\n}\n\nfunction normalizeCaptureBounds(bounds, imageWidth, imageHeight) {\n const left = clampInt(bounds?.left, 0, imageWidth - 1, 0);\n const top = clampInt(bounds?.top, 0, imageHeight - 1, 0);\n const right = clampInt(bounds?.right, left + 1, imageWidth, imageWidth);\n const bottom = clampInt(bounds?.bottom, top + 1, imageHeight, imageHeight);\n return {\n x: left,\n y: top,\n w: Math.max(1, right - left),\n h: Math.max(1, bottom - top),\n };\n}\n\nfunction clampInt(value, min, max, fallback) {\n const number = Math.round(Number(value));\n if (!Number.isFinite(number)) return fallback;\n return Math.min(max, Math.max(min, number));\n}\n\nfunction resolveActorInfo(value) {\n if (value && typeof value === 'object') return value;\n const key = String(value || '').trim();\n const info = ActorInfo[key];\n if (!info) {\n throw new CrawlerError({\n message: `invalid_request: unknown actorInfo ${key}`,\n code: Code.InvalidRequest,\n });\n }\n return info;\n}\n\nfunction selectLink(event, prefix) {\n const candidates = [];\n if (event?.link) candidates.push(event.link);\n if (Array.isArray(event?.candidates)) {\n for (const candidate of event.candidates) {\n if (candidate?.link) candidates.push(candidate.link);\n }\n }\n return candidates.find((link) => !prefix || String(link).startsWith(prefix)) || '';\n}\n\nfunction extractLinks(value) {\n const text = String(value || '');\n const matches = text.match(/https?:\\/\\/[^\\s\"'<>\uFF0C\u3002]+/g) || [];\n return matches.map((link) => link.replace(/[)\\].,\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]+$/g, ''));\n}\n", "import { Jimp, JimpMime, ResizeStrategy } from 'jimp';\n\nimport { Logger } from '../logger.js';\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY,\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY),\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES,\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType,\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE,\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, { quality });\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst rawPngResult = (buffer) => ({\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n format: 'png',\n mimeType: 'image/png',\n withinLimit: true,\n});\n\nconst mimeTypeForFormat = (format) => (format === 'jpeg' ? 'image/jpeg' : 'image/png');\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) smallest = candidate;\n if (candidate.bytes <= compression.maxBytes) {\n return { ...candidate, mimeType: mimeTypeForFormat(candidate.format), withinLimit: true };\n }\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94),\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) break;\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return {\n ...fallback,\n mimeType: mimeTypeForFormat(fallback.format),\n withinLimit: fallback.bytes <= compression.maxBytes,\n };\n};\n\nexport const compressImageBufferToResult = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n const raw = rawPngResult(buffer);\n return {\n ...raw,\n base64: raw.buffer.toString('base64'),\n };\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n Logger.warn('captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE', { message: error?.message || String(error) });\n return null;\n });\n\n if (!result?.buffer) {\n const raw = rawPngResult(buffer);\n return {\n ...raw,\n base64: raw.buffer.toString('base64'),\n };\n }\n\n if (result.withinLimit) {\n Logger.info('captureScreen \u5DF2\u538B\u7F29', {\n originalBytes,\n outputBytes: result.bytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n size: `${result.width}x${result.height}`,\n });\n } else {\n Logger.warn('captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807', {\n originalBytes,\n outputBytes: result.bytes,\n maxBytes: compression.maxBytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n });\n }\n\n return {\n ...result,\n base64: result.buffer.toString('base64'),\n };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const result = await compressImageBufferToResult(buffer, compression);\n return result.base64;\n};\n", "import { ApifyKit } from '../src/apify-kit.js';\nimport { Context } from '../src/context.js';\nimport { Device } from '../src/device.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceSQLite } from '../src/device-sqlite.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Launch } from '../src/launch.js';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { NetworkCapture } from '../src/network-capture.js';\nimport { Share } from '../src/share.js';\nimport { WebView } from '../src/webview.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\n\nconst ToolkitMode = Object.freeze({\n default: 'default',\n});\n\nexport const useAndroidToolKit = () => {\n return {\n Launch,\n ApifyKit,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Device,\n Mutation,\n NetworkCapture,\n Share,\n WebView,\n Constants,\n Errors,\n Logger,\n LOG_TEMPLATES,\n $Internals: { LOG_TEMPLATES, stripAnsi },\n Context,\n };\n};\n\nuseAndroidToolKit.Mode = ToolkitMode;\n"],
5
+ "mappings": "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",
6
+ "names": ["text", "text", "options", "out", "createHash", "bounds", "pressEnter", "point", "text", "bounds", "createHash", "execFile", "promisify", "execFileAsync", "promisify", "execFile", "requireNonEmpty", "fs", "fs", "createHash", "snapshot", "click", "requireNonEmpty", "appDataDir", "normalizeStringArray", "adbSuShell", "shellQuote", "text", "createHash", "waitForStable", "selectorLabel", "snapshot", "matchesSelector", "text", "normalizeSelector", "path", "appDataDir", "adbSuShell", "shellQuote", "text", "createHash", "Jimp", "JimpMime", "DEFAULT_TIMEOUT_MS", "DEFAULT_POLL_INTERVAL_MS", "Jimp", "JimpMime", "bounds", "createHash", "text", "fs"]
7
7
  }