@skrillex1224/android-toolkit 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +62 -70
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +62 -70
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
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/mutation.js", "../src/share.js", "../src/internals/compression.js", "../entrys/node.js"],
|
|
4
|
-
"sourcesContent": ["import fs from 'node:fs';\n\nimport { Code, Status } 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\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 = String(options.inputPath || '').trim();\n const outputPath = requiredOption(options.outputPath, 'outputPath');\n const input = options.input || (inputPath ? JSON.parse(fs.readFileSync(inputPath, 'utf8')) : {});\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\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 Logger.start(`[Step] ${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n Logger.success(`[Step] ${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n Logger.fail(`[Step] ${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: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n Logger.success('pushSuccess', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n Logger.success('pushArtifact', { 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: serializeError(normalized),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n Logger.success('pushFailed', { 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 requiredOption(value, name) {\n const clean = String(value || '').trim();\n if (!clean) throw new Error(`ApifyKit.useApifyKit requires ${name}`);\n return clean;\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, depth = 0, seen = new WeakSet()) {\n if (depth > 8) return '[MaxDepth]';\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 (value instanceof Error) return serializeError(value);\n if (Array.isArray(value)) return value.map((item) => sanitizeData(item, depth + 1, seen)).filter((item) => item !== undefined);\n if (type !== 'object') return String(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const out = {};\n for (const [key, item] of Object.entries(value)) {\n const safe = sanitizeData(item, depth + 1, seen);\n if (safe !== undefined) out[key] = safe;\n }\n return out;\n}\n", "export const Code = Object.freeze({\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\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 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\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 share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n 'doubao.android': createActorInfo({\n key: 'doubao.android',\n name: '\u8C46\u5305 Android',\n share: {\n prefix: 'https://www.doubao.com/thread/',\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 } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const Device = {\n adbExec,\n adbShell,\n forceStopApp,\n startActivity,\n startLauncher,\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 readClipboard,\n clearClipboard,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\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 execFileAsync(adbPath, args.map(String), {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n Logger.debug('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 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 startActivity(ctx, component, args = []) {\n await adbShell(ctx, ['am', 'start', '-n', requireValue(component, 'component'), ...args], { timeoutMs: 20000 });\n await sleep(1500);\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n await startActivity(ctx, `${requireValue(packageName, 'packageName')}/${requireValue(launcherActivity, 'launcherActivity')}`, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\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 String(out || '').trim();\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') || trimmed.includes('topResumedActivity')) return trimmed;\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 await adbInput(ctx, [\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 ], { timeoutMs: 15000 });\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 adbShell(ctx, ['input', 'text', shellSingleQuote(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 screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const { stdout } = await execFileAsync(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeout: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n });\n return Buffer.from(stdout);\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nasync function readClipboard(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 clearClipboard(ctx) {\n Logger.info('Device.clearClipboard skipped', {\n reason: 'Android shell clipboard set is not portable; captureLink validates by link change.',\n });\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.warn('uiautomator dump retry', { 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\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\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 compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\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\nfunction shellSingleQuote(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});\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\nexport const LOG_TEMPLATES = Object.freeze({\n stepStart: '[Step] start',\n stepSuccess: '[Step] success',\n stepFail: '[Step] failed',\n mutationStable: '[Mutation] stable',\n shareStart: '[Share] start',\n screenshotDone: '[Share] screenshot done',\n dataPush: '[Dataset] push',\n});\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? `[${scope}] ` : '';\n return {\n start: (message, detail) => Logger.start(`${prefix}${message}`, detail),\n success: (message, detail) => Logger.success(`${prefix}${message}`, detail),\n fail: (message, error) => Logger.fail(`${prefix}${message}`, error),\n warn: (message, detail) => Logger.warn(`${prefix}${message}`, detail),\n info: (message, detail) => Logger.info(`${prefix}${message}`, detail),\n debug: (message, detail) => Logger.debug(`${prefix}${message}`, detail),\n };\n },\n useTemplate() {\n return {\n taskStart: (detail) => Logger.start('\u4EFB\u52A1\u5F00\u59CB', detail),\n taskSuccess: (detail) => Logger.success('\u4EFB\u52A1\u5B8C\u6210', detail),\n taskFail: (detail, error) => Logger.fail(`\u4EFB\u52A1\u5931\u8D25 ${detail || ''}`.trim(), error),\n stepStart: (step, detail) => Logger.start(`[Step] ${step}`, detail),\n stepSuccess: (step, detail) => Logger.success(`[Step] ${step}`, detail),\n stepFail: (step, error) => Logger.fail(`[Step] ${step}`, error),\n mutationStable: (detail) => Logger.success('[Mutation] stable', detail),\n shareStart: (detail) => Logger.start('[Share] capture', detail),\n screenshotDone: (detail) => Logger.success('[Share] screenshot', detail),\n dataPush: (detail) => Logger.success('[Dataset] push', detail),\n };\n },\n start(message, detail = '') {\n write('info', `\u25B6 ${message}`, detail);\n },\n success(message, detail = '') {\n write('info', `\u2713 ${message}`, detail);\n },\n fail(message, error = '') {\n write('error', `\u2717 ${message}`, error?.message || error);\n },\n warn(message, detail = '') {\n write('warn', `\u26A0 ${message}`, detail);\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n info(message, detail = '') {\n write('info', message, detail);\n },\n debug(message, detail = '') {\n write('debug', 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 write(level, message, detail = '') {\n const formattedDetail = formatDetail(detail);\n const line = formattedDetail\n ? `[${formatTimestamp()}] [android-toolkit] ${message} ${formattedDetail}`\n : `[${formatTimestamp()}] [android-toolkit] ${message}`;\n const writer = activeLogger[level] || activeLogger.warning || activeLogger.warn || activeLogger.info || console.error;\n writer.call(activeLogger, line);\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 if (detail == null || detail === '') return '';\n if (detail instanceof Error) return detail.message;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) return detail.map(formatDetail).filter(Boolean).join(' ');\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 .join(' ');\n }\n return String(detail);\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\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\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 return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\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, options);\n}\n\nasync function scrollBounds(ctx, bounds, direction, options = {}) {\n const box = bounds;\n const ratio = Number(options.swipeRatio || 0.72);\n const durationMs = Number(options.durationMs || 360);\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 || 500));\n}\n\nasync function scrollToEnd(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'up', options);\n}\n\nasync function scrollToTop(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'down', options);\n}\n\nasync function scrollUntilStable(ctx, selector, direction, options = {}) {\n const maxSwipes = Math.max(1, Number(options.maxSwipes || 20));\n const stableRoundsTarget = Math.max(1, Number(options.stableRounds || 2));\n const hashSource = String(options.stability || options.hashSource || 'view');\n if (hashSource === 'screenshot') {\n return scrollUntilScreenshotStable(ctx, selector, direction, options, maxSwipes, stableRoundsTarget, hashSource);\n }\n let lastHash = '';\n let stableRounds = 0;\n for (let index = 0; index < maxSwipes; index += 1) {\n const currentHash = await scrollStateHash(ctx, selector, options, hashSource);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index, stableRounds, hash: currentHash, hashSource, capped: false };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n await scroll(ctx, selector, direction, options);\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash, hashSource, capped: true };\n}\n\nasync function scrollUntilScreenshotStable(ctx, selector, direction, options, maxSwipes, stableRoundsTarget, hashSource) {\n const node = await DeviceView.find(ctx, selector, options);\n const bounds = node.bounds;\n let lastHash = await scrollStateHash(ctx, selector, options, hashSource);\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, selector, options, hashSource);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index + 1, stableRounds, hash: currentHash, hashSource, capped: false };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash, hashSource, capped: true };\n}\n\nasync function scrollStateHash(ctx, selector, options, hashSource) {\n if (hashSource === 'screenshot') {\n const png = await Device.screenshotPng(ctx);\n return createHash('sha256').update(png).digest('hex');\n }\n const node = await DeviceView.find(ctx, selector, options);\n return DeviceView.hashNode(node);\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']) {\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',\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 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 serial = requireNonEmpty(ctx?.serial, 'serial');\n const adbPath = requireNonEmpty(ctx?.adbPath, 'adbPath');\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(adbPath, serial, 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(adbPath, serial, `${remoteDb}-wal`, `${localDb}-wal`);\n await adbPullOptional(adbPath, serial, `${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(adbPath, serial, remotePath, localPath) {\n await execFileAsync(adbPath, ['-s', serial, 'pull', remotePath, localPath], {\n timeout: 30_000,\n maxBuffer: 8 * 1024 * 1024,\n encoding: 'utf8',\n });\n}\n\nasync function adbPullOptional(adbPath, serial, remotePath, localPath) {\n await adbPull(adbPath, serial, 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 { Share } from './share.js';\n\nconst DEFAULT_INPUT_PATH = '/apify_storage/input.json';\nconst DEFAULT_OUTPUT_PATH = '/apify_storage/output.json';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const inputPath = pathOption(options.inputPath, DEFAULT_INPUT_PATH);\n const outputPath = pathOption(options.outputPath, DEFAULT_OUTPUT_PATH);\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\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 Logger,\n Context,\n };\n\n try {\n Logger.start('Launch.run', {\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\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 Logger.success('Launch.run', { duration: Logger.duration(startedAt) });\n } catch (error) {\n Logger.fail(`Launch.run 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 }\n}\n\nfunction pathOption(value, fallback) {\n const clean = String(value || '').trim();\n return clean || fallback;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.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 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 Logger.start('Mutation.waitForStable', {\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 Logger.warn('Mutation.waitForStable snapshot skipped', {\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) Logger.warn('Mutation.waitForStable \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 Logger.success('Mutation.waitForStable', {\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 { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { CrawlerError } from './errors.js';\nimport { compressImageBufferToBase64, resolveImageCompression } from './internals/compression.js';\nimport { Logger, sleep } from './logger.js';\n\nconst DEFAULT_CAPTURE_COUNT = 9;\nconst DEFAULT_COLUMNS = 3;\nconst DEFAULT_SETTLE_MS = 550;\nconst DEFAULT_TIMEOUT_MS = 50000;\nconst DEFAULT_POLL_INTERVAL_MS = 800;\n\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n const shouldHideKeyboard = options.hideKeyboard !== false;\n\n if (shouldHideKeyboard) await Device.hideKeyboard(ctx, { attempts: 2, settleMs: 350 }).catch(() => {});\n try {\n const topResult = await DeviceInput.scrollToTop(ctx, targetSelector, {\n maxSwipes: Number(options.scrollToTopMaxSwipes || 12),\n stableRounds: Number(options.scrollToTopStableRounds || 2),\n settleMs: 400,\n stability: options.scrollStability || options.stability || 'view',\n });\n Logger.info('captureScreen scrollToTop', {\n swipes: topResult?.swipes,\n stableRounds: topResult?.stableRounds,\n hashSource: topResult?.hashSource,\n capped: topResult?.capped === true,\n });\n } catch (error) {\n if (options.strictScrollToTop === true) throw error;\n Logger.warn('captureScreen scrollToTop skipped', { message: error?.message || String(error) });\n }\n\n for (let index = 0; index < DEFAULT_CAPTURE_COUNT; index += 1) {\n if (shouldHideKeyboard) await Device.hideKeyboard(ctx, { attempts: 1, settleMs: 250 }).catch(() => {});\n await sleep(DEFAULT_SETTLE_MS);\n const png = await Device.screenshotPng(ctx);\n const hash = createHash('sha256').update(png).digest('hex');\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (index >= DEFAULT_CAPTURE_COUNT - 1) break;\n await DeviceInput.scroll(ctx, targetSelector, 'up', {\n swipeRatio: 0.72,\n durationMs: 360,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const sprite = await composeSprite(frameBuffers, { columns: DEFAULT_COLUMNS, gap: 16 });\n const compression = resolveImageCompression(options);\n const base64 = await compressImageBufferToBase64(sprite, compression);\n Logger.success('Share.captureScreen', {\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n base64Bytes: Math.ceil(base64.length),\n });\n return `data:image/jpeg;base64,${base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\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 pollIntervalMs = Number(options.pollIntervalMs || DEFAULT_POLL_INTERVAL_MS);\n const deadline = Date.now() + timeoutMs;\n const prefix = String(share.prefix || '').trim();\n\n Logger.start('Share.captureLink', { 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 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 && link !== beforeLink) {\n Logger.success('Share.captureLink', { link });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n if (link && link === beforeLink) {\n lastEvent = { ...event, rejected: 'same_as_baseline', beforeLink };\n }\n await sleep(pollIntervalMs);\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 Device.readClipboard(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\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 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) return { ...candidate, withinLimit: true };\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 { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\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) return buffer.toString('base64');\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 result.buffer.toString('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 } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Share } from '../src/share.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 Share,\n Constants,\n Errors,\n Logger,\n Context,\n };\n};\n\nuseAndroidToolKit.Mode = ToolkitMode;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["text", "options", "createHash", "bounds", "pressEnter", "point", "text", "bounds", "createHash", "execFile", "promisify", "execFileAsync", "promisify", "execFile", "requireNonEmpty", "fs", "fs", "selectorLabel", "snapshot", "matchesSelector", "text", "normalizeSelector", "createHash", "Jimp", "JimpMime", "createHash", "readClipboard", "Jimp", "JimpMime", "text", "fs"]
|
|
4
|
+
"sourcesContent": ["import fs from 'node:fs';\n\nimport { Code, Status } 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\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 = String(options.inputPath || '').trim();\n const outputPath = requiredOption(options.outputPath, 'outputPath');\n const input = options.input || (inputPath ? JSON.parse(fs.readFileSync(inputPath, 'utf8')) : {});\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\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 Logger.start(`[Step] ${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n Logger.success(`[Step] ${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n Logger.fail(`[Step] ${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: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n Logger.success('pushSuccess', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n Logger.success('pushArtifact', { 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: serializeError(normalized),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n Logger.success('pushFailed', { 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 requiredOption(value, name) {\n const clean = String(value || '').trim();\n if (!clean) throw new Error(`ApifyKit.useApifyKit requires ${name}`);\n return clean;\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, depth = 0, seen = new WeakSet()) {\n if (depth > 8) return '[MaxDepth]';\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 (value instanceof Error) return serializeError(value);\n if (Array.isArray(value)) return value.map((item) => sanitizeData(item, depth + 1, seen)).filter((item) => item !== undefined);\n if (type !== 'object') return String(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const out = {};\n for (const [key, item] of Object.entries(value)) {\n const safe = sanitizeData(item, depth + 1, seen);\n if (safe !== undefined) out[key] = safe;\n }\n return out;\n}\n", "export const Code = Object.freeze({\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\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 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\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 share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n 'doubao.android': createActorInfo({\n key: 'doubao.android',\n name: '\u8C46\u5305 Android',\n share: {\n prefix: 'https://www.doubao.com/thread/',\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 } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const Device = {\n adbExec,\n adbShell,\n forceStopApp,\n startActivity,\n startLauncher,\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 readClipboard,\n clearClipboard,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\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 execFileAsync(adbPath, args.map(String), {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n Logger.debug('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 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 startActivity(ctx, component, args = []) {\n await adbShell(ctx, ['am', 'start', '-n', requireValue(component, 'component'), ...args], { timeoutMs: 20000 });\n await sleep(1500);\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n await startActivity(ctx, `${requireValue(packageName, 'packageName')}/${requireValue(launcherActivity, 'launcherActivity')}`, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\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 String(out || '').trim();\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') || trimmed.includes('topResumedActivity')) return trimmed;\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 await adbInput(ctx, [\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 ], { timeoutMs: 15000 });\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 adbShell(ctx, ['input', 'text', shellSingleQuote(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 screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const { stdout } = await execFileAsync(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeout: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n });\n return Buffer.from(stdout);\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nasync function readClipboard(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 clearClipboard(ctx) {\n Logger.info('Device.clearClipboard skipped', {\n reason: 'Android shell clipboard set is not portable; captureLink validates by link change.',\n });\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.warn('uiautomator dump retry', { 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\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\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 compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\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\nfunction shellSingleQuote(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});\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\nexport const LOG_TEMPLATES = Object.freeze({\n stepStart: '[Step] start',\n stepSuccess: '[Step] success',\n stepFail: '[Step] failed',\n mutationStable: '[Mutation] stable',\n shareStart: '[Share] start',\n screenshotDone: '[Share] screenshot done',\n dataPush: '[Dataset] push',\n});\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? `[${scope}] ` : '';\n return {\n start: (message, detail) => Logger.start(`${prefix}${message}`, detail),\n success: (message, detail) => Logger.success(`${prefix}${message}`, detail),\n fail: (message, error) => Logger.fail(`${prefix}${message}`, error),\n warn: (message, detail) => Logger.warn(`${prefix}${message}`, detail),\n info: (message, detail) => Logger.info(`${prefix}${message}`, detail),\n debug: (message, detail) => Logger.debug(`${prefix}${message}`, detail),\n };\n },\n useTemplate() {\n return {\n taskStart: (detail) => Logger.start('\u4EFB\u52A1\u5F00\u59CB', detail),\n taskSuccess: (detail) => Logger.success('\u4EFB\u52A1\u5B8C\u6210', detail),\n taskFail: (detail, error) => Logger.fail(`\u4EFB\u52A1\u5931\u8D25 ${detail || ''}`.trim(), error),\n stepStart: (step, detail) => Logger.start(`[Step] ${step}`, detail),\n stepSuccess: (step, detail) => Logger.success(`[Step] ${step}`, detail),\n stepFail: (step, error) => Logger.fail(`[Step] ${step}`, error),\n mutationStable: (detail) => Logger.success('[Mutation] stable', detail),\n shareStart: (detail) => Logger.start('[Share] capture', detail),\n screenshotDone: (detail) => Logger.success('[Share] screenshot', detail),\n dataPush: (detail) => Logger.success('[Dataset] push', detail),\n };\n },\n start(message, detail = '') {\n write('info', `\u25B6 ${message}`, detail);\n },\n success(message, detail = '') {\n write('info', `\u2713 ${message}`, detail);\n },\n fail(message, error = '') {\n write('error', `\u2717 ${message}`, error?.message || error);\n },\n warn(message, detail = '') {\n write('warn', `\u26A0 ${message}`, detail);\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n info(message, detail = '') {\n write('info', message, detail);\n },\n debug(message, detail = '') {\n write('debug', 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 write(level, message, detail = '') {\n const formattedDetail = formatDetail(detail);\n const line = formattedDetail\n ? `[${formatTimestamp()}] [android-toolkit] ${message} ${formattedDetail}`\n : `[${formatTimestamp()}] [android-toolkit] ${message}`;\n const writer = activeLogger[level] || activeLogger.warning || activeLogger.warn || activeLogger.info || console.error;\n writer.call(activeLogger, line);\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 if (detail == null || detail === '') return '';\n if (detail instanceof Error) return detail.message;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) return detail.map(formatDetail).filter(Boolean).join(' ');\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 .join(' ');\n }\n return String(detail);\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';\n\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\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 return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\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, 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 = Math.max(1, Number(options.maxSwipes || SCROLL_MAX_SWIPES));\n const stableRoundsTarget = Math.max(1, Number(options.stableRounds || 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 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\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']) {\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',\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 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 serial = requireNonEmpty(ctx?.serial, 'serial');\n const adbPath = requireNonEmpty(ctx?.adbPath, 'adbPath');\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(adbPath, serial, 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(adbPath, serial, `${remoteDb}-wal`, `${localDb}-wal`);\n await adbPullOptional(adbPath, serial, `${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(adbPath, serial, remotePath, localPath) {\n await execFileAsync(adbPath, ['-s', serial, 'pull', remotePath, localPath], {\n timeout: 30_000,\n maxBuffer: 8 * 1024 * 1024,\n encoding: 'utf8',\n });\n}\n\nasync function adbPullOptional(adbPath, serial, remotePath, localPath) {\n await adbPull(adbPath, serial, 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 { Share } from './share.js';\n\nconst DEFAULT_INPUT_PATH = '/apify_storage/input.json';\nconst DEFAULT_OUTPUT_PATH = '/apify_storage/output.json';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const inputPath = pathOption(options.inputPath, DEFAULT_INPUT_PATH);\n const outputPath = pathOption(options.outputPath, DEFAULT_OUTPUT_PATH);\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\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 Logger,\n Context,\n };\n\n try {\n Logger.start('Launch.run', {\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\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 Logger.success('Launch.run', { duration: Logger.duration(startedAt) });\n } catch (error) {\n Logger.fail(`Launch.run 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 }\n}\n\nfunction pathOption(value, fallback) {\n const clean = String(value || '').trim();\n return clean || fallback;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.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 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 Logger.start('Mutation.waitForStable', {\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 Logger.warn('Mutation.waitForStable snapshot skipped', {\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) Logger.warn('Mutation.waitForStable \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 Logger.success('Mutation.waitForStable', {\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 { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { DeviceInput } from './device-input.js';\nimport { CrawlerError } from './errors.js';\nimport { compressImageBufferToBase64, 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// \u91CD\u7F6E\u5230\u9876\u90E8\u8981\u8DB3\u591F\u5BBD\u677E\uFF0C\u957F\u56DE\u7B54\u4E0D\u80FD\u56E0\u4E3A\u56DE\u9876\u6B21\u6570\u8FC7\u5C11\u800C\u4ECE\u4E2D\u95F4\u5F00\u59CB\u622A\u3002\nconst RESET_TO_TOP_MAX_SWIPES = 16;\nconst RESET_TO_TOP_STABLE_ROUNDS = 1;\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\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n const resetToTop = options.resetToTop !== false;\n let topResult = null;\n\n if (resetToTop) {\n topResult = await DeviceInput.scrollToTop(ctx, targetSelector, {\n maxSwipes: RESET_TO_TOP_MAX_SWIPES,\n stableRounds: RESET_TO_TOP_STABLE_ROUNDS,\n settleMs: 400,\n });\n Logger.info('captureScreen scrollToTop', {\n swipes: topResult?.swipes,\n stableRounds: topResult?.stableRounds,\n hashSource: topResult?.hashSource,\n capped: topResult?.capped === true,\n });\n if (topResult?.capped === 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 }\n }\n\n for (let index = 0; index < DEFAULT_CAPTURE_COUNT; index += 1) {\n await sleep(DEFAULT_SETTLE_MS);\n const png = await Device.screenshotPng(ctx);\n const hash = createHash('sha256').update(png).digest('hex');\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (index >= DEFAULT_CAPTURE_COUNT - 1) break;\n await DeviceInput.scroll(ctx, targetSelector, 'up', {\n swipeRatio: CAPTURE_SCROLL_STEP_RATIO,\n durationMs: CAPTURE_SCROLL_DURATION_MS,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const sprite = await composeSprite(frameBuffers, { columns: DEFAULT_COLUMNS, gap: SPRITE_GAP });\n const compression = resolveImageCompression(options);\n const base64 = await compressImageBufferToBase64(sprite, compression);\n Logger.success('Share.captureScreen', {\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n scrollStepRatio: CAPTURE_SCROLL_STEP_RATIO,\n resetToTop,\n topCapped: topResult?.capped === true,\n base64Bytes: Math.ceil(base64.length),\n });\n return `data:image/jpeg;base64,${base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\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 deadline = Date.now() + timeoutMs;\n const prefix = String(share.prefix || '').trim();\n\n Logger.start('Share.captureLink', { 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 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 && link !== beforeLink) {\n Logger.success('Share.captureLink', { link });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n if (link && link === beforeLink) {\n lastEvent = { ...event, rejected: 'same_as_baseline', beforeLink };\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 Device.readClipboard(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\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 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) return { ...candidate, withinLimit: true };\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 { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\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) return buffer.toString('base64');\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 result.buffer.toString('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 } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Share } from '../src/share.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 Share,\n Constants,\n Errors,\n Logger,\n Context,\n };\n};\n\nuseAndroidToolKit.Mode = ToolkitMode;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Device", "text", "options", "Device", "createHash", "Device", "bounds", "pressEnter", "Device", "point", "text", "bounds", "createHash", "execFile", "promisify", "execFileAsync", "promisify", "execFile", "requireNonEmpty", "Device", "fs", "fs", "selectorLabel", "snapshot", "matchesSelector", "text", "normalizeSelector", "createHash", "Jimp", "JimpMime", "createHash", "readClipboard", "Jimp", "JimpMime", "text", "fs", "Device", "Device"]
|
|
7
7
|
}
|