@tai2/aco 0.2.2 → 0.2.3
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/README.md +12 -0
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/lib/actions.ts","../src/lib/session-store.ts","../src/lib/connection.ts","../src/lib/wd-client.ts","../src/lib/run-with-session.ts","../src/commands/actions.ts","../src/commands/context/current.ts","../src/commands/context/list.ts","../src/commands/context/switch.ts","../src/commands/context/index.ts","../src/lib/devices/format.ts","../src/lib/devices/appium-log.ts","../src/lib/devices/android-real.ts","../src/lib/devices/android.ts","../src/lib/devices/ios-real.ts","../src/lib/devices/ios.ts","../src/lib/devices/index.ts","../src/commands/device/list.ts","../src/commands/device/index.ts","../src/lib/locator.ts","../src/commands/element/active.ts","../src/commands/element/attribute.ts","../src/commands/element/clear.ts","../src/commands/element/click.ts","../src/commands/element/displayed.ts","../src/commands/element/enabled.ts","../src/commands/element/find.ts","../src/commands/element/property.ts","../src/commands/element/rect.ts","../src/commands/element/selected.ts","../src/commands/element/send-keys.ts","../src/commands/element/text.ts","../src/commands/element/index.ts","../src/lib/list-elements.ts","../src/lib/errors.ts","../src/commands/elements.ts","../src/commands/mobile/call.ts","../src/commands/mobile/list.ts","../src/commands/mobile/index.ts","../src/commands/orientation.ts","../src/data/extensions-android.json","../src/data/extensions-ios.json","../src/lib/manifest.ts","../src/commands/platform-extensions.ts","../src/commands/screenshot.ts","../src/commands/scroll-into-view.ts","../src/commands/send-keys.ts","../src/commands/session/list.ts","../src/commands/session/start.ts","../src/lib/appium-server.ts","../src/lib/caps.ts","../src/lib/port.ts","../src/commands/session/stop.ts","../src/commands/session/index.ts","../src/commands/settings/get.ts","../src/commands/settings/set.ts","../src/commands/settings/index.ts","../src/lib/xpath.ts","../src/commands/source.ts","../src/commands/status.ts","../src/commands/swipe.ts","../src/commands/tap.ts","../src/commands/timeouts.ts","../src/commands/wait.ts","../src/commands/web.ts","../src/commands/window.ts","../src/lib/node-version.ts"],"sourcesContent":["import { Command } from '@commander-js/extra-typings';\nimport { registerActions } from './commands/actions.js';\nimport { registerContext } from './commands/context/index.js';\nimport { registerDevice } from './commands/device/index.js';\nimport { registerElement } from './commands/element/index.js';\nimport { registerElements } from './commands/elements.js';\nimport { registerMobile } from './commands/mobile/index.js';\nimport { registerOrientation } from './commands/orientation.js';\nimport {\n registerAndroid,\n registerIos,\n} from './commands/platform-extensions.js';\nimport { registerScreenshot } from './commands/screenshot.js';\nimport { registerScrollIntoView } from './commands/scroll-into-view.js';\nimport { registerSendKeys } from './commands/send-keys.js';\nimport { registerSession } from './commands/session/index.js';\nimport { registerSettings } from './commands/settings/index.js';\nimport { registerSource } from './commands/source.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerSwipe } from './commands/swipe.js';\nimport { registerTap } from './commands/tap.js';\nimport { registerTimeouts } from './commands/timeouts.js';\nimport { registerWait } from './commands/wait.js';\nimport { registerWeb } from './commands/web.js';\nimport { registerWindow } from './commands/window.js';\nimport { assertSupportedNodeVersion } from './lib/node-version.js';\n\nassertSupportedNodeVersion('20.0.0');\n\nconst program = new Command()\n .name('aco')\n .description(\n 'Appium Command-line Operator -- start a session, then drive it from the shell.',\n )\n .version('0.0.0')\n .showHelpAfterError();\n\nregisterSession(program);\n\nregisterElement(program);\nregisterSource(program);\nregisterElements(program);\nregisterScreenshot(program);\nregisterTap(program);\nregisterSwipe(program);\nregisterSendKeys(program);\nregisterScrollIntoView(program);\nregisterActions(program);\nregisterContext(program);\nregisterMobile(program);\nregisterIos(program);\nregisterAndroid(program);\nregisterDevice(program);\nregisterSettings(program);\nregisterWeb(program);\nregisterOrientation(program);\nregisterTimeouts(program);\nregisterWindow(program);\nregisterStatus(program);\nregisterWait(program);\n\ntry {\n await program.parseAsync(process.argv);\n} catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`aco: ${message}`);\n process.exit(1);\n}\n","export type PointerType = 'touch' | 'mouse' | 'pen';\n\ntype PointerItem =\n | {\n type: 'pointerMove';\n x: number;\n y: number;\n duration: number;\n origin: 'viewport';\n }\n | { type: 'pointerDown'; button: number }\n | { type: 'pointerUp'; button: number }\n | { type: 'pause'; duration: number }\n | { type: 'pointerCancel' };\n\ntype KeyItem =\n | { type: 'keyDown'; value: string }\n | { type: 'keyUp'; value: string }\n | { type: 'pause'; duration: number };\n\nexport interface PointerSource {\n id: string;\n type: 'pointer';\n parameters: { pointerType: PointerType };\n actions: PointerItem[];\n}\n\nexport interface KeySource {\n id: string;\n type: 'key';\n actions: KeyItem[];\n}\n\nexport type InputSource = PointerSource | KeySource;\n\n// Matches WebdriverIO's MOVE_PARAM_DEFAULTS so a `move` between `down` and `up`\n// reads as a natural swipe glide (research.md §2).\nconst MOVE_DEFAULT_DURATION = 100;\n\n// A short finger-down dwell so the touch reads as a tap, not a flick.\n// W3C taps are commonly 50-120ms; 100ms matches the move default above.\nconst TAP_DEFAULT_DURATION = 100;\n\nexport function buildTap(\n x: number,\n y: number,\n duration: number = TAP_DEFAULT_DURATION,\n pointerType: PointerType = 'touch',\n): PointerSource[] {\n return [\n {\n id: 'finger1',\n type: 'pointer',\n parameters: { pointerType },\n actions: [\n { type: 'pointerMove', x, y, duration: 0, origin: 'viewport' },\n { type: 'pointerDown', button: 0 },\n { type: 'pause', duration },\n { type: 'pointerUp', button: 0 },\n ],\n },\n ];\n}\n\nexport function parseGesture(spec: string): PointerItem[] {\n const steps = spec\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (steps.length === 0) {\n throw new Error('gesture is empty; expected e.g. \"down 200 600, up\"');\n }\n return steps.map((step, i) => parseStep(step, i + 1));\n}\n\nfunction parseStep(step: string, n: number): PointerItem {\n const [verb, ...rest] = step.split(/\\s+/);\n const nums = rest.map((tok) => {\n const v = Number(tok);\n if (!Number.isFinite(v)) {\n throw new Error(`gesture step ${n} \"${step}\": \"${tok}\" is not a number`);\n }\n return v;\n });\n switch (verb) {\n case 'move': {\n const [x, y, duration] = nums;\n if (x === undefined || y === undefined || nums.length > 3) {\n throw new Error(\n `gesture step ${n} \"${step}\": move needs <x> <y> [duration]`,\n );\n }\n return {\n type: 'pointerMove',\n x,\n y,\n duration: duration ?? MOVE_DEFAULT_DURATION,\n origin: 'viewport',\n };\n }\n case 'down':\n return { type: 'pointerDown', button: nums[0] ?? 0 };\n case 'up':\n return { type: 'pointerUp', button: nums[0] ?? 0 };\n case 'pause': {\n const [duration] = nums;\n if (duration === undefined || nums.length !== 1) {\n throw new Error(`gesture step ${n} \"${step}\": pause needs <duration>`);\n }\n return { type: 'pause', duration };\n }\n case 'cancel':\n return { type: 'pointerCancel' };\n default:\n throw new Error(`gesture step ${n} \"${step}\": unknown verb \"${verb}\"`);\n }\n}\n\n// Serialize plain text into a `key` source: a keyDown+keyUp pair per character\n// (the W3C \"type these letters\" shape, research.md §6). Array.from keeps astral\n// code points (emoji, combining sequences) intact rather than splitting them on\n// UTF-16 surrogate halves.\nexport function buildKeySource(text: string): KeySource {\n const actions: KeyItem[] = [];\n for (const ch of Array.from(text)) {\n actions.push({ type: 'keyDown', value: ch });\n actions.push({ type: 'keyUp', value: ch });\n }\n return { id: 'keyboard', type: 'key', actions };\n}\n\nexport function buildActions(\n gestures: string[],\n pointerType: PointerType,\n text?: string,\n): InputSource[] {\n const sources: InputSource[] = gestures.map((g, i) => ({\n id: `finger${i + 1}`,\n type: 'pointer',\n parameters: { pointerType },\n actions: parseGesture(g),\n }));\n if (text != null && text.length > 0) {\n sources.push(buildKeySource(text));\n }\n return sources;\n}\n\n// Escape-hatch path: validate the already-parsed `--json` value is an array and\n// return it untouched. Deliberate pass-through -- no touch-default injection, so\n// a raw payload reaches Appium exactly as written (Trade-offs §C).\nexport function asRawActions(raw: unknown): unknown[] {\n if (!Array.isArray(raw)) {\n throw new Error(\n '--json must be a W3C actions array (e.g. [{\"type\":\"pointer\",...}])',\n );\n }\n return raw;\n}\n\nexport function parsePointerType(v: string): PointerType {\n if (v === 'touch' || v === 'mouse' || v === 'pen') return v;\n throw new Error(`--pointer-type must be touch|mouse|pen (got \"${v}\")`);\n}\n","import {\n mkdirSync,\n readFileSync,\n readdirSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Platform } from './connection.js';\n\nexport interface SessionRecord {\n sessionId: string;\n serverUrl: string;\n platform: Platform;\n pid: number;\n startedAt: string;\n deviceName?: string;\n app?: string;\n}\n\nfunction storeDir(): string {\n return join(homedir(), '.aco', 'sessions');\n}\n\nfunction ensureDir(): void {\n mkdirSync(storeDir(), { recursive: true, mode: 0o700 });\n}\n\nfunction fileFor(id: string): string {\n return join(storeDir(), `${encodeURIComponent(id)}.json`);\n}\n\nexport function saveSession(rec: SessionRecord): void {\n ensureDir();\n writeFileSync(fileFor(rec.sessionId), `${JSON.stringify(rec, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n });\n}\n\nexport function removeSession(id: string): void {\n try {\n unlinkSync(fileFor(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nexport function readSession(id: string): SessionRecord | null {\n try {\n const txt = readFileSync(fileFor(id), 'utf8');\n return JSON.parse(txt) as SessionRecord;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\nexport function listSessions(): SessionRecord[] {\n ensureDir();\n const dir = storeDir();\n const out: SessionRecord[] = [];\n for (const f of readdirSync(dir)) {\n if (!f.endsWith('.json')) continue;\n try {\n const txt = readFileSync(join(dir, f), 'utf8');\n out.push(JSON.parse(txt) as SessionRecord);\n } catch {\n /* skip malformed records */\n }\n }\n out.sort((a, b) => (a.startedAt < b.startedAt ? 1 : -1));\n return out;\n}\n\nexport function isLocalHost(serverUrl: string): boolean {\n try {\n const h = new URL(serverUrl).hostname;\n return h === '127.0.0.1' || h === 'localhost' || h === '::1';\n } catch {\n return false;\n }\n}\n\nexport function isPidAlive(pid: number): boolean {\n if (!pid) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code !== 'ESRCH';\n }\n}\n\nexport async function probeServerStatus(\n serverUrl: string,\n timeoutMs: number,\n): Promise<boolean | null> {\n let statusUrl: string;\n try {\n statusUrl = new URL(\n 'status',\n serverUrl.endsWith('/') ? serverUrl : `${serverUrl}/`,\n ).toString();\n } catch {\n return null;\n }\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), timeoutMs);\n try {\n const res = await fetch(statusUrl, { signal: ac.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function latestLiveSession(): SessionRecord | null {\n for (const rec of listSessions()) {\n if (!isLocalHost(rec.serverUrl) || isPidAlive(rec.pid)) return rec;\n }\n return null;\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n type SessionRecord,\n latestLiveSession,\n readSession,\n} from './session-store.js';\n\nexport type Platform = 'ios' | 'android';\n\nexport const DEFAULT_SERVER_URL = 'http://127.0.0.1:4723';\n\nexport interface Connection {\n sessionId: string;\n hostname: string;\n port: number;\n basePath: string;\n protocol: 'http' | 'https';\n platform: Platform;\n}\n\nexport interface ConnectionFlags {\n session?: string;\n serverUrl?: string;\n platform?: string;\n}\n\nexport function parseConnection(flags: ConnectionFlags): Connection {\n if (!flags.session) throw new Error('--session is required');\n if (!flags.platform) throw new Error('--platform is required');\n\n const platform = flags.platform.toLowerCase();\n if (platform !== 'ios' && platform !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${flags.platform}\")`,\n );\n }\n\n const rawUrl = flags.serverUrl ?? DEFAULT_SERVER_URL;\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n throw new Error(`--server-url is not a valid URL: ${rawUrl}`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`--server-url must use http(s); got ${url.protocol}`);\n }\n\n return {\n sessionId: flags.session,\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n basePath: url.pathname && url.pathname !== '/' ? url.pathname : '/',\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n platform,\n };\n}\n\nexport function addConnectionFlags(cmd: Command) {\n return cmd\n .option(\n '-s, --session <id>',\n 'W3C session id (defaults to the latest live session in ~/.aco/sessions)',\n )\n .option(\n '-S, --server-url <url>',\n `Appium server URL (defaults to the stored session's URL, then ${DEFAULT_SERVER_URL})`,\n )\n .option(\n '-p, --platform <ios|android>',\n \"session platform (drives mobile: dispatch; defaults to the stored session's platform)\",\n );\n}\n\nexport interface ResolveResult {\n conn: Connection;\n source: 'flags' | 'store-by-id' | 'store-latest';\n record?: SessionRecord;\n}\n\nexport function resolveConnection(flags: ConnectionFlags): ResolveResult {\n if (flags.session && flags.serverUrl && flags.platform) {\n return { conn: parseConnection(flags), source: 'flags' };\n }\n\n if (flags.session) {\n const rec = readSession(flags.session);\n const serverUrl = flags.serverUrl ?? rec?.serverUrl ?? DEFAULT_SERVER_URL;\n const platform = flags.platform ?? rec?.platform;\n if (!rec && !flags.serverUrl) {\n process.stderr.write(\n `aco: warning -- no stored record for session ${flags.session}; ` +\n `falling back to ${DEFAULT_SERVER_URL}\\n`,\n );\n }\n if (!platform) {\n throw new Error(\n `--platform is required (no stored record found for session ${flags.session})`,\n );\n }\n return {\n conn: parseConnection({ session: flags.session, serverUrl, platform }),\n source: rec ? 'store-by-id' : 'flags',\n record: rec ?? undefined,\n };\n }\n\n const latest = latestLiveSession();\n if (!latest) {\n throw new Error(\n 'no --session given and no live session found in ~/.aco/sessions. ' +\n 'Start one with `aco session start ...` or pass --session explicitly.',\n );\n }\n return {\n conn: parseConnection({\n session: latest.sessionId,\n serverUrl: flags.serverUrl ?? latest.serverUrl,\n platform: flags.platform ?? latest.platform,\n }),\n source: 'store-latest',\n record: latest,\n };\n}\n","import { attach, remote } from 'webdriverio';\nimport type { Connection } from './connection.js';\n\nexport async function attachBrowser(\n conn: Connection,\n): Promise<WebdriverIO.Browser> {\n return attach({\n sessionId: conn.sessionId,\n capabilities: {} as WebdriverIO.Capabilities,\n hostname: conn.hostname,\n port: conn.port,\n path: conn.basePath,\n protocol: conn.protocol,\n isMobile: true,\n isIOS: conn.platform === 'ios',\n isAndroid: conn.platform === 'android',\n logLevel: 'silent',\n });\n}\n\nexport const DEFAULT_SESSION_TIMEOUT_MS = 300_000;\n\nexport interface CreateBrowserOptions {\n hostname: string;\n port: number;\n basePath: string;\n capabilities: Record<string, unknown>;\n connectionTimeoutMs?: number;\n // Remote-server support:\n protocol?: 'http' | 'https'; // defaults to 'http'\n // BASIC auth -- webdriver's transport (webdriver@9.27.2 build/node.js ~line\n // 2147) attaches `Authorization: Basic base64(user:key)` ONLY to the\n // `POST /session` request, never to subsequent commands. This matches the\n // device-farm contract where only session creation requires auth.\n user?: string;\n key?: string;\n}\n\nexport async function createBrowser(\n opts: CreateBrowserOptions,\n): Promise<WebdriverIO.Browser> {\n return remote({\n hostname: opts.hostname,\n port: opts.port,\n path: opts.basePath,\n protocol: opts.protocol ?? 'http',\n logLevel: 'silent',\n connectionRetryTimeout:\n opts.connectionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS,\n connectionRetryCount: 0,\n // Only forwarded when set; undefined user/key means no auth header.\n ...(opts.user !== undefined ? { user: opts.user } : {}),\n ...(opts.key !== undefined ? { key: opts.key } : {}),\n capabilities: opts.capabilities as WebdriverIO.Capabilities,\n });\n}\n","import {\n type ConnectionFlags,\n type Platform,\n resolveConnection,\n} from './connection.js';\nimport { attachBrowser } from './wd-client.js';\n\nexport async function runWithSession<T>(\n flags: ConnectionFlags,\n fn: (b: WebdriverIO.Browser, platform: Platform) => Promise<T>,\n): Promise<T> {\n const { conn } = resolveConnection(flags);\n const browser = await attachBrowser(conn);\n try {\n return await fn(browser, conn.platform);\n } finally {\n try {\n await (browser as { shutdown?: () => Promise<void> }).shutdown?.();\n } catch {\n /* ignore */\n }\n }\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n asRawActions,\n buildActions,\n parsePointerType,\n} from '../lib/actions.js';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerActions(program: Command): void {\n addConnectionFlags(\n program\n .command('actions')\n .description(\n 'perform a low-level W3C pointer gesture (POST /actions); ' +\n 'cross-platform, no mobile: extension needed',\n ),\n )\n .option(\n '-g, --gesture <steps>',\n 'one pointer chain, e.g. \"move 200 600 0, down, move 200 200 300, up\"; ' +\n 'repeat for parallel multi-touch chains',\n (val: string, prev: string[] = []) => [...prev, val],\n [] as string[],\n )\n .option(\n '-t, --type <text>',\n 'type these letters via a key source; combinable with --gesture',\n )\n .option(\n '-j, --json <w3c-actions>',\n 'raw W3C actions array (escape hatch; mutually exclusive with --gesture/--type)',\n )\n .option(\n '--pointer-type <touch|mouse|pen>',\n 'pointer device type (default: touch)',\n parsePointerType,\n 'touch' as const,\n )\n .option(\n '--no-release',\n 'skip the trailing DELETE /actions (leaves input state held)',\n )\n .option(\n '--release-only',\n 'issue a standalone DELETE /actions and nothing else ' +\n '(cleanup after a prior --no-release); mutually exclusive with ' +\n '--gesture/--type/--json/--no-release',\n )\n .action(async (opts) => {\n const gestures = opts.gesture ?? [];\n const hasErgonomic = gestures.length > 0 || opts.type != null;\n\n if (opts.releaseOnly) {\n if (hasErgonomic || opts.json) {\n throw new Error('--release-only takes no --gesture/--type/--json');\n }\n if (opts.release === false) {\n throw new Error('--release-only and --no-release contradict');\n }\n await runWithSession(opts, async (b) => {\n await b.releaseActions();\n });\n process.stdout.write('ok\\n');\n return;\n }\n\n if (hasErgonomic && opts.json) {\n throw new Error('pass either --gesture/--type or --json, not both');\n }\n\n let payload: unknown[];\n if (opts.json) {\n let raw: unknown;\n try {\n raw = JSON.parse(opts.json);\n } catch (err) {\n throw new Error(\n `--json must be valid JSON: ${(err as Error).message}`,\n );\n }\n payload = asRawActions(raw);\n } else if (hasErgonomic) {\n payload = buildActions(gestures, opts.pointerType, opts.type);\n } else {\n throw new Error('nothing to do: pass --gesture, --type, or --json');\n }\n\n await runWithSession(opts, async (b) => {\n await b.performActions(\n payload as Parameters<typeof b.performActions>[0],\n );\n if (opts.release !== false) {\n await b.releaseActions();\n }\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextCurrent(context: Command): void {\n addConnectionFlags(\n context.command('current').description('print the active context name'),\n ).action(async (opts) => {\n const name = await runWithSession(opts, (b) => b.getContext());\n process.stdout.write(`${String(name)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextList(context: Command): void {\n addConnectionFlags(\n context.command('list').description('list available contexts'),\n ).action(async (opts) => {\n const contexts = await runWithSession(opts, (b) => b.getContexts());\n process.stdout.write(`${JSON.stringify(contexts)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextSwitch(context: Command): void {\n addConnectionFlags(\n context.command('switch').description('switch to a context by name'),\n )\n .requiredOption('-n, --name <context>', 'context name')\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.switchContext(opts.name));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerContextCurrent } from './current.js';\nimport { registerContextList } from './list.js';\nimport { registerContextSwitch } from './switch.js';\n\nexport function registerContext(program: Command): void {\n const context = program\n .command('context')\n .description('inspect / switch the active automation context');\n registerContextList(context);\n registerContextCurrent(context);\n registerContextSwitch(context);\n}\n","import type { Device } from './types.js';\n\nconst STATE_RANK: Record<Device['state'], number> = {\n booted: 0,\n available: 1,\n unknown: 2,\n unavailable: 3,\n};\n\nexport function sortDevices(devices: Device[]): Device[] {\n return [...devices].sort((a, b) => {\n if (a.platform !== b.platform) return a.platform < b.platform ? -1 : 1;\n if (a.state !== b.state) return STATE_RANK[a.state] - STATE_RANK[b.state];\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function renderTable(devices: Device[]): string {\n if (devices.length === 0) return '';\n const cols = sortDevices(devices).map((d) => ({\n platform: d.platform,\n kind: d.kind,\n state: d.state,\n version: d.platformVersion ?? '',\n name: d.name,\n id: d.id,\n }));\n const widths = {\n platform: Math.max(8, ...cols.map((c) => c.platform.length)),\n kind: Math.max(9, ...cols.map((c) => c.kind.length)),\n state: Math.max(11, ...cols.map((c) => c.state.length)),\n version: Math.max(7, ...cols.map((c) => c.version.length)),\n name: Math.max(4, ...cols.map((c) => c.name.length)),\n };\n const header = `${[\n 'PLATFORM'.padEnd(widths.platform),\n 'KIND'.padEnd(widths.kind),\n 'STATE'.padEnd(widths.state),\n 'VERSION'.padEnd(widths.version),\n 'NAME'.padEnd(widths.name),\n 'ID',\n ].join(' ')}\\n`;\n const body = cols\n .map((c) =>\n [\n c.platform.padEnd(widths.platform),\n c.kind.padEnd(widths.kind),\n c.state.padEnd(widths.state),\n c.version.padEnd(widths.version),\n c.name.padEnd(widths.name),\n c.id,\n ].join(' '),\n )\n .join('\\n');\n return `${header + body}\\n`;\n}\n","import { log } from '@appium/logger';\n\nlet quieted = false;\n\n// `appium-ios-device` and `appium-adb` log routine probe failures (e.g. \"usbmuxd\n// socket missing\", \"no adb devices\") at debug level through @appium/support's\n// shared logger, whose first `getLogger` call (made when those libraries are\n// imported) forces the process-global @appium/logger level to \"verbose\". Left\n// alone, every `aco device list` on a machine with no real device spews a\n// usbmuxd/adb stack trace to stderr. We lower that shared global level to \"warn\"\n// so genuine warnings/errors still surface but the expected no-device-connected\n// probes stay quiet; we report real failures as our own friendly notes instead.\n//\n// This must run *after* the appium libraries are imported (which it does -- it\n// is called from inside the listers, well after their top-level imports), so the\n// libraries' own \"default to verbose\" initialization does not clobber it.\nexport function quietAppiumLog(): void {\n if (quieted) return;\n log.level = 'warn';\n quieted = true;\n}\n","import type { VerboseDevice } from 'appium-adb';\nimport { quietAppiumLog } from './appium-log.js';\nimport type { Device, DeviceState, ListResult } from './types.js';\n\n// adb's `state` vocabulary -> aco's DeviceState.\nfunction mapAdbState(adbState: string): DeviceState {\n if (adbState === 'device') return 'booted'; // reachable & authorized\n if (adbState === 'offline') return 'unavailable';\n return 'unknown'; // unauthorized, bootloader, ...\n}\n\nexport async function listAndroidRealDevices(): Promise<ListResult> {\n // Loaded lazily: `appium-adb` pulls in `@appium/support` -> `read-pkg`\n // (ESM-only) -> `unicorn-magic`, whose subpath exports the `tsx` dev runtime\n // cannot resolve. A static top-level import would crash the whole CLI at\n // startup under `pnpm dev`; a guarded dynamic import degrades to a note there\n // while staying fully functional under the built `node dist` runtime.\n let ADB: typeof import('appium-adb').ADB;\n try {\n ({ ADB } = await import('appium-adb'));\n } catch (err) {\n return {\n devices: [],\n notes: [\n `Android real-device discovery unavailable in this runtime: ${(err as Error).message}`,\n ],\n };\n }\n quietAppiumLog();\n\n let adb: import('appium-adb').ADB;\n try {\n adb = await ADB.createADB();\n } catch (err) {\n return {\n devices: [],\n notes: [\n `Android real devices skipped: ${(err as Error).message}. Ensure the Android SDK platform-tools (adb) are installed and on PATH (set $ANDROID_HOME / $ANDROID_SDK_ROOT).`,\n ],\n };\n }\n\n const notes: string[] = [];\n // `adb devices -l` long format (verbose): serial, state, and trailing\n // descriptors (`product:` / `model:` / `device:` / `transport_id:`). The\n // `model:` descriptor carries the AVD name for emulators, which lets us\n // reconcile a running emulator against its AVD `.ini` definition row.\n let connected: VerboseDevice[];\n let emulatorSerials: Set<string>;\n try {\n connected = await adb.getConnectedDevices({ verbose: true });\n const emulators = await adb.getConnectedEmulators();\n emulatorSerials = new Set(emulators.map((e) => e.udid));\n } catch (err) {\n return {\n devices: [],\n notes: [`Android real devices skipped: ${(err as Error).message}.`],\n };\n }\n\n const devices: Device[] = [];\n for (const d of connected) {\n const isEmulator = emulatorSerials.has(d.udid) || /^emulator-/.test(d.udid);\n let platformVersion: string | undefined;\n if (d.state === 'device') {\n try {\n platformVersion = await adb\n .clone({ udid: d.udid })\n .getPlatformVersion();\n } catch {\n notes.push(\n `Android device ${d.udid}: could not read platform version.`,\n );\n }\n } else if (d.state === 'unauthorized') {\n notes.push(\n `Android device ${d.udid} is unauthorized -- accept the \"Allow USB debugging\" prompt on the device, then re-run.`,\n );\n }\n devices.push({\n id: d.udid,\n // The `model:` descriptor from the long format gives a friendly label\n // (the AVD name for emulators, the product model for handsets); fall back\n // to the serial when adb omits it.\n name: d.model || d.udid,\n platform: 'android',\n kind: isEmulator ? 'emulator' : 'real',\n // `avdName` carries the running emulator's AVD identity so the merge step\n // in index.ts can collapse the matching `.ini` definition row into this one.\n avdName: isEmulator ? d.model : undefined,\n state: mapAdbState(d.state),\n platformVersion,\n });\n }\n return { devices, notes };\n}\n\nexport { mapAdbState };\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Device, ListResult } from './types.js';\n\ninterface ResolvedAvdDir {\n dir: string;\n notes: string[];\n}\n\nfunction resolveAvdDir(): ResolvedAvdDir | null {\n const notes: string[] = [];\n const candidates: Array<{ path: string | undefined; suffix?: string }> = [\n { path: process.env.ANDROID_AVD_HOME },\n { path: process.env.ANDROID_EMULATOR_HOME, suffix: 'avd' },\n { path: join(homedir(), '.android'), suffix: 'avd' },\n ];\n for (const c of candidates) {\n if (!c.path) continue;\n const full = c.suffix ? join(c.path, c.suffix) : c.path;\n try {\n if (statSync(full).isDirectory()) {\n return { dir: full, notes };\n }\n notes.push(`Android: ${full} exists but is not a directory; skipping.`);\n } catch {\n // ENOENT — try next candidate\n }\n }\n return null;\n}\n\ninterface AvdIniMeta {\n target?: string;\n apiLevel?: string;\n path?: string;\n}\n\nfunction parseAvdIni(iniPath: string): AvdIniMeta {\n let raw: string;\n try {\n raw = readFileSync(iniPath, 'utf8');\n } catch {\n return {};\n }\n const m: AvdIniMeta = {};\n for (const line of raw.split('\\n')) {\n const eq = line.indexOf('=');\n if (eq < 0) continue;\n const k = line.slice(0, eq).trim();\n const v = line.slice(eq + 1).trim();\n if (k === 'target') m.target = v;\n if (k === 'path') m.path = v;\n }\n if (m.target) {\n const apiMatch = /^android-(\\d+)$/.exec(m.target);\n if (apiMatch) m.apiLevel = apiMatch[1];\n }\n return m;\n}\n\nexport async function listAndroidAvds(): Promise<ListResult> {\n const resolved = resolveAvdDir();\n if (!resolved) {\n return {\n devices: [],\n notes: [\n 'Android skipped: no AVD directory found. ' +\n 'Set $ANDROID_AVD_HOME, $ANDROID_EMULATOR_HOME, or create ' +\n '~/.android/avd (Android Studio does this on first AVD).',\n ],\n };\n }\n\n const entries = readdirSync(resolved.dir);\n const out: Device[] = [];\n for (const f of entries) {\n if (!f.endsWith('.ini')) continue;\n const name = f.slice(0, -'.ini'.length);\n const iniPath = join(resolved.dir, f);\n const meta = parseAvdIni(iniPath);\n out.push({\n id: name,\n name,\n platform: 'android',\n kind: 'emulator',\n state: 'unknown',\n platformVersion: meta.apiLevel,\n runtime: meta.target,\n });\n }\n return { devices: out, notes: resolved.notes };\n}\n","import { quietAppiumLog } from './appium-log.js';\nimport type { Device, ListResult } from './types.js';\n\nexport async function listIosRealDevices(): Promise<ListResult> {\n // Loaded lazily: `appium-ios-device` pulls in `@appium/support` ->\n // `read-pkg` (ESM-only) -> `unicorn-magic`, whose subpath exports the `tsx`\n // dev runtime cannot resolve. A static top-level import would crash the whole\n // CLI at startup under `pnpm dev`; a guarded dynamic import degrades to a note\n // there while staying fully functional under the built `node dist` runtime.\n let utilities: typeof import('appium-ios-device').utilities;\n try {\n ({ utilities } = await import('appium-ios-device'));\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS real-device discovery unavailable in this runtime: ${(err as Error).message}`,\n ],\n };\n }\n quietAppiumLog();\n\n let udids: string[];\n try {\n udids = await utilities.getConnectedDevices();\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS real devices skipped: ${(err as Error).message}. Connect the device via USB and trust this computer.`,\n ],\n };\n }\n\n const devices: Device[] = [];\n const notes: string[] = [];\n for (const udid of udids) {\n let name = udid;\n let platformVersion: string | undefined;\n try {\n name = await utilities.getDeviceName(udid);\n } catch {\n notes.push(\n `iOS real device ${udid}: could not read name (locked/untrusted?).`,\n );\n }\n try {\n platformVersion = await utilities.getOSVersion(udid);\n } catch {\n // leave version blank\n }\n devices.push({\n id: udid,\n name,\n platform: 'ios',\n kind: 'real',\n // A connected, trusted device is reachable -> treat as \"booted\" so it\n // ranks first and shows under the default `--state available` filter.\n state: 'booted',\n platformVersion,\n });\n }\n return { devices, notes };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Device, DeviceState, ListResult } from './types.js';\n\nconst execFileP = promisify(execFile);\n\ninterface SimctlListDeviceEntry {\n udid: string;\n name: string;\n state: string;\n isAvailable?: boolean;\n availability?: string;\n}\n\ninterface SimctlListDevicesJson {\n devices: Record<string, SimctlListDeviceEntry[]>;\n}\n\nconst RUNTIME_PREFIX = 'com.apple.CoreSimulator.SimRuntime.';\n\nfunction runtimeToVersion(runtime: string): string | undefined {\n const m = /(\\d+(?:\\.\\d+){0,2})$/.exec(runtime);\n return m?.[1];\n}\n\nfunction mapIosState(e: SimctlListDeviceEntry): DeviceState {\n if (e.isAvailable === false) return 'unavailable';\n if (\n typeof e.availability === 'string' &&\n /unavailable/i.test(e.availability)\n ) {\n return 'unavailable';\n }\n if (e.state === 'Booted') return 'booted';\n return 'available';\n}\n\nexport async function listIosSimulators(): Promise<ListResult> {\n let raw: string;\n try {\n const { stdout } = await execFileP(\n 'xcrun',\n ['simctl', 'list', '-j', 'devices'],\n { maxBuffer: 16 * 1024 * 1024 },\n );\n raw = stdout;\n } catch (err) {\n const e = err as NodeJS.ErrnoException & { stderr?: string };\n if (e.code === 'ENOENT') {\n return {\n devices: [],\n notes: [\n 'iOS skipped: `xcrun` not found on PATH. ' +\n 'Install Xcode command line tools: `xcode-select --install`.',\n ],\n };\n }\n if (\n typeof e.stderr === 'string' &&\n /unable to find utility \"simctl\"/i.test(e.stderr)\n ) {\n return {\n devices: [],\n notes: [\n 'iOS skipped: `xcrun simctl` not available. ' +\n 'Install Xcode (not just the CLT) and run ' +\n '`sudo xcode-select -s /Applications/Xcode.app`.',\n ],\n };\n }\n return {\n devices: [],\n notes: [`iOS skipped: ${e.message}`],\n };\n }\n\n let parsed: SimctlListDevicesJson;\n try {\n parsed = JSON.parse(raw) as SimctlListDevicesJson;\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS skipped: failed to parse simctl JSON: ${(err as Error).message}`,\n ],\n };\n }\n\n const out: Device[] = [];\n for (const [rawRuntime, entries] of Object.entries(parsed.devices ?? {})) {\n const runtime = rawRuntime.startsWith(RUNTIME_PREFIX)\n ? rawRuntime.slice(RUNTIME_PREFIX.length).replace(/-/g, '.')\n : rawRuntime;\n const platformVersion = runtimeToVersion(runtime);\n for (const e of entries) {\n out.push({\n id: e.udid,\n name: e.name,\n platform: 'ios',\n kind: 'simulator',\n state: mapIosState(e),\n platformVersion,\n runtime,\n });\n }\n }\n return { devices: out, notes: [] };\n}\n","import { listAndroidRealDevices } from './android-real.js';\nimport { listAndroidAvds } from './android.js';\nimport { listIosRealDevices } from './ios-real.js';\nimport { listIosSimulators } from './ios.js';\nimport type { ListResult, Platform } from './types.js';\n\nexport type {\n Device,\n DeviceKind,\n DeviceState,\n ListResult,\n Platform,\n} from './types.js';\n\nexport { listIosSimulators } from './ios.js';\nexport { listIosRealDevices } from './ios-real.js';\nexport { listAndroidAvds } from './android.js';\nexport { listAndroidRealDevices } from './android-real.js';\n\nfunction merge(results: ListResult[]): ListResult {\n return {\n devices: results.flatMap((r) => r.devices),\n notes: results.flatMap((r) => r.notes),\n };\n}\n\nexport async function listIos(): Promise<ListResult> {\n return merge(await Promise.all([listIosSimulators(), listIosRealDevices()]));\n}\n\nexport async function listAndroid(): Promise<ListResult> {\n const [avds, real] = await Promise.all([\n listAndroidAvds(),\n listAndroidRealDevices(),\n ]);\n // Reconcile: a running emulator shows up both as an AVD `.ini` definition\n // (id = AVD name) and as an adb serial (id = emulator-5554, avdName = AVD\n // name). Drop the `.ini` row whose name matches a running emulator's avdName\n // so the booted instance is the single source of truth for that AVD.\n const runningAvdNames = new Set(\n real.devices\n .filter((d) => d.kind === 'emulator' && d.avdName)\n .map((d) => d.avdName as string),\n );\n const avdDefs = {\n ...avds,\n devices: avds.devices.filter((d) => !runningAvdNames.has(d.name)),\n };\n return merge([avdDefs, real]);\n}\n\nexport async function listAllDevices(platform?: Platform): Promise<ListResult> {\n if (platform === 'ios') return listIos();\n if (platform === 'android') return listAndroid();\n return merge(await Promise.all([listIos(), listAndroid()]));\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { renderTable, sortDevices } from '../../lib/devices/format.js';\nimport {\n type Device,\n type Platform,\n listAllDevices,\n} from '../../lib/devices/index.js';\n\ntype StateFilter = 'available' | 'booted' | 'all';\n\nconst STATE_FILTERS: Record<StateFilter, (d: Device) => boolean> = {\n available: (d) => d.state !== 'unavailable',\n booted: (d) => d.state === 'booted',\n all: () => true,\n};\n\nfunction isStateFilter(value: string): value is StateFilter {\n return value === 'available' || value === 'booted' || value === 'all';\n}\n\nexport function registerDeviceList(device: Command): void {\n device\n .command('list')\n .description(\n 'list iOS Simulators + connected iPhones/iPads and Android AVDs + ' +\n 'connected handsets/emulators that you can pass to `aco session start`',\n )\n .option(\n '-p, --platform <ios|android>',\n 'restrict to one platform (default: both)',\n )\n .option(\n '--state <available|booted|all>',\n 'filter rows by state',\n 'available',\n )\n .option('--json', 'emit JSON instead of a human-readable table')\n .action(async (opts) => {\n let platform: Platform | undefined;\n if (opts.platform) {\n const p = opts.platform.toLowerCase();\n if (p !== 'ios' && p !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${opts.platform}\")`,\n );\n }\n platform = p;\n }\n\n const stateRaw = (opts.state ?? 'available').toLowerCase();\n if (!isStateFilter(stateRaw)) {\n throw new Error(\n `--state must be \"available\", \"booted\", or \"all\" (got \"${opts.state}\")`,\n );\n }\n const filter = STATE_FILTERS[stateRaw];\n\n const { devices, notes } = await listAllDevices(platform);\n const filtered = devices.filter(filter);\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ devices: sortDevices(filtered), notes }, null, 2)}\\n`,\n );\n return;\n }\n\n for (const n of notes) process.stderr.write(`aco: ${n}\\n`);\n\n if (filtered.length === 0) {\n const hint =\n platform === 'ios'\n ? 'Install simulator runtimes via Xcode > Settings > Platforms.'\n : platform === 'android'\n ? 'Create an AVD via Android Studio > Virtual Device Manager.'\n : 'Install Xcode runtimes and/or an Android AVD first.';\n process.stderr.write(`no devices found. ${hint}\\n`);\n return;\n }\n\n process.stdout.write(renderTable(filtered));\n process.stderr.write(\n 'tip: pass a row ID to `--udid` (real device or iOS simulator) ' +\n 'or a NAME to `--avd` (Android emulator)\\n',\n );\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerDeviceList } from './list.js';\n\nexport function registerDevice(program: Command): void {\n const device = program\n .command('device')\n .description('discover iOS Simulators and Android AVDs to target');\n registerDeviceList(device);\n}\n","export const W3C_ELEMENT_ID = 'element-6066-11e4-a52e-4f735466cecf';\n\nexport const STRATEGIES = [\n 'accessibility id',\n 'xpath',\n 'class name',\n 'css selector',\n '-ios predicate string',\n '-ios class chain',\n '-android uiautomator',\n '-android viewtag',\n 'id',\n] as const;\n\nexport function unwrapElementId(ref: Record<string, string>): string {\n // The raw W3C findElement command resolves to a `{ error, message }` value\n // on no-match rather than rejecting, so surface it as a real failure\n // instead of JSON-stringifying the error object as if it were an id.\n if (ref && typeof ref === 'object' && 'error' in ref) {\n throw new Error(ref.message || ref.error || 'no such element');\n }\n return ref[W3C_ELEMENT_ID] ?? ref.ELEMENT ?? JSON.stringify(ref);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { unwrapElementId } from '../../lib/locator.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementActive(element: Command): void {\n addConnectionFlags(\n element\n .command('active')\n .description('get the active (focused) element (GET /element/active)'),\n ).action(async (opts) => {\n const id = await runWithSession(opts, async (b) => {\n const el = (await b.getActiveElement()) as Record<string, string>;\n return unwrapElementId(el);\n });\n process.stdout.write(`${JSON.stringify(id)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementAttribute(element: Command): void {\n addConnectionFlags(\n element\n .command('attribute')\n .description(\n 'read an element attribute (GET /element/:id/attribute/:name)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-n, --name <attr>', 'attribute name')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementAttribute(opts.element, opts.name),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementClear(element: Command): void {\n addConnectionFlags(\n element\n .command('clear')\n .description('clear an element (POST /element/:id/clear)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.elementClear(opts.element));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementClick(element: Command): void {\n addConnectionFlags(\n element\n .command('click')\n .description('click an element by id (POST /element/:id/click)'),\n )\n .requiredOption(\n '-e, --element <id>',\n 'element id (from `aco element find`)',\n )\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.elementClick(opts.element));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementDisplayed(element: Command): void {\n addConnectionFlags(\n element\n .command('displayed')\n .description('is the element displayed? (GET /element/:id/displayed)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementDisplayed(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementEnabled(element: Command): void {\n addConnectionFlags(\n element\n .command('enabled')\n .description('is the element enabled? (GET /element/:id/enabled)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementEnabled(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { STRATEGIES, unwrapElementId } from '../../lib/locator.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementFind(element: Command): void {\n addConnectionFlags(\n element\n .command('find')\n .description('find a single element (POST /element)'),\n )\n .requiredOption(\n '-u, --using <strategy>',\n `locator strategy (${STRATEGIES.join(', ')})`,\n )\n .requiredOption('-v, --value <value>', 'locator value')\n .option('--all', 'find all matching elements (POST /elements)')\n .action(async (opts) => {\n const result = await runWithSession(opts, async (b) => {\n if (opts.all) {\n const els = (await b.findElements(opts.using, opts.value)) as Record<\n string,\n string\n >[];\n return els.map(unwrapElementId);\n }\n const el = (await b.findElement(opts.using, opts.value)) as Record<\n string,\n string\n >;\n return unwrapElementId(el);\n });\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementProperty(element: Command): void {\n addConnectionFlags(\n element\n .command('property')\n .description(\n 'read an element property (GET /element/:id/property/:name)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-n, --name <prop>', 'property name')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementProperty(opts.element, opts.name),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementRect(element: Command): void {\n addConnectionFlags(\n element\n .command('rect')\n .description(\n 'get the element rect {x,y,width,height} (GET /element/:id/rect)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementRect(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementSelected(element: Command): void {\n addConnectionFlags(\n element\n .command('selected')\n .description('is the element selected? (GET /element/:id/selected)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementSelected(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementSendKeys(element: Command): void {\n addConnectionFlags(\n element\n .command('send-keys')\n .description('send keys to an element (POST /element/:id/value)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-t, --text <value>', 'text to type')\n .action(async (opts) => {\n await runWithSession(opts, (b) =>\n b.elementSendKeys(opts.element, opts.text),\n );\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementText(element: Command): void {\n addConnectionFlags(\n element\n .command('text')\n .description(\"read an element's text (GET /element/:id/text)\"),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const text = await runWithSession(opts, (b) =>\n b.getElementText(opts.element),\n );\n process.stdout.write(`${text}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerElementActive } from './active.js';\nimport { registerElementAttribute } from './attribute.js';\nimport { registerElementClear } from './clear.js';\nimport { registerElementClick } from './click.js';\nimport { registerElementDisplayed } from './displayed.js';\nimport { registerElementEnabled } from './enabled.js';\nimport { registerElementFind } from './find.js';\nimport { registerElementProperty } from './property.js';\nimport { registerElementRect } from './rect.js';\nimport { registerElementSelected } from './selected.js';\nimport { registerElementSendKeys } from './send-keys.js';\nimport { registerElementText } from './text.js';\n\nexport function registerElement(program: Command): void {\n const element = program\n .command('element')\n .description('W3C element commands');\n registerElementFind(element);\n registerElementActive(element);\n registerElementClick(element);\n registerElementText(element);\n registerElementSendKeys(element);\n registerElementAttribute(element);\n registerElementProperty(element);\n registerElementDisplayed(element);\n registerElementEnabled(element);\n registerElementSelected(element);\n registerElementRect(element);\n registerElementClear(element);\n}\n","import { DOMParser } from '@xmldom/xmldom';\nimport type { Platform } from './connection.js';\nimport { AcoUserError } from './errors.js';\n\nexport interface ElementRow {\n index: number;\n type: string;\n label: string;\n accessibilityId?: string;\n value?: string;\n selector: string;\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nconst ATTRS = {\n ios: { a11y: 'name', text: 'label', value: 'value' },\n android: { a11y: 'content-desc', text: 'text', value: 'text' },\n} as const;\n\nfunction esc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction attr(el: Element, name: string): string {\n return el.getAttribute(name)?.trim() ?? '';\n}\n\nfunction rectOf(\n platform: Platform,\n el: Element,\n): ElementRow['rect'] | undefined {\n if (platform === 'ios') {\n const n = (k: string) => Number.parseFloat(el.getAttribute(k) ?? '');\n const x = n('x');\n const y = n('y');\n const width = n('width');\n const height = n('height');\n if ([x, y, width, height].every(Number.isFinite)) {\n return { x, y, width, height };\n }\n return undefined;\n }\n const m = (el.getAttribute('bounds') ?? '').match(\n /\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]/,\n );\n if (!m) return undefined;\n const x1 = Number(m[1]);\n const y1 = Number(m[2]);\n const x2 = Number(m[3]);\n const y2 = Number(m[4]);\n return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };\n}\n\nfunction selectorFor(\n platform: Platform,\n a11y: string,\n text: string,\n): string | undefined {\n if (a11y) return `accessibility id:${a11y}`;\n if (text) {\n return platform === 'ios'\n ? `-ios predicate string:label == \"${esc(text)}\"`\n : `-android uiautomator:new UiSelector().text(\"${esc(text)}\")`;\n }\n return undefined;\n}\n\nexport function listElements(\n xml: string,\n platform: Platform,\n opts: { limit?: number } = {},\n): ElementRow[] {\n const parseErrors: string[] = [];\n let doc: ReturnType<DOMParser['parseFromString']>;\n try {\n doc = new DOMParser({\n onError: (level, msg) => {\n if (level === 'error' || level === 'fatalError') parseErrors.push(msg);\n },\n }).parseFromString(xml, 'text/xml');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`could not parse page source as XML: ${msg}`);\n }\n if (parseErrors.length > 0) {\n throw new AcoUserError(\n `could not parse page source as XML: ${parseErrors[0]}`,\n );\n }\n\n const a = ATTRS[platform];\n const rows: ElementRow[] = [];\n\n const walk = (node: Element) => {\n const tag = node.tagName ?? node.nodeName;\n\n const a11y = attr(node, a.a11y);\n const text = attr(node, a.text);\n const value = a.value !== a.text ? attr(node, a.value) : '';\n\n const selector = selectorFor(platform, a11y, text || value);\n if (selector) {\n rows.push({\n index: rows.length,\n type: tag,\n label: text || a11y || value,\n accessibilityId: a11y || undefined,\n value: value || undefined,\n selector,\n rect: rectOf(platform, node),\n });\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n if (child?.nodeType === 1) walk(child as unknown as Element);\n }\n };\n\n const root = doc.documentElement;\n if (root) walk(root as unknown as Element);\n\n return opts.limit != null ? rows.slice(0, opts.limit) : rows;\n}\n\nexport function formatRows(rows: ElementRow[]): string {\n if (rows.length === 0) {\n return 'no labelled elements found on the current screen';\n }\n return rows\n .map((r) => {\n const rect = r.rect\n ? `\\n rect: ${r.rect.x},${r.rect.y} ${r.rect.width}x${r.rect.height}`\n : '';\n return (\n `#${r.index} ${r.type} ${JSON.stringify(r.label)}\\n` +\n ` selector: ${r.selector}${rect}`\n );\n })\n .join('\\n');\n}\n","export class AcoUserError extends Error {}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { formatRows, listElements } from '../lib/list-elements.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerElements(program: Command): void {\n addConnectionFlags(\n program\n .command('elements')\n .description(\n 'list on-screen elements that carry text (name/label/value or ' +\n 'content-desc/text), each with a ready-to-paste selector for `aco tap`',\n ),\n )\n .option('--json', 'emit machine-readable rows instead of the human list')\n .option('--limit <n>', 'cap the number of rows', (v) => {\n const n = Number.parseInt(v, 10);\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`--limit must be a non-negative integer (got \"${v}\")`);\n }\n return n;\n })\n .action(async (opts) => {\n const rows = await runWithSession(opts, async (b, platform) => {\n const xml = await b.getPageSource();\n return listElements(xml, platform, { limit: opts.limit });\n });\n const out = opts.json ? JSON.stringify(rows, null, 2) : formatRows(rows);\n process.stdout.write(`${out}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerMobileCall(mobile: Command): void {\n addConnectionFlags(\n mobile\n .command('call')\n .description(\n 'invoke any mobile: extension by name with a JSON args blob ' +\n '(unvalidated escape hatch; prefer `aco ios`/`aco android` for ' +\n 'first-class commands)',\n ),\n )\n .requiredOption(\n '-n, --name <mobile:xxx>',\n 'the mobile: command, including the \"mobile: \" prefix',\n )\n .option('-a, --args <json>', 'arguments object as JSON', '{}')\n .action(async (opts) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args) as Record<string, unknown>;\n } catch (err) {\n throw new Error(`--args must be valid JSON: ${(err as Error).message}`);\n }\n const result = await runWithSession(opts, (b) =>\n b.execute(opts.name, args),\n );\n process.stdout.write(`${JSON.stringify(result ?? null)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags, resolveConnection } from '../../lib/connection.js';\n\nexport function registerMobileList(mobile: Command): void {\n addConnectionFlags(\n mobile\n .command('list')\n .description(\n 'list mobile: extensions the connected driver advertises ' +\n '(GET /session/:id/appium/extensions)',\n ),\n )\n .option('--json', 'emit the raw endpoint payload as JSON')\n .action(async (opts) => {\n const { conn } = resolveConnection(opts);\n const base =\n conn.basePath === '/' ? '' : conn.basePath.replace(/\\/$/, '');\n const url =\n `${conn.protocol}://${conn.hostname}:${conn.port}` +\n `${base}/session/${conn.sessionId}/appium/extensions`;\n\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `listExtensions failed: ${res.status} ${res.statusText}`,\n );\n }\n const body = (await res.json()) as {\n value?: { rest?: { driver?: Record<string, unknown> } };\n };\n const driver = body.value?.rest?.driver ?? {};\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify(body.value ?? body, null, 2)}\\n`,\n );\n return;\n }\n for (const name of Object.keys(driver)) {\n process.stdout.write(`${name}\\n`);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerMobileCall } from './call.js';\nimport { registerMobileList } from './list.js';\n\nexport function registerMobile(program: Command): void {\n const mobile = program\n .command('mobile')\n .description('inspect and call mobile: execute extensions');\n registerMobileList(mobile);\n registerMobileCall(mobile);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nconst ORIENTATIONS = ['PORTRAIT', 'LANDSCAPE'] as const;\n\nexport function registerOrientation(program: Command): void {\n const orientation = program\n .command('orientation')\n .description('read / set the device orientation (JSONWP /orientation)');\n\n addConnectionFlags(\n orientation\n .command('get')\n .description('print the current device orientation (GET /orientation)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getOrientation());\n process.stdout.write(`${value}\\n`);\n });\n\n addConnectionFlags(\n orientation\n .command('set')\n .description('set the device orientation (POST /orientation)'),\n )\n .argument('<orientation>', 'PORTRAIT or LANDSCAPE')\n .action(async (orientationArg, opts) => {\n const normalized = orientationArg.toUpperCase();\n if (!(ORIENTATIONS as readonly string[]).includes(normalized)) {\n throw new Error(\n `invalid orientation \"${orientationArg}\": expected PORTRAIT or LANDSCAPE`,\n );\n }\n await runWithSession(opts, (b) => b.setOrientation(normalized));\n process.stdout.write('ok\\n');\n });\n}\n","{\n \"drivers\": [\n {\n \"package\": \"appium-uiautomator2-driver\",\n \"version\": \"7.5.2\"\n },\n {\n \"package\": \"appium-android-driver\",\n \"version\": \"13.2.3\"\n }\n ],\n \"extensions\": {\n \"mobile: shell\": {\n \"command\": \"mobileShell\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"includeStderr\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: execEmuConsoleCommand\": {\n \"command\": \"mobileExecEmuConsoleCommand\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"execTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"connTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"initTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startLogsBroadcast\": {\n \"command\": \"mobileStartLogsBroadcast\",\n \"params\": []\n },\n \"mobile: stopLogsBroadcast\": {\n \"command\": \"mobileStopLogsBroadcast\",\n \"params\": []\n },\n \"mobile: changePermissions\": {\n \"command\": \"mobileChangePermissions\",\n \"params\": [\n {\n \"name\": \"permissions\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appPackage\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"target\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPermissions\": {\n \"command\": \"mobileGetPermissions\",\n \"params\": [\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appPackage\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: performEditorAction\": {\n \"command\": \"mobilePerformEditorAction\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getDeviceTime\": {\n \"command\": \"mobileGetDeviceTime\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startScreenStreaming\": {\n \"command\": \"mobileStartScreenStreaming\",\n \"params\": [\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"bitRate\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"host\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"port\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"pathname\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"tcpPort\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"quality\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"considerRotation\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"logPipelineDetails\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: stopScreenStreaming\": {\n \"command\": \"mobileStopScreenStreaming\",\n \"params\": []\n },\n \"mobile: getNotifications\": {\n \"command\": \"mobileGetNotifications\",\n \"params\": []\n },\n \"mobile: listSms\": {\n \"command\": \"mobileListSms\",\n \"params\": []\n },\n \"mobile: pushFile\": {\n \"command\": \"pushFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFolder\": {\n \"command\": \"pullFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFile\": {\n \"command\": \"pullFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFile\": {\n \"command\": \"mobileDeleteFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isAppInstalled\": {\n \"command\": \"mobileIsAppInstalled\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listApps\": {\n \"command\": \"mobileListApps\",\n \"params\": [\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: queryAppState\": {\n \"command\": \"queryAppState\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activateApp\": {\n \"command\": \"activateApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: removeApp\": {\n \"command\": \"mobileRemoveApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"keepData\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"skipInstallCheck\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: terminateApp\": {\n \"command\": \"mobileTerminateApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installApp\": {\n \"command\": \"mobileInstallApp\",\n \"params\": [\n {\n \"name\": \"appPath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"checkVersion\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"allowTestPackages\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"useSdcard\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"grantPermissions\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"replace\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"noIncremental\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: clearApp\": {\n \"command\": \"mobileClearApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: backgroundApp\": {\n \"command\": \"mobileBackgroundApp\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startService\": {\n \"command\": \"mobileStartService\",\n \"params\": [\n {\n \"name\": \"foreground\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopService\": {\n \"command\": \"mobileStopService\",\n \"params\": [\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startActivity\": {\n \"command\": \"mobileStartActivity\",\n \"params\": [\n {\n \"name\": \"wait\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"stop\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"windowingMode\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"activityType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"display\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: broadcast\": {\n \"command\": \"mobileBroadcast\",\n \"params\": [\n {\n \"name\": \"receiverPermission\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"allowBackgroundActivityStarts\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getContexts\": {\n \"command\": \"mobileGetContexts\",\n \"params\": [\n {\n \"name\": \"waitForWebviewMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getChromeCapabilities\": {\n \"command\": \"mobileGetChromeCapabilities\",\n \"params\": []\n },\n \"mobile: lock\": {\n \"command\": \"lock\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: unlock\": {\n \"command\": \"mobileUnlock\",\n \"params\": [\n {\n \"name\": \"key\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"strategy\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: isLocked\": {\n \"command\": \"isLocked\",\n \"params\": []\n },\n \"mobile: refreshGpsCache\": {\n \"command\": \"mobileRefreshGpsCache\",\n \"params\": [\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startMediaProjectionRecording\": {\n \"command\": \"mobileStartMediaProjectionRecording\",\n \"params\": [\n {\n \"name\": \"resolution\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"priority\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxDurationSec\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"filename\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isMediaProjectionRecordingRunning\": {\n \"command\": \"mobileIsMediaProjectionRecordingRunning\",\n \"params\": []\n },\n \"mobile: stopMediaProjectionRecording\": {\n \"command\": \"mobileStopMediaProjectionRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uploadTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getConnectivity\": {\n \"command\": \"mobileGetConnectivity\",\n \"params\": [\n {\n \"name\": \"services\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setConnectivity\": {\n \"command\": \"mobileSetConnectivity\",\n \"params\": [\n {\n \"name\": \"wifi\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"data\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"airplaneMode\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: hideKeyboard\": {\n \"command\": \"hideKeyboard\",\n \"params\": []\n },\n \"mobile: isKeyboardShown\": {\n \"command\": \"isKeyboardShown\",\n \"params\": []\n },\n \"mobile: deviceidle\": {\n \"command\": \"mobileDeviceidle\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"packages\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: bluetooth\": {\n \"command\": \"mobileBluetooth\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: nfc\": {\n \"command\": \"mobileNfc\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setUiMode\": {\n \"command\": \"mobileSetUiMode\",\n \"params\": [\n {\n \"name\": \"mode\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"value\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getUiMode\": {\n \"command\": \"mobileGetUiMode\",\n \"params\": [\n {\n \"name\": \"mode\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: injectEmulatorCameraImage\": {\n \"command\": \"mobileInjectEmulatorCameraImage\",\n \"params\": [\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sendTrimMemory\": {\n \"command\": \"mobileSendTrimMemory\",\n \"params\": [\n {\n \"name\": \"pkg\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"level\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPerformanceData\": {\n \"command\": \"mobileGetPerformanceData\",\n \"params\": [\n {\n \"name\": \"packageName\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"dataType\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPerformanceDataTypes\": {\n \"command\": \"getPerformanceDataTypes\",\n \"params\": []\n },\n \"mobile: toggleGps\": {\n \"command\": \"toggleLocationServices\",\n \"params\": []\n },\n \"mobile: isGpsEnabled\": {\n \"command\": \"isLocationServicesEnabled\",\n \"params\": []\n },\n \"mobile: getDisplayDensity\": {\n \"command\": \"getDisplayDensity\",\n \"params\": []\n },\n \"mobile: getSystemBars\": {\n \"command\": \"getSystemBars\",\n \"params\": []\n },\n \"mobile: statusBar\": {\n \"command\": \"mobilePerformStatusBarCommand\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: fingerprint\": {\n \"command\": \"mobileFingerprint\",\n \"params\": [\n {\n \"name\": \"fingerprintId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sendSms\": {\n \"command\": \"mobileSendSms\",\n \"params\": [\n {\n \"name\": \"phoneNumber\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"message\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmCall\": {\n \"command\": \"mobileGsmCall\",\n \"params\": [\n {\n \"name\": \"phoneNumber\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmSignal\": {\n \"command\": \"mobileGsmSignal\",\n \"params\": [\n {\n \"name\": \"strength\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmVoice\": {\n \"command\": \"mobileGsmVoice\",\n \"params\": [\n {\n \"name\": \"state\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: powerAc\": {\n \"command\": \"mobilePowerAc\",\n \"params\": [\n {\n \"name\": \"state\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: powerCapacity\": {\n \"command\": \"mobilePowerCapacity\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: networkSpeed\": {\n \"command\": \"mobileNetworkSpeed\",\n \"params\": [\n {\n \"name\": \"speed\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sensorSet\": {\n \"command\": \"sensorSet\",\n \"params\": [\n {\n \"name\": \"sensorType\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"value\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getCurrentActivity\": {\n \"command\": \"getCurrentActivity\",\n \"params\": []\n },\n \"mobile: getCurrentPackage\": {\n \"command\": \"getCurrentPackage\",\n \"params\": []\n },\n \"mobile: setGeolocation\": {\n \"command\": \"mobileSetGeolocation\",\n \"params\": [\n {\n \"name\": \"latitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"longitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"altitude\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"satellites\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"bearing\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"accuracy\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getGeolocation\": {\n \"command\": \"mobileGetGeolocation\",\n \"params\": []\n },\n \"mobile: resetGeolocation\": {\n \"command\": \"mobileResetGeolocation\",\n \"params\": []\n },\n \"mobile: setStylusHandwriting\": {\n \"command\": \"setStylusHandwriting\",\n \"params\": [\n {\n \"name\": \"enabled\",\n \"required\": true,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: getAppStrings\": {\n \"command\": \"getStrings\",\n \"params\": [\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragGesture\": {\n \"command\": \"mobileDragGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"startX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"startY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"endX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"endY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: flingGesture\": {\n \"command\": \"mobileFlingGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: doubleClickGesture\": {\n \"command\": \"mobileDoubleClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: clickGesture\": {\n \"command\": \"mobileClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: longClickGesture\": {\n \"command\": \"mobileLongClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"duration\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: pinchCloseGesture\": {\n \"command\": \"mobilePinchCloseGesture\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: pinchOpenGesture\": {\n \"command\": \"mobilePinchOpenGesture\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: swipeGesture\": {\n \"command\": \"mobileSwipeGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: scrollGesture\": {\n \"command\": \"mobileScrollGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: scrollBackTo\": {\n \"command\": \"mobileScrollBackTo\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementToId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scroll\": {\n \"command\": \"mobileScroll\",\n \"params\": [\n {\n \"name\": \"strategy\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"selector\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxSwipes\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: viewportScreenshot\": {\n \"command\": \"mobileViewportScreenshot\",\n \"params\": []\n },\n \"mobile: viewportRect\": {\n \"command\": \"mobileViewPortRect\",\n \"params\": []\n },\n \"mobile: deepLink\": {\n \"command\": \"mobileDeepLink\",\n \"params\": [\n {\n \"name\": \"url\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"waitForLaunch\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: acceptAlert\": {\n \"command\": \"mobileAcceptAlert\",\n \"params\": [\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dismissAlert\": {\n \"command\": \"mobileDismissAlert\",\n \"params\": [\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: batteryInfo\": {\n \"command\": \"mobileGetBatteryInfo\",\n \"params\": []\n },\n \"mobile: deviceInfo\": {\n \"command\": \"mobileGetDeviceInfo\",\n \"params\": []\n },\n \"mobile: openNotifications\": {\n \"command\": \"openNotifications\",\n \"params\": []\n },\n \"mobile: type\": {\n \"command\": \"mobileType\",\n \"params\": [\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: replaceElementValue\": {\n \"command\": \"mobileReplaceElementValue\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installMultipleApks\": {\n \"command\": \"mobileInstallMultipleApks\",\n \"params\": [\n {\n \"name\": \"apks\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"options\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pressKey\": {\n \"command\": \"mobilePressKey\",\n \"params\": [\n {\n \"name\": \"keycode\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"metastate\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"isLongPress\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"source\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: screenshots\": {\n \"command\": \"mobileScreenshots\",\n \"params\": [\n {\n \"name\": \"displayId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scheduleAction\": {\n \"command\": \"mobileScheduleAction\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"steps\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxPass\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"maxFail\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"times\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"intervalMs\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"maxHistoryItems\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getActionHistory\": {\n \"command\": \"mobileGetActionHistory\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: unscheduleAction\": {\n \"command\": \"mobileUnscheduleAction\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setClipboard\": {\n \"command\": \"setClipboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"label\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getClipboard\": {\n \"command\": \"getClipboard\",\n \"params\": []\n },\n \"mobile: resetAccessibilityCache\": {\n \"command\": \"mobileResetAccessibilityCache\",\n \"params\": []\n },\n \"mobile: listWindows\": {\n \"command\": \"mobileListWindows\",\n \"params\": [\n {\n \"name\": \"filters\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"skipScreenshots\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: listDisplays\": {\n \"command\": \"mobileListDisplays\",\n \"params\": []\n }\n }\n}\n","{\n \"drivers\": [\n {\n \"package\": \"appium-xcuitest-driver\",\n \"version\": \"11.9.0\"\n }\n ],\n \"extensions\": {\n \"mobile: tap\": {\n \"command\": \"mobileTap\",\n \"params\": [\n {\n \"name\": \"x\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scroll\": {\n \"command\": \"mobileScroll\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"direction\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"predicateString\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"toVisible\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"distance\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: selectPickerWheelValue\": {\n \"command\": \"mobileSelectPickerWheelValue\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"order\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"offset\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: sendMemoryWarning\": {\n \"command\": \"mobileSendMemoryWarning\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: swipe\": {\n \"command\": \"mobileSwipe\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"velocity\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pinch\": {\n \"command\": \"mobilePinch\",\n \"params\": [\n {\n \"name\": \"scale\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: doubleTap\": {\n \"command\": \"mobileDoubleTap\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: twoFingerTap\": {\n \"command\": \"mobileTwoFingerTap\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: tapWithNumberOfTaps\": {\n \"command\": \"mobileTapWithNumberOfTaps\",\n \"params\": [\n {\n \"name\": \"numberOfTouches\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"numberOfTaps\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: touchAndHold\": {\n \"command\": \"mobileTouchAndHold\",\n \"params\": [\n {\n \"name\": \"duration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragFromToForDuration\": {\n \"command\": \"mobileDragFromToForDuration\",\n \"params\": [\n {\n \"name\": \"duration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromX\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromY\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toX\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toY\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: rotateElement\": {\n \"command\": \"mobileRotateElement\",\n \"params\": [\n {\n \"name\": \"rotation\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragFromToWithVelocity\": {\n \"command\": \"mobileDragFromToWithVelocity\",\n \"params\": [\n {\n \"name\": \"pressDuration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"holdDuration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromElementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"toElementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fromX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toY\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: forcePress\": {\n \"command\": \"mobileForcePress\",\n \"params\": [\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"duration\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"pressure\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scrollToElement\": {\n \"command\": \"mobileScrollToElement\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: alert\": {\n \"command\": \"mobileHandleAlert\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setPasteboard\": {\n \"command\": \"mobileSetPasteboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"encoding\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPasteboard\": {\n \"command\": \"mobileGetPasteboard\",\n \"params\": [\n {\n \"name\": \"encoding\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: source\": {\n \"command\": \"mobileGetSource\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"excludedAttributes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getAppStrings\": {\n \"command\": \"getStrings\",\n \"params\": [\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"stringFile\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getContexts\": {\n \"command\": \"mobileGetContexts\",\n \"params\": [\n {\n \"name\": \"waitForWebviewMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: installApp\": {\n \"command\": \"mobileInstallApp\",\n \"params\": [\n {\n \"name\": \"app\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"checkVersion\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: isAppInstalled\": {\n \"command\": \"mobileIsAppInstalled\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: removeApp\": {\n \"command\": \"mobileRemoveApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: launchApp\": {\n \"command\": \"mobileLaunchApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"arguments\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"environment\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: terminateApp\": {\n \"command\": \"mobileTerminateApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: killApp\": {\n \"command\": \"mobileKillApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: queryAppState\": {\n \"command\": \"mobileQueryAppState\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activateApp\": {\n \"command\": \"mobileActivateApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listApps\": {\n \"command\": \"mobileListApps\",\n \"params\": [\n {\n \"name\": \"applicationType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"returnAttributes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: clearApp\": {\n \"command\": \"mobileClearApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: viewportScreenshot\": {\n \"command\": \"getViewportScreenshot\",\n \"params\": []\n },\n \"mobile: viewportRect\": {\n \"command\": \"getViewportRect\",\n \"params\": []\n },\n \"mobile: startPerfRecord\": {\n \"command\": \"mobileStartPerfRecord\",\n \"params\": [\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"profileName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pid\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopPerfRecord\": {\n \"command\": \"mobileStopPerfRecord\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"profileName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installCertificate\": {\n \"command\": \"mobileInstallCertificate\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"commonName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"isRoot\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: removeCertificate\": {\n \"command\": \"mobileRemoveCertificate\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listCertificates\": {\n \"command\": \"mobileListCertificates\",\n \"params\": []\n },\n \"mobile: startLogsBroadcast\": {\n \"command\": \"mobileStartLogsBroadcast\",\n \"params\": []\n },\n \"mobile: stopLogsBroadcast\": {\n \"command\": \"mobileStopLogsBroadcast\",\n \"params\": []\n },\n \"mobile: batteryInfo\": {\n \"command\": \"mobileGetBatteryInfo\",\n \"params\": []\n },\n \"mobile: performAccessibilityAudit\": {\n \"command\": \"mobilePerformAccessibilityAudit\",\n \"params\": [\n {\n \"name\": \"auditTypes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deviceInfo\": {\n \"command\": \"mobileGetDeviceInfo\",\n \"params\": []\n },\n \"mobile: getDeviceTime\": {\n \"command\": \"mobileGetDeviceTime\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activeAppInfo\": {\n \"command\": \"mobileGetActiveAppInfo\",\n \"params\": []\n },\n \"mobile: deviceScreenInfo\": {\n \"command\": \"getScreenInfo\",\n \"params\": []\n },\n \"mobile: pressButton\": {\n \"command\": \"mobilePressButton\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"durationSeconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: enrollBiometric\": {\n \"command\": \"mobileEnrollBiometric\",\n \"params\": [\n {\n \"name\": \"isEnabled\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: sendBiometricMatch\": {\n \"command\": \"mobileSendBiometricMatch\",\n \"params\": [\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"match\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: isBiometricEnrolled\": {\n \"command\": \"mobileIsBiometricEnrolled\",\n \"params\": []\n },\n \"mobile: clearKeychains\": {\n \"command\": \"mobileClearKeychains\",\n \"params\": []\n },\n \"mobile: getPermission\": {\n \"command\": \"mobileGetPermission\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"service\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setPermission\": {\n \"command\": \"mobileSetPermissions\",\n \"params\": [\n {\n \"name\": \"access\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: resetPermission\": {\n \"command\": \"mobileResetPermission\",\n \"params\": [\n {\n \"name\": \"service\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getAppearance\": {\n \"command\": \"mobileGetAppearance\",\n \"params\": []\n },\n \"mobile: setAppearance\": {\n \"command\": \"mobileSetAppearance\",\n \"params\": [\n {\n \"name\": \"style\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getIncreaseContrast\": {\n \"command\": \"mobileGetIncreaseContrast\",\n \"params\": []\n },\n \"mobile: setIncreaseContrast\": {\n \"command\": \"mobileSetIncreaseContrast\",\n \"params\": [\n {\n \"name\": \"increaseContrast\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: contentSize\": {\n \"command\": \"mobileGetContentSize\",\n \"params\": []\n },\n \"mobile: setContentSize\": {\n \"command\": \"mobileSetContentSize\",\n \"params\": [\n {\n \"name\": \"size\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getClipboard\": {\n \"command\": \"getClipboard\",\n \"params\": [\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setClipboard\": {\n \"command\": \"setClipboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: siriCommand\": {\n \"command\": \"mobileSiriCommand\",\n \"params\": [\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pushFile\": {\n \"command\": \"mobilePushFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFile\": {\n \"command\": \"mobilePullFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFolder\": {\n \"command\": \"mobilePullFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFile\": {\n \"command\": \"mobileDeleteFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFolder\": {\n \"command\": \"mobileDeleteFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: runXCTest\": {\n \"command\": \"mobileRunXCTest\",\n \"params\": [\n {\n \"name\": \"testRunnerBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appUnderTestBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"xctestBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"testType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"env\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: installXCTestBundle\": {\n \"command\": \"mobileInstallXCTestBundle\",\n \"params\": [\n {\n \"name\": \"xctestApp\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listXCTestBundles\": {\n \"command\": \"mobileListXCTestBundles\",\n \"params\": []\n },\n \"mobile: startXCTestScreenRecording\": {\n \"command\": \"mobileStartXctestScreenRecording\",\n \"params\": [\n {\n \"name\": \"fps\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"codec\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getXCTestScreenRecordingInfo\": {\n \"command\": \"mobileGetXctestScreenRecordingInfo\",\n \"params\": []\n },\n \"mobile: stopXCTestScreenRecording\": {\n \"command\": \"mobileStopXctestScreenRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pushNotification\": {\n \"command\": \"mobilePushNotification\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: expectNotification\": {\n \"command\": \"mobileExpectNotification\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutSeconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: performIoHidEvent\": {\n \"command\": \"mobilePerformIoHidEvent\",\n \"params\": [\n {\n \"name\": \"page\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"usage\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"durationSeconds\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: configureLocalization\": {\n \"command\": \"mobileConfigureLocalization\",\n \"params\": [\n {\n \"name\": \"keyboard\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"locale\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: resetLocationService\": {\n \"command\": \"mobileResetLocationService\",\n \"params\": []\n },\n \"mobile: startNetworkMonitor\": {\n \"command\": \"mobileStartNetworkMonitor\",\n \"params\": []\n },\n \"mobile: stopNetworkMonitor\": {\n \"command\": \"mobileStopNetworkMonitor\",\n \"params\": []\n },\n \"mobile: listConditionInducers\": {\n \"command\": \"listConditionInducers\",\n \"params\": []\n },\n \"mobile: enableConditionInducer\": {\n \"command\": \"enableConditionInducer\",\n \"params\": [\n {\n \"name\": \"conditionID\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"profileID\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: disableConditionInducer\": {\n \"command\": \"disableConditionInducer\",\n \"params\": []\n },\n \"mobile: updateSafariPreferences\": {\n \"command\": \"mobileUpdateSafariPreferences\",\n \"params\": [\n {\n \"name\": \"preferences\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: calibrateWebToRealCoordinatesTranslation\": {\n \"command\": \"mobileCalibrateWebToRealCoordinatesTranslation\",\n \"params\": []\n },\n \"mobile: keys\": {\n \"command\": \"mobileKeys\",\n \"params\": [\n {\n \"name\": \"keys\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deepLink\": {\n \"command\": \"mobileDeepLink\",\n \"params\": [\n {\n \"name\": \"url\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"bundleId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setSimulatedLocation\": {\n \"command\": \"mobileSetSimulatedLocation\",\n \"params\": [\n {\n \"name\": \"latitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"longitude\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getSimulatedLocation\": {\n \"command\": \"mobileGetSimulatedLocation\",\n \"params\": []\n },\n \"mobile: resetSimulatedLocation\": {\n \"command\": \"mobileResetSimulatedLocation\",\n \"params\": []\n },\n \"mobile: shake\": {\n \"command\": \"mobileShake\",\n \"params\": []\n },\n \"mobile: startScreenRecording\": {\n \"command\": \"mobileStartScreenRecording\",\n \"params\": [\n {\n \"name\": \"videoType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoQuality\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoFps\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoFilters\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoScale\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pixelFormat\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"forceRestart\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeLimit\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"hardwareAcceleration\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopScreenRecording\": {\n \"command\": \"mobileStopScreenRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startAudioRecording\": {\n \"command\": \"startAudioRecording\",\n \"params\": [\n {\n \"name\": \"audioInput\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeLimit\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioCodec\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioBitrate\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioChannels\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioRate\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"forceRestart\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: stopAudioRecording\": {\n \"command\": \"stopAudioRecording\",\n \"params\": []\n },\n \"mobile: hideKeyboard\": {\n \"command\": \"mobileHideKeyboard\",\n \"params\": [\n {\n \"name\": \"keys\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isKeyboardShown\": {\n \"command\": \"isKeyboardShown\",\n \"params\": []\n },\n \"mobile: lock\": {\n \"command\": \"lock\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: unlock\": {\n \"command\": \"unlock\",\n \"params\": []\n },\n \"mobile: isLocked\": {\n \"command\": \"isLocked\",\n \"params\": []\n },\n \"mobile: backgroundApp\": {\n \"command\": \"background\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: simctl\": {\n \"command\": \"mobileSimctl\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n }\n }\n}\n","import androidManifest from '../data/extensions-android.json' with {\n type: 'json',\n};\nimport iosManifest from '../data/extensions-ios.json' with { type: 'json' };\n\nexport type ParamKind = 'number' | 'boolean' | 'string';\n\nexport interface ParamSpec {\n name: string;\n required: boolean;\n kind: ParamKind;\n}\n\nexport interface ExtensionSpec {\n command: string;\n params: ParamSpec[];\n}\n\nexport type Manifest = Record<string, ExtensionSpec>;\n\nexport interface DriverRef {\n package: string;\n version: string;\n}\n\nexport interface ManifestSnapshot {\n drivers: DriverRef[];\n extensions: Manifest;\n}\n\nexport function loadManifest(platform: 'ios' | 'android'): Manifest {\n const snapshot = (\n platform === 'ios' ? iosManifest : androidManifest\n ) as ManifestSnapshot;\n return snapshot.extensions;\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport {\n type ExtensionSpec,\n type ParamKind,\n loadManifest,\n} from '../lib/manifest.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Platform = 'ios' | 'android';\n\n// \"mobile: doubleTap\" -> \"double-tap\"\nfunction subcommandName(mobileName: string): string {\n return mobileName\n .replace(/^mobile:\\s*/, '')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\n// Coerce a raw CLI string using the param's source-derived kind.\nfunction coerceArg(value: string, kind: ParamKind): unknown {\n switch (kind) {\n case 'number':\n return Number(value);\n case 'boolean':\n return value === 'true';\n default:\n // 'string' -- also the fallback for types we cannot reduce\n // (element IDs, unions, arrays/objects): forwarded as a raw string.\n return value;\n }\n}\n\nfunction registerOneExtension(\n group: Command,\n mobileName: string,\n spec: ExtensionSpec,\n): void {\n const cmd = group\n .command(subcommandName(mobileName))\n .description(`${mobileName} (${spec.command})`);\n\n for (const p of spec.params) {\n const flag = `--${p.name} <value>`;\n const help = `${p.required ? 'required' : 'optional'} param \"${p.name}\" (${p.kind})`;\n if (p.required) cmd.requiredOption(flag, help);\n else cmd.option(flag, help);\n }\n\n addConnectionFlags(cmd).action(async (opts: Record<string, unknown>) => {\n const args: Record<string, unknown> = {};\n for (const p of spec.params) {\n const raw = opts[p.name];\n if (typeof raw === 'string') args[p.name] = coerceArg(raw, p.kind);\n }\n const result = await runWithSession(\n opts as Parameters<typeof runWithSession>[0],\n (b) => b.execute(mobileName, args),\n );\n process.stdout.write(`${JSON.stringify(result ?? null)}\\n`);\n });\n}\n\nfunction registerPlatformExtensions(\n program: Command,\n platform: Platform,\n): void {\n const group = program\n .command(platform)\n .description(\n `${platform === 'ios' ? 'iOS (XCUITest)' : 'Android (UiAutomator2)'} mobile: extensions as first-class commands (generated from the pinned driver source)`,\n );\n for (const [mobileName, spec] of Object.entries(loadManifest(platform))) {\n registerOneExtension(group, mobileName, spec);\n }\n}\n\nexport function registerIos(program: Command): void {\n registerPlatformExtensions(program, 'ios');\n}\n\nexport function registerAndroid(program: Command): void {\n registerPlatformExtensions(program, 'android');\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerScreenshot(program: Command): void {\n addConnectionFlags(\n program\n .command('screenshot')\n .description('take a viewport screenshot (W3C GET /screenshot)'),\n )\n .option('-o, --out <path>', 'write PNG here (default: stdout as base64)')\n .action(async (opts) => {\n const b64 = await runWithSession(opts, (b) => b.takeScreenshot());\n if (opts.out) {\n writeFileSync(opts.out, Buffer.from(b64, 'base64'));\n process.stdout.write(`saved screenshot to ${opts.out}\\n`);\n } else {\n process.stdout.write(b64);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nexport function registerScrollIntoView(program: Command): void {\n addConnectionFlags(\n program\n .command('scroll-into-view')\n .description(\n \"scroll a native element into view (WebdriverIO's element.scrollIntoView; \" +\n 'swipes until the element is displayed)',\n ),\n )\n .argument(\n '<selector>',\n 'WDIO selector string for the target (e.g. ' +\n '\"accessibility id:gestures.row.29\", \"xpath://...\", \"css selector:...\")',\n )\n .option('-d, --direction <dir>', 'scroll direction: up|down|left|right')\n .option('--max-scrolls <n>', 'max swipes before giving up', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--duration <ms>', 'duration of each swipe in ms', (v) =>\n Number.parseInt(v, 10),\n )\n .option(\n '--percent <0..1>',\n 'fraction of the scrollable element to swipe',\n (v) => Number.parseFloat(v),\n )\n .option(\n '--scrollable <selector>',\n 'WDIO selector string for the scrollable container ' +\n '(defaults to the platform default scroll view)',\n )\n .action(async (selector, opts) => {\n const dir = opts.direction as Direction | undefined;\n\n await runWithSession(opts, async (b) => {\n const target = await b.$(selector);\n\n const scrollableElement = opts.scrollable\n ? await b.$(opts.scrollable)\n : undefined;\n\n // Forward only the options the user set; WDIO owns the defaults\n // (maxScrolls: 10, direction: 'up', duration: 1500, percent: 0.95).\n await target.scrollIntoView({\n ...(dir ? { direction: dir } : {}),\n ...(opts.maxScrolls != null ? { maxScrolls: opts.maxScrolls } : {}),\n ...(opts.duration != null ? { duration: opts.duration } : {}),\n ...(opts.percent != null ? { percent: opts.percent } : {}),\n ...(scrollableElement ? { scrollableElement } : {}),\n });\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerSendKeys(program: Command): void {\n addConnectionFlags(\n program\n .command('send-keys')\n .description(\n 'type text into an element resolved by a WDIO selector ' +\n '(POST /element/:id/value). Clears the field first by default ' +\n '(POST /element/:id/clear); pass --no-clear to append instead',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the target, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the target; types into the first match',\n )\n .option('-e, --element <id>', 'raw element id of the target')\n .requiredOption('-t, --text <value>', 'text to type')\n .option(\n '--no-clear',\n 'skip clearing the field first (append to existing contents)',\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length !== 1) {\n throw new Error('pass exactly one of --selector, --label, --element');\n }\n\n await runWithSession(opts, async (b) => {\n let elementId: string;\n if (opts.element != null) {\n elementId = opts.element;\n } else {\n const selector =\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string);\n const el = await b.$(selector);\n elementId = await el.elementId;\n if (!elementId) {\n throw new Error(`no element matched ${selector}`);\n }\n }\n\n if (opts.clear) {\n await b.elementClear(elementId);\n }\n await b.elementSendKeys(elementId, opts.text);\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n type SessionRecord,\n isLocalHost,\n isPidAlive,\n listSessions,\n probeServerStatus,\n removeSession,\n} from '../../lib/session-store.js';\n\ninterface AnnotatedRecord extends SessionRecord {\n alive: boolean | null;\n pidAlive: boolean | null;\n serverUp: boolean | null;\n}\n\nexport function registerSessionList(session: Command): void {\n session\n .command('list')\n .description('list sessions stored under ~/.aco/sessions')\n .option('--json', 'emit JSON instead of a table')\n .option(\n '--prune',\n 'delete records for sessions whose server is unreachable or whose Appium child is dead',\n )\n .action(async (opts) => {\n const records = listSessions();\n const annotated: AnnotatedRecord[] = await Promise.all(\n records.map(async (r) => {\n const pidAlive = isLocalHost(r.serverUrl) ? isPidAlive(r.pid) : null;\n const serverUp = await probeServerStatus(r.serverUrl, 2_000);\n const alive: boolean | null =\n serverUp === false\n ? false\n : pidAlive === false\n ? false\n : serverUp === true\n ? true\n : null;\n return { ...r, alive, pidAlive, serverUp };\n }),\n );\n\n if (opts.prune) {\n let n = 0;\n for (const r of annotated) {\n if (r.alive === false) {\n removeSession(r.sessionId);\n n += 1;\n }\n }\n process.stderr.write(`aco: pruned ${n} dead record(s)\\n`);\n return;\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(annotated, null, 2)}\\n`);\n return;\n }\n\n if (annotated.length === 0) {\n process.stderr.write(\n 'no sessions stored. start one with `aco session start ...`\\n',\n );\n return;\n }\n\n for (const r of annotated) {\n const alive = r.alive === null ? '?' : r.alive ? 'yes' : 'no';\n process.stdout.write(\n `${[\n r.startedAt,\n r.platform.padEnd(7),\n String(r.pid).padEnd(6),\n alive.padEnd(5),\n r.serverUrl.padEnd(34),\n r.sessionId,\n ].join(' ')}\\n`,\n );\n }\n });\n}\n","import { spawn } from 'node:child_process';\nimport { createWriteStream, mkdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from '@commander-js/extra-typings';\nimport {\n startAppiumServer,\n stopAppiumServer,\n} from '../../lib/appium-server.js';\nimport { buildCapabilities } from '../../lib/caps.js';\nimport type { Platform } from '../../lib/connection.js';\nimport { listAndroidAvds } from '../../lib/devices/android.js';\nimport {\n listAndroidRealDevices,\n listIosRealDevices,\n} from '../../lib/devices/index.js';\nimport { pickFreePort } from '../../lib/port.js';\nimport {\n type SessionRecord,\n removeSession,\n saveSession,\n} from '../../lib/session-store.js';\nimport {\n DEFAULT_SESSION_TIMEOUT_MS,\n createBrowser,\n} from '../../lib/wd-client.js';\n\nfunction parseExtraCaps(values: string[] | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const v of values ?? []) {\n const idx = v.indexOf('=');\n if (idx < 0) throw new Error(`--cap expects key=value, got \"${v}\"`);\n const key = v.slice(0, idx);\n const raw = v.slice(idx + 1);\n try {\n out[key] = JSON.parse(raw) as unknown;\n } catch {\n out[key] = raw;\n }\n }\n return out;\n}\n\nexport function parseCapsJson(value: string): Record<string, unknown> {\n let raw = value;\n if (value.startsWith('@')) {\n const path = value.slice(1);\n try {\n raw = readFileSync(path, 'utf8');\n } catch (err) {\n throw new Error(\n `--caps-json: cannot read file ${path}: ${(err as Error).message}`,\n );\n }\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(`--caps-json is not valid JSON: ${(err as Error).message}`);\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n '--caps-json must be a JSON object (the W3C capabilities map)',\n );\n }\n return parsed as Record<string, unknown>;\n}\n\nexport function resolveAuth(opts: {\n username?: string;\n password?: string;\n auth?: string;\n}): { user?: string; key?: string } {\n if (opts.auth !== undefined) {\n if (opts.username !== undefined || opts.password !== undefined) {\n throw new Error('--auth cannot be combined with --username/--password');\n }\n const idx = opts.auth.indexOf(':');\n if (idx < 0) {\n throw new Error('--auth expects \"user:password\"');\n }\n return { user: opts.auth.slice(0, idx), key: opts.auth.slice(idx + 1) };\n }\n if (opts.username !== undefined || opts.password !== undefined) {\n if (opts.username === undefined || opts.password === undefined) {\n throw new Error('--username and --password must be given together');\n }\n return { user: opts.username, key: opts.password };\n }\n // Fallback to env vars so credentials need not appear in shell history /\n // process args. Flags above always win.\n const envUser = process.env.ACO_REMOTE_USERNAME;\n const envKey = process.env.ACO_REMOTE_PASSWORD;\n if (envUser !== undefined || envKey !== undefined) {\n if (envUser === undefined || envKey === undefined) {\n throw new Error(\n 'ACO_REMOTE_USERNAME and ACO_REMOTE_PASSWORD must be set together',\n );\n }\n return { user: envUser, key: envKey };\n }\n return {};\n}\n\nfunction readFirstLine(\n stream: NodeJS.ReadableStream,\n timeoutMs: number,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let buf = '';\n const cleanup = () => {\n clearTimeout(timer);\n stream.off('data', onData);\n stream.off('error', onErr);\n };\n const onData = (chunk: Buffer) => {\n buf += chunk.toString('utf8');\n const nl = buf.indexOf('\\n');\n if (nl >= 0) {\n cleanup();\n resolve(buf.slice(0, nl));\n }\n };\n const onErr = (err: Error) => {\n cleanup();\n reject(err);\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n `detached child did not emit a session envelope within ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n stream.on('data', onData);\n stream.on('error', onErr);\n });\n}\n\nasync function detachAndExit(sessionTimeoutSec: number): Promise<void> {\n const entry = process.argv[1];\n if (!entry || !entry.endsWith('.js')) {\n process.stderr.write(\n 'aco: --detach is not supported in dev mode (tsx). ' +\n 'Run the built `dist/cli.js` to use --detach.\\n',\n );\n process.exit(2);\n }\n\n const filteredArgs = process.argv.slice(2).filter((a) => a !== '--detach');\n\n mkdirSync(join(homedir(), '.aco', 'logs'), { recursive: true });\n const bootstrapLog = createWriteStream(\n join(homedir(), '.aco', 'logs', `aco-detach-${process.pid}.log`),\n { flags: 'a' },\n );\n\n const child = spawn(process.execPath, [entry, ...filteredArgs], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: process.env,\n windowsHide: true,\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error('aco: failed to capture detached child stdio');\n }\n\n // The envelope only lands once the session is created, so wait at least as\n // long as the child's own --session-timeout, plus a margin for the Appium\n // server to boot. A flat 60s here would defeat --session-timeout on cold\n // simulator/WDA boots and kill a session that was still coming up.\n const envelopeTimeoutMs = (sessionTimeoutSec + 60) * 1000;\n\n // Buffer the child's stderr from the start: if it dies before emitting an\n // envelope, this is the only place the real Appium/WDA failure is visible.\n let earlyErr = '';\n const onEarlyErr = (chunk: Buffer) => {\n earlyErr += chunk.toString('utf8');\n };\n child.stderr.on('data', onEarlyErr);\n\n let envelope: string;\n try {\n envelope = await Promise.race([\n readFirstLine(child.stdout, envelopeTimeoutMs),\n new Promise<never>((_, reject) => {\n child.once('exit', (code, signal) => {\n const how = signal ? `signal ${signal}` : `code ${code}`;\n reject(\n new Error(\n `aco: session start exited (${how}) before creating a session\\n${earlyErr}`,\n ),\n );\n });\n }),\n ]);\n } catch (err) {\n bootstrapLog.write(earlyErr);\n process.stderr.write(\n `${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n }\n\n child.stderr.off('data', onEarlyErr);\n bootstrapLog.write(earlyErr);\n child.stdout.pipe(bootstrapLog);\n child.stderr.pipe(bootstrapLog);\n\n process.stdout.write(`${envelope}\\n`);\n process.stderr.write(\n `session detached -- pid ${child.pid}, stop with \\`aco session stop\\`\\n`,\n );\n\n child.unref();\n process.exit(0);\n}\n\nexport function registerSessionStart(session: Command): void {\n session\n .command('start')\n .description(\n 'spin up an Appium server (sidecar) and create a session against an AUT. ' +\n 'Runs in the foreground bound to the TTY by default; use --detach for background.',\n )\n .requiredOption('-p, --platform <ios|android>', 'target platform')\n .option(\n '-a, --app <path-or-id>',\n 'path to the AUT build, or bundleId/appPackage',\n )\n .option(\n '-A, --app-activity <activity>',\n 'Android only -- launchable activity (required when --app is an appPackage id)',\n )\n .option(\n '-d, --device-name <name>',\n 'appium:deviceName (iOS simulator label, e.g. \"iPhone 15\"; informational on Android -- use --avd to pick the emulator)',\n )\n .option('-V, --platform-version <ver>', 'appium:platformVersion')\n .option('-u, --udid <udid>', 'appium:udid')\n .option(\n '--avd <name>',\n 'Android only -- AVD name of the emulator to target (appium:avd)',\n )\n .option(\n '--xcode-org-id <id>',\n 'iOS real device -- appium:xcodeOrgId (Apple Team ID for WDA signing)',\n )\n .option(\n '--xcode-signing-id <id>',\n 'iOS real device -- appium:xcodeSigningId (default \"iPhone Developer\")',\n )\n .option(\n '--allow-provisioning-device-registration',\n 'iOS real device -- appium:allowProvisioningDeviceRegistration ' +\n '(let Xcode register the device with your provisioning profile)',\n )\n .option(\n '--updated-wda-bundle-id <id>',\n 'iOS real device -- appium:updatedWDABundleId (custom WDA bundle id for signing)',\n )\n .option(\n '--port <port>',\n 'preferred Appium port (default: 4723)',\n (v) => Number.parseInt(v, 10),\n 4723,\n )\n .option(\n '-S, --server-url <url>',\n 'attach to an existing remote Appium server (e.g. a device farm grid) ' +\n 'instead of spawning a local one. When set, --port and the local ' +\n 'server flags (--address, --log-level, --use-drivers, ...) are ignored.',\n )\n .option(\n '--username <user>',\n 'BASIC auth username for the remote server (sent only on session creation)',\n )\n .option(\n '--password <pass>',\n 'BASIC auth password for the remote server (sent only on session creation)',\n )\n .option(\n '--auth <user:pass>',\n 'BASIC auth as \"user:password\" (alternative to --username/--password; ' +\n 'value before the first \":\" is the user)',\n )\n .option('--cap <key=value...>', 'extra W3C capability (repeatable)')\n .option(\n '--caps-json <json>',\n 'verbatim W3C capabilities as a JSON object (or @file to read from a ' +\n 'file), bypassing aco-built caps. Escape hatch for device farms with ' +\n 'nested vendor caps (e.g. LambdaTest\\'s \"lt:options\"). Per-device flags ' +\n '(--app, --device-name, --udid, ...) are ignored; --cap entries still ' +\n 'merge on top (shallow). --platform is still required for the record.',\n )\n .option(\n '--allow-insecure <feature...>',\n 'Appium insecure feature(s) to enable on the server. Appium 3 requires ' +\n 'each feature scoped to a driver or \"*\" ' +\n '(e.g. uiautomator2:chromedriver_autodownload for Android webview automation)',\n )\n .option(\n '--deny-insecure <feature...>',\n 'Appium insecure feature(s) to disable. Only takes effect with ' +\n '--allow-insecure or --relaxed-security, and is applied last (deny wins)',\n )\n .option(\n '--relaxed-security',\n 'enable Appium --relaxed-security (allow all insecure features). ' +\n 'Use only on a trusted local network; claw back features with --deny-insecure',\n )\n .option('--allow-cors', 'allow browser (CORS) connections to the server')\n .option(\n '--base-path <path>',\n 'URL prefix for all WebDriver routes on the spawned server (default: /)',\n )\n .option(\n '--log-level <level>',\n 'Appium server log level: debug | info | warn | error, or ' +\n 'console:file (e.g. warn:debug) (default: info)',\n )\n .option(\n '--use-drivers <name...>',\n 'restrict which installed Appium drivers to activate (default: all)',\n )\n .option(\n '--use-plugins <name...>',\n 'Appium plugins to activate (default: none; e.g. images, element-wait)',\n )\n .option(\n '--address <host>',\n 'interface for the spawned server to bind. Defaults to 127.0.0.1 ' +\n '(local-only); set to 0.0.0.0 or a specific IP to expose it on a ' +\n 'trusted network',\n )\n .option(\n '--keep-alive-timeout <seconds>',\n 'Appium HTTP keep-alive/connection timeout in seconds; 0 disables ' +\n '(default: 600)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--request-timeout <seconds>',\n 'Appium timeout in seconds for receiving the full HTTP request; ' +\n '0 disables (default: 3600)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--shutdown-timeout <ms>',\n 'Appium grace period in milliseconds for active connections to close ' +\n 'on shutdown (default: 5000)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--session-timeout <seconds>',\n `time to wait for session creation before aborting (default: ${DEFAULT_SESSION_TIMEOUT_MS / 1000}s; bump it for cold simulator/WDA boots)`,\n (v) => Number.parseInt(v, 10),\n DEFAULT_SESSION_TIMEOUT_MS / 1000,\n )\n .option(\n '--log',\n 'stream the full Appium server log to stdout (in addition to ~/.aco/logs)',\n )\n .option(\n '--detach',\n 'run in the background; print envelope on stdout then exit immediately',\n )\n .action(async (opts) => {\n // Remote mode owns no local process, so it already behaves like --detach\n // (create session, print envelope, exit). Skip the re-exec path for it.\n if (opts.detach && !opts.serverUrl) {\n await detachAndExit(opts.sessionTimeout);\n return;\n }\n\n const platform = opts.platform.toLowerCase() as Platform;\n if (platform !== 'ios' && platform !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${opts.platform}\")`,\n );\n }\n\n // When no explicit target (--udid/--avd) is given, prefer a connected\n // real device over spinning up a virtual one. Only when none is connected\n // do we fall back to auto-booting the first AVD (Android) -- Appium will\n // not auto-boot an emulator unless we tell it which AVD to use.\n // Skipped entirely with --caps-json: the user supplies the full caps, so\n // there is no aco-built target to auto-detect.\n let avd = opts.avd;\n let udid = opts.udid;\n if (!opts.capsJson && !udid && !avd) {\n const realList =\n platform === 'ios'\n ? await listIosRealDevices()\n : await listAndroidRealDevices();\n const realDevice = realList.devices.find(\n (d) => d.kind === 'real' && d.state === 'booted',\n );\n if (realDevice) {\n udid = realDevice.id;\n process.stderr.write(\n `aco: no --udid/--avd given, targeting connected real device ${udid} ` +\n `(${realDevice.name})\\n`,\n );\n } else if (platform === 'android') {\n const { devices } = await listAndroidAvds();\n const first = devices[0];\n if (!first) {\n throw new Error(\n 'aco: no connected Android device and no AVD found to boot. ' +\n 'Plug in a device (enable USB debugging), create an AVD in Android ' +\n 'Studio, or boot an emulator and pass `--udid`. ' +\n 'See `aco device list --platform android`.',\n );\n }\n avd = first.name;\n process.stderr.write(`aco: no --avd given, using \"${avd}\"\\n`);\n }\n // iOS with no real device and no flags: leave both unset. XCUITest will\n // pick a default simulator (or error) as it does today -- we do not\n // auto-pick a simulator here.\n }\n\n let capabilities: Record<string, unknown>;\n if (opts.capsJson) {\n // Escape hatch: use the supplied JSON verbatim as the capabilities map,\n // with --cap entries shallow-merged on top. aco's per-device caps are\n // not built, so the per-device flags below have no effect -- warn so a\n // stale flag in a script does not read as \"applied\".\n const ignored = [\n opts.app !== undefined ? '--app' : undefined,\n opts.appActivity !== undefined ? '--app-activity' : undefined,\n opts.deviceName !== undefined ? '--device-name' : undefined,\n opts.platformVersion !== undefined ? '--platform-version' : undefined,\n opts.udid !== undefined ? '--udid' : undefined,\n opts.avd !== undefined ? '--avd' : undefined,\n opts.xcodeOrgId !== undefined ? '--xcode-org-id' : undefined,\n opts.xcodeSigningId !== undefined ? '--xcode-signing-id' : undefined,\n opts.allowProvisioningDeviceRegistration\n ? '--allow-provisioning-device-registration'\n : undefined,\n opts.updatedWdaBundleId !== undefined\n ? '--updated-wda-bundle-id'\n : undefined,\n ].filter((f): f is string => f !== undefined);\n if (ignored.length > 0) {\n process.stderr.write(\n `aco: warning -- ignoring per-device flags with --caps-json: ${ignored.join(', ')}\\n`,\n );\n }\n capabilities = {\n ...parseCapsJson(opts.capsJson),\n ...parseExtraCaps(opts.cap),\n };\n } else {\n capabilities = buildCapabilities({\n platform,\n app: opts.app,\n appActivity: opts.appActivity,\n deviceName: opts.deviceName,\n platformVersion: opts.platformVersion,\n udid,\n avd,\n xcodeOrgId: opts.xcodeOrgId,\n xcodeSigningId: opts.xcodeSigningId,\n allowProvisioningDeviceRegistration:\n opts.allowProvisioningDeviceRegistration,\n updatedWdaBundleId: opts.updatedWdaBundleId,\n extraCaps: parseExtraCaps(opts.cap),\n });\n }\n\n const auth = resolveAuth(opts);\n\n // Resolve the connection target. Reuse the same URL parsing as\n // parseConnection for the remote case so https/port/base-path are handled\n // identically to the consumer commands.\n let conn: {\n hostname: string;\n port: number;\n basePath: string;\n protocol: 'http' | 'https';\n serverUrl: string;\n };\n let server: Awaited<ReturnType<typeof startAppiumServer>> | undefined;\n\n if (opts.serverUrl) {\n // REMOTE: do not spawn appium.\n let url: URL;\n try {\n url = new URL(opts.serverUrl);\n } catch {\n throw new Error(`--server-url is not a valid URL: ${opts.serverUrl}`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`--server-url must use http(s); got ${url.protocol}`);\n }\n const basePath =\n url.pathname && url.pathname !== '/' ? url.pathname : '/';\n const baseSuffix = basePath.replace(/\\/+$/, '');\n const protocol = url.protocol === 'https:' ? 'https' : 'http';\n conn = {\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (protocol === 'https' ? 443 : 80),\n basePath,\n protocol,\n // Canonical URL stored in the record; consumers parse it back. No creds.\n serverUrl: `${protocol}://${url.host}${baseSuffix}`,\n };\n\n const ignoredFlags = [\n opts.address !== undefined ? '--address' : undefined,\n opts.logLevel !== undefined ? '--log-level' : undefined,\n opts.useDrivers !== undefined ? '--use-drivers' : undefined,\n opts.usePlugins !== undefined ? '--use-plugins' : undefined,\n opts.keepAliveTimeout !== undefined\n ? '--keep-alive-timeout'\n : undefined,\n opts.requestTimeout !== undefined ? '--request-timeout' : undefined,\n opts.shutdownTimeout !== undefined ? '--shutdown-timeout' : undefined,\n opts.basePath !== undefined ? '--base-path' : undefined,\n opts.allowInsecure !== undefined ? '--allow-insecure' : undefined,\n opts.denyInsecure !== undefined ? '--deny-insecure' : undefined,\n opts.relaxedSecurity ? '--relaxed-security' : undefined,\n opts.allowCors ? '--allow-cors' : undefined,\n opts.log ? '--log' : undefined,\n ].filter((f): f is string => f !== undefined);\n if (ignoredFlags.length > 0) {\n process.stderr.write(\n `aco: warning -- ignoring local-server flags with --server-url: ${ignoredFlags.join(', ')}\\n`,\n );\n }\n if (opts.detach) {\n process.stderr.write(\n 'aco: --detach is a no-op with --server-url (remote sessions ' +\n 'already exit immediately after creation)\\n',\n );\n }\n } else {\n // LOCAL (unchanged):\n const port = await pickFreePort(opts.port);\n server = await startAppiumServer({\n port,\n tee: Boolean(opts.log),\n // --address forwards to the existing internal `hostname` option, which\n // keeps its 127.0.0.1 default when --address is omitted.\n hostname: opts.address,\n allowInsecure: opts.allowInsecure,\n denyInsecure: opts.denyInsecure,\n relaxedSecurity: opts.relaxedSecurity,\n allowCors: opts.allowCors,\n basePath: opts.basePath,\n logLevel: opts.logLevel,\n useDrivers: opts.useDrivers,\n usePlugins: opts.usePlugins,\n keepAliveTimeout: opts.keepAliveTimeout,\n requestTimeout: opts.requestTimeout,\n shutdownTimeout: opts.shutdownTimeout,\n });\n conn = {\n hostname: server.hostname,\n port: server.port,\n basePath: server.basePath,\n protocol: 'http',\n serverUrl: server.serverUrl,\n };\n }\n\n let browser: WebdriverIO.Browser;\n try {\n browser = await createBrowser({\n hostname: conn.hostname,\n port: conn.port,\n basePath: conn.basePath,\n protocol: conn.protocol,\n user: auth.user,\n key: auth.key,\n capabilities,\n connectionTimeoutMs: opts.sessionTimeout * 1000,\n });\n } catch (err) {\n if (server) {\n try {\n process.kill(server.pid, 'SIGTERM');\n } catch {\n /* ignore */\n }\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (\n platform === 'android' &&\n !udid &&\n /Could not find a connected Android device/i.test(msg)\n ) {\n process.stderr.write(\n `aco: hint -- the AVD \"${avd}\" did not come up in time. Bump --session-timeout for a cold boot, pick another AVD with --avd <name> (see \"aco device list --platform android\"), or boot an emulator yourself before running \"session start\".\\n`,\n );\n }\n if (\n platform === 'ios' &&\n udid &&\n !opts.xcodeOrgId &&\n /(provisioning profile|code sign|xcodebuild|WebDriverAgent)/i.test(\n msg,\n )\n ) {\n process.stderr.write(\n 'aco: hint -- building WebDriverAgent on a real iOS device needs code ' +\n 'signing. Pass --xcode-org-id <TeamID> (and optionally ' +\n '--xcode-signing-id / --allow-provisioning-device-registration / ' +\n '--updated-wda-bundle-id), or open WebDriverAgent.xcodeproj in Xcode once ' +\n 'to configure signing.\\n',\n );\n }\n throw err;\n }\n\n const record: SessionRecord = {\n sessionId: browser.sessionId,\n serverUrl: conn.serverUrl,\n platform,\n // 0 => no local child; stop.ts/list.ts already treat this as \"remote\".\n pid: server?.pid ?? 0,\n startedAt: new Date().toISOString(),\n deviceName: opts.deviceName,\n app: opts.app,\n };\n saveSession(record);\n\n process.stdout.write(\n `${JSON.stringify({\n sessionId: record.sessionId,\n serverUrl: record.serverUrl,\n platform: record.platform,\n pid: record.pid,\n })}\\n`,\n );\n\n if (!server) {\n // REMOTE: nothing local to babysit. The session lives on the farm; we\n // exit cleanly and let `aco <command>` attach and `aco session stop`\n // tear it down.\n process.stderr.write(\n 'session created on remote server -- stop it with `aco session stop`\\n',\n );\n return;\n }\n\n process.stderr.write('session ready -- press Ctrl-C to stop\\n');\n\n let cleaningUp = false;\n let exitCode = 0;\n const cleanup = async (reason: 'signal' | 'child-exit') => {\n if (cleaningUp) return;\n cleaningUp = true;\n if (reason === 'child-exit') {\n exitCode = 1;\n process.stderr.write(\n 'aco: Appium server exited unexpectedly, cleaning up\\n',\n );\n }\n try {\n await browser.deleteSession();\n } catch (err) {\n process.stderr.write(\n `aco: warning, deleteSession failed: ${(err as Error).message}\\n`,\n );\n }\n if (reason === 'signal' && server.pid) {\n await stopAppiumServer(server.pid);\n }\n removeSession(record.sessionId);\n process.exit(exitCode);\n };\n\n for (const sig of ['SIGINT', 'SIGTERM', 'SIGHUP'] as NodeJS.Signals[]) {\n process.on(sig, () => {\n void cleanup('signal');\n });\n }\n server.child.once('exit', () => {\n void cleanup('child-exit');\n });\n\n await new Promise<void>(() => {});\n });\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { createWriteStream, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { setTimeout as delay } from 'node:timers/promises';\n\nexport interface StartedServer {\n child: ChildProcess;\n serverUrl: string;\n hostname: string;\n port: number;\n basePath: string;\n pid: number;\n}\n\nexport interface StartAppiumServerOptions {\n port: number;\n // Interface to bind (Appium --address). Defaults to \"127.0.0.1\" — note this\n // is deliberately narrower than Appium's own 0.0.0.0 default. Surfaced via\n // the --address CLI flag.\n hostname?: string;\n tee?: boolean;\n // Appium \"insecure features\" to enable on the server (e.g.\n // `chromedriver_autodownload`). Forwarded verbatim as --allow-insecure.\n allowInsecure?: string[];\n // Appium \"insecure features\" to disable. Only meaningful alongside\n // --allow-insecure or --relaxed-security; applied last (deny wins).\n denyInsecure?: string[];\n // Open all insecure features (Appium --relaxed-security). Use only on a\n // trusted local network; pair with --deny-insecure to claw features back.\n relaxedSecurity?: boolean;\n // Allow browser (CORS) connections to the server (Appium --allow-cors).\n allowCors?: boolean;\n // Server URL prefix for all WebDriver routes (Appium --base-path).\n // Defaults to \"/\".\n basePath?: string;\n // Appium server log level, e.g. \"debug\" or \"warn:debug\" (console:file).\n // Defaults to \"info\".\n logLevel?: string;\n // Drivers to activate (Appium --use-drivers). Default: all installed.\n useDrivers?: string[];\n // Plugins to activate (Appium --use-plugins). Default: none.\n usePlugins?: string[];\n // Appium --keep-alive-timeout, in seconds (0 disables). Default: Appium's 600.\n keepAliveTimeout?: number;\n // Appium --request-timeout, in seconds (0 disables). Default: Appium's 3600.\n requestTimeout?: number;\n // Appium --shutdown-timeout, in milliseconds. Default: Appium's 5000.\n shutdownTimeout?: number;\n // How long to wait for the spawned server to start serving /status before\n // giving up (and tearing the child down). Defaults to 30s.\n readyTimeoutMs?: number;\n}\n\nexport async function startAppiumServer(\n opts: StartAppiumServerOptions,\n): Promise<StartedServer> {\n const hostname = opts.hostname ?? '127.0.0.1';\n const basePath = opts.basePath ?? '/';\n const logLevel = opts.logLevel ?? 'info';\n\n mkdirSync(join(homedir(), '.aco', 'logs'), { recursive: true });\n const logFile = createWriteStream(\n join(homedir(), '.aco', 'logs', `appium-${opts.port}.log`),\n );\n\n const args = [\n '--address',\n hostname,\n '--port',\n String(opts.port),\n '--base-path',\n basePath,\n '--log-level',\n logLevel,\n ];\n if (opts.allowInsecure && opts.allowInsecure.length > 0) {\n args.push('--allow-insecure', opts.allowInsecure.join(','));\n }\n if (opts.denyInsecure && opts.denyInsecure.length > 0) {\n args.push('--deny-insecure', opts.denyInsecure.join(','));\n }\n if (opts.relaxedSecurity) {\n args.push('--relaxed-security');\n }\n if (opts.allowCors) {\n args.push('--allow-cors');\n }\n if (opts.useDrivers && opts.useDrivers.length > 0) {\n args.push('--use-drivers', opts.useDrivers.join(','));\n }\n if (opts.usePlugins && opts.usePlugins.length > 0) {\n args.push('--use-plugins', opts.usePlugins.join(','));\n }\n if (opts.keepAliveTimeout !== undefined) {\n args.push('--keep-alive-timeout', String(opts.keepAliveTimeout));\n }\n if (opts.requestTimeout !== undefined) {\n args.push('--request-timeout', String(opts.requestTimeout));\n }\n if (opts.shutdownTimeout !== undefined) {\n args.push('--shutdown-timeout', String(opts.shutdownTimeout));\n }\n\n const child = spawn('appium', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env },\n });\n\n child.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOENT') {\n process.stderr.write(\n 'aco: `appium` not found on PATH. Install Appium first: ' +\n 'https://appium.io/docs/en/latest/quickstart/install/\\n',\n );\n process.exit(127);\n }\n throw err;\n });\n\n child.stdout?.pipe(logFile);\n child.stderr?.pipe(logFile);\n\n if (opts.tee) {\n child.stdout?.pipe(process.stdout);\n child.stderr?.pipe(process.stdout);\n }\n\n // serverUrl carries the base-path so it is the full, canonical URL the\n // session record stores and subcommands attach to (parseConnection derives\n // basePath back out of the pathname). For the default \"/\" the suffix is empty.\n const baseSuffix = basePath.replace(/\\/+$/, '');\n const serverUrl = `http://${hostname}:${opts.port}${baseSuffix}`;\n // Appium serves /status under --base-path, so a non-default base-path must be\n // included in the readiness probe or it 404s and we never see a 200.\n const statusUrl = `${serverUrl}/status`;\n try {\n await waitForReady(statusUrl, opts.readyTimeoutMs ?? 30_000);\n } catch (err) {\n // We spawned this child; if it never became ready we own tearing it down.\n // Without this, a never-binding Appium (e.g. one wedged before listening)\n // is left as a zombie after startAppiumServer rejects, since the caller\n // only kills the server in the createBrowser failure branch.\n if (child.pid) {\n try {\n process.kill(child.pid, 'SIGTERM');\n } catch (killErr) {\n if ((killErr as NodeJS.ErrnoException).code !== 'ESRCH') throw killErr;\n }\n }\n throw err;\n }\n\n return {\n child,\n serverUrl,\n hostname,\n port: opts.port,\n basePath,\n pid: child.pid ?? 0,\n };\n}\n\nasync function waitForReady(\n statusUrl: string,\n timeoutMs: number,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n const res = await fetch(statusUrl);\n if (res.ok) return;\n } catch (err) {\n lastErr = err;\n }\n await delay(250);\n }\n throw new Error(\n `Appium server did not become ready within ${timeoutMs}ms at ${statusUrl}. ` +\n `Last error: ${String(lastErr ?? 'n/a')}. Check ~/.aco/logs/appium-*.log for details.`,\n );\n}\n\nexport async function stopAppiumServer(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err;\n }\n}\n","import type { Platform } from './connection.js';\n\nexport interface StartCapsInput {\n platform: Platform;\n app?: string;\n appActivity?: string;\n deviceName?: string;\n platformVersion?: string;\n udid?: string;\n avd?: string;\n // iOS real-device code signing (XCUITest builds/installs WDA on-device):\n xcodeOrgId?: string;\n xcodeSigningId?: string;\n allowProvisioningDeviceRegistration?: boolean;\n updatedWdaBundleId?: string;\n extraCaps?: Record<string, unknown>;\n}\n\nexport function buildCapabilities(\n input: StartCapsInput,\n): Record<string, unknown> {\n const automationName = input.platform === 'ios' ? 'XCUITest' : 'UiAutomator2';\n const platformName = input.platform === 'ios' ? 'iOS' : 'Android';\n const base: Record<string, unknown> = {\n platformName,\n 'appium:automationName': automationName,\n // aco is an interactive operator CLI: a user typing subcommands across\n // separate shell invocations can easily exceed Appium's 60s default\n // newCommandTimeout, which would silently terminate the session between\n // shots. Disable it by default; users can re-enable via\n // `--cap appium:newCommandTimeout=<seconds>`.\n 'appium:newCommandTimeout': 0,\n };\n\n if (input.deviceName) base['appium:deviceName'] = input.deviceName;\n if (input.platformVersion)\n base['appium:platformVersion'] = input.platformVersion;\n if (input.udid) base['appium:udid'] = input.udid;\n if (input.avd) {\n if (input.platform !== 'android') {\n throw new Error(\n '--avd is only valid for --platform android (iOS uses --udid / --device-name).',\n );\n }\n base['appium:avd'] = input.avd;\n }\n\n const signingProvided =\n input.xcodeOrgId ||\n input.xcodeSigningId ||\n input.allowProvisioningDeviceRegistration ||\n input.updatedWdaBundleId;\n if (signingProvided && input.platform !== 'ios') {\n throw new Error(\n 'Code-signing flags (--xcode-org-id, --xcode-signing-id, ' +\n '--allow-provisioning-device-registration, --updated-wda-bundle-id) ' +\n 'are only valid for --platform ios.',\n );\n }\n if (input.xcodeOrgId) base['appium:xcodeOrgId'] = input.xcodeOrgId;\n if (input.xcodeSigningId)\n base['appium:xcodeSigningId'] = input.xcodeSigningId;\n if (input.allowProvisioningDeviceRegistration)\n base['appium:allowProvisioningDeviceRegistration'] = true;\n if (input.updatedWdaBundleId)\n base['appium:updatedWDABundleId'] = input.updatedWdaBundleId;\n\n if (input.app) {\n const looksLikePath =\n /^[./~]|^[A-Za-z]:\\\\/.test(input.app) ||\n /\\.(app|apk|aab|ipa|zip)$/i.test(input.app);\n if (looksLikePath) {\n base['appium:app'] = input.app;\n } else if (input.platform === 'ios') {\n base['appium:bundleId'] = input.app;\n } else {\n if (!input.appActivity) {\n throw new Error(\n 'Android `--app <package>` also requires `--app-activity <activity>` ' +\n '(UIAutomator2 needs appium:appPackage + appium:appActivity to launch an installed app).',\n );\n }\n base['appium:appPackage'] = input.app;\n base['appium:appActivity'] = input.appActivity;\n }\n }\n\n return { ...base, ...(input.extraCaps ?? {}) };\n}\n","import { createServer } from 'node:net';\n\nexport function pickFreePort(preferred = 4723): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryListen = (p: number, retryOnEaddr: boolean) => {\n const srv = createServer();\n srv.unref();\n srv.once('error', (err: NodeJS.ErrnoException) => {\n if (retryOnEaddr && err.code === 'EADDRINUSE') {\n tryListen(0, false);\n } else {\n reject(err);\n }\n });\n srv.listen(p, () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : p;\n srv.close(() => resolve(port));\n });\n };\n tryListen(preferred, true);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { stopAppiumServer } from '../../lib/appium-server.js';\nimport type { Connection } from '../../lib/connection.js';\nimport {\n type SessionRecord,\n latestLiveSession,\n listSessions,\n readSession,\n removeSession,\n} from '../../lib/session-store.js';\nimport { attachBrowser } from '../../lib/wd-client.js';\n\nfunction resolveStopTargets(opts: {\n all?: boolean;\n session?: string;\n}): SessionRecord[] {\n if (opts.all) return listSessions();\n const id = opts.session ?? latestLiveSession()?.sessionId;\n if (!id) {\n throw new Error('no --session and no stored session to stop');\n }\n const rec = readSession(id);\n if (!rec) throw new Error(`no stored session ${id}`);\n return [rec];\n}\n\nfunction connectionFromRecord(r: SessionRecord): Connection {\n const url = new URL(r.serverUrl);\n return {\n sessionId: r.sessionId,\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n basePath: url.pathname && url.pathname !== '/' ? url.pathname : '/',\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n platform: r.platform,\n };\n}\n\nexport function registerSessionStop(session: Command): void {\n session\n .command('stop')\n .description(\n 'tear down a stored session (deleteSession + SIGTERM the Appium child) and remove its record',\n )\n .option('-s, --session <id>', 'session id (default: latest live session)')\n .option('--all', 'stop every stored session')\n .action(async (opts) => {\n const records = resolveStopTargets(opts);\n\n for (const r of records) {\n process.stderr.write(`aco: stopping ${r.sessionId} ...\\n`);\n try {\n const browser = await attachBrowser(connectionFromRecord(r));\n await browser.deleteSession();\n } catch (err) {\n process.stderr.write(\n `aco: warning -- deleteSession failed for ${r.sessionId}: ${(err as Error).message}\\n`,\n );\n }\n if (r.pid) {\n try {\n await stopAppiumServer(r.pid);\n } catch (err) {\n process.stderr.write(\n `aco: warning -- SIGTERM pid ${r.pid} failed: ${(err as Error).message}\\n`,\n );\n }\n }\n removeSession(r.sessionId);\n process.stderr.write(`aco: stopped ${r.sessionId}\\n`);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerSessionList } from './list.js';\nimport { registerSessionStart } from './start.js';\nimport { registerSessionStop } from './stop.js';\n\nexport function registerSession(program: Command): void {\n const session = program\n .command('session')\n .description('manage Appium sessions (boot a server + create a session)');\n registerSessionStart(session);\n registerSessionList(session);\n registerSessionStop(session);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerSettingsGet(settings: Command): void {\n addConnectionFlags(\n settings\n .command('get')\n .description('print the active driver settings (GET /appium/settings)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getSettings());\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nfunction parsePairs(values: string[] | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const v of values ?? []) {\n const idx = v.indexOf('=');\n if (idx < 0) throw new Error(`--set expects key=value, got \"${v}\"`);\n const key = v.slice(0, idx);\n const raw = v.slice(idx + 1);\n try {\n out[key] = JSON.parse(raw) as unknown;\n } catch {\n out[key] = raw;\n }\n }\n return out;\n}\n\nexport function registerSettingsSet(settings: Command): void {\n addConnectionFlags(\n settings\n .command('set')\n .description('update driver settings (POST /appium/settings)'),\n )\n .option('--set <key=value...>', 'a setting to update (repeatable)')\n .option('-j, --json <obj>', 'settings object as a single JSON blob')\n .action(async (opts) => {\n let body: Record<string, unknown> = {};\n if (opts.json) {\n try {\n body = JSON.parse(opts.json) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `--json must be valid JSON: ${(err as Error).message}`,\n );\n }\n }\n body = { ...body, ...parsePairs(opts.set) };\n if (Object.keys(body).length === 0) {\n throw new Error('nothing to set: pass --set key=value or --json <obj>');\n }\n await runWithSession(opts, (b) => b.updateSettings(body));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerSettingsGet } from './get.js';\nimport { registerSettingsSet } from './set.js';\n\nexport function registerSettings(program: Command): void {\n const settings = program\n .command('settings')\n .description('read / update the live Appium driver settings API');\n registerSettingsGet(settings);\n registerSettingsSet(settings);\n}\n","import { DOMParser, XMLSerializer } from '@xmldom/xmldom';\nimport { type SelectReturnType, select } from 'xpath';\nimport { AcoUserError } from './errors.js';\n\nexport function applyXpath(xml: string, expr: string): string {\n const parseErrors: string[] = [];\n let doc: ReturnType<DOMParser['parseFromString']>;\n try {\n doc = new DOMParser({\n onError: (level, msg) => {\n if (level === 'error' || level === 'fatalError') parseErrors.push(msg);\n },\n }).parseFromString(xml, 'text/xml');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`could not parse page source as XML: ${msg}`);\n }\n\n if (parseErrors.length > 0) {\n throw new AcoUserError(\n `could not parse page source as XML: ${parseErrors[0]}`,\n );\n }\n\n let result: SelectReturnType;\n try {\n result = select(expr, doc as unknown as Parameters<typeof select>[1]);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`invalid XPath expression: ${msg}`);\n }\n\n if (Array.isArray(result)) {\n const serializer = new XMLSerializer();\n return result\n .map((node) =>\n serializer.serializeToString(\n node as unknown as Parameters<XMLSerializer['serializeToString']>[0],\n ),\n )\n .join('\\n');\n }\n return String(result);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\nimport { applyXpath } from '../lib/xpath.js';\n\nexport function registerSource(program: Command): void {\n addConnectionFlags(\n program\n .command('source')\n .description('print the current page source (W3C GET /source)'),\n )\n .option(\n '-x, --xpath <expr>',\n 'filter the page source with a client-side XPath 1.0 expression ' +\n '(evaluated locally against the returned XML, not by the driver)',\n )\n .action(async (opts) => {\n const xml = await runWithSession(opts, (b) => b.getPageSource());\n const out = opts.xpath ? applyXpath(xml, opts.xpath) : xml;\n process.stdout.write(`${out}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags, resolveConnection } from '../lib/connection.js';\n\nexport function registerStatus(program: Command): void {\n addConnectionFlags(\n program\n .command('status')\n .description(\n 'print the Appium server status (GET /status; no session required)',\n ),\n ).action(async (opts) => {\n const { conn } = resolveConnection(opts);\n const base = conn.basePath === '/' ? '' : conn.basePath.replace(/\\/$/, '');\n const url = `${conn.protocol}://${conn.hostname}:${conn.port}${base}/status`;\n const res = await fetch(url);\n process.stdout.write(`${await res.text()}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { W3C_ELEMENT_ID } from '../lib/locator.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nfunction finiteNumber(flag: string, v: string): number {\n const n = Number(v);\n if (!Number.isFinite(n)) {\n throw new Error(`${flag} must be a number (got \"${v}\")`);\n }\n return n;\n}\n\nfunction point(flag: string, v: string): { x: number; y: number } {\n const [x, y, ...rest] = v.split(',');\n if (x == null || y == null || rest.length > 0) {\n throw new Error(`${flag} must be \"x,y\" (got \"${v}\")`);\n }\n return {\n x: finiteNumber(flag, x),\n y: finiteNumber(flag, y),\n };\n}\n\nexport function registerSwipe(program: Command): void {\n addConnectionFlags(\n program\n .command('swipe')\n .description(\n 'swipe in a direction within an element (or the viewport) via ' +\n \"WebdriverIO's cross-platform swipe (a real W3C pointer gesture), \" +\n 'naming the target with --selector, --label, or a raw --element id',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the element to swipe within, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the element to swipe within; uses the first match',\n )\n .option('-e, --element <id>', 'raw element id to swipe within')\n .option('-d, --direction <dir>', 'up|down|left|right (default up)', (v) => {\n if (v !== 'up' && v !== 'down' && v !== 'left' && v !== 'right') {\n throw new Error(`--direction must be up|down|left|right (got \"${v}\")`);\n }\n return v;\n })\n .option('--duration <ms>', 'how long the swipe takes (default 1500)', (v) =>\n finiteNumber('--duration', v),\n )\n .option(\n '--percent <0..1>',\n 'fraction of the element/viewport to traverse (default 0.95)',\n (v) => finiteNumber('--percent', v),\n )\n .option(\n '--from <x,y>',\n 'absolute start coordinates (ignored when an element is given)',\n (v) => point('--from', v),\n )\n .option(\n '--to <x,y>',\n 'absolute end coordinates (ignored when an element is given)',\n (v) => point('--to', v),\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length > 1) {\n throw new Error('pass at most one of --selector, --label, --element');\n }\n const hasElementSource = sources.length === 1;\n const hasFrom = opts.from != null;\n const hasTo = opts.to != null;\n\n if (hasFrom !== hasTo) {\n throw new Error('pass both --from and --to, or neither');\n }\n if (hasElementSource && (hasFrom || hasTo)) {\n throw new Error(\n '--from/--to are ignored when an element is given; pass one or the other',\n );\n }\n\n await runWithSession(opts, async (b) => {\n const scrollableElement = hasElementSource\n ? opts.element != null\n ? await b.$({ [W3C_ELEMENT_ID]: opts.element })\n : await b.$(\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string),\n )\n : undefined;\n\n // Forward only the options the user set; WDIO owns the defaults\n // (direction: 'up', duration: 1500, percent: 0.95).\n await b.swipe({\n ...(opts.direction ? { direction: opts.direction as Direction } : {}),\n ...(opts.duration != null ? { duration: opts.duration } : {}),\n ...(opts.percent != null ? { percent: opts.percent } : {}),\n ...(scrollableElement ? { scrollableElement } : {}),\n ...(opts.from ? { from: opts.from } : {}),\n ...(opts.to ? { to: opts.to } : {}),\n });\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { buildTap } from '../lib/actions.js';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nfunction finiteNumber(flag: string, v: string): number {\n const n = Number(v);\n if (!Number.isFinite(n)) {\n throw new Error(`${flag} must be a number (got \"${v}\")`);\n }\n return n;\n}\n\nexport function registerTap(program: Command): void {\n addConnectionFlags(\n program\n .command('tap')\n .description(\n 'tap the center of an element (or absolute coords) with a real ' +\n 'W3C pointer gesture (POST /actions), so the touch bubbles up the ' +\n 'native view hierarchy',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the target, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the target; taps the first match',\n )\n .option('-e, --element <id>', 'raw element id of the target')\n .option(\n '-x, --x <px>',\n 'x coordinate (absolute, or offset within element)',\n (v) => finiteNumber('--x', v),\n )\n .option(\n '-y, --y <px>',\n 'y coordinate (absolute, or offset within element)',\n (v) => finiteNumber('--y', v),\n )\n .option(\n '-d, --duration <ms>',\n 'how long the finger stays down (default 100)',\n (v) => finiteNumber('--duration', v),\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length > 1) {\n throw new Error('pass at most one of --selector, --label, --element');\n }\n const hasElementSource = sources.length === 1;\n const hasCoords = opts.x != null && opts.y != null;\n\n if (!hasElementSource && !hasCoords) {\n throw new Error(\n 'nothing to tap: pass --selector, --label, --element, or both --x and --y',\n );\n }\n\n await runWithSession(opts, async (b) => {\n let x: number;\n let y: number;\n\n if (hasElementSource) {\n let elementId: string;\n if (opts.element != null) {\n elementId = opts.element;\n } else {\n const selector =\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string);\n const el = await b.$(selector);\n elementId = await el.elementId;\n if (!elementId) {\n throw new Error(`no element matched ${selector}`);\n }\n }\n const rect = await b.getElementRect(elementId);\n // --x/--y act as an offset from the element's top-left when an\n // element is given; otherwise tap its geometric center.\n x = opts.x != null ? rect.x + opts.x : rect.x + rect.width / 2;\n y = opts.y != null ? rect.y + opts.y : rect.y + rect.height / 2;\n } else {\n // Absolute viewport coordinates (both guaranteed present here).\n x = opts.x as number;\n y = opts.y as number;\n }\n\n await b.performActions(\n buildTap(x, y, opts.duration) as Parameters<\n typeof b.performActions\n >[0],\n );\n await b.releaseActions();\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerTimeouts(program: Command): void {\n const timeouts = program\n .command('timeouts')\n .description('read / update the session timeouts (W3C /timeouts)');\n\n addConnectionFlags(\n timeouts\n .command('get')\n .description('print the active timeouts (GET /timeouts)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getTimeouts());\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n\n addConnectionFlags(\n timeouts\n .command('set')\n .description('set session timeouts (POST /timeouts)'),\n )\n .option('--implicit <ms>', 'implicit wait timeout', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--page-load <ms>', 'page load timeout', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--script <ms>', 'script timeout', (v) => Number.parseInt(v, 10))\n .action(async (opts) => {\n if (\n opts.implicit === undefined &&\n opts.pageLoad === undefined &&\n opts.script === undefined\n ) {\n throw new Error(\n 'nothing to set: pass --implicit, --page-load, and/or --script',\n );\n }\n await runWithSession(opts, (b) =>\n b.setTimeouts(opts.implicit, opts.pageLoad, opts.script),\n );\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { STRATEGIES, unwrapElementId } from '../lib/locator.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWait(program: Command): void {\n addConnectionFlags(\n program\n .command('wait')\n .description('poll for an element until it reaches a state or times out'),\n )\n .requiredOption(\n '-u, --using <strategy>',\n `locator strategy (${STRATEGIES.join(', ')})`,\n )\n .requiredOption('-v, --value <value>', 'locator value')\n .option('--for <state>', 'displayed | enabled | exists', 'displayed')\n .option(\n '--timeout <ms>',\n 'overall timeout',\n (v) => Number.parseInt(v, 10),\n 10000,\n )\n .option(\n '--interval <ms>',\n 'poll interval',\n (v) => Number.parseInt(v, 10),\n 250,\n )\n .action(async (opts) => {\n await runWithSession(opts, async (b) => {\n const deadline = Date.now() + opts.timeout;\n let lastErr = '';\n while (Date.now() < deadline) {\n try {\n const el = (await b.findElement(opts.using, opts.value)) as Record<\n string,\n string\n >;\n if (!('error' in el)) {\n const id = unwrapElementId(el);\n const ok =\n opts.for === 'exists'\n ? true\n : opts.for === 'enabled'\n ? await b.isElementEnabled(id)\n : await b.isElementDisplayed(id);\n if (ok) {\n process.stdout.write(`${JSON.stringify(id)}\\n`);\n return;\n }\n }\n } catch (e) {\n lastErr = (e as Error).message;\n }\n await new Promise((r) => setTimeout(r, opts.interval));\n }\n throw new Error(\n `wait timed out after ${opts.timeout}ms (${opts.for}); last: ${lastErr}`,\n );\n });\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWeb(program: Command): void {\n const web = program\n .command('web')\n .description(\n 'navigate the active web/WebView context ' +\n '(switch into a WEBVIEW_* context first via `aco context switch`)',\n );\n\n addConnectionFlags(\n web\n .command('url')\n .description(\n 'get or set the current URL. With <url>: navigate; ' +\n 'without: print the current URL',\n ),\n )\n .argument('[url]', 'URL to navigate to (omit to read the current URL)')\n .action(async (url, opts) => {\n if (url) {\n await runWithSession(opts, (b) => b.navigateTo(url));\n process.stdout.write('ok\\n');\n } else {\n const current = await runWithSession(opts, (b) => b.getUrl());\n process.stdout.write(`${current}\\n`);\n }\n });\n\n for (const [name, method, desc] of [\n ['back', 'back', 'navigate back in history'],\n ['forward', 'forward', 'navigate forward in history'],\n ['refresh', 'refresh', 'reload the current page'],\n ] as const) {\n addConnectionFlags(web.command(name).description(desc)).action(\n async (opts) => {\n await runWithSession(opts, (b) => b[method]());\n process.stdout.write('ok\\n');\n },\n );\n }\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWindow(program: Command): void {\n const window = program\n .command('window')\n .description('inspect the active window');\n\n addConnectionFlags(\n window\n .command('rect')\n .description('get the window rect {x,y,width,height} (GET /window/rect)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getWindowRect());\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","export function assertSupportedNodeVersion(minimum: string): void {\n const current = process.versions.node;\n if (compareSemver(current, minimum) < 0) {\n console.error(\n `aco requires Node.js >= ${minimum}, but is running on ${current}.\\nPlease upgrade Node.js: https://nodejs.org/`,\n );\n process.exit(1);\n }\n}\n\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split('.').map((n) => Number.parseInt(n, 10));\n const pb = b.split('.').map((n) => Number.parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai !== bi) return ai - bi;\n }\n return 0;\n}\n"],"mappings":"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","names":["program","program","readFileSync","readdirSync","homedir","join","program","program","program","program","program","program","writeFileSync","program","writeFileSync","program","program","spawn","createWriteStream","mkdirSync","readFileSync","homedir","join","mkdirSync","homedir","join","readFileSync","mkdirSync","join","homedir","createWriteStream","spawn","program","program","DOMParser","DOMParser","program","program","program","finiteNumber","program","program","program","program","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/lib/actions.ts","../src/lib/session-store.ts","../src/lib/connection.ts","../src/lib/wd-client.ts","../src/lib/run-with-session.ts","../src/commands/actions.ts","../src/commands/context/current.ts","../src/commands/context/list.ts","../src/commands/context/switch.ts","../src/commands/context/index.ts","../src/lib/devices/format.ts","../src/lib/devices/appium-log.ts","../src/lib/devices/android-real.ts","../src/lib/devices/android.ts","../src/lib/devices/ios-real.ts","../src/lib/devices/ios.ts","../src/lib/devices/index.ts","../src/commands/device/list.ts","../src/commands/device/index.ts","../src/lib/locator.ts","../src/commands/element/active.ts","../src/commands/element/attribute.ts","../src/commands/element/clear.ts","../src/commands/element/click.ts","../src/commands/element/displayed.ts","../src/commands/element/enabled.ts","../src/commands/element/find.ts","../src/commands/element/property.ts","../src/commands/element/rect.ts","../src/commands/element/selected.ts","../src/commands/element/send-keys.ts","../src/commands/element/text.ts","../src/commands/element/index.ts","../src/lib/list-elements.ts","../src/lib/errors.ts","../src/commands/elements.ts","../src/commands/mobile/call.ts","../src/commands/mobile/list.ts","../src/commands/mobile/index.ts","../src/commands/orientation.ts","../src/data/extensions-android.json","../src/data/extensions-ios.json","../src/lib/manifest.ts","../src/commands/platform-extensions.ts","../src/commands/screenshot.ts","../src/commands/scroll-into-view.ts","../src/commands/send-keys.ts","../src/commands/session/list.ts","../src/commands/session/start.ts","../src/lib/appium-server.ts","../src/lib/caps.ts","../src/lib/port.ts","../src/commands/session/stop.ts","../src/commands/session/index.ts","../src/commands/settings/get.ts","../src/commands/settings/set.ts","../src/commands/settings/index.ts","../src/lib/xpath.ts","../src/commands/source.ts","../src/commands/status.ts","../src/commands/swipe.ts","../src/commands/tap.ts","../src/commands/timeouts.ts","../src/commands/wait.ts","../src/commands/web.ts","../src/commands/window.ts","../src/lib/node-version.ts"],"sourcesContent":["import { Command } from '@commander-js/extra-typings';\nimport { registerActions } from './commands/actions.js';\nimport { registerContext } from './commands/context/index.js';\nimport { registerDevice } from './commands/device/index.js';\nimport { registerElement } from './commands/element/index.js';\nimport { registerElements } from './commands/elements.js';\nimport { registerMobile } from './commands/mobile/index.js';\nimport { registerOrientation } from './commands/orientation.js';\nimport {\n registerAndroid,\n registerIos,\n} from './commands/platform-extensions.js';\nimport { registerScreenshot } from './commands/screenshot.js';\nimport { registerScrollIntoView } from './commands/scroll-into-view.js';\nimport { registerSendKeys } from './commands/send-keys.js';\nimport { registerSession } from './commands/session/index.js';\nimport { registerSettings } from './commands/settings/index.js';\nimport { registerSource } from './commands/source.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerSwipe } from './commands/swipe.js';\nimport { registerTap } from './commands/tap.js';\nimport { registerTimeouts } from './commands/timeouts.js';\nimport { registerWait } from './commands/wait.js';\nimport { registerWeb } from './commands/web.js';\nimport { registerWindow } from './commands/window.js';\nimport { assertSupportedNodeVersion } from './lib/node-version.js';\n\nassertSupportedNodeVersion('20.0.0');\n\nconst program = new Command()\n .name('aco')\n .description(\n 'Appium Command-line Operator -- start a session, then drive it from the shell.',\n )\n .version('0.0.0')\n .showHelpAfterError();\n\nregisterSession(program);\n\nregisterElement(program);\nregisterSource(program);\nregisterElements(program);\nregisterScreenshot(program);\nregisterTap(program);\nregisterSwipe(program);\nregisterSendKeys(program);\nregisterScrollIntoView(program);\nregisterActions(program);\nregisterContext(program);\nregisterMobile(program);\nregisterIos(program);\nregisterAndroid(program);\nregisterDevice(program);\nregisterSettings(program);\nregisterWeb(program);\nregisterOrientation(program);\nregisterTimeouts(program);\nregisterWindow(program);\nregisterStatus(program);\nregisterWait(program);\n\ntry {\n await program.parseAsync(process.argv);\n} catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`aco: ${message}`);\n process.exit(1);\n}\n","export type PointerType = 'touch' | 'mouse' | 'pen';\n\ntype PointerItem =\n | {\n type: 'pointerMove';\n x: number;\n y: number;\n duration: number;\n origin: 'viewport';\n }\n | { type: 'pointerDown'; button: number }\n | { type: 'pointerUp'; button: number }\n | { type: 'pause'; duration: number }\n | { type: 'pointerCancel' };\n\ntype KeyItem =\n | { type: 'keyDown'; value: string }\n | { type: 'keyUp'; value: string }\n | { type: 'pause'; duration: number };\n\nexport interface PointerSource {\n id: string;\n type: 'pointer';\n parameters: { pointerType: PointerType };\n actions: PointerItem[];\n}\n\nexport interface KeySource {\n id: string;\n type: 'key';\n actions: KeyItem[];\n}\n\nexport type InputSource = PointerSource | KeySource;\n\n// Matches WebdriverIO's MOVE_PARAM_DEFAULTS so a `move` between `down` and `up`\n// reads as a natural swipe glide (research.md §2).\nconst MOVE_DEFAULT_DURATION = 100;\n\n// A short finger-down dwell so the touch reads as a tap, not a flick.\n// W3C taps are commonly 50-120ms; 100ms matches the move default above.\nconst TAP_DEFAULT_DURATION = 100;\n\nexport function buildTap(\n x: number,\n y: number,\n duration: number = TAP_DEFAULT_DURATION,\n pointerType: PointerType = 'touch',\n): PointerSource[] {\n return [\n {\n id: 'finger1',\n type: 'pointer',\n parameters: { pointerType },\n actions: [\n { type: 'pointerMove', x, y, duration: 0, origin: 'viewport' },\n { type: 'pointerDown', button: 0 },\n { type: 'pause', duration },\n { type: 'pointerUp', button: 0 },\n ],\n },\n ];\n}\n\nexport function parseGesture(spec: string): PointerItem[] {\n const steps = spec\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (steps.length === 0) {\n throw new Error('gesture is empty; expected e.g. \"down 200 600, up\"');\n }\n return steps.map((step, i) => parseStep(step, i + 1));\n}\n\nfunction parseStep(step: string, n: number): PointerItem {\n const [verb, ...rest] = step.split(/\\s+/);\n const nums = rest.map((tok) => {\n const v = Number(tok);\n if (!Number.isFinite(v)) {\n throw new Error(`gesture step ${n} \"${step}\": \"${tok}\" is not a number`);\n }\n return v;\n });\n switch (verb) {\n case 'move': {\n const [x, y, duration] = nums;\n if (x === undefined || y === undefined || nums.length > 3) {\n throw new Error(\n `gesture step ${n} \"${step}\": move needs <x> <y> [duration]`,\n );\n }\n return {\n type: 'pointerMove',\n x,\n y,\n duration: duration ?? MOVE_DEFAULT_DURATION,\n origin: 'viewport',\n };\n }\n case 'down':\n return { type: 'pointerDown', button: nums[0] ?? 0 };\n case 'up':\n return { type: 'pointerUp', button: nums[0] ?? 0 };\n case 'pause': {\n const [duration] = nums;\n if (duration === undefined || nums.length !== 1) {\n throw new Error(`gesture step ${n} \"${step}\": pause needs <duration>`);\n }\n return { type: 'pause', duration };\n }\n case 'cancel':\n return { type: 'pointerCancel' };\n default:\n throw new Error(`gesture step ${n} \"${step}\": unknown verb \"${verb}\"`);\n }\n}\n\n// Serialize plain text into a `key` source: a keyDown+keyUp pair per character\n// (the W3C \"type these letters\" shape, research.md §6). Array.from keeps astral\n// code points (emoji, combining sequences) intact rather than splitting them on\n// UTF-16 surrogate halves.\nexport function buildKeySource(text: string): KeySource {\n const actions: KeyItem[] = [];\n for (const ch of Array.from(text)) {\n actions.push({ type: 'keyDown', value: ch });\n actions.push({ type: 'keyUp', value: ch });\n }\n return { id: 'keyboard', type: 'key', actions };\n}\n\nexport function buildActions(\n gestures: string[],\n pointerType: PointerType,\n text?: string,\n): InputSource[] {\n const sources: InputSource[] = gestures.map((g, i) => ({\n id: `finger${i + 1}`,\n type: 'pointer',\n parameters: { pointerType },\n actions: parseGesture(g),\n }));\n if (text != null && text.length > 0) {\n sources.push(buildKeySource(text));\n }\n return sources;\n}\n\n// Escape-hatch path: validate the already-parsed `--json` value is an array and\n// return it untouched. Deliberate pass-through -- no touch-default injection, so\n// a raw payload reaches Appium exactly as written (Trade-offs §C).\nexport function asRawActions(raw: unknown): unknown[] {\n if (!Array.isArray(raw)) {\n throw new Error(\n '--json must be a W3C actions array (e.g. [{\"type\":\"pointer\",...}])',\n );\n }\n return raw;\n}\n\nexport function parsePointerType(v: string): PointerType {\n if (v === 'touch' || v === 'mouse' || v === 'pen') return v;\n throw new Error(`--pointer-type must be touch|mouse|pen (got \"${v}\")`);\n}\n","import {\n mkdirSync,\n readFileSync,\n readdirSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Platform } from './connection.js';\n\nexport interface SessionRecord {\n sessionId: string;\n serverUrl: string;\n platform: Platform;\n pid: number;\n startedAt: string;\n deviceName?: string;\n app?: string;\n}\n\nfunction storeDir(): string {\n return join(homedir(), '.aco', 'sessions');\n}\n\nfunction ensureDir(): void {\n mkdirSync(storeDir(), { recursive: true, mode: 0o700 });\n}\n\nfunction fileFor(id: string): string {\n return join(storeDir(), `${encodeURIComponent(id)}.json`);\n}\n\nexport function saveSession(rec: SessionRecord): void {\n ensureDir();\n writeFileSync(fileFor(rec.sessionId), `${JSON.stringify(rec, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n });\n}\n\nexport function removeSession(id: string): void {\n try {\n unlinkSync(fileFor(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nexport function readSession(id: string): SessionRecord | null {\n try {\n const txt = readFileSync(fileFor(id), 'utf8');\n return JSON.parse(txt) as SessionRecord;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\nexport function listSessions(): SessionRecord[] {\n ensureDir();\n const dir = storeDir();\n const out: SessionRecord[] = [];\n for (const f of readdirSync(dir)) {\n if (!f.endsWith('.json')) continue;\n try {\n const txt = readFileSync(join(dir, f), 'utf8');\n out.push(JSON.parse(txt) as SessionRecord);\n } catch {\n /* skip malformed records */\n }\n }\n out.sort((a, b) => (a.startedAt < b.startedAt ? 1 : -1));\n return out;\n}\n\nexport function isLocalHost(serverUrl: string): boolean {\n try {\n const h = new URL(serverUrl).hostname;\n return h === '127.0.0.1' || h === 'localhost' || h === '::1';\n } catch {\n return false;\n }\n}\n\nexport function isPidAlive(pid: number): boolean {\n if (!pid) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code !== 'ESRCH';\n }\n}\n\nexport async function probeServerStatus(\n serverUrl: string,\n timeoutMs: number,\n): Promise<boolean | null> {\n let statusUrl: string;\n try {\n statusUrl = new URL(\n 'status',\n serverUrl.endsWith('/') ? serverUrl : `${serverUrl}/`,\n ).toString();\n } catch {\n return null;\n }\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), timeoutMs);\n try {\n const res = await fetch(statusUrl, { signal: ac.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function latestLiveSession(): SessionRecord | null {\n for (const rec of listSessions()) {\n if (!isLocalHost(rec.serverUrl) || isPidAlive(rec.pid)) return rec;\n }\n return null;\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n type SessionRecord,\n latestLiveSession,\n readSession,\n} from './session-store.js';\n\nexport type Platform = 'ios' | 'android';\n\nexport const DEFAULT_SERVER_URL = 'http://127.0.0.1:4723';\n\nexport interface Connection {\n sessionId: string;\n hostname: string;\n port: number;\n basePath: string;\n protocol: 'http' | 'https';\n platform: Platform;\n}\n\nexport interface ConnectionFlags {\n session?: string;\n serverUrl?: string;\n platform?: string;\n}\n\nexport function parseConnection(flags: ConnectionFlags): Connection {\n if (!flags.session) throw new Error('--session is required');\n if (!flags.platform) throw new Error('--platform is required');\n\n const platform = flags.platform.toLowerCase();\n if (platform !== 'ios' && platform !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${flags.platform}\")`,\n );\n }\n\n const rawUrl = flags.serverUrl ?? DEFAULT_SERVER_URL;\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n throw new Error(`--server-url is not a valid URL: ${rawUrl}`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`--server-url must use http(s); got ${url.protocol}`);\n }\n\n return {\n sessionId: flags.session,\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n basePath: url.pathname && url.pathname !== '/' ? url.pathname : '/',\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n platform,\n };\n}\n\nexport function addConnectionFlags(cmd: Command) {\n return cmd\n .option(\n '-s, --session <id>',\n 'W3C session id (defaults to the latest live session in ~/.aco/sessions)',\n )\n .option(\n '-S, --server-url <url>',\n `Appium server URL (defaults to the stored session's URL, then ${DEFAULT_SERVER_URL})`,\n )\n .option(\n '-p, --platform <ios|android>',\n \"session platform (drives mobile: dispatch; defaults to the stored session's platform)\",\n );\n}\n\nexport interface ResolveResult {\n conn: Connection;\n source: 'flags' | 'store-by-id' | 'store-latest';\n record?: SessionRecord;\n}\n\nexport function resolveConnection(flags: ConnectionFlags): ResolveResult {\n if (flags.session && flags.serverUrl && flags.platform) {\n return { conn: parseConnection(flags), source: 'flags' };\n }\n\n if (flags.session) {\n const rec = readSession(flags.session);\n const serverUrl = flags.serverUrl ?? rec?.serverUrl ?? DEFAULT_SERVER_URL;\n const platform = flags.platform ?? rec?.platform;\n if (!rec && !flags.serverUrl) {\n process.stderr.write(\n `aco: warning -- no stored record for session ${flags.session}; ` +\n `falling back to ${DEFAULT_SERVER_URL}\\n`,\n );\n }\n if (!platform) {\n throw new Error(\n `--platform is required (no stored record found for session ${flags.session})`,\n );\n }\n return {\n conn: parseConnection({ session: flags.session, serverUrl, platform }),\n source: rec ? 'store-by-id' : 'flags',\n record: rec ?? undefined,\n };\n }\n\n const latest = latestLiveSession();\n if (!latest) {\n throw new Error(\n 'no --session given and no live session found in ~/.aco/sessions. ' +\n 'Start one with `aco session start ...` or pass --session explicitly.',\n );\n }\n return {\n conn: parseConnection({\n session: latest.sessionId,\n serverUrl: flags.serverUrl ?? latest.serverUrl,\n platform: flags.platform ?? latest.platform,\n }),\n source: 'store-latest',\n record: latest,\n };\n}\n","import { attach, remote } from 'webdriverio';\nimport type { Connection } from './connection.js';\n\n// Node >=26 enforces the Fetch spec's \"forbidden request headers\" and rejects\n// any request that sets them by hand. webdriver@9's transport does exactly\n// that: its DEFAULT_HEADERS carry `Connection: keep-alive` and it computes a\n// `Content-Length` header for every request with a body. The result is that\n// *every* WebDriver call fails on Node 26 with\n// WebDriverError: Request failed with error code UND_ERR_INVALID_ARG\n// even though the identical code works on Node <=25 (which silently dropped the\n// forbidden headers). This is webdriverio#15265; until it ships a fix upstream\n// we strip the offending headers via the supported `transformRequest` hook. The\n// Fetch layer recomputes Content-Length from the body and manages connection\n// reuse itself, so removing them is safe -- and on Node <=25 deleting\n// absent/allowed headers is a harmless no-op.\nexport function stripForbiddenHeaders(\n requestOptions: RequestInit,\n): RequestInit {\n const { headers } = requestOptions;\n if (headers instanceof Headers) {\n headers.delete('Connection');\n headers.delete('Content-Length');\n }\n return requestOptions;\n}\n\nexport async function attachBrowser(\n conn: Connection,\n): Promise<WebdriverIO.Browser> {\n return attach({\n sessionId: conn.sessionId,\n capabilities: {} as WebdriverIO.Capabilities,\n hostname: conn.hostname,\n port: conn.port,\n path: conn.basePath,\n protocol: conn.protocol,\n isMobile: true,\n isIOS: conn.platform === 'ios',\n isAndroid: conn.platform === 'android',\n logLevel: 'silent',\n transformRequest: stripForbiddenHeaders,\n });\n}\n\nexport const DEFAULT_SESSION_TIMEOUT_MS = 300_000;\n\nexport interface CreateBrowserOptions {\n hostname: string;\n port: number;\n basePath: string;\n capabilities: Record<string, unknown>;\n connectionTimeoutMs?: number;\n // Remote-server support:\n protocol?: 'http' | 'https'; // defaults to 'http'\n // BASIC auth -- webdriver's transport (webdriver@9.27.2 build/node.js ~line\n // 2147) attaches `Authorization: Basic base64(user:key)` ONLY to the\n // `POST /session` request, never to subsequent commands. This matches the\n // device-farm contract where only session creation requires auth.\n user?: string;\n key?: string;\n}\n\nexport async function createBrowser(\n opts: CreateBrowserOptions,\n): Promise<WebdriverIO.Browser> {\n return remote({\n hostname: opts.hostname,\n port: opts.port,\n path: opts.basePath,\n protocol: opts.protocol ?? 'http',\n logLevel: 'silent',\n connectionRetryTimeout:\n opts.connectionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS,\n connectionRetryCount: 0,\n transformRequest: stripForbiddenHeaders,\n // Only forwarded when set; undefined user/key means no auth header.\n ...(opts.user !== undefined ? { user: opts.user } : {}),\n ...(opts.key !== undefined ? { key: opts.key } : {}),\n capabilities: opts.capabilities as WebdriverIO.Capabilities,\n });\n}\n","import {\n type ConnectionFlags,\n type Platform,\n resolveConnection,\n} from './connection.js';\nimport { attachBrowser } from './wd-client.js';\n\nexport async function runWithSession<T>(\n flags: ConnectionFlags,\n fn: (b: WebdriverIO.Browser, platform: Platform) => Promise<T>,\n): Promise<T> {\n const { conn } = resolveConnection(flags);\n const browser = await attachBrowser(conn);\n try {\n return await fn(browser, conn.platform);\n } finally {\n try {\n await (browser as { shutdown?: () => Promise<void> }).shutdown?.();\n } catch {\n /* ignore */\n }\n }\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n asRawActions,\n buildActions,\n parsePointerType,\n} from '../lib/actions.js';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerActions(program: Command): void {\n addConnectionFlags(\n program\n .command('actions')\n .description(\n 'perform a low-level W3C pointer gesture (POST /actions); ' +\n 'cross-platform, no mobile: extension needed',\n ),\n )\n .option(\n '-g, --gesture <steps>',\n 'one pointer chain, e.g. \"move 200 600 0, down, move 200 200 300, up\"; ' +\n 'repeat for parallel multi-touch chains',\n (val: string, prev: string[] = []) => [...prev, val],\n [] as string[],\n )\n .option(\n '-t, --type <text>',\n 'type these letters via a key source; combinable with --gesture',\n )\n .option(\n '-j, --json <w3c-actions>',\n 'raw W3C actions array (escape hatch; mutually exclusive with --gesture/--type)',\n )\n .option(\n '--pointer-type <touch|mouse|pen>',\n 'pointer device type (default: touch)',\n parsePointerType,\n 'touch' as const,\n )\n .option(\n '--no-release',\n 'skip the trailing DELETE /actions (leaves input state held)',\n )\n .option(\n '--release-only',\n 'issue a standalone DELETE /actions and nothing else ' +\n '(cleanup after a prior --no-release); mutually exclusive with ' +\n '--gesture/--type/--json/--no-release',\n )\n .action(async (opts) => {\n const gestures = opts.gesture ?? [];\n const hasErgonomic = gestures.length > 0 || opts.type != null;\n\n if (opts.releaseOnly) {\n if (hasErgonomic || opts.json) {\n throw new Error('--release-only takes no --gesture/--type/--json');\n }\n if (opts.release === false) {\n throw new Error('--release-only and --no-release contradict');\n }\n await runWithSession(opts, async (b) => {\n await b.releaseActions();\n });\n process.stdout.write('ok\\n');\n return;\n }\n\n if (hasErgonomic && opts.json) {\n throw new Error('pass either --gesture/--type or --json, not both');\n }\n\n let payload: unknown[];\n if (opts.json) {\n let raw: unknown;\n try {\n raw = JSON.parse(opts.json);\n } catch (err) {\n throw new Error(\n `--json must be valid JSON: ${(err as Error).message}`,\n );\n }\n payload = asRawActions(raw);\n } else if (hasErgonomic) {\n payload = buildActions(gestures, opts.pointerType, opts.type);\n } else {\n throw new Error('nothing to do: pass --gesture, --type, or --json');\n }\n\n await runWithSession(opts, async (b) => {\n await b.performActions(\n payload as Parameters<typeof b.performActions>[0],\n );\n if (opts.release !== false) {\n await b.releaseActions();\n }\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextCurrent(context: Command): void {\n addConnectionFlags(\n context.command('current').description('print the active context name'),\n ).action(async (opts) => {\n const name = await runWithSession(opts, (b) => b.getContext());\n process.stdout.write(`${String(name)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextList(context: Command): void {\n addConnectionFlags(\n context.command('list').description('list available contexts'),\n ).action(async (opts) => {\n const contexts = await runWithSession(opts, (b) => b.getContexts());\n process.stdout.write(`${JSON.stringify(contexts)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerContextSwitch(context: Command): void {\n addConnectionFlags(\n context.command('switch').description('switch to a context by name'),\n )\n .requiredOption('-n, --name <context>', 'context name')\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.switchContext(opts.name));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerContextCurrent } from './current.js';\nimport { registerContextList } from './list.js';\nimport { registerContextSwitch } from './switch.js';\n\nexport function registerContext(program: Command): void {\n const context = program\n .command('context')\n .description('inspect / switch the active automation context');\n registerContextList(context);\n registerContextCurrent(context);\n registerContextSwitch(context);\n}\n","import type { Device } from './types.js';\n\nconst STATE_RANK: Record<Device['state'], number> = {\n booted: 0,\n available: 1,\n unknown: 2,\n unavailable: 3,\n};\n\nexport function sortDevices(devices: Device[]): Device[] {\n return [...devices].sort((a, b) => {\n if (a.platform !== b.platform) return a.platform < b.platform ? -1 : 1;\n if (a.state !== b.state) return STATE_RANK[a.state] - STATE_RANK[b.state];\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function renderTable(devices: Device[]): string {\n if (devices.length === 0) return '';\n const cols = sortDevices(devices).map((d) => ({\n platform: d.platform,\n kind: d.kind,\n state: d.state,\n version: d.platformVersion ?? '',\n name: d.name,\n id: d.id,\n }));\n const widths = {\n platform: Math.max(8, ...cols.map((c) => c.platform.length)),\n kind: Math.max(9, ...cols.map((c) => c.kind.length)),\n state: Math.max(11, ...cols.map((c) => c.state.length)),\n version: Math.max(7, ...cols.map((c) => c.version.length)),\n name: Math.max(4, ...cols.map((c) => c.name.length)),\n };\n const header = `${[\n 'PLATFORM'.padEnd(widths.platform),\n 'KIND'.padEnd(widths.kind),\n 'STATE'.padEnd(widths.state),\n 'VERSION'.padEnd(widths.version),\n 'NAME'.padEnd(widths.name),\n 'ID',\n ].join(' ')}\\n`;\n const body = cols\n .map((c) =>\n [\n c.platform.padEnd(widths.platform),\n c.kind.padEnd(widths.kind),\n c.state.padEnd(widths.state),\n c.version.padEnd(widths.version),\n c.name.padEnd(widths.name),\n c.id,\n ].join(' '),\n )\n .join('\\n');\n return `${header + body}\\n`;\n}\n","import { log } from '@appium/logger';\n\nlet quieted = false;\n\n// `appium-ios-device` and `appium-adb` log routine probe failures (e.g. \"usbmuxd\n// socket missing\", \"no adb devices\") at debug level through @appium/support's\n// shared logger, whose first `getLogger` call (made when those libraries are\n// imported) forces the process-global @appium/logger level to \"verbose\". Left\n// alone, every `aco device list` on a machine with no real device spews a\n// usbmuxd/adb stack trace to stderr. We lower that shared global level to \"warn\"\n// so genuine warnings/errors still surface but the expected no-device-connected\n// probes stay quiet; we report real failures as our own friendly notes instead.\n//\n// This must run *after* the appium libraries are imported (which it does -- it\n// is called from inside the listers, well after their top-level imports), so the\n// libraries' own \"default to verbose\" initialization does not clobber it.\nexport function quietAppiumLog(): void {\n if (quieted) return;\n log.level = 'warn';\n quieted = true;\n}\n","import type { VerboseDevice } from 'appium-adb';\nimport { quietAppiumLog } from './appium-log.js';\nimport type { Device, DeviceState, ListResult } from './types.js';\n\n// adb's `state` vocabulary -> aco's DeviceState.\nfunction mapAdbState(adbState: string): DeviceState {\n if (adbState === 'device') return 'booted'; // reachable & authorized\n if (adbState === 'offline') return 'unavailable';\n return 'unknown'; // unauthorized, bootloader, ...\n}\n\nexport async function listAndroidRealDevices(): Promise<ListResult> {\n // Loaded lazily: `appium-adb` pulls in `@appium/support` -> `read-pkg`\n // (ESM-only) -> `unicorn-magic`, whose subpath exports the `tsx` dev runtime\n // cannot resolve. A static top-level import would crash the whole CLI at\n // startup under `pnpm dev`; a guarded dynamic import degrades to a note there\n // while staying fully functional under the built `node dist` runtime.\n let ADB: typeof import('appium-adb').ADB;\n try {\n ({ ADB } = await import('appium-adb'));\n } catch (err) {\n return {\n devices: [],\n notes: [\n `Android real-device discovery unavailable in this runtime: ${(err as Error).message}`,\n ],\n };\n }\n quietAppiumLog();\n\n let adb: import('appium-adb').ADB;\n try {\n adb = await ADB.createADB();\n } catch (err) {\n return {\n devices: [],\n notes: [\n `Android real devices skipped: ${(err as Error).message}. Ensure the Android SDK platform-tools (adb) are installed and on PATH (set $ANDROID_HOME / $ANDROID_SDK_ROOT).`,\n ],\n };\n }\n\n const notes: string[] = [];\n // `adb devices -l` long format (verbose): serial, state, and trailing\n // descriptors (`product:` / `model:` / `device:` / `transport_id:`). The\n // `model:` descriptor carries the AVD name for emulators, which lets us\n // reconcile a running emulator against its AVD `.ini` definition row.\n let connected: VerboseDevice[];\n let emulatorSerials: Set<string>;\n try {\n connected = await adb.getConnectedDevices({ verbose: true });\n const emulators = await adb.getConnectedEmulators();\n emulatorSerials = new Set(emulators.map((e) => e.udid));\n } catch (err) {\n return {\n devices: [],\n notes: [`Android real devices skipped: ${(err as Error).message}.`],\n };\n }\n\n const devices: Device[] = [];\n for (const d of connected) {\n const isEmulator = emulatorSerials.has(d.udid) || /^emulator-/.test(d.udid);\n let platformVersion: string | undefined;\n if (d.state === 'device') {\n try {\n platformVersion = await adb\n .clone({ udid: d.udid })\n .getPlatformVersion();\n } catch {\n notes.push(\n `Android device ${d.udid}: could not read platform version.`,\n );\n }\n } else if (d.state === 'unauthorized') {\n notes.push(\n `Android device ${d.udid} is unauthorized -- accept the \"Allow USB debugging\" prompt on the device, then re-run.`,\n );\n }\n devices.push({\n id: d.udid,\n // The `model:` descriptor from the long format gives a friendly label\n // (the AVD name for emulators, the product model for handsets); fall back\n // to the serial when adb omits it.\n name: d.model || d.udid,\n platform: 'android',\n kind: isEmulator ? 'emulator' : 'real',\n // `avdName` carries the running emulator's AVD identity so the merge step\n // in index.ts can collapse the matching `.ini` definition row into this one.\n avdName: isEmulator ? d.model : undefined,\n state: mapAdbState(d.state),\n platformVersion,\n });\n }\n return { devices, notes };\n}\n\nexport { mapAdbState };\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Device, ListResult } from './types.js';\n\ninterface ResolvedAvdDir {\n dir: string;\n notes: string[];\n}\n\nfunction resolveAvdDir(): ResolvedAvdDir | null {\n const notes: string[] = [];\n const candidates: Array<{ path: string | undefined; suffix?: string }> = [\n { path: process.env.ANDROID_AVD_HOME },\n { path: process.env.ANDROID_EMULATOR_HOME, suffix: 'avd' },\n { path: join(homedir(), '.android'), suffix: 'avd' },\n ];\n for (const c of candidates) {\n if (!c.path) continue;\n const full = c.suffix ? join(c.path, c.suffix) : c.path;\n try {\n if (statSync(full).isDirectory()) {\n return { dir: full, notes };\n }\n notes.push(`Android: ${full} exists but is not a directory; skipping.`);\n } catch {\n // ENOENT — try next candidate\n }\n }\n return null;\n}\n\ninterface AvdIniMeta {\n target?: string;\n apiLevel?: string;\n path?: string;\n}\n\nfunction parseAvdIni(iniPath: string): AvdIniMeta {\n let raw: string;\n try {\n raw = readFileSync(iniPath, 'utf8');\n } catch {\n return {};\n }\n const m: AvdIniMeta = {};\n for (const line of raw.split('\\n')) {\n const eq = line.indexOf('=');\n if (eq < 0) continue;\n const k = line.slice(0, eq).trim();\n const v = line.slice(eq + 1).trim();\n if (k === 'target') m.target = v;\n if (k === 'path') m.path = v;\n }\n if (m.target) {\n const apiMatch = /^android-(\\d+)$/.exec(m.target);\n if (apiMatch) m.apiLevel = apiMatch[1];\n }\n return m;\n}\n\nexport async function listAndroidAvds(): Promise<ListResult> {\n const resolved = resolveAvdDir();\n if (!resolved) {\n return {\n devices: [],\n notes: [\n 'Android skipped: no AVD directory found. ' +\n 'Set $ANDROID_AVD_HOME, $ANDROID_EMULATOR_HOME, or create ' +\n '~/.android/avd (Android Studio does this on first AVD).',\n ],\n };\n }\n\n const entries = readdirSync(resolved.dir);\n const out: Device[] = [];\n for (const f of entries) {\n if (!f.endsWith('.ini')) continue;\n const name = f.slice(0, -'.ini'.length);\n const iniPath = join(resolved.dir, f);\n const meta = parseAvdIni(iniPath);\n out.push({\n id: name,\n name,\n platform: 'android',\n kind: 'emulator',\n state: 'unknown',\n platformVersion: meta.apiLevel,\n runtime: meta.target,\n });\n }\n return { devices: out, notes: resolved.notes };\n}\n","import { quietAppiumLog } from './appium-log.js';\nimport type { Device, ListResult } from './types.js';\n\nexport async function listIosRealDevices(): Promise<ListResult> {\n // Loaded lazily: `appium-ios-device` pulls in `@appium/support` ->\n // `read-pkg` (ESM-only) -> `unicorn-magic`, whose subpath exports the `tsx`\n // dev runtime cannot resolve. A static top-level import would crash the whole\n // CLI at startup under `pnpm dev`; a guarded dynamic import degrades to a note\n // there while staying fully functional under the built `node dist` runtime.\n let utilities: typeof import('appium-ios-device').utilities;\n try {\n ({ utilities } = await import('appium-ios-device'));\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS real-device discovery unavailable in this runtime: ${(err as Error).message}`,\n ],\n };\n }\n quietAppiumLog();\n\n let udids: string[];\n try {\n udids = await utilities.getConnectedDevices();\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS real devices skipped: ${(err as Error).message}. Connect the device via USB and trust this computer.`,\n ],\n };\n }\n\n const devices: Device[] = [];\n const notes: string[] = [];\n for (const udid of udids) {\n let name = udid;\n let platformVersion: string | undefined;\n try {\n name = await utilities.getDeviceName(udid);\n } catch {\n notes.push(\n `iOS real device ${udid}: could not read name (locked/untrusted?).`,\n );\n }\n try {\n platformVersion = await utilities.getOSVersion(udid);\n } catch {\n // leave version blank\n }\n devices.push({\n id: udid,\n name,\n platform: 'ios',\n kind: 'real',\n // A connected, trusted device is reachable -> treat as \"booted\" so it\n // ranks first and shows under the default `--state available` filter.\n state: 'booted',\n platformVersion,\n });\n }\n return { devices, notes };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Device, DeviceState, ListResult } from './types.js';\n\nconst execFileP = promisify(execFile);\n\ninterface SimctlListDeviceEntry {\n udid: string;\n name: string;\n state: string;\n isAvailable?: boolean;\n availability?: string;\n}\n\ninterface SimctlListDevicesJson {\n devices: Record<string, SimctlListDeviceEntry[]>;\n}\n\nconst RUNTIME_PREFIX = 'com.apple.CoreSimulator.SimRuntime.';\n\nfunction runtimeToVersion(runtime: string): string | undefined {\n const m = /(\\d+(?:\\.\\d+){0,2})$/.exec(runtime);\n return m?.[1];\n}\n\nfunction mapIosState(e: SimctlListDeviceEntry): DeviceState {\n if (e.isAvailable === false) return 'unavailable';\n if (\n typeof e.availability === 'string' &&\n /unavailable/i.test(e.availability)\n ) {\n return 'unavailable';\n }\n if (e.state === 'Booted') return 'booted';\n return 'available';\n}\n\nexport async function listIosSimulators(): Promise<ListResult> {\n let raw: string;\n try {\n const { stdout } = await execFileP(\n 'xcrun',\n ['simctl', 'list', '-j', 'devices'],\n { maxBuffer: 16 * 1024 * 1024 },\n );\n raw = stdout;\n } catch (err) {\n const e = err as NodeJS.ErrnoException & { stderr?: string };\n if (e.code === 'ENOENT') {\n return {\n devices: [],\n notes: [\n 'iOS skipped: `xcrun` not found on PATH. ' +\n 'Install Xcode command line tools: `xcode-select --install`.',\n ],\n };\n }\n if (\n typeof e.stderr === 'string' &&\n /unable to find utility \"simctl\"/i.test(e.stderr)\n ) {\n return {\n devices: [],\n notes: [\n 'iOS skipped: `xcrun simctl` not available. ' +\n 'Install Xcode (not just the CLT) and run ' +\n '`sudo xcode-select -s /Applications/Xcode.app`.',\n ],\n };\n }\n return {\n devices: [],\n notes: [`iOS skipped: ${e.message}`],\n };\n }\n\n let parsed: SimctlListDevicesJson;\n try {\n parsed = JSON.parse(raw) as SimctlListDevicesJson;\n } catch (err) {\n return {\n devices: [],\n notes: [\n `iOS skipped: failed to parse simctl JSON: ${(err as Error).message}`,\n ],\n };\n }\n\n const out: Device[] = [];\n for (const [rawRuntime, entries] of Object.entries(parsed.devices ?? {})) {\n const runtime = rawRuntime.startsWith(RUNTIME_PREFIX)\n ? rawRuntime.slice(RUNTIME_PREFIX.length).replace(/-/g, '.')\n : rawRuntime;\n const platformVersion = runtimeToVersion(runtime);\n for (const e of entries) {\n out.push({\n id: e.udid,\n name: e.name,\n platform: 'ios',\n kind: 'simulator',\n state: mapIosState(e),\n platformVersion,\n runtime,\n });\n }\n }\n return { devices: out, notes: [] };\n}\n","import { listAndroidRealDevices } from './android-real.js';\nimport { listAndroidAvds } from './android.js';\nimport { listIosRealDevices } from './ios-real.js';\nimport { listIosSimulators } from './ios.js';\nimport type { ListResult, Platform } from './types.js';\n\nexport type {\n Device,\n DeviceKind,\n DeviceState,\n ListResult,\n Platform,\n} from './types.js';\n\nexport { listIosSimulators } from './ios.js';\nexport { listIosRealDevices } from './ios-real.js';\nexport { listAndroidAvds } from './android.js';\nexport { listAndroidRealDevices } from './android-real.js';\n\nfunction merge(results: ListResult[]): ListResult {\n return {\n devices: results.flatMap((r) => r.devices),\n notes: results.flatMap((r) => r.notes),\n };\n}\n\nexport async function listIos(): Promise<ListResult> {\n return merge(await Promise.all([listIosSimulators(), listIosRealDevices()]));\n}\n\nexport async function listAndroid(): Promise<ListResult> {\n const [avds, real] = await Promise.all([\n listAndroidAvds(),\n listAndroidRealDevices(),\n ]);\n // Reconcile: a running emulator shows up both as an AVD `.ini` definition\n // (id = AVD name) and as an adb serial (id = emulator-5554, avdName = AVD\n // name). Drop the `.ini` row whose name matches a running emulator's avdName\n // so the booted instance is the single source of truth for that AVD.\n const runningAvdNames = new Set(\n real.devices\n .filter((d) => d.kind === 'emulator' && d.avdName)\n .map((d) => d.avdName as string),\n );\n const avdDefs = {\n ...avds,\n devices: avds.devices.filter((d) => !runningAvdNames.has(d.name)),\n };\n return merge([avdDefs, real]);\n}\n\nexport async function listAllDevices(platform?: Platform): Promise<ListResult> {\n if (platform === 'ios') return listIos();\n if (platform === 'android') return listAndroid();\n return merge(await Promise.all([listIos(), listAndroid()]));\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { renderTable, sortDevices } from '../../lib/devices/format.js';\nimport {\n type Device,\n type Platform,\n listAllDevices,\n} from '../../lib/devices/index.js';\n\ntype StateFilter = 'available' | 'booted' | 'all';\n\nconst STATE_FILTERS: Record<StateFilter, (d: Device) => boolean> = {\n available: (d) => d.state !== 'unavailable',\n booted: (d) => d.state === 'booted',\n all: () => true,\n};\n\nfunction isStateFilter(value: string): value is StateFilter {\n return value === 'available' || value === 'booted' || value === 'all';\n}\n\nexport function registerDeviceList(device: Command): void {\n device\n .command('list')\n .description(\n 'list iOS Simulators + connected iPhones/iPads and Android AVDs + ' +\n 'connected handsets/emulators that you can pass to `aco session start`',\n )\n .option(\n '-p, --platform <ios|android>',\n 'restrict to one platform (default: both)',\n )\n .option(\n '--state <available|booted|all>',\n 'filter rows by state',\n 'available',\n )\n .option('--json', 'emit JSON instead of a human-readable table')\n .action(async (opts) => {\n let platform: Platform | undefined;\n if (opts.platform) {\n const p = opts.platform.toLowerCase();\n if (p !== 'ios' && p !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${opts.platform}\")`,\n );\n }\n platform = p;\n }\n\n const stateRaw = (opts.state ?? 'available').toLowerCase();\n if (!isStateFilter(stateRaw)) {\n throw new Error(\n `--state must be \"available\", \"booted\", or \"all\" (got \"${opts.state}\")`,\n );\n }\n const filter = STATE_FILTERS[stateRaw];\n\n const { devices, notes } = await listAllDevices(platform);\n const filtered = devices.filter(filter);\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ devices: sortDevices(filtered), notes }, null, 2)}\\n`,\n );\n return;\n }\n\n for (const n of notes) process.stderr.write(`aco: ${n}\\n`);\n\n if (filtered.length === 0) {\n const hint =\n platform === 'ios'\n ? 'Install simulator runtimes via Xcode > Settings > Platforms.'\n : platform === 'android'\n ? 'Create an AVD via Android Studio > Virtual Device Manager.'\n : 'Install Xcode runtimes and/or an Android AVD first.';\n process.stderr.write(`no devices found. ${hint}\\n`);\n return;\n }\n\n process.stdout.write(renderTable(filtered));\n process.stderr.write(\n 'tip: pass a row ID to `--udid` (real device or iOS simulator) ' +\n 'or a NAME to `--avd` (Android emulator)\\n',\n );\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerDeviceList } from './list.js';\n\nexport function registerDevice(program: Command): void {\n const device = program\n .command('device')\n .description('discover iOS Simulators and Android AVDs to target');\n registerDeviceList(device);\n}\n","export const W3C_ELEMENT_ID = 'element-6066-11e4-a52e-4f735466cecf';\n\nexport const STRATEGIES = [\n 'accessibility id',\n 'xpath',\n 'class name',\n 'css selector',\n '-ios predicate string',\n '-ios class chain',\n '-android uiautomator',\n '-android viewtag',\n 'id',\n] as const;\n\nexport function unwrapElementId(ref: Record<string, string>): string {\n // The raw W3C findElement command resolves to a `{ error, message }` value\n // on no-match rather than rejecting, so surface it as a real failure\n // instead of JSON-stringifying the error object as if it were an id.\n if (ref && typeof ref === 'object' && 'error' in ref) {\n throw new Error(ref.message || ref.error || 'no such element');\n }\n return ref[W3C_ELEMENT_ID] ?? ref.ELEMENT ?? JSON.stringify(ref);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { unwrapElementId } from '../../lib/locator.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementActive(element: Command): void {\n addConnectionFlags(\n element\n .command('active')\n .description('get the active (focused) element (GET /element/active)'),\n ).action(async (opts) => {\n const id = await runWithSession(opts, async (b) => {\n const el = (await b.getActiveElement()) as Record<string, string>;\n return unwrapElementId(el);\n });\n process.stdout.write(`${JSON.stringify(id)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementAttribute(element: Command): void {\n addConnectionFlags(\n element\n .command('attribute')\n .description(\n 'read an element attribute (GET /element/:id/attribute/:name)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-n, --name <attr>', 'attribute name')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementAttribute(opts.element, opts.name),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementClear(element: Command): void {\n addConnectionFlags(\n element\n .command('clear')\n .description('clear an element (POST /element/:id/clear)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.elementClear(opts.element));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementClick(element: Command): void {\n addConnectionFlags(\n element\n .command('click')\n .description('click an element by id (POST /element/:id/click)'),\n )\n .requiredOption(\n '-e, --element <id>',\n 'element id (from `aco element find`)',\n )\n .action(async (opts) => {\n await runWithSession(opts, (b) => b.elementClick(opts.element));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementDisplayed(element: Command): void {\n addConnectionFlags(\n element\n .command('displayed')\n .description('is the element displayed? (GET /element/:id/displayed)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementDisplayed(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementEnabled(element: Command): void {\n addConnectionFlags(\n element\n .command('enabled')\n .description('is the element enabled? (GET /element/:id/enabled)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementEnabled(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { STRATEGIES, unwrapElementId } from '../../lib/locator.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementFind(element: Command): void {\n addConnectionFlags(\n element\n .command('find')\n .description('find a single element (POST /element)'),\n )\n .requiredOption(\n '-u, --using <strategy>',\n `locator strategy (${STRATEGIES.join(', ')})`,\n )\n .requiredOption('-v, --value <value>', 'locator value')\n .option('--all', 'find all matching elements (POST /elements)')\n .action(async (opts) => {\n const result = await runWithSession(opts, async (b) => {\n if (opts.all) {\n const els = (await b.findElements(opts.using, opts.value)) as Record<\n string,\n string\n >[];\n return els.map(unwrapElementId);\n }\n const el = (await b.findElement(opts.using, opts.value)) as Record<\n string,\n string\n >;\n return unwrapElementId(el);\n });\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementProperty(element: Command): void {\n addConnectionFlags(\n element\n .command('property')\n .description(\n 'read an element property (GET /element/:id/property/:name)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-n, --name <prop>', 'property name')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementProperty(opts.element, opts.name),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementRect(element: Command): void {\n addConnectionFlags(\n element\n .command('rect')\n .description(\n 'get the element rect {x,y,width,height} (GET /element/:id/rect)',\n ),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.getElementRect(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementSelected(element: Command): void {\n addConnectionFlags(\n element\n .command('selected')\n .description('is the element selected? (GET /element/:id/selected)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const value = await runWithSession(opts, (b) =>\n b.isElementSelected(opts.element),\n );\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementSendKeys(element: Command): void {\n addConnectionFlags(\n element\n .command('send-keys')\n .description('send keys to an element (POST /element/:id/value)'),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .requiredOption('-t, --text <value>', 'text to type')\n .action(async (opts) => {\n await runWithSession(opts, (b) =>\n b.elementSendKeys(opts.element, opts.text),\n );\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerElementText(element: Command): void {\n addConnectionFlags(\n element\n .command('text')\n .description(\"read an element's text (GET /element/:id/text)\"),\n )\n .requiredOption('-e, --element <id>', 'element id')\n .action(async (opts) => {\n const text = await runWithSession(opts, (b) =>\n b.getElementText(opts.element),\n );\n process.stdout.write(`${text}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerElementActive } from './active.js';\nimport { registerElementAttribute } from './attribute.js';\nimport { registerElementClear } from './clear.js';\nimport { registerElementClick } from './click.js';\nimport { registerElementDisplayed } from './displayed.js';\nimport { registerElementEnabled } from './enabled.js';\nimport { registerElementFind } from './find.js';\nimport { registerElementProperty } from './property.js';\nimport { registerElementRect } from './rect.js';\nimport { registerElementSelected } from './selected.js';\nimport { registerElementSendKeys } from './send-keys.js';\nimport { registerElementText } from './text.js';\n\nexport function registerElement(program: Command): void {\n const element = program\n .command('element')\n .description('W3C element commands');\n registerElementFind(element);\n registerElementActive(element);\n registerElementClick(element);\n registerElementText(element);\n registerElementSendKeys(element);\n registerElementAttribute(element);\n registerElementProperty(element);\n registerElementDisplayed(element);\n registerElementEnabled(element);\n registerElementSelected(element);\n registerElementRect(element);\n registerElementClear(element);\n}\n","import { DOMParser } from '@xmldom/xmldom';\nimport type { Platform } from './connection.js';\nimport { AcoUserError } from './errors.js';\n\nexport interface ElementRow {\n index: number;\n type: string;\n label: string;\n accessibilityId?: string;\n value?: string;\n selector: string;\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nconst ATTRS = {\n ios: { a11y: 'name', text: 'label', value: 'value' },\n android: { a11y: 'content-desc', text: 'text', value: 'text' },\n} as const;\n\nfunction esc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction attr(el: Element, name: string): string {\n return el.getAttribute(name)?.trim() ?? '';\n}\n\nfunction rectOf(\n platform: Platform,\n el: Element,\n): ElementRow['rect'] | undefined {\n if (platform === 'ios') {\n const n = (k: string) => Number.parseFloat(el.getAttribute(k) ?? '');\n const x = n('x');\n const y = n('y');\n const width = n('width');\n const height = n('height');\n if ([x, y, width, height].every(Number.isFinite)) {\n return { x, y, width, height };\n }\n return undefined;\n }\n const m = (el.getAttribute('bounds') ?? '').match(\n /\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]/,\n );\n if (!m) return undefined;\n const x1 = Number(m[1]);\n const y1 = Number(m[2]);\n const x2 = Number(m[3]);\n const y2 = Number(m[4]);\n return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };\n}\n\nfunction selectorFor(\n platform: Platform,\n a11y: string,\n text: string,\n): string | undefined {\n if (a11y) return `accessibility id:${a11y}`;\n if (text) {\n return platform === 'ios'\n ? `-ios predicate string:label == \"${esc(text)}\"`\n : `-android uiautomator:new UiSelector().text(\"${esc(text)}\")`;\n }\n return undefined;\n}\n\nexport function listElements(\n xml: string,\n platform: Platform,\n opts: { limit?: number } = {},\n): ElementRow[] {\n const parseErrors: string[] = [];\n let doc: ReturnType<DOMParser['parseFromString']>;\n try {\n doc = new DOMParser({\n onError: (level, msg) => {\n if (level === 'error' || level === 'fatalError') parseErrors.push(msg);\n },\n }).parseFromString(xml, 'text/xml');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`could not parse page source as XML: ${msg}`);\n }\n if (parseErrors.length > 0) {\n throw new AcoUserError(\n `could not parse page source as XML: ${parseErrors[0]}`,\n );\n }\n\n const a = ATTRS[platform];\n const rows: ElementRow[] = [];\n\n const walk = (node: Element) => {\n const tag = node.tagName ?? node.nodeName;\n\n const a11y = attr(node, a.a11y);\n const text = attr(node, a.text);\n const value = a.value !== a.text ? attr(node, a.value) : '';\n\n const selector = selectorFor(platform, a11y, text || value);\n if (selector) {\n rows.push({\n index: rows.length,\n type: tag,\n label: text || a11y || value,\n accessibilityId: a11y || undefined,\n value: value || undefined,\n selector,\n rect: rectOf(platform, node),\n });\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n if (child?.nodeType === 1) walk(child as unknown as Element);\n }\n };\n\n const root = doc.documentElement;\n if (root) walk(root as unknown as Element);\n\n return opts.limit != null ? rows.slice(0, opts.limit) : rows;\n}\n\nexport function formatRows(rows: ElementRow[]): string {\n if (rows.length === 0) {\n return 'no labelled elements found on the current screen';\n }\n return rows\n .map((r) => {\n const rect = r.rect\n ? `\\n rect: ${r.rect.x},${r.rect.y} ${r.rect.width}x${r.rect.height}`\n : '';\n return (\n `#${r.index} ${r.type} ${JSON.stringify(r.label)}\\n` +\n ` selector: ${r.selector}${rect}`\n );\n })\n .join('\\n');\n}\n","export class AcoUserError extends Error {}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { formatRows, listElements } from '../lib/list-elements.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerElements(program: Command): void {\n addConnectionFlags(\n program\n .command('elements')\n .description(\n 'list on-screen elements that carry text (name/label/value or ' +\n 'content-desc/text), each with a ready-to-paste selector for `aco tap`',\n ),\n )\n .option('--json', 'emit machine-readable rows instead of the human list')\n .option('--limit <n>', 'cap the number of rows', (v) => {\n const n = Number.parseInt(v, 10);\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`--limit must be a non-negative integer (got \"${v}\")`);\n }\n return n;\n })\n .action(async (opts) => {\n const rows = await runWithSession(opts, async (b, platform) => {\n const xml = await b.getPageSource();\n return listElements(xml, platform, { limit: opts.limit });\n });\n const out = opts.json ? JSON.stringify(rows, null, 2) : formatRows(rows);\n process.stdout.write(`${out}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerMobileCall(mobile: Command): void {\n addConnectionFlags(\n mobile\n .command('call')\n .description(\n 'invoke any mobile: extension by name with a JSON args blob ' +\n '(unvalidated escape hatch; prefer `aco ios`/`aco android` for ' +\n 'first-class commands)',\n ),\n )\n .requiredOption(\n '-n, --name <mobile:xxx>',\n 'the mobile: command, including the \"mobile: \" prefix',\n )\n .option('-a, --args <json>', 'arguments object as JSON', '{}')\n .action(async (opts) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args) as Record<string, unknown>;\n } catch (err) {\n throw new Error(`--args must be valid JSON: ${(err as Error).message}`);\n }\n const result = await runWithSession(opts, (b) =>\n b.execute(opts.name, args),\n );\n process.stdout.write(`${JSON.stringify(result ?? null)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags, resolveConnection } from '../../lib/connection.js';\n\nexport function registerMobileList(mobile: Command): void {\n addConnectionFlags(\n mobile\n .command('list')\n .description(\n 'list mobile: extensions the connected driver advertises ' +\n '(GET /session/:id/appium/extensions)',\n ),\n )\n .option('--json', 'emit the raw endpoint payload as JSON')\n .action(async (opts) => {\n const { conn } = resolveConnection(opts);\n const base =\n conn.basePath === '/' ? '' : conn.basePath.replace(/\\/$/, '');\n const url =\n `${conn.protocol}://${conn.hostname}:${conn.port}` +\n `${base}/session/${conn.sessionId}/appium/extensions`;\n\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `listExtensions failed: ${res.status} ${res.statusText}`,\n );\n }\n const body = (await res.json()) as {\n value?: { rest?: { driver?: Record<string, unknown> } };\n };\n const driver = body.value?.rest?.driver ?? {};\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify(body.value ?? body, null, 2)}\\n`,\n );\n return;\n }\n for (const name of Object.keys(driver)) {\n process.stdout.write(`${name}\\n`);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerMobileCall } from './call.js';\nimport { registerMobileList } from './list.js';\n\nexport function registerMobile(program: Command): void {\n const mobile = program\n .command('mobile')\n .description('inspect and call mobile: execute extensions');\n registerMobileList(mobile);\n registerMobileCall(mobile);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nconst ORIENTATIONS = ['PORTRAIT', 'LANDSCAPE'] as const;\n\nexport function registerOrientation(program: Command): void {\n const orientation = program\n .command('orientation')\n .description('read / set the device orientation (JSONWP /orientation)');\n\n addConnectionFlags(\n orientation\n .command('get')\n .description('print the current device orientation (GET /orientation)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getOrientation());\n process.stdout.write(`${value}\\n`);\n });\n\n addConnectionFlags(\n orientation\n .command('set')\n .description('set the device orientation (POST /orientation)'),\n )\n .argument('<orientation>', 'PORTRAIT or LANDSCAPE')\n .action(async (orientationArg, opts) => {\n const normalized = orientationArg.toUpperCase();\n if (!(ORIENTATIONS as readonly string[]).includes(normalized)) {\n throw new Error(\n `invalid orientation \"${orientationArg}\": expected PORTRAIT or LANDSCAPE`,\n );\n }\n await runWithSession(opts, (b) => b.setOrientation(normalized));\n process.stdout.write('ok\\n');\n });\n}\n","{\n \"drivers\": [\n {\n \"package\": \"appium-uiautomator2-driver\",\n \"version\": \"7.5.2\"\n },\n {\n \"package\": \"appium-android-driver\",\n \"version\": \"13.2.3\"\n }\n ],\n \"extensions\": {\n \"mobile: shell\": {\n \"command\": \"mobileShell\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"includeStderr\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: execEmuConsoleCommand\": {\n \"command\": \"mobileExecEmuConsoleCommand\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"execTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"connTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"initTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startLogsBroadcast\": {\n \"command\": \"mobileStartLogsBroadcast\",\n \"params\": []\n },\n \"mobile: stopLogsBroadcast\": {\n \"command\": \"mobileStopLogsBroadcast\",\n \"params\": []\n },\n \"mobile: changePermissions\": {\n \"command\": \"mobileChangePermissions\",\n \"params\": [\n {\n \"name\": \"permissions\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appPackage\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"target\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPermissions\": {\n \"command\": \"mobileGetPermissions\",\n \"params\": [\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appPackage\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: performEditorAction\": {\n \"command\": \"mobilePerformEditorAction\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getDeviceTime\": {\n \"command\": \"mobileGetDeviceTime\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startScreenStreaming\": {\n \"command\": \"mobileStartScreenStreaming\",\n \"params\": [\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"bitRate\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"host\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"port\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"pathname\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"tcpPort\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"quality\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"considerRotation\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"logPipelineDetails\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: stopScreenStreaming\": {\n \"command\": \"mobileStopScreenStreaming\",\n \"params\": []\n },\n \"mobile: getNotifications\": {\n \"command\": \"mobileGetNotifications\",\n \"params\": []\n },\n \"mobile: listSms\": {\n \"command\": \"mobileListSms\",\n \"params\": []\n },\n \"mobile: pushFile\": {\n \"command\": \"pushFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFolder\": {\n \"command\": \"pullFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFile\": {\n \"command\": \"pullFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFile\": {\n \"command\": \"mobileDeleteFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isAppInstalled\": {\n \"command\": \"mobileIsAppInstalled\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listApps\": {\n \"command\": \"mobileListApps\",\n \"params\": [\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: queryAppState\": {\n \"command\": \"queryAppState\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activateApp\": {\n \"command\": \"activateApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: removeApp\": {\n \"command\": \"mobileRemoveApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"keepData\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"skipInstallCheck\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: terminateApp\": {\n \"command\": \"mobileTerminateApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installApp\": {\n \"command\": \"mobileInstallApp\",\n \"params\": [\n {\n \"name\": \"appPath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"checkVersion\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"allowTestPackages\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"useSdcard\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"grantPermissions\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"replace\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"noIncremental\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: clearApp\": {\n \"command\": \"mobileClearApp\",\n \"params\": [\n {\n \"name\": \"appId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: backgroundApp\": {\n \"command\": \"mobileBackgroundApp\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startService\": {\n \"command\": \"mobileStartService\",\n \"params\": [\n {\n \"name\": \"foreground\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopService\": {\n \"command\": \"mobileStopService\",\n \"params\": [\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startActivity\": {\n \"command\": \"mobileStartActivity\",\n \"params\": [\n {\n \"name\": \"wait\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"stop\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"windowingMode\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"activityType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"display\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: broadcast\": {\n \"command\": \"mobileBroadcast\",\n \"params\": [\n {\n \"name\": \"receiverPermission\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"allowBackgroundActivityStarts\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"intent\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"mimeType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"identifier\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"categories\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"extras\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getContexts\": {\n \"command\": \"mobileGetContexts\",\n \"params\": [\n {\n \"name\": \"waitForWebviewMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getChromeCapabilities\": {\n \"command\": \"mobileGetChromeCapabilities\",\n \"params\": []\n },\n \"mobile: lock\": {\n \"command\": \"lock\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: unlock\": {\n \"command\": \"mobileUnlock\",\n \"params\": [\n {\n \"name\": \"key\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"strategy\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: isLocked\": {\n \"command\": \"isLocked\",\n \"params\": []\n },\n \"mobile: refreshGpsCache\": {\n \"command\": \"mobileRefreshGpsCache\",\n \"params\": [\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: startMediaProjectionRecording\": {\n \"command\": \"mobileStartMediaProjectionRecording\",\n \"params\": [\n {\n \"name\": \"resolution\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"priority\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxDurationSec\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"filename\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isMediaProjectionRecordingRunning\": {\n \"command\": \"mobileIsMediaProjectionRecordingRunning\",\n \"params\": []\n },\n \"mobile: stopMediaProjectionRecording\": {\n \"command\": \"mobileStopMediaProjectionRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"uploadTimeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getConnectivity\": {\n \"command\": \"mobileGetConnectivity\",\n \"params\": [\n {\n \"name\": \"services\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setConnectivity\": {\n \"command\": \"mobileSetConnectivity\",\n \"params\": [\n {\n \"name\": \"wifi\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"data\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"airplaneMode\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: hideKeyboard\": {\n \"command\": \"hideKeyboard\",\n \"params\": []\n },\n \"mobile: isKeyboardShown\": {\n \"command\": \"isKeyboardShown\",\n \"params\": []\n },\n \"mobile: deviceidle\": {\n \"command\": \"mobileDeviceidle\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"packages\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: bluetooth\": {\n \"command\": \"mobileBluetooth\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: nfc\": {\n \"command\": \"mobileNfc\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setUiMode\": {\n \"command\": \"mobileSetUiMode\",\n \"params\": [\n {\n \"name\": \"mode\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"value\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getUiMode\": {\n \"command\": \"mobileGetUiMode\",\n \"params\": [\n {\n \"name\": \"mode\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: injectEmulatorCameraImage\": {\n \"command\": \"mobileInjectEmulatorCameraImage\",\n \"params\": [\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sendTrimMemory\": {\n \"command\": \"mobileSendTrimMemory\",\n \"params\": [\n {\n \"name\": \"pkg\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"level\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPerformanceData\": {\n \"command\": \"mobileGetPerformanceData\",\n \"params\": [\n {\n \"name\": \"packageName\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"dataType\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPerformanceDataTypes\": {\n \"command\": \"getPerformanceDataTypes\",\n \"params\": []\n },\n \"mobile: toggleGps\": {\n \"command\": \"toggleLocationServices\",\n \"params\": []\n },\n \"mobile: isGpsEnabled\": {\n \"command\": \"isLocationServicesEnabled\",\n \"params\": []\n },\n \"mobile: getDisplayDensity\": {\n \"command\": \"getDisplayDensity\",\n \"params\": []\n },\n \"mobile: getSystemBars\": {\n \"command\": \"getSystemBars\",\n \"params\": []\n },\n \"mobile: statusBar\": {\n \"command\": \"mobilePerformStatusBarCommand\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"component\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: fingerprint\": {\n \"command\": \"mobileFingerprint\",\n \"params\": [\n {\n \"name\": \"fingerprintId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sendSms\": {\n \"command\": \"mobileSendSms\",\n \"params\": [\n {\n \"name\": \"phoneNumber\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"message\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmCall\": {\n \"command\": \"mobileGsmCall\",\n \"params\": [\n {\n \"name\": \"phoneNumber\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmSignal\": {\n \"command\": \"mobileGsmSignal\",\n \"params\": [\n {\n \"name\": \"strength\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: gsmVoice\": {\n \"command\": \"mobileGsmVoice\",\n \"params\": [\n {\n \"name\": \"state\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: powerAc\": {\n \"command\": \"mobilePowerAc\",\n \"params\": [\n {\n \"name\": \"state\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: powerCapacity\": {\n \"command\": \"mobilePowerCapacity\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: networkSpeed\": {\n \"command\": \"mobileNetworkSpeed\",\n \"params\": [\n {\n \"name\": \"speed\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: sensorSet\": {\n \"command\": \"sensorSet\",\n \"params\": [\n {\n \"name\": \"sensorType\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"value\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getCurrentActivity\": {\n \"command\": \"getCurrentActivity\",\n \"params\": []\n },\n \"mobile: getCurrentPackage\": {\n \"command\": \"getCurrentPackage\",\n \"params\": []\n },\n \"mobile: setGeolocation\": {\n \"command\": \"mobileSetGeolocation\",\n \"params\": [\n {\n \"name\": \"latitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"longitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"altitude\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"satellites\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"bearing\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"accuracy\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getGeolocation\": {\n \"command\": \"mobileGetGeolocation\",\n \"params\": []\n },\n \"mobile: resetGeolocation\": {\n \"command\": \"mobileResetGeolocation\",\n \"params\": []\n },\n \"mobile: setStylusHandwriting\": {\n \"command\": \"setStylusHandwriting\",\n \"params\": [\n {\n \"name\": \"enabled\",\n \"required\": true,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: getAppStrings\": {\n \"command\": \"getStrings\",\n \"params\": [\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragGesture\": {\n \"command\": \"mobileDragGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"startX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"startY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"endX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"endY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: flingGesture\": {\n \"command\": \"mobileFlingGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: doubleClickGesture\": {\n \"command\": \"mobileDoubleClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: clickGesture\": {\n \"command\": \"mobileClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: longClickGesture\": {\n \"command\": \"mobileLongClickGesture\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"duration\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: pinchCloseGesture\": {\n \"command\": \"mobilePinchCloseGesture\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: pinchOpenGesture\": {\n \"command\": \"mobilePinchOpenGesture\",\n \"params\": [\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: swipeGesture\": {\n \"command\": \"mobileSwipeGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: scrollGesture\": {\n \"command\": \"mobileScrollGesture\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"percent\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"left\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"top\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"width\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"height\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"speed\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: scrollBackTo\": {\n \"command\": \"mobileScrollBackTo\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementToId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scroll\": {\n \"command\": \"mobileScroll\",\n \"params\": [\n {\n \"name\": \"strategy\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"selector\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxSwipes\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: viewportScreenshot\": {\n \"command\": \"mobileViewportScreenshot\",\n \"params\": []\n },\n \"mobile: viewportRect\": {\n \"command\": \"mobileViewPortRect\",\n \"params\": []\n },\n \"mobile: deepLink\": {\n \"command\": \"mobileDeepLink\",\n \"params\": [\n {\n \"name\": \"url\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"package\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"waitForLaunch\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: acceptAlert\": {\n \"command\": \"mobileAcceptAlert\",\n \"params\": [\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dismissAlert\": {\n \"command\": \"mobileDismissAlert\",\n \"params\": [\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: batteryInfo\": {\n \"command\": \"mobileGetBatteryInfo\",\n \"params\": []\n },\n \"mobile: deviceInfo\": {\n \"command\": \"mobileGetDeviceInfo\",\n \"params\": []\n },\n \"mobile: openNotifications\": {\n \"command\": \"openNotifications\",\n \"params\": []\n },\n \"mobile: type\": {\n \"command\": \"mobileType\",\n \"params\": [\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: replaceElementValue\": {\n \"command\": \"mobileReplaceElementValue\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installMultipleApks\": {\n \"command\": \"mobileInstallMultipleApks\",\n \"params\": [\n {\n \"name\": \"apks\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"options\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pressKey\": {\n \"command\": \"mobilePressKey\",\n \"params\": [\n {\n \"name\": \"keycode\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"metastate\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"flags\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"isLongPress\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"source\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: screenshots\": {\n \"command\": \"mobileScreenshots\",\n \"params\": [\n {\n \"name\": \"displayId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scheduleAction\": {\n \"command\": \"mobileScheduleAction\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"steps\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"maxPass\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"maxFail\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"times\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"intervalMs\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"maxHistoryItems\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getActionHistory\": {\n \"command\": \"mobileGetActionHistory\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: unscheduleAction\": {\n \"command\": \"mobileUnscheduleAction\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setClipboard\": {\n \"command\": \"setClipboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"label\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getClipboard\": {\n \"command\": \"getClipboard\",\n \"params\": []\n },\n \"mobile: resetAccessibilityCache\": {\n \"command\": \"mobileResetAccessibilityCache\",\n \"params\": []\n },\n \"mobile: listWindows\": {\n \"command\": \"mobileListWindows\",\n \"params\": [\n {\n \"name\": \"filters\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"skipScreenshots\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: listDisplays\": {\n \"command\": \"mobileListDisplays\",\n \"params\": []\n }\n }\n}\n","{\n \"drivers\": [\n {\n \"package\": \"appium-xcuitest-driver\",\n \"version\": \"11.9.0\"\n }\n ],\n \"extensions\": {\n \"mobile: tap\": {\n \"command\": \"mobileTap\",\n \"params\": [\n {\n \"name\": \"x\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scroll\": {\n \"command\": \"mobileScroll\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"direction\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"predicateString\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"toVisible\",\n \"required\": false,\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"distance\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: selectPickerWheelValue\": {\n \"command\": \"mobileSelectPickerWheelValue\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"order\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"offset\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: sendMemoryWarning\": {\n \"command\": \"mobileSendMemoryWarning\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: swipe\": {\n \"command\": \"mobileSwipe\",\n \"params\": [\n {\n \"name\": \"direction\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"velocity\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pinch\": {\n \"command\": \"mobilePinch\",\n \"params\": [\n {\n \"name\": \"scale\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: doubleTap\": {\n \"command\": \"mobileDoubleTap\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: twoFingerTap\": {\n \"command\": \"mobileTwoFingerTap\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: tapWithNumberOfTaps\": {\n \"command\": \"mobileTapWithNumberOfTaps\",\n \"params\": [\n {\n \"name\": \"numberOfTouches\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"numberOfTaps\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: touchAndHold\": {\n \"command\": \"mobileTouchAndHold\",\n \"params\": [\n {\n \"name\": \"duration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragFromToForDuration\": {\n \"command\": \"mobileDragFromToForDuration\",\n \"params\": [\n {\n \"name\": \"duration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromX\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromY\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toX\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toY\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: rotateElement\": {\n \"command\": \"mobileRotateElement\",\n \"params\": [\n {\n \"name\": \"rotation\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: dragFromToWithVelocity\": {\n \"command\": \"mobileDragFromToWithVelocity\",\n \"params\": [\n {\n \"name\": \"pressDuration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"holdDuration\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"velocity\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromElementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"toElementId\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fromX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"fromY\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toX\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"toY\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: forcePress\": {\n \"command\": \"mobileForcePress\",\n \"params\": [\n {\n \"name\": \"x\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"y\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"duration\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"pressure\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: scrollToElement\": {\n \"command\": \"mobileScrollToElement\",\n \"params\": [\n {\n \"name\": \"elementId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: alert\": {\n \"command\": \"mobileHandleAlert\",\n \"params\": [\n {\n \"name\": \"action\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"buttonLabel\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setPasteboard\": {\n \"command\": \"mobileSetPasteboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"encoding\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getPasteboard\": {\n \"command\": \"mobileGetPasteboard\",\n \"params\": [\n {\n \"name\": \"encoding\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: source\": {\n \"command\": \"mobileGetSource\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"excludedAttributes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getAppStrings\": {\n \"command\": \"getStrings\",\n \"params\": [\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"stringFile\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getContexts\": {\n \"command\": \"mobileGetContexts\",\n \"params\": [\n {\n \"name\": \"waitForWebviewMs\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: installApp\": {\n \"command\": \"mobileInstallApp\",\n \"params\": [\n {\n \"name\": \"app\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutMs\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"checkVersion\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: isAppInstalled\": {\n \"command\": \"mobileIsAppInstalled\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: removeApp\": {\n \"command\": \"mobileRemoveApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: launchApp\": {\n \"command\": \"mobileLaunchApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"arguments\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"environment\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: terminateApp\": {\n \"command\": \"mobileTerminateApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: killApp\": {\n \"command\": \"mobileKillApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: queryAppState\": {\n \"command\": \"mobileQueryAppState\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activateApp\": {\n \"command\": \"mobileActivateApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listApps\": {\n \"command\": \"mobileListApps\",\n \"params\": [\n {\n \"name\": \"applicationType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"returnAttributes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: clearApp\": {\n \"command\": \"mobileClearApp\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: viewportScreenshot\": {\n \"command\": \"getViewportScreenshot\",\n \"params\": []\n },\n \"mobile: viewportRect\": {\n \"command\": \"getViewportRect\",\n \"params\": []\n },\n \"mobile: startPerfRecord\": {\n \"command\": \"mobileStartPerfRecord\",\n \"params\": [\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"profileName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pid\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopPerfRecord\": {\n \"command\": \"mobileStopPerfRecord\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"profileName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: installCertificate\": {\n \"command\": \"mobileInstallCertificate\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"commonName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"isRoot\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: removeCertificate\": {\n \"command\": \"mobileRemoveCertificate\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listCertificates\": {\n \"command\": \"mobileListCertificates\",\n \"params\": []\n },\n \"mobile: startLogsBroadcast\": {\n \"command\": \"mobileStartLogsBroadcast\",\n \"params\": []\n },\n \"mobile: stopLogsBroadcast\": {\n \"command\": \"mobileStopLogsBroadcast\",\n \"params\": []\n },\n \"mobile: batteryInfo\": {\n \"command\": \"mobileGetBatteryInfo\",\n \"params\": []\n },\n \"mobile: performAccessibilityAudit\": {\n \"command\": \"mobilePerformAccessibilityAudit\",\n \"params\": [\n {\n \"name\": \"auditTypes\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deviceInfo\": {\n \"command\": \"mobileGetDeviceInfo\",\n \"params\": []\n },\n \"mobile: getDeviceTime\": {\n \"command\": \"mobileGetDeviceTime\",\n \"params\": [\n {\n \"name\": \"format\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: activeAppInfo\": {\n \"command\": \"mobileGetActiveAppInfo\",\n \"params\": []\n },\n \"mobile: deviceScreenInfo\": {\n \"command\": \"getScreenInfo\",\n \"params\": []\n },\n \"mobile: pressButton\": {\n \"command\": \"mobilePressButton\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"durationSeconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: enrollBiometric\": {\n \"command\": \"mobileEnrollBiometric\",\n \"params\": [\n {\n \"name\": \"isEnabled\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: sendBiometricMatch\": {\n \"command\": \"mobileSendBiometricMatch\",\n \"params\": [\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"match\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: isBiometricEnrolled\": {\n \"command\": \"mobileIsBiometricEnrolled\",\n \"params\": []\n },\n \"mobile: clearKeychains\": {\n \"command\": \"mobileClearKeychains\",\n \"params\": []\n },\n \"mobile: getPermission\": {\n \"command\": \"mobileGetPermission\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"service\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setPermission\": {\n \"command\": \"mobileSetPermissions\",\n \"params\": [\n {\n \"name\": \"access\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: resetPermission\": {\n \"command\": \"mobileResetPermission\",\n \"params\": [\n {\n \"name\": \"service\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getAppearance\": {\n \"command\": \"mobileGetAppearance\",\n \"params\": []\n },\n \"mobile: setAppearance\": {\n \"command\": \"mobileSetAppearance\",\n \"params\": [\n {\n \"name\": \"style\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getIncreaseContrast\": {\n \"command\": \"mobileGetIncreaseContrast\",\n \"params\": []\n },\n \"mobile: setIncreaseContrast\": {\n \"command\": \"mobileSetIncreaseContrast\",\n \"params\": [\n {\n \"name\": \"increaseContrast\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: contentSize\": {\n \"command\": \"mobileGetContentSize\",\n \"params\": []\n },\n \"mobile: setContentSize\": {\n \"command\": \"mobileSetContentSize\",\n \"params\": [\n {\n \"name\": \"size\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: getClipboard\": {\n \"command\": \"getClipboard\",\n \"params\": [\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setClipboard\": {\n \"command\": \"setClipboard\",\n \"params\": [\n {\n \"name\": \"content\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"contentType\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: siriCommand\": {\n \"command\": \"mobileSiriCommand\",\n \"params\": [\n {\n \"name\": \"text\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pushFile\": {\n \"command\": \"mobilePushFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFile\": {\n \"command\": \"mobilePullFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pullFolder\": {\n \"command\": \"mobilePullFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFile\": {\n \"command\": \"mobileDeleteFile\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deleteFolder\": {\n \"command\": \"mobileDeleteFolder\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: runXCTest\": {\n \"command\": \"mobileRunXCTest\",\n \"params\": [\n {\n \"name\": \"testRunnerBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"appUnderTestBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"xctestBundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"testType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"env\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: installXCTestBundle\": {\n \"command\": \"mobileInstallXCTestBundle\",\n \"params\": [\n {\n \"name\": \"xctestApp\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: listXCTestBundles\": {\n \"command\": \"mobileListXCTestBundles\",\n \"params\": []\n },\n \"mobile: startXCTestScreenRecording\": {\n \"command\": \"mobileStartXctestScreenRecording\",\n \"params\": [\n {\n \"name\": \"fps\",\n \"required\": false,\n \"kind\": \"number\"\n },\n {\n \"name\": \"codec\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getXCTestScreenRecordingInfo\": {\n \"command\": \"mobileGetXctestScreenRecordingInfo\",\n \"params\": []\n },\n \"mobile: stopXCTestScreenRecording\": {\n \"command\": \"mobileStopXctestScreenRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: pushNotification\": {\n \"command\": \"mobilePushNotification\",\n \"params\": [\n {\n \"name\": \"bundleId\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"payload\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: expectNotification\": {\n \"command\": \"mobileExpectNotification\",\n \"params\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"type\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeoutSeconds\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: performIoHidEvent\": {\n \"command\": \"mobilePerformIoHidEvent\",\n \"params\": [\n {\n \"name\": \"page\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"usage\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"durationSeconds\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: configureLocalization\": {\n \"command\": \"mobileConfigureLocalization\",\n \"params\": [\n {\n \"name\": \"keyboard\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"language\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"locale\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: resetLocationService\": {\n \"command\": \"mobileResetLocationService\",\n \"params\": []\n },\n \"mobile: startNetworkMonitor\": {\n \"command\": \"mobileStartNetworkMonitor\",\n \"params\": []\n },\n \"mobile: stopNetworkMonitor\": {\n \"command\": \"mobileStopNetworkMonitor\",\n \"params\": []\n },\n \"mobile: listConditionInducers\": {\n \"command\": \"listConditionInducers\",\n \"params\": []\n },\n \"mobile: enableConditionInducer\": {\n \"command\": \"enableConditionInducer\",\n \"params\": [\n {\n \"name\": \"conditionID\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"profileID\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: disableConditionInducer\": {\n \"command\": \"disableConditionInducer\",\n \"params\": []\n },\n \"mobile: updateSafariPreferences\": {\n \"command\": \"mobileUpdateSafariPreferences\",\n \"params\": [\n {\n \"name\": \"preferences\",\n \"required\": true,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: calibrateWebToRealCoordinatesTranslation\": {\n \"command\": \"mobileCalibrateWebToRealCoordinatesTranslation\",\n \"params\": []\n },\n \"mobile: keys\": {\n \"command\": \"mobileKeys\",\n \"params\": [\n {\n \"name\": \"keys\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"elementId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: deepLink\": {\n \"command\": \"mobileDeepLink\",\n \"params\": [\n {\n \"name\": \"url\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"bundleId\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: setSimulatedLocation\": {\n \"command\": \"mobileSetSimulatedLocation\",\n \"params\": [\n {\n \"name\": \"latitude\",\n \"required\": true,\n \"kind\": \"number\"\n },\n {\n \"name\": \"longitude\",\n \"required\": true,\n \"kind\": \"number\"\n }\n ]\n },\n \"mobile: getSimulatedLocation\": {\n \"command\": \"mobileGetSimulatedLocation\",\n \"params\": []\n },\n \"mobile: resetSimulatedLocation\": {\n \"command\": \"mobileResetSimulatedLocation\",\n \"params\": []\n },\n \"mobile: shake\": {\n \"command\": \"mobileShake\",\n \"params\": []\n },\n \"mobile: startScreenRecording\": {\n \"command\": \"mobileStartScreenRecording\",\n \"params\": [\n {\n \"name\": \"videoType\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoQuality\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoFps\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoFilters\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"videoScale\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pixelFormat\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"forceRestart\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeLimit\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"hardwareAcceleration\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: stopScreenRecording\": {\n \"command\": \"mobileStopScreenRecording\",\n \"params\": [\n {\n \"name\": \"remotePath\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"user\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"pass\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"headers\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"fileFieldName\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"formFields\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"method\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: startAudioRecording\": {\n \"command\": \"startAudioRecording\",\n \"params\": [\n {\n \"name\": \"audioInput\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeLimit\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioCodec\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioBitrate\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioChannels\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"audioRate\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"forceRestart\",\n \"required\": false,\n \"kind\": \"boolean\"\n }\n ]\n },\n \"mobile: stopAudioRecording\": {\n \"command\": \"stopAudioRecording\",\n \"params\": []\n },\n \"mobile: hideKeyboard\": {\n \"command\": \"mobileHideKeyboard\",\n \"params\": [\n {\n \"name\": \"keys\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: isKeyboardShown\": {\n \"command\": \"isKeyboardShown\",\n \"params\": []\n },\n \"mobile: lock\": {\n \"command\": \"lock\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: unlock\": {\n \"command\": \"unlock\",\n \"params\": []\n },\n \"mobile: isLocked\": {\n \"command\": \"isLocked\",\n \"params\": []\n },\n \"mobile: backgroundApp\": {\n \"command\": \"background\",\n \"params\": [\n {\n \"name\": \"seconds\",\n \"required\": false,\n \"kind\": \"string\"\n }\n ]\n },\n \"mobile: simctl\": {\n \"command\": \"mobileSimctl\",\n \"params\": [\n {\n \"name\": \"command\",\n \"required\": true,\n \"kind\": \"string\"\n },\n {\n \"name\": \"args\",\n \"required\": false,\n \"kind\": \"string\"\n },\n {\n \"name\": \"timeout\",\n \"required\": false,\n \"kind\": \"number\"\n }\n ]\n }\n }\n}\n","import androidManifest from '../data/extensions-android.json' with {\n type: 'json',\n};\nimport iosManifest from '../data/extensions-ios.json' with { type: 'json' };\n\nexport type ParamKind = 'number' | 'boolean' | 'string';\n\nexport interface ParamSpec {\n name: string;\n required: boolean;\n kind: ParamKind;\n}\n\nexport interface ExtensionSpec {\n command: string;\n params: ParamSpec[];\n}\n\nexport type Manifest = Record<string, ExtensionSpec>;\n\nexport interface DriverRef {\n package: string;\n version: string;\n}\n\nexport interface ManifestSnapshot {\n drivers: DriverRef[];\n extensions: Manifest;\n}\n\nexport function loadManifest(platform: 'ios' | 'android'): Manifest {\n const snapshot = (\n platform === 'ios' ? iosManifest : androidManifest\n ) as ManifestSnapshot;\n return snapshot.extensions;\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport {\n type ExtensionSpec,\n type ParamKind,\n loadManifest,\n} from '../lib/manifest.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Platform = 'ios' | 'android';\n\n// \"mobile: doubleTap\" -> \"double-tap\"\nfunction subcommandName(mobileName: string): string {\n return mobileName\n .replace(/^mobile:\\s*/, '')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\n// Coerce a raw CLI string using the param's source-derived kind.\nfunction coerceArg(value: string, kind: ParamKind): unknown {\n switch (kind) {\n case 'number':\n return Number(value);\n case 'boolean':\n return value === 'true';\n default:\n // 'string' -- also the fallback for types we cannot reduce\n // (element IDs, unions, arrays/objects): forwarded as a raw string.\n return value;\n }\n}\n\nfunction registerOneExtension(\n group: Command,\n mobileName: string,\n spec: ExtensionSpec,\n): void {\n const cmd = group\n .command(subcommandName(mobileName))\n .description(`${mobileName} (${spec.command})`);\n\n for (const p of spec.params) {\n const flag = `--${p.name} <value>`;\n const help = `${p.required ? 'required' : 'optional'} param \"${p.name}\" (${p.kind})`;\n if (p.required) cmd.requiredOption(flag, help);\n else cmd.option(flag, help);\n }\n\n addConnectionFlags(cmd).action(async (opts: Record<string, unknown>) => {\n const args: Record<string, unknown> = {};\n for (const p of spec.params) {\n const raw = opts[p.name];\n if (typeof raw === 'string') args[p.name] = coerceArg(raw, p.kind);\n }\n const result = await runWithSession(\n opts as Parameters<typeof runWithSession>[0],\n (b) => b.execute(mobileName, args),\n );\n process.stdout.write(`${JSON.stringify(result ?? null)}\\n`);\n });\n}\n\nfunction registerPlatformExtensions(\n program: Command,\n platform: Platform,\n): void {\n const group = program\n .command(platform)\n .description(\n `${platform === 'ios' ? 'iOS (XCUITest)' : 'Android (UiAutomator2)'} mobile: extensions as first-class commands (generated from the pinned driver source)`,\n );\n for (const [mobileName, spec] of Object.entries(loadManifest(platform))) {\n registerOneExtension(group, mobileName, spec);\n }\n}\n\nexport function registerIos(program: Command): void {\n registerPlatformExtensions(program, 'ios');\n}\n\nexport function registerAndroid(program: Command): void {\n registerPlatformExtensions(program, 'android');\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerScreenshot(program: Command): void {\n addConnectionFlags(\n program\n .command('screenshot')\n .description('take a viewport screenshot (W3C GET /screenshot)'),\n )\n .option('-o, --out <path>', 'write PNG here (default: stdout as base64)')\n .action(async (opts) => {\n const b64 = await runWithSession(opts, (b) => b.takeScreenshot());\n if (opts.out) {\n writeFileSync(opts.out, Buffer.from(b64, 'base64'));\n process.stdout.write(`saved screenshot to ${opts.out}\\n`);\n } else {\n process.stdout.write(b64);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nexport function registerScrollIntoView(program: Command): void {\n addConnectionFlags(\n program\n .command('scroll-into-view')\n .description(\n \"scroll a native element into view (WebdriverIO's element.scrollIntoView; \" +\n 'swipes until the element is displayed)',\n ),\n )\n .argument(\n '<selector>',\n 'WDIO selector string for the target (e.g. ' +\n '\"accessibility id:gestures.row.29\", \"xpath://...\", \"css selector:...\")',\n )\n .option('-d, --direction <dir>', 'scroll direction: up|down|left|right')\n .option('--max-scrolls <n>', 'max swipes before giving up', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--duration <ms>', 'duration of each swipe in ms', (v) =>\n Number.parseInt(v, 10),\n )\n .option(\n '--percent <0..1>',\n 'fraction of the scrollable element to swipe',\n (v) => Number.parseFloat(v),\n )\n .option(\n '--scrollable <selector>',\n 'WDIO selector string for the scrollable container ' +\n '(defaults to the platform default scroll view)',\n )\n .action(async (selector, opts) => {\n const dir = opts.direction as Direction | undefined;\n\n await runWithSession(opts, async (b) => {\n const target = await b.$(selector);\n\n const scrollableElement = opts.scrollable\n ? await b.$(opts.scrollable)\n : undefined;\n\n // Forward only the options the user set; WDIO owns the defaults\n // (maxScrolls: 10, direction: 'up', duration: 1500, percent: 0.95).\n await target.scrollIntoView({\n ...(dir ? { direction: dir } : {}),\n ...(opts.maxScrolls != null ? { maxScrolls: opts.maxScrolls } : {}),\n ...(opts.duration != null ? { duration: opts.duration } : {}),\n ...(opts.percent != null ? { percent: opts.percent } : {}),\n ...(scrollableElement ? { scrollableElement } : {}),\n });\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerSendKeys(program: Command): void {\n addConnectionFlags(\n program\n .command('send-keys')\n .description(\n 'type text into an element resolved by a WDIO selector ' +\n '(POST /element/:id/value). Clears the field first by default ' +\n '(POST /element/:id/clear); pass --no-clear to append instead',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the target, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the target; types into the first match',\n )\n .option('-e, --element <id>', 'raw element id of the target')\n .requiredOption('-t, --text <value>', 'text to type')\n .option(\n '--no-clear',\n 'skip clearing the field first (append to existing contents)',\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length !== 1) {\n throw new Error('pass exactly one of --selector, --label, --element');\n }\n\n await runWithSession(opts, async (b) => {\n let elementId: string;\n if (opts.element != null) {\n elementId = opts.element;\n } else {\n const selector =\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string);\n const el = await b.$(selector);\n elementId = await el.elementId;\n if (!elementId) {\n throw new Error(`no element matched ${selector}`);\n }\n }\n\n if (opts.clear) {\n await b.elementClear(elementId);\n }\n await b.elementSendKeys(elementId, opts.text);\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport {\n type SessionRecord,\n isLocalHost,\n isPidAlive,\n listSessions,\n probeServerStatus,\n removeSession,\n} from '../../lib/session-store.js';\n\ninterface AnnotatedRecord extends SessionRecord {\n alive: boolean | null;\n pidAlive: boolean | null;\n serverUp: boolean | null;\n}\n\nexport function registerSessionList(session: Command): void {\n session\n .command('list')\n .description('list sessions stored under ~/.aco/sessions')\n .option('--json', 'emit JSON instead of a table')\n .option(\n '--prune',\n 'delete records for sessions whose server is unreachable or whose Appium child is dead',\n )\n .action(async (opts) => {\n const records = listSessions();\n const annotated: AnnotatedRecord[] = await Promise.all(\n records.map(async (r) => {\n const pidAlive = isLocalHost(r.serverUrl) ? isPidAlive(r.pid) : null;\n const serverUp = await probeServerStatus(r.serverUrl, 2_000);\n const alive: boolean | null =\n serverUp === false\n ? false\n : pidAlive === false\n ? false\n : serverUp === true\n ? true\n : null;\n return { ...r, alive, pidAlive, serverUp };\n }),\n );\n\n if (opts.prune) {\n let n = 0;\n for (const r of annotated) {\n if (r.alive === false) {\n removeSession(r.sessionId);\n n += 1;\n }\n }\n process.stderr.write(`aco: pruned ${n} dead record(s)\\n`);\n return;\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(annotated, null, 2)}\\n`);\n return;\n }\n\n if (annotated.length === 0) {\n process.stderr.write(\n 'no sessions stored. start one with `aco session start ...`\\n',\n );\n return;\n }\n\n for (const r of annotated) {\n const alive = r.alive === null ? '?' : r.alive ? 'yes' : 'no';\n process.stdout.write(\n `${[\n r.startedAt,\n r.platform.padEnd(7),\n String(r.pid).padEnd(6),\n alive.padEnd(5),\n r.serverUrl.padEnd(34),\n r.sessionId,\n ].join(' ')}\\n`,\n );\n }\n });\n}\n","import { spawn } from 'node:child_process';\nimport { createWriteStream, mkdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from '@commander-js/extra-typings';\nimport {\n startAppiumServer,\n stopAppiumServer,\n} from '../../lib/appium-server.js';\nimport { buildCapabilities } from '../../lib/caps.js';\nimport type { Platform } from '../../lib/connection.js';\nimport { listAndroidAvds } from '../../lib/devices/android.js';\nimport {\n listAndroidRealDevices,\n listIosRealDevices,\n} from '../../lib/devices/index.js';\nimport { pickFreePort } from '../../lib/port.js';\nimport {\n type SessionRecord,\n removeSession,\n saveSession,\n} from '../../lib/session-store.js';\nimport {\n DEFAULT_SESSION_TIMEOUT_MS,\n createBrowser,\n} from '../../lib/wd-client.js';\n\nfunction parseExtraCaps(values: string[] | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const v of values ?? []) {\n const idx = v.indexOf('=');\n if (idx < 0) throw new Error(`--cap expects key=value, got \"${v}\"`);\n const key = v.slice(0, idx);\n const raw = v.slice(idx + 1);\n try {\n out[key] = JSON.parse(raw) as unknown;\n } catch {\n out[key] = raw;\n }\n }\n return out;\n}\n\nexport function parseCapsJson(value: string): Record<string, unknown> {\n let raw = value;\n if (value.startsWith('@')) {\n const path = value.slice(1);\n try {\n raw = readFileSync(path, 'utf8');\n } catch (err) {\n throw new Error(\n `--caps-json: cannot read file ${path}: ${(err as Error).message}`,\n );\n }\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(`--caps-json is not valid JSON: ${(err as Error).message}`);\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n '--caps-json must be a JSON object (the W3C capabilities map)',\n );\n }\n return parsed as Record<string, unknown>;\n}\n\nexport function resolveAuth(opts: {\n username?: string;\n password?: string;\n auth?: string;\n}): { user?: string; key?: string } {\n if (opts.auth !== undefined) {\n if (opts.username !== undefined || opts.password !== undefined) {\n throw new Error('--auth cannot be combined with --username/--password');\n }\n const idx = opts.auth.indexOf(':');\n if (idx < 0) {\n throw new Error('--auth expects \"user:password\"');\n }\n return { user: opts.auth.slice(0, idx), key: opts.auth.slice(idx + 1) };\n }\n if (opts.username !== undefined || opts.password !== undefined) {\n if (opts.username === undefined || opts.password === undefined) {\n throw new Error('--username and --password must be given together');\n }\n return { user: opts.username, key: opts.password };\n }\n // Fallback to env vars so credentials need not appear in shell history /\n // process args. Flags above always win.\n const envUser = process.env.ACO_REMOTE_USERNAME;\n const envKey = process.env.ACO_REMOTE_PASSWORD;\n if (envUser !== undefined || envKey !== undefined) {\n if (envUser === undefined || envKey === undefined) {\n throw new Error(\n 'ACO_REMOTE_USERNAME and ACO_REMOTE_PASSWORD must be set together',\n );\n }\n return { user: envUser, key: envKey };\n }\n return {};\n}\n\nfunction readFirstLine(\n stream: NodeJS.ReadableStream,\n timeoutMs: number,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let buf = '';\n const cleanup = () => {\n clearTimeout(timer);\n stream.off('data', onData);\n stream.off('error', onErr);\n };\n const onData = (chunk: Buffer) => {\n buf += chunk.toString('utf8');\n const nl = buf.indexOf('\\n');\n if (nl >= 0) {\n cleanup();\n resolve(buf.slice(0, nl));\n }\n };\n const onErr = (err: Error) => {\n cleanup();\n reject(err);\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n `detached child did not emit a session envelope within ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n stream.on('data', onData);\n stream.on('error', onErr);\n });\n}\n\nasync function detachAndExit(sessionTimeoutSec: number): Promise<void> {\n const entry = process.argv[1];\n if (!entry || !entry.endsWith('.js')) {\n process.stderr.write(\n 'aco: --detach is not supported in dev mode (tsx). ' +\n 'Run the built `dist/cli.js` to use --detach.\\n',\n );\n process.exit(2);\n }\n\n const filteredArgs = process.argv.slice(2).filter((a) => a !== '--detach');\n\n mkdirSync(join(homedir(), '.aco', 'logs'), { recursive: true });\n const bootstrapLog = createWriteStream(\n join(homedir(), '.aco', 'logs', `aco-detach-${process.pid}.log`),\n { flags: 'a' },\n );\n\n const child = spawn(process.execPath, [entry, ...filteredArgs], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: process.env,\n windowsHide: true,\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error('aco: failed to capture detached child stdio');\n }\n\n // The envelope only lands once the session is created, so wait at least as\n // long as the child's own --session-timeout, plus a margin for the Appium\n // server to boot. A flat 60s here would defeat --session-timeout on cold\n // simulator/WDA boots and kill a session that was still coming up.\n const envelopeTimeoutMs = (sessionTimeoutSec + 60) * 1000;\n\n // Buffer the child's stderr from the start: if it dies before emitting an\n // envelope, this is the only place the real Appium/WDA failure is visible.\n let earlyErr = '';\n const onEarlyErr = (chunk: Buffer) => {\n earlyErr += chunk.toString('utf8');\n };\n child.stderr.on('data', onEarlyErr);\n\n let envelope: string;\n try {\n envelope = await Promise.race([\n readFirstLine(child.stdout, envelopeTimeoutMs),\n new Promise<never>((_, reject) => {\n child.once('exit', (code, signal) => {\n const how = signal ? `signal ${signal}` : `code ${code}`;\n reject(\n new Error(\n `aco: session start exited (${how}) before creating a session\\n${earlyErr}`,\n ),\n );\n });\n }),\n ]);\n } catch (err) {\n bootstrapLog.write(earlyErr);\n process.stderr.write(\n `${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n }\n\n child.stderr.off('data', onEarlyErr);\n bootstrapLog.write(earlyErr);\n child.stdout.pipe(bootstrapLog);\n child.stderr.pipe(bootstrapLog);\n\n process.stdout.write(`${envelope}\\n`);\n process.stderr.write(\n `session detached -- pid ${child.pid}, stop with \\`aco session stop\\`\\n`,\n );\n\n child.unref();\n process.exit(0);\n}\n\nexport function registerSessionStart(session: Command): void {\n session\n .command('start')\n .description(\n 'spin up an Appium server (sidecar) and create a session against an AUT. ' +\n 'Runs in the foreground bound to the TTY by default; use --detach for background.',\n )\n .requiredOption('-p, --platform <ios|android>', 'target platform')\n .option(\n '-a, --app <path-or-id>',\n 'path to the AUT build, or bundleId/appPackage',\n )\n .option(\n '-A, --app-activity <activity>',\n 'Android only -- launchable activity (required when --app is an appPackage id)',\n )\n .option(\n '-d, --device-name <name>',\n 'appium:deviceName (iOS simulator label, e.g. \"iPhone 15\"; informational on Android -- use --avd to pick the emulator)',\n )\n .option('-V, --platform-version <ver>', 'appium:platformVersion')\n .option('-u, --udid <udid>', 'appium:udid')\n .option(\n '--avd <name>',\n 'Android only -- AVD name of the emulator to target (appium:avd)',\n )\n .option(\n '--xcode-org-id <id>',\n 'iOS real device -- appium:xcodeOrgId (Apple Team ID for WDA signing)',\n )\n .option(\n '--xcode-signing-id <id>',\n 'iOS real device -- appium:xcodeSigningId (default \"iPhone Developer\")',\n )\n .option(\n '--allow-provisioning-device-registration',\n 'iOS real device -- appium:allowProvisioningDeviceRegistration ' +\n '(let Xcode register the device with your provisioning profile)',\n )\n .option(\n '--updated-wda-bundle-id <id>',\n 'iOS real device -- appium:updatedWDABundleId (custom WDA bundle id for signing)',\n )\n .option(\n '--port <port>',\n 'preferred Appium port (default: 4723)',\n (v) => Number.parseInt(v, 10),\n 4723,\n )\n .option(\n '-S, --server-url <url>',\n 'attach to an existing remote Appium server (e.g. a device farm grid) ' +\n 'instead of spawning a local one. When set, --port and the local ' +\n 'server flags (--address, --log-level, --use-drivers, ...) are ignored.',\n )\n .option(\n '--username <user>',\n 'BASIC auth username for the remote server (sent only on session creation)',\n )\n .option(\n '--password <pass>',\n 'BASIC auth password for the remote server (sent only on session creation)',\n )\n .option(\n '--auth <user:pass>',\n 'BASIC auth as \"user:password\" (alternative to --username/--password; ' +\n 'value before the first \":\" is the user)',\n )\n .option('--cap <key=value...>', 'extra W3C capability (repeatable)')\n .option(\n '--caps-json <json>',\n 'verbatim W3C capabilities as a JSON object (or @file to read from a ' +\n 'file), bypassing aco-built caps. Escape hatch for device farms with ' +\n 'nested vendor caps (e.g. LambdaTest\\'s \"lt:options\"). Per-device flags ' +\n '(--app, --device-name, --udid, ...) are ignored; --cap entries still ' +\n 'merge on top (shallow). --platform is still required for the record.',\n )\n .option(\n '--allow-insecure <feature...>',\n 'Appium insecure feature(s) to enable on the server. Appium 3 requires ' +\n 'each feature scoped to a driver or \"*\" ' +\n '(e.g. uiautomator2:chromedriver_autodownload for Android webview automation)',\n )\n .option(\n '--deny-insecure <feature...>',\n 'Appium insecure feature(s) to disable. Only takes effect with ' +\n '--allow-insecure or --relaxed-security, and is applied last (deny wins)',\n )\n .option(\n '--relaxed-security',\n 'enable Appium --relaxed-security (allow all insecure features). ' +\n 'Use only on a trusted local network; claw back features with --deny-insecure',\n )\n .option('--allow-cors', 'allow browser (CORS) connections to the server')\n .option(\n '--base-path <path>',\n 'URL prefix for all WebDriver routes on the spawned server (default: /)',\n )\n .option(\n '--log-level <level>',\n 'Appium server log level: debug | info | warn | error, or ' +\n 'console:file (e.g. warn:debug) (default: info)',\n )\n .option(\n '--use-drivers <name...>',\n 'restrict which installed Appium drivers to activate (default: all)',\n )\n .option(\n '--use-plugins <name...>',\n 'Appium plugins to activate (default: none; e.g. images, element-wait)',\n )\n .option(\n '--address <host>',\n 'interface for the spawned server to bind. Defaults to 127.0.0.1 ' +\n '(local-only); set to 0.0.0.0 or a specific IP to expose it on a ' +\n 'trusted network',\n )\n .option(\n '--keep-alive-timeout <seconds>',\n 'Appium HTTP keep-alive/connection timeout in seconds; 0 disables ' +\n '(default: 600)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--request-timeout <seconds>',\n 'Appium timeout in seconds for receiving the full HTTP request; ' +\n '0 disables (default: 3600)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--shutdown-timeout <ms>',\n 'Appium grace period in milliseconds for active connections to close ' +\n 'on shutdown (default: 5000)',\n (v) => Number.parseInt(v, 10),\n )\n .option(\n '--session-timeout <seconds>',\n `time to wait for session creation before aborting (default: ${DEFAULT_SESSION_TIMEOUT_MS / 1000}s; bump it for cold simulator/WDA boots)`,\n (v) => Number.parseInt(v, 10),\n DEFAULT_SESSION_TIMEOUT_MS / 1000,\n )\n .option(\n '--log',\n 'stream the full Appium server log to stdout (in addition to ~/.aco/logs)',\n )\n .option(\n '--detach',\n 'run in the background; print envelope on stdout then exit immediately',\n )\n .action(async (opts) => {\n // Remote mode owns no local process, so it already behaves like --detach\n // (create session, print envelope, exit). Skip the re-exec path for it.\n if (opts.detach && !opts.serverUrl) {\n await detachAndExit(opts.sessionTimeout);\n return;\n }\n\n const platform = opts.platform.toLowerCase() as Platform;\n if (platform !== 'ios' && platform !== 'android') {\n throw new Error(\n `--platform must be \"ios\" or \"android\" (got \"${opts.platform}\")`,\n );\n }\n\n // When no explicit target (--udid/--avd) is given, prefer a connected\n // real device over spinning up a virtual one. Only when none is connected\n // do we fall back to auto-booting the first AVD (Android) -- Appium will\n // not auto-boot an emulator unless we tell it which AVD to use.\n // Skipped entirely with --caps-json: the user supplies the full caps, so\n // there is no aco-built target to auto-detect.\n let avd = opts.avd;\n let udid = opts.udid;\n if (!opts.capsJson && !udid && !avd) {\n const realList =\n platform === 'ios'\n ? await listIosRealDevices()\n : await listAndroidRealDevices();\n const realDevice = realList.devices.find(\n (d) => d.kind === 'real' && d.state === 'booted',\n );\n if (realDevice) {\n udid = realDevice.id;\n process.stderr.write(\n `aco: no --udid/--avd given, targeting connected real device ${udid} ` +\n `(${realDevice.name})\\n`,\n );\n } else if (platform === 'android') {\n const { devices } = await listAndroidAvds();\n const first = devices[0];\n if (!first) {\n throw new Error(\n 'aco: no connected Android device and no AVD found to boot. ' +\n 'Plug in a device (enable USB debugging), create an AVD in Android ' +\n 'Studio, or boot an emulator and pass `--udid`. ' +\n 'See `aco device list --platform android`.',\n );\n }\n avd = first.name;\n process.stderr.write(`aco: no --avd given, using \"${avd}\"\\n`);\n }\n // iOS with no real device and no flags: leave both unset. XCUITest will\n // pick a default simulator (or error) as it does today -- we do not\n // auto-pick a simulator here.\n }\n\n let capabilities: Record<string, unknown>;\n if (opts.capsJson) {\n // Escape hatch: use the supplied JSON verbatim as the capabilities map,\n // with --cap entries shallow-merged on top. aco's per-device caps are\n // not built, so the per-device flags below have no effect -- warn so a\n // stale flag in a script does not read as \"applied\".\n const ignored = [\n opts.app !== undefined ? '--app' : undefined,\n opts.appActivity !== undefined ? '--app-activity' : undefined,\n opts.deviceName !== undefined ? '--device-name' : undefined,\n opts.platformVersion !== undefined ? '--platform-version' : undefined,\n opts.udid !== undefined ? '--udid' : undefined,\n opts.avd !== undefined ? '--avd' : undefined,\n opts.xcodeOrgId !== undefined ? '--xcode-org-id' : undefined,\n opts.xcodeSigningId !== undefined ? '--xcode-signing-id' : undefined,\n opts.allowProvisioningDeviceRegistration\n ? '--allow-provisioning-device-registration'\n : undefined,\n opts.updatedWdaBundleId !== undefined\n ? '--updated-wda-bundle-id'\n : undefined,\n ].filter((f): f is string => f !== undefined);\n if (ignored.length > 0) {\n process.stderr.write(\n `aco: warning -- ignoring per-device flags with --caps-json: ${ignored.join(', ')}\\n`,\n );\n }\n capabilities = {\n ...parseCapsJson(opts.capsJson),\n ...parseExtraCaps(opts.cap),\n };\n } else {\n capabilities = buildCapabilities({\n platform,\n app: opts.app,\n appActivity: opts.appActivity,\n deviceName: opts.deviceName,\n platformVersion: opts.platformVersion,\n udid,\n avd,\n xcodeOrgId: opts.xcodeOrgId,\n xcodeSigningId: opts.xcodeSigningId,\n allowProvisioningDeviceRegistration:\n opts.allowProvisioningDeviceRegistration,\n updatedWdaBundleId: opts.updatedWdaBundleId,\n extraCaps: parseExtraCaps(opts.cap),\n });\n }\n\n const auth = resolveAuth(opts);\n\n // Resolve the connection target. Reuse the same URL parsing as\n // parseConnection for the remote case so https/port/base-path are handled\n // identically to the consumer commands.\n let conn: {\n hostname: string;\n port: number;\n basePath: string;\n protocol: 'http' | 'https';\n serverUrl: string;\n };\n let server: Awaited<ReturnType<typeof startAppiumServer>> | undefined;\n\n if (opts.serverUrl) {\n // REMOTE: do not spawn appium.\n let url: URL;\n try {\n url = new URL(opts.serverUrl);\n } catch {\n throw new Error(`--server-url is not a valid URL: ${opts.serverUrl}`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`--server-url must use http(s); got ${url.protocol}`);\n }\n const basePath =\n url.pathname && url.pathname !== '/' ? url.pathname : '/';\n const baseSuffix = basePath.replace(/\\/+$/, '');\n const protocol = url.protocol === 'https:' ? 'https' : 'http';\n conn = {\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (protocol === 'https' ? 443 : 80),\n basePath,\n protocol,\n // Canonical URL stored in the record; consumers parse it back. No creds.\n serverUrl: `${protocol}://${url.host}${baseSuffix}`,\n };\n\n const ignoredFlags = [\n opts.address !== undefined ? '--address' : undefined,\n opts.logLevel !== undefined ? '--log-level' : undefined,\n opts.useDrivers !== undefined ? '--use-drivers' : undefined,\n opts.usePlugins !== undefined ? '--use-plugins' : undefined,\n opts.keepAliveTimeout !== undefined\n ? '--keep-alive-timeout'\n : undefined,\n opts.requestTimeout !== undefined ? '--request-timeout' : undefined,\n opts.shutdownTimeout !== undefined ? '--shutdown-timeout' : undefined,\n opts.basePath !== undefined ? '--base-path' : undefined,\n opts.allowInsecure !== undefined ? '--allow-insecure' : undefined,\n opts.denyInsecure !== undefined ? '--deny-insecure' : undefined,\n opts.relaxedSecurity ? '--relaxed-security' : undefined,\n opts.allowCors ? '--allow-cors' : undefined,\n opts.log ? '--log' : undefined,\n ].filter((f): f is string => f !== undefined);\n if (ignoredFlags.length > 0) {\n process.stderr.write(\n `aco: warning -- ignoring local-server flags with --server-url: ${ignoredFlags.join(', ')}\\n`,\n );\n }\n if (opts.detach) {\n process.stderr.write(\n 'aco: --detach is a no-op with --server-url (remote sessions ' +\n 'already exit immediately after creation)\\n',\n );\n }\n } else {\n // LOCAL (unchanged):\n const port = await pickFreePort(opts.port);\n server = await startAppiumServer({\n port,\n tee: Boolean(opts.log),\n // --address forwards to the existing internal `hostname` option, which\n // keeps its 127.0.0.1 default when --address is omitted.\n hostname: opts.address,\n allowInsecure: opts.allowInsecure,\n denyInsecure: opts.denyInsecure,\n relaxedSecurity: opts.relaxedSecurity,\n allowCors: opts.allowCors,\n basePath: opts.basePath,\n logLevel: opts.logLevel,\n useDrivers: opts.useDrivers,\n usePlugins: opts.usePlugins,\n keepAliveTimeout: opts.keepAliveTimeout,\n requestTimeout: opts.requestTimeout,\n shutdownTimeout: opts.shutdownTimeout,\n });\n conn = {\n hostname: server.hostname,\n port: server.port,\n basePath: server.basePath,\n protocol: 'http',\n serverUrl: server.serverUrl,\n };\n }\n\n let browser: WebdriverIO.Browser;\n try {\n browser = await createBrowser({\n hostname: conn.hostname,\n port: conn.port,\n basePath: conn.basePath,\n protocol: conn.protocol,\n user: auth.user,\n key: auth.key,\n capabilities,\n connectionTimeoutMs: opts.sessionTimeout * 1000,\n });\n } catch (err) {\n if (server) {\n try {\n process.kill(server.pid, 'SIGTERM');\n } catch {\n /* ignore */\n }\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (\n platform === 'android' &&\n !udid &&\n /Could not find a connected Android device/i.test(msg)\n ) {\n process.stderr.write(\n `aco: hint -- the AVD \"${avd}\" did not come up in time. Bump --session-timeout for a cold boot, pick another AVD with --avd <name> (see \"aco device list --platform android\"), or boot an emulator yourself before running \"session start\".\\n`,\n );\n }\n if (\n platform === 'ios' &&\n udid &&\n !opts.xcodeOrgId &&\n /(provisioning profile|code sign|xcodebuild|WebDriverAgent)/i.test(\n msg,\n )\n ) {\n process.stderr.write(\n 'aco: hint -- building WebDriverAgent on a real iOS device needs code ' +\n 'signing. Pass --xcode-org-id <TeamID> (and optionally ' +\n '--xcode-signing-id / --allow-provisioning-device-registration / ' +\n '--updated-wda-bundle-id), or open WebDriverAgent.xcodeproj in Xcode once ' +\n 'to configure signing.\\n',\n );\n }\n throw err;\n }\n\n const record: SessionRecord = {\n sessionId: browser.sessionId,\n serverUrl: conn.serverUrl,\n platform,\n // 0 => no local child; stop.ts/list.ts already treat this as \"remote\".\n pid: server?.pid ?? 0,\n startedAt: new Date().toISOString(),\n deviceName: opts.deviceName,\n app: opts.app,\n };\n saveSession(record);\n\n process.stdout.write(\n `${JSON.stringify({\n sessionId: record.sessionId,\n serverUrl: record.serverUrl,\n platform: record.platform,\n pid: record.pid,\n })}\\n`,\n );\n\n if (!server) {\n // REMOTE: nothing local to babysit. The session lives on the farm; we\n // exit cleanly and let `aco <command>` attach and `aco session stop`\n // tear it down.\n process.stderr.write(\n 'session created on remote server -- stop it with `aco session stop`\\n',\n );\n return;\n }\n\n process.stderr.write('session ready -- press Ctrl-C to stop\\n');\n\n let cleaningUp = false;\n let exitCode = 0;\n const cleanup = async (reason: 'signal' | 'child-exit') => {\n if (cleaningUp) return;\n cleaningUp = true;\n if (reason === 'child-exit') {\n exitCode = 1;\n process.stderr.write(\n 'aco: Appium server exited unexpectedly, cleaning up\\n',\n );\n }\n try {\n await browser.deleteSession();\n } catch (err) {\n process.stderr.write(\n `aco: warning, deleteSession failed: ${(err as Error).message}\\n`,\n );\n }\n if (reason === 'signal' && server.pid) {\n await stopAppiumServer(server.pid);\n }\n removeSession(record.sessionId);\n process.exit(exitCode);\n };\n\n for (const sig of ['SIGINT', 'SIGTERM', 'SIGHUP'] as NodeJS.Signals[]) {\n process.on(sig, () => {\n void cleanup('signal');\n });\n }\n server.child.once('exit', () => {\n void cleanup('child-exit');\n });\n\n await new Promise<void>(() => {});\n });\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { createWriteStream, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { setTimeout as delay } from 'node:timers/promises';\n\nexport interface StartedServer {\n child: ChildProcess;\n serverUrl: string;\n hostname: string;\n port: number;\n basePath: string;\n pid: number;\n}\n\nexport interface StartAppiumServerOptions {\n port: number;\n // Interface to bind (Appium --address). Defaults to \"127.0.0.1\" — note this\n // is deliberately narrower than Appium's own 0.0.0.0 default. Surfaced via\n // the --address CLI flag.\n hostname?: string;\n tee?: boolean;\n // Appium \"insecure features\" to enable on the server (e.g.\n // `chromedriver_autodownload`). Forwarded verbatim as --allow-insecure.\n allowInsecure?: string[];\n // Appium \"insecure features\" to disable. Only meaningful alongside\n // --allow-insecure or --relaxed-security; applied last (deny wins).\n denyInsecure?: string[];\n // Open all insecure features (Appium --relaxed-security). Use only on a\n // trusted local network; pair with --deny-insecure to claw features back.\n relaxedSecurity?: boolean;\n // Allow browser (CORS) connections to the server (Appium --allow-cors).\n allowCors?: boolean;\n // Server URL prefix for all WebDriver routes (Appium --base-path).\n // Defaults to \"/\".\n basePath?: string;\n // Appium server log level, e.g. \"debug\" or \"warn:debug\" (console:file).\n // Defaults to \"info\".\n logLevel?: string;\n // Drivers to activate (Appium --use-drivers). Default: all installed.\n useDrivers?: string[];\n // Plugins to activate (Appium --use-plugins). Default: none.\n usePlugins?: string[];\n // Appium --keep-alive-timeout, in seconds (0 disables). Default: Appium's 600.\n keepAliveTimeout?: number;\n // Appium --request-timeout, in seconds (0 disables). Default: Appium's 3600.\n requestTimeout?: number;\n // Appium --shutdown-timeout, in milliseconds. Default: Appium's 5000.\n shutdownTimeout?: number;\n // How long to wait for the spawned server to start serving /status before\n // giving up (and tearing the child down). Defaults to 30s.\n readyTimeoutMs?: number;\n}\n\nexport async function startAppiumServer(\n opts: StartAppiumServerOptions,\n): Promise<StartedServer> {\n const hostname = opts.hostname ?? '127.0.0.1';\n const basePath = opts.basePath ?? '/';\n const logLevel = opts.logLevel ?? 'info';\n\n mkdirSync(join(homedir(), '.aco', 'logs'), { recursive: true });\n const logFile = createWriteStream(\n join(homedir(), '.aco', 'logs', `appium-${opts.port}.log`),\n );\n\n const args = [\n '--address',\n hostname,\n '--port',\n String(opts.port),\n '--base-path',\n basePath,\n '--log-level',\n logLevel,\n ];\n if (opts.allowInsecure && opts.allowInsecure.length > 0) {\n args.push('--allow-insecure', opts.allowInsecure.join(','));\n }\n if (opts.denyInsecure && opts.denyInsecure.length > 0) {\n args.push('--deny-insecure', opts.denyInsecure.join(','));\n }\n if (opts.relaxedSecurity) {\n args.push('--relaxed-security');\n }\n if (opts.allowCors) {\n args.push('--allow-cors');\n }\n if (opts.useDrivers && opts.useDrivers.length > 0) {\n args.push('--use-drivers', opts.useDrivers.join(','));\n }\n if (opts.usePlugins && opts.usePlugins.length > 0) {\n args.push('--use-plugins', opts.usePlugins.join(','));\n }\n if (opts.keepAliveTimeout !== undefined) {\n args.push('--keep-alive-timeout', String(opts.keepAliveTimeout));\n }\n if (opts.requestTimeout !== undefined) {\n args.push('--request-timeout', String(opts.requestTimeout));\n }\n if (opts.shutdownTimeout !== undefined) {\n args.push('--shutdown-timeout', String(opts.shutdownTimeout));\n }\n\n const child = spawn('appium', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env },\n });\n\n child.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOENT') {\n process.stderr.write(\n 'aco: `appium` not found on PATH. Install Appium first: ' +\n 'https://appium.io/docs/en/latest/quickstart/install/\\n',\n );\n process.exit(127);\n }\n throw err;\n });\n\n child.stdout?.pipe(logFile);\n child.stderr?.pipe(logFile);\n\n if (opts.tee) {\n child.stdout?.pipe(process.stdout);\n child.stderr?.pipe(process.stdout);\n }\n\n // serverUrl carries the base-path so it is the full, canonical URL the\n // session record stores and subcommands attach to (parseConnection derives\n // basePath back out of the pathname). For the default \"/\" the suffix is empty.\n const baseSuffix = basePath.replace(/\\/+$/, '');\n const serverUrl = `http://${hostname}:${opts.port}${baseSuffix}`;\n // Appium serves /status under --base-path, so a non-default base-path must be\n // included in the readiness probe or it 404s and we never see a 200.\n const statusUrl = `${serverUrl}/status`;\n try {\n await waitForReady(statusUrl, opts.readyTimeoutMs ?? 30_000);\n } catch (err) {\n // We spawned this child; if it never became ready we own tearing it down.\n // Without this, a never-binding Appium (e.g. one wedged before listening)\n // is left as a zombie after startAppiumServer rejects, since the caller\n // only kills the server in the createBrowser failure branch.\n if (child.pid) {\n try {\n process.kill(child.pid, 'SIGTERM');\n } catch (killErr) {\n if ((killErr as NodeJS.ErrnoException).code !== 'ESRCH') throw killErr;\n }\n }\n throw err;\n }\n\n return {\n child,\n serverUrl,\n hostname,\n port: opts.port,\n basePath,\n pid: child.pid ?? 0,\n };\n}\n\nasync function waitForReady(\n statusUrl: string,\n timeoutMs: number,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n const res = await fetch(statusUrl);\n if (res.ok) return;\n } catch (err) {\n lastErr = err;\n }\n await delay(250);\n }\n throw new Error(\n `Appium server did not become ready within ${timeoutMs}ms at ${statusUrl}. ` +\n `Last error: ${String(lastErr ?? 'n/a')}. Check ~/.aco/logs/appium-*.log for details.`,\n );\n}\n\nexport async function stopAppiumServer(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err;\n }\n}\n","import type { Platform } from './connection.js';\n\nexport interface StartCapsInput {\n platform: Platform;\n app?: string;\n appActivity?: string;\n deviceName?: string;\n platformVersion?: string;\n udid?: string;\n avd?: string;\n // iOS real-device code signing (XCUITest builds/installs WDA on-device):\n xcodeOrgId?: string;\n xcodeSigningId?: string;\n allowProvisioningDeviceRegistration?: boolean;\n updatedWdaBundleId?: string;\n extraCaps?: Record<string, unknown>;\n}\n\nexport function buildCapabilities(\n input: StartCapsInput,\n): Record<string, unknown> {\n const automationName = input.platform === 'ios' ? 'XCUITest' : 'UiAutomator2';\n const platformName = input.platform === 'ios' ? 'iOS' : 'Android';\n const base: Record<string, unknown> = {\n platformName,\n 'appium:automationName': automationName,\n // aco is an interactive operator CLI: a user typing subcommands across\n // separate shell invocations can easily exceed Appium's 60s default\n // newCommandTimeout, which would silently terminate the session between\n // shots. Disable it by default; users can re-enable via\n // `--cap appium:newCommandTimeout=<seconds>`.\n 'appium:newCommandTimeout': 0,\n };\n\n if (input.deviceName) base['appium:deviceName'] = input.deviceName;\n if (input.platformVersion)\n base['appium:platformVersion'] = input.platformVersion;\n if (input.udid) base['appium:udid'] = input.udid;\n if (input.avd) {\n if (input.platform !== 'android') {\n throw new Error(\n '--avd is only valid for --platform android (iOS uses --udid / --device-name).',\n );\n }\n base['appium:avd'] = input.avd;\n }\n\n const signingProvided =\n input.xcodeOrgId ||\n input.xcodeSigningId ||\n input.allowProvisioningDeviceRegistration ||\n input.updatedWdaBundleId;\n if (signingProvided && input.platform !== 'ios') {\n throw new Error(\n 'Code-signing flags (--xcode-org-id, --xcode-signing-id, ' +\n '--allow-provisioning-device-registration, --updated-wda-bundle-id) ' +\n 'are only valid for --platform ios.',\n );\n }\n if (input.xcodeOrgId) base['appium:xcodeOrgId'] = input.xcodeOrgId;\n if (input.xcodeSigningId)\n base['appium:xcodeSigningId'] = input.xcodeSigningId;\n if (input.allowProvisioningDeviceRegistration)\n base['appium:allowProvisioningDeviceRegistration'] = true;\n if (input.updatedWdaBundleId)\n base['appium:updatedWDABundleId'] = input.updatedWdaBundleId;\n\n if (input.app) {\n const looksLikePath =\n /^[./~]|^[A-Za-z]:\\\\/.test(input.app) ||\n /\\.(app|apk|aab|ipa|zip)$/i.test(input.app);\n if (looksLikePath) {\n base['appium:app'] = input.app;\n } else if (input.platform === 'ios') {\n base['appium:bundleId'] = input.app;\n } else {\n if (!input.appActivity) {\n throw new Error(\n 'Android `--app <package>` also requires `--app-activity <activity>` ' +\n '(UIAutomator2 needs appium:appPackage + appium:appActivity to launch an installed app).',\n );\n }\n base['appium:appPackage'] = input.app;\n base['appium:appActivity'] = input.appActivity;\n }\n }\n\n return { ...base, ...(input.extraCaps ?? {}) };\n}\n","import { createServer } from 'node:net';\n\nexport function pickFreePort(preferred = 4723): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryListen = (p: number, retryOnEaddr: boolean) => {\n const srv = createServer();\n srv.unref();\n srv.once('error', (err: NodeJS.ErrnoException) => {\n if (retryOnEaddr && err.code === 'EADDRINUSE') {\n tryListen(0, false);\n } else {\n reject(err);\n }\n });\n srv.listen(p, () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : p;\n srv.close(() => resolve(port));\n });\n };\n tryListen(preferred, true);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { stopAppiumServer } from '../../lib/appium-server.js';\nimport type { Connection } from '../../lib/connection.js';\nimport {\n type SessionRecord,\n latestLiveSession,\n listSessions,\n readSession,\n removeSession,\n} from '../../lib/session-store.js';\nimport { attachBrowser } from '../../lib/wd-client.js';\n\nfunction resolveStopTargets(opts: {\n all?: boolean;\n session?: string;\n}): SessionRecord[] {\n if (opts.all) return listSessions();\n const id = opts.session ?? latestLiveSession()?.sessionId;\n if (!id) {\n throw new Error('no --session and no stored session to stop');\n }\n const rec = readSession(id);\n if (!rec) throw new Error(`no stored session ${id}`);\n return [rec];\n}\n\nfunction connectionFromRecord(r: SessionRecord): Connection {\n const url = new URL(r.serverUrl);\n return {\n sessionId: r.sessionId,\n hostname: url.hostname,\n port:\n Number.parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n basePath: url.pathname && url.pathname !== '/' ? url.pathname : '/',\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n platform: r.platform,\n };\n}\n\nexport function registerSessionStop(session: Command): void {\n session\n .command('stop')\n .description(\n 'tear down a stored session (deleteSession + SIGTERM the Appium child) and remove its record',\n )\n .option('-s, --session <id>', 'session id (default: latest live session)')\n .option('--all', 'stop every stored session')\n .action(async (opts) => {\n const records = resolveStopTargets(opts);\n\n for (const r of records) {\n process.stderr.write(`aco: stopping ${r.sessionId} ...\\n`);\n try {\n const browser = await attachBrowser(connectionFromRecord(r));\n await browser.deleteSession();\n } catch (err) {\n process.stderr.write(\n `aco: warning -- deleteSession failed for ${r.sessionId}: ${(err as Error).message}\\n`,\n );\n }\n if (r.pid) {\n try {\n await stopAppiumServer(r.pid);\n } catch (err) {\n process.stderr.write(\n `aco: warning -- SIGTERM pid ${r.pid} failed: ${(err as Error).message}\\n`,\n );\n }\n }\n removeSession(r.sessionId);\n process.stderr.write(`aco: stopped ${r.sessionId}\\n`);\n }\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerSessionList } from './list.js';\nimport { registerSessionStart } from './start.js';\nimport { registerSessionStop } from './stop.js';\n\nexport function registerSession(program: Command): void {\n const session = program\n .command('session')\n .description('manage Appium sessions (boot a server + create a session)');\n registerSessionStart(session);\n registerSessionList(session);\n registerSessionStop(session);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nexport function registerSettingsGet(settings: Command): void {\n addConnectionFlags(\n settings\n .command('get')\n .description('print the active driver settings (GET /appium/settings)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getSettings());\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../../lib/connection.js';\nimport { runWithSession } from '../../lib/run-with-session.js';\n\nfunction parsePairs(values: string[] | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const v of values ?? []) {\n const idx = v.indexOf('=');\n if (idx < 0) throw new Error(`--set expects key=value, got \"${v}\"`);\n const key = v.slice(0, idx);\n const raw = v.slice(idx + 1);\n try {\n out[key] = JSON.parse(raw) as unknown;\n } catch {\n out[key] = raw;\n }\n }\n return out;\n}\n\nexport function registerSettingsSet(settings: Command): void {\n addConnectionFlags(\n settings\n .command('set')\n .description('update driver settings (POST /appium/settings)'),\n )\n .option('--set <key=value...>', 'a setting to update (repeatable)')\n .option('-j, --json <obj>', 'settings object as a single JSON blob')\n .action(async (opts) => {\n let body: Record<string, unknown> = {};\n if (opts.json) {\n try {\n body = JSON.parse(opts.json) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `--json must be valid JSON: ${(err as Error).message}`,\n );\n }\n }\n body = { ...body, ...parsePairs(opts.set) };\n if (Object.keys(body).length === 0) {\n throw new Error('nothing to set: pass --set key=value or --json <obj>');\n }\n await runWithSession(opts, (b) => b.updateSettings(body));\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { registerSettingsGet } from './get.js';\nimport { registerSettingsSet } from './set.js';\n\nexport function registerSettings(program: Command): void {\n const settings = program\n .command('settings')\n .description('read / update the live Appium driver settings API');\n registerSettingsGet(settings);\n registerSettingsSet(settings);\n}\n","import { DOMParser, XMLSerializer } from '@xmldom/xmldom';\nimport { type SelectReturnType, select } from 'xpath';\nimport { AcoUserError } from './errors.js';\n\nexport function applyXpath(xml: string, expr: string): string {\n const parseErrors: string[] = [];\n let doc: ReturnType<DOMParser['parseFromString']>;\n try {\n doc = new DOMParser({\n onError: (level, msg) => {\n if (level === 'error' || level === 'fatalError') parseErrors.push(msg);\n },\n }).parseFromString(xml, 'text/xml');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`could not parse page source as XML: ${msg}`);\n }\n\n if (parseErrors.length > 0) {\n throw new AcoUserError(\n `could not parse page source as XML: ${parseErrors[0]}`,\n );\n }\n\n let result: SelectReturnType;\n try {\n result = select(expr, doc as unknown as Parameters<typeof select>[1]);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new AcoUserError(`invalid XPath expression: ${msg}`);\n }\n\n if (Array.isArray(result)) {\n const serializer = new XMLSerializer();\n return result\n .map((node) =>\n serializer.serializeToString(\n node as unknown as Parameters<XMLSerializer['serializeToString']>[0],\n ),\n )\n .join('\\n');\n }\n return String(result);\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\nimport { applyXpath } from '../lib/xpath.js';\n\nexport function registerSource(program: Command): void {\n addConnectionFlags(\n program\n .command('source')\n .description('print the current page source (W3C GET /source)'),\n )\n .option(\n '-x, --xpath <expr>',\n 'filter the page source with a client-side XPath 1.0 expression ' +\n '(evaluated locally against the returned XML, not by the driver)',\n )\n .action(async (opts) => {\n const xml = await runWithSession(opts, (b) => b.getPageSource());\n const out = opts.xpath ? applyXpath(xml, opts.xpath) : xml;\n process.stdout.write(`${out}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags, resolveConnection } from '../lib/connection.js';\n\nexport function registerStatus(program: Command): void {\n addConnectionFlags(\n program\n .command('status')\n .description(\n 'print the Appium server status (GET /status; no session required)',\n ),\n ).action(async (opts) => {\n const { conn } = resolveConnection(opts);\n const base = conn.basePath === '/' ? '' : conn.basePath.replace(/\\/$/, '');\n const url = `${conn.protocol}://${conn.hostname}:${conn.port}${base}/status`;\n const res = await fetch(url);\n process.stdout.write(`${await res.text()}\\n`);\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { W3C_ELEMENT_ID } from '../lib/locator.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nfunction finiteNumber(flag: string, v: string): number {\n const n = Number(v);\n if (!Number.isFinite(n)) {\n throw new Error(`${flag} must be a number (got \"${v}\")`);\n }\n return n;\n}\n\nfunction point(flag: string, v: string): { x: number; y: number } {\n const [x, y, ...rest] = v.split(',');\n if (x == null || y == null || rest.length > 0) {\n throw new Error(`${flag} must be \"x,y\" (got \"${v}\")`);\n }\n return {\n x: finiteNumber(flag, x),\n y: finiteNumber(flag, y),\n };\n}\n\nexport function registerSwipe(program: Command): void {\n addConnectionFlags(\n program\n .command('swipe')\n .description(\n 'swipe in a direction within an element (or the viewport) via ' +\n \"WebdriverIO's cross-platform swipe (a real W3C pointer gesture), \" +\n 'naming the target with --selector, --label, or a raw --element id',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the element to swipe within, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the element to swipe within; uses the first match',\n )\n .option('-e, --element <id>', 'raw element id to swipe within')\n .option('-d, --direction <dir>', 'up|down|left|right (default up)', (v) => {\n if (v !== 'up' && v !== 'down' && v !== 'left' && v !== 'right') {\n throw new Error(`--direction must be up|down|left|right (got \"${v}\")`);\n }\n return v;\n })\n .option('--duration <ms>', 'how long the swipe takes (default 1500)', (v) =>\n finiteNumber('--duration', v),\n )\n .option(\n '--percent <0..1>',\n 'fraction of the element/viewport to traverse (default 0.95)',\n (v) => finiteNumber('--percent', v),\n )\n .option(\n '--from <x,y>',\n 'absolute start coordinates (ignored when an element is given)',\n (v) => point('--from', v),\n )\n .option(\n '--to <x,y>',\n 'absolute end coordinates (ignored when an element is given)',\n (v) => point('--to', v),\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length > 1) {\n throw new Error('pass at most one of --selector, --label, --element');\n }\n const hasElementSource = sources.length === 1;\n const hasFrom = opts.from != null;\n const hasTo = opts.to != null;\n\n if (hasFrom !== hasTo) {\n throw new Error('pass both --from and --to, or neither');\n }\n if (hasElementSource && (hasFrom || hasTo)) {\n throw new Error(\n '--from/--to are ignored when an element is given; pass one or the other',\n );\n }\n\n await runWithSession(opts, async (b) => {\n const scrollableElement = hasElementSource\n ? opts.element != null\n ? await b.$({ [W3C_ELEMENT_ID]: opts.element })\n : await b.$(\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string),\n )\n : undefined;\n\n // Forward only the options the user set; WDIO owns the defaults\n // (direction: 'up', duration: 1500, percent: 0.95).\n await b.swipe({\n ...(opts.direction ? { direction: opts.direction as Direction } : {}),\n ...(opts.duration != null ? { duration: opts.duration } : {}),\n ...(opts.percent != null ? { percent: opts.percent } : {}),\n ...(scrollableElement ? { scrollableElement } : {}),\n ...(opts.from ? { from: opts.from } : {}),\n ...(opts.to ? { to: opts.to } : {}),\n });\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { buildTap } from '../lib/actions.js';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nfunction finiteNumber(flag: string, v: string): number {\n const n = Number(v);\n if (!Number.isFinite(n)) {\n throw new Error(`${flag} must be a number (got \"${v}\")`);\n }\n return n;\n}\n\nexport function registerTap(program: Command): void {\n addConnectionFlags(\n program\n .command('tap')\n .description(\n 'tap the center of an element (or absolute coords) with a real ' +\n 'W3C pointer gesture (POST /actions), so the touch bubbles up the ' +\n 'native view hierarchy',\n ),\n )\n .option(\n '--selector <wdio-selector>',\n 'WDIO selector for the target, e.g. \"accessibility id:foo\", \"xpath://...\"',\n )\n .option(\n '-l, --label <text>',\n 'accessibility id (label) of the target; taps the first match',\n )\n .option('-e, --element <id>', 'raw element id of the target')\n .option(\n '-x, --x <px>',\n 'x coordinate (absolute, or offset within element)',\n (v) => finiteNumber('--x', v),\n )\n .option(\n '-y, --y <px>',\n 'y coordinate (absolute, or offset within element)',\n (v) => finiteNumber('--y', v),\n )\n .option(\n '-d, --duration <ms>',\n 'how long the finger stays down (default 100)',\n (v) => finiteNumber('--duration', v),\n )\n .action(async (opts) => {\n const sources = [opts.selector, opts.label, opts.element].filter(\n (s) => s != null,\n );\n if (sources.length > 1) {\n throw new Error('pass at most one of --selector, --label, --element');\n }\n const hasElementSource = sources.length === 1;\n const hasCoords = opts.x != null && opts.y != null;\n\n if (!hasElementSource && !hasCoords) {\n throw new Error(\n 'nothing to tap: pass --selector, --label, --element, or both --x and --y',\n );\n }\n\n await runWithSession(opts, async (b) => {\n let x: number;\n let y: number;\n\n if (hasElementSource) {\n let elementId: string;\n if (opts.element != null) {\n elementId = opts.element;\n } else {\n const selector =\n opts.label != null\n ? `accessibility id:${opts.label}`\n : (opts.selector as string);\n const el = await b.$(selector);\n elementId = await el.elementId;\n if (!elementId) {\n throw new Error(`no element matched ${selector}`);\n }\n }\n const rect = await b.getElementRect(elementId);\n // --x/--y act as an offset from the element's top-left when an\n // element is given; otherwise tap its geometric center.\n x = opts.x != null ? rect.x + opts.x : rect.x + rect.width / 2;\n y = opts.y != null ? rect.y + opts.y : rect.y + rect.height / 2;\n } else {\n // Absolute viewport coordinates (both guaranteed present here).\n x = opts.x as number;\n y = opts.y as number;\n }\n\n await b.performActions(\n buildTap(x, y, opts.duration) as Parameters<\n typeof b.performActions\n >[0],\n );\n await b.releaseActions();\n });\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerTimeouts(program: Command): void {\n const timeouts = program\n .command('timeouts')\n .description('read / update the session timeouts (W3C /timeouts)');\n\n addConnectionFlags(\n timeouts\n .command('get')\n .description('print the active timeouts (GET /timeouts)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getTimeouts());\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n\n addConnectionFlags(\n timeouts\n .command('set')\n .description('set session timeouts (POST /timeouts)'),\n )\n .option('--implicit <ms>', 'implicit wait timeout', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--page-load <ms>', 'page load timeout', (v) =>\n Number.parseInt(v, 10),\n )\n .option('--script <ms>', 'script timeout', (v) => Number.parseInt(v, 10))\n .action(async (opts) => {\n if (\n opts.implicit === undefined &&\n opts.pageLoad === undefined &&\n opts.script === undefined\n ) {\n throw new Error(\n 'nothing to set: pass --implicit, --page-load, and/or --script',\n );\n }\n await runWithSession(opts, (b) =>\n b.setTimeouts(opts.implicit, opts.pageLoad, opts.script),\n );\n process.stdout.write('ok\\n');\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { STRATEGIES, unwrapElementId } from '../lib/locator.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWait(program: Command): void {\n addConnectionFlags(\n program\n .command('wait')\n .description('poll for an element until it reaches a state or times out'),\n )\n .requiredOption(\n '-u, --using <strategy>',\n `locator strategy (${STRATEGIES.join(', ')})`,\n )\n .requiredOption('-v, --value <value>', 'locator value')\n .option('--for <state>', 'displayed | enabled | exists', 'displayed')\n .option(\n '--timeout <ms>',\n 'overall timeout',\n (v) => Number.parseInt(v, 10),\n 10000,\n )\n .option(\n '--interval <ms>',\n 'poll interval',\n (v) => Number.parseInt(v, 10),\n 250,\n )\n .action(async (opts) => {\n await runWithSession(opts, async (b) => {\n const deadline = Date.now() + opts.timeout;\n let lastErr = '';\n while (Date.now() < deadline) {\n try {\n const el = (await b.findElement(opts.using, opts.value)) as Record<\n string,\n string\n >;\n if (!('error' in el)) {\n const id = unwrapElementId(el);\n const ok =\n opts.for === 'exists'\n ? true\n : opts.for === 'enabled'\n ? await b.isElementEnabled(id)\n : await b.isElementDisplayed(id);\n if (ok) {\n process.stdout.write(`${JSON.stringify(id)}\\n`);\n return;\n }\n }\n } catch (e) {\n lastErr = (e as Error).message;\n }\n await new Promise((r) => setTimeout(r, opts.interval));\n }\n throw new Error(\n `wait timed out after ${opts.timeout}ms (${opts.for}); last: ${lastErr}`,\n );\n });\n });\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWeb(program: Command): void {\n const web = program\n .command('web')\n .description(\n 'navigate the active web/WebView context ' +\n '(switch into a WEBVIEW_* context first via `aco context switch`)',\n );\n\n addConnectionFlags(\n web\n .command('url')\n .description(\n 'get or set the current URL. With <url>: navigate; ' +\n 'without: print the current URL',\n ),\n )\n .argument('[url]', 'URL to navigate to (omit to read the current URL)')\n .action(async (url, opts) => {\n if (url) {\n await runWithSession(opts, (b) => b.navigateTo(url));\n process.stdout.write('ok\\n');\n } else {\n const current = await runWithSession(opts, (b) => b.getUrl());\n process.stdout.write(`${current}\\n`);\n }\n });\n\n for (const [name, method, desc] of [\n ['back', 'back', 'navigate back in history'],\n ['forward', 'forward', 'navigate forward in history'],\n ['refresh', 'refresh', 'reload the current page'],\n ] as const) {\n addConnectionFlags(web.command(name).description(desc)).action(\n async (opts) => {\n await runWithSession(opts, (b) => b[method]());\n process.stdout.write('ok\\n');\n },\n );\n }\n}\n","import type { Command } from '@commander-js/extra-typings';\nimport { addConnectionFlags } from '../lib/connection.js';\nimport { runWithSession } from '../lib/run-with-session.js';\n\nexport function registerWindow(program: Command): void {\n const window = program\n .command('window')\n .description('inspect the active window');\n\n addConnectionFlags(\n window\n .command('rect')\n .description('get the window rect {x,y,width,height} (GET /window/rect)'),\n ).action(async (opts) => {\n const value = await runWithSession(opts, (b) => b.getWindowRect());\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n });\n}\n","export function assertSupportedNodeVersion(minimum: string): void {\n const current = process.versions.node;\n if (compareSemver(current, minimum) < 0) {\n console.error(\n `aco requires Node.js >= ${minimum}, but is running on ${current}.\\nPlease upgrade Node.js: https://nodejs.org/`,\n );\n process.exit(1);\n }\n}\n\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split('.').map((n) => Number.parseInt(n, 10));\n const pb = b.split('.').map((n) => Number.parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai !== bi) return ai - bi;\n }\n return 0;\n}\n"],"mappings":"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","names":["program","program","readFileSync","readdirSync","homedir","join","program","program","program","program","program","program","writeFileSync","program","writeFileSync","program","program","spawn","createWriteStream","mkdirSync","readFileSync","homedir","join","mkdirSync","homedir","join","readFileSync","mkdirSync","join","homedir","createWriteStream","spawn","program","program","DOMParser","DOMParser","program","program","program","finiteNumber","program","program","program","program","program"]}
|