agent-device 0.20.2 → 0.20.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/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.apk → agent-device-android-ime-helper-0.20.3.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.manifest.json → agent-device-android-ime-helper-0.20.3.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.2.apk → agent-device-android-snapshot-helper-0.20.3.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.2.manifest.json → agent-device-android-snapshot-helper-0.20.3.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -176
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +184 -0
- package/dist/src/android-adb.d.ts +3 -26
- package/dist/src/android-adb.js +1 -1
- package/dist/src/app-helpers.js +1 -0
- package/dist/src/apps.js +5 -5
- package/dist/src/context.js +1 -1
- package/dist/src/device-input-state.d.ts +26 -0
- package/dist/src/find.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +14 -14
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +78 -2
- package/dist/src/logcat.js +1 -1
- package/dist/src/recording-export-quality.js +2 -3
- package/dist/src/runtime2.js +1 -1
- package/dist/src/sdk-android-adb.d.ts +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +8 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/tv-remote.d.ts +1 -1
- package/package.json +14 -15
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.2.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.2.apk.sha256 +0 -1
package/dist/src/lease.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{Bt as t,Ht as n,Lt as r,On as i,Pt as a}from"./recording-export-quality.js";import{n as o,r as s}from"./lease-context.js";import{
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{Bt as t,Ht as n,Lt as r,On as i,Pt as a}from"./recording-export-quality.js";import{n as o,r as s}from"./lease-context.js";import{on as c}from"./internal/daemon.js";async function l(e){let{req:a,sessionName:c,sessionStore:l,leaseRegistry:f,providerRuntimeIds:p,providerRuntimeRequiredIds:m,leaseLifecycleProvider:h,cloudArtifactProvider:g}=e,_=o(a);switch(a.command){case i.artifacts:return{ok:!0,data:await d(a,s(a,l.get(c)),g)};case`lease_allocate`:{u(_.leaseProvider,p,m);let e=f.allocateLease(r(_)),t;try{t=await h?.allocate?.(e,{req:a})}catch(t){throw f.releaseLease(n({leaseId:e.leaseId,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})),t}return{ok:!0,data:{lease:e,...t?{provider:t}:{}}}}case`lease_heartbeat`:{let e=f.heartbeatLease(t(_)),n=await h?.heartbeat?.(e,{req:a});return{ok:!0,data:{lease:e,...n?{provider:n}:{}}}}case`lease_release`:{let e=n(_),t=f.getLease(e),r=t?await h?.release?.(t,{req:a}):void 0;return{ok:!0,data:{released:f.releaseLease(e).released,...r?{provider:r}:{}}}}default:return null}}function u(t,n,r){if(!(!t||n===void 0||r===void 0||!r.includes(t)||n.includes(t)))throw new e(`UNSUPPORTED_OPERATION`,`Provider "${t}" is not available in this daemon runtime.`,{provider:t,hint:`Restart the daemon with ${t} configured, then retry lease allocation.`})}async function d(e,t,n){let r=h(e.flags,`providerSessionId`);return f(t,r)?await p(t.tenantId):await m(t,r,n)}function f(e,t){return a(e)||!e.leaseProvider&&!t}async function p(e){let t=await c(e);return{source:`daemon`,status:`ready`,artifacts:t,...t.length===0?{message:`No daemon artifacts available.`}:{}}}async function m(t,n,r){if(!t.leaseProvider)throw new e(`INVALID_ARGS`,`artifacts requires --provider for provider session lookup or an active cloud connection.`);if(!t.leaseId&&!n)throw new e(`INVALID_ARGS`,`artifacts requires an active cloud lease or --provider-session <id>.`);let i=await r?.listCloudArtifacts?.({provider:t.leaseProvider,leaseId:t.leaseId,providerSessionId:n});if(!i)throw new e(`UNSUPPORTED_OPERATION`,`Cloud artifacts are not available for provider "${t.leaseProvider}".`);return i}function h(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}export{l as handleLeaseCommands};
|
package/dist/src/limrun.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { A as SnapshotNode, B as DeviceTarget, D as Rect, E as RawSnapshotNode, H as PlatformSelector, N as SnapshotState, R as DeviceInfo, T as Point, j as SnapshotOptions$1, k as SnapshotBackend, o as DaemonRequest, p as LeaseBackend } from "./sdk-contracts.js";
|
|
2
|
-
import {
|
|
2
|
+
import { c as ScrollDirection, o as GesturePlan, r as AndroidAdbProvider } from "./sdk-android-adb.js";
|
|
3
|
+
import { t as AppsFilter } from "./sdk-app-inventory.js";
|
|
4
|
+
import { n as AndroidKeyboardState, t as AndroidKeyboardDismissResult } from "./device-input-state.js";
|
|
3
5
|
import { a as CloudArtifactProvider, f as SnapshotCaptureAnnotations, n as DeviceRotation, p as SessionSurface, s as BackMode, t as TvRemoteButton, u as SnapshotDiagnosticsSummary } from "./tv-remote.js";
|
|
4
6
|
import { t as ClickButton } from "./click-button.js";
|
|
7
|
+
import Limrun from "@limrun/api";
|
|
8
|
+
import "@limrun/api/instance-client";
|
|
9
|
+
import "@limrun/api/ios-client";
|
|
5
10
|
//#region src/platforms/permission-utils.d.ts
|
|
6
11
|
type SettingOptions = {
|
|
7
12
|
permissionTarget?: string;
|
|
@@ -327,6 +332,76 @@ type ProviderPortReverseOptions = {
|
|
|
327
332
|
};
|
|
328
333
|
type ProviderExpiredLeaseRecovery = (lease: DeviceLease) => Promise<void>;
|
|
329
334
|
//#endregion
|
|
335
|
+
//#region src/providers/limrun/ios.d.ts
|
|
336
|
+
type LimrunIosRemoteInstallOptions = {
|
|
337
|
+
md5?: string;
|
|
338
|
+
relaunch?: boolean;
|
|
339
|
+
appIdentifierHint?: string;
|
|
340
|
+
};
|
|
341
|
+
type LimrunIosRemoteInstallResult = {
|
|
342
|
+
appId?: string;
|
|
343
|
+
};
|
|
344
|
+
//#endregion
|
|
345
|
+
//#region src/providers/limrun/device-session.d.ts
|
|
346
|
+
type LimrunRecordingQuality = 5 | 6 | 7 | 8 | 9 | 10;
|
|
347
|
+
type LimrunInstalledApp = {
|
|
348
|
+
id: string;
|
|
349
|
+
name?: string;
|
|
350
|
+
installType?: string;
|
|
351
|
+
};
|
|
352
|
+
type LimrunForegroundApp = {
|
|
353
|
+
appId?: string;
|
|
354
|
+
activity?: string;
|
|
355
|
+
};
|
|
356
|
+
type LimrunIosCommandResult = {
|
|
357
|
+
code: number;
|
|
358
|
+
stdout: string;
|
|
359
|
+
stderr: string;
|
|
360
|
+
};
|
|
361
|
+
type LimrunIosCommandExecution = {
|
|
362
|
+
on(event: 'line-stdout' | 'line-stderr', listener: (line: string) => void): LimrunIosCommandExecution;
|
|
363
|
+
on(event: 'exit', listener: (code: number) => void): LimrunIosCommandExecution;
|
|
364
|
+
on(event: 'error', listener: (error: Error) => void): LimrunIosCommandExecution;
|
|
365
|
+
off(event: 'line-stdout' | 'line-stderr', listener: (line: string) => void): LimrunIosCommandExecution;
|
|
366
|
+
off(event: 'exit', listener: (code: number) => void): LimrunIosCommandExecution;
|
|
367
|
+
off(event: 'error', listener: (error: Error) => void): LimrunIosCommandExecution;
|
|
368
|
+
wait(): Promise<LimrunIosCommandResult>;
|
|
369
|
+
stop(): void;
|
|
370
|
+
};
|
|
371
|
+
type LimrunDeviceSessionBase = {
|
|
372
|
+
readonly platform: 'android' | 'ios';
|
|
373
|
+
readonly device: DeviceInfo;
|
|
374
|
+
readonly interactor: Interactor;
|
|
375
|
+
listApps(filter?: AppsFilter): Promise<LimrunInstalledApp[]>;
|
|
376
|
+
pressKey(key: string, modifiers?: string[]): Promise<void>;
|
|
377
|
+
startRecording(options?: {
|
|
378
|
+
quality?: LimrunRecordingQuality;
|
|
379
|
+
}): Promise<void>;
|
|
380
|
+
stopRecording(options: {
|
|
381
|
+
outPath: string;
|
|
382
|
+
}): Promise<string>;
|
|
383
|
+
};
|
|
384
|
+
type LimrunAndroidDeviceSession = LimrunDeviceSessionBase & {
|
|
385
|
+
readonly platform: 'android';
|
|
386
|
+
readonly adb: AndroidAdbProvider;
|
|
387
|
+
getForegroundApp(): Promise<LimrunForegroundApp | undefined>;
|
|
388
|
+
getKeyboardState(): Promise<AndroidKeyboardState>;
|
|
389
|
+
dismissKeyboard(): Promise<AndroidKeyboardDismissResult>;
|
|
390
|
+
readLogs(lineLimit: number): Promise<string>;
|
|
391
|
+
installRemoteApp(url: string): Promise<void>;
|
|
392
|
+
};
|
|
393
|
+
type LimrunIosDeviceSession = LimrunDeviceSessionBase & {
|
|
394
|
+
readonly platform: 'ios';
|
|
395
|
+
readonly viewport: {
|
|
396
|
+
width: number;
|
|
397
|
+
height: number;
|
|
398
|
+
};
|
|
399
|
+
readLogs(appId: string, lineLimit: number): Promise<string>;
|
|
400
|
+
installRemoteApp(url: string, options?: LimrunIosRemoteInstallOptions): Promise<LimrunIosRemoteInstallResult>;
|
|
401
|
+
runSimctl(args: string[]): LimrunIosCommandExecution;
|
|
402
|
+
};
|
|
403
|
+
type LimrunDeviceSession = LimrunAndroidDeviceSession | LimrunIosDeviceSession;
|
|
404
|
+
//#endregion
|
|
330
405
|
//#region src/providers/limrun/runtime.d.ts
|
|
331
406
|
type LimrunRuntimeOptions = {
|
|
332
407
|
apiKey: string;
|
|
@@ -343,6 +418,7 @@ declare class LimrunRuntime implements ProviderDeviceRuntime {
|
|
|
343
418
|
constructor(options: LimrunRuntimeOptions);
|
|
344
419
|
ownsDevice(device: DeviceInfo): boolean;
|
|
345
420
|
getInteractor(device: DeviceInfo): Interactor | undefined;
|
|
421
|
+
getDeviceSession(device: DeviceInfo): LimrunDeviceSession | undefined;
|
|
346
422
|
installApp(device: DeviceInfo, app: string, appPath: string, options?: ProviderDeviceInstallOptions): Promise<ProviderDeviceInstallResult | undefined>;
|
|
347
423
|
installInstallablePath(device: DeviceInfo, installablePath: string, options?: ProviderDeviceInstallOptions): Promise<ProviderDeviceInstallResult | undefined>;
|
|
348
424
|
configurePortReverse(options: ProviderPortReverseOptions): Promise<Record<string, unknown> | undefined>;
|
|
@@ -358,4 +434,4 @@ declare class LimrunRuntime implements ProviderDeviceRuntime {
|
|
|
358
434
|
private requireAndroidPortReverseSession;
|
|
359
435
|
}
|
|
360
436
|
//#endregion
|
|
361
|
-
export { LimrunRuntime, type LimrunRuntimeOptions };
|
|
437
|
+
export { type AndroidAdbProvider, type AndroidKeyboardDismissResult, type AndroidKeyboardState, type LimrunAndroidDeviceSession, type LimrunDeviceSession, type LimrunForegroundApp, type LimrunInstalledApp, type LimrunIosCommandExecution, type LimrunIosCommandResult, type LimrunIosDeviceSession, type LimrunIosRemoteInstallOptions, type LimrunIosRemoteInstallResult, type LimrunRecordingQuality, LimrunRuntime, type LimrunRuntimeOptions };
|
package/dist/src/logcat.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{t as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{n}from"./sdk-android-adb.js";import"node:fs";var r=e({captureAndroidLogcatWithAdb:()=>i,streamAndroidLogcatWithAdb:()=>a});async function i(e,t={}){let r=[`logcat`,`-d`,`-v`,`time`];t.lines!==void 0&&r.push(`-t`,String(Math.max(1,Math.floor(t.lines))));let i=await e(r,{allowFailure:!0,timeoutMs:t.timeoutMs,signal:t.signal});if(i.exitCode!==0)throw n(`Failed to capture Android logcat`,i);return i.stdout}function a(e,n={}){if(!e.spawn)throw new t(`UNSUPPORTED_OPERATION`,`Android ADB provider does not support streams`,{capability:`adb.spawn`});let r=[`logcat`,`-v`,`time`];n.pid&&r.push(`--pid`,n.pid);let i=e.spawn(r,{stdio:[`ignore`,`pipe`,`pipe`],signal:n.signal});return n.output&&i.stdout&&i.stdout.pipe(n.output,{end:!1}),i}export{r as n,a as r,i as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{S as e,T as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contracts.js";import{$ as c,A as l,J as u,Q as d,T as f,X as p,Y as m,Z as h}from"./sdk-batch-runner.js";import{d as g}from"./sdk-device.js";import{$ as ee,F as te,G as ne,J as re,K as ie,P as ae,Q as oe,U as se,W as ce,Y as le,Z as ue,a as de,at as fe,c as pe,d as me,et as he,g as ge,h as _e,lt as ve,n as ye,nt as be,o as xe,p as Se,q as Ce,r as we,rt as _,s as v,st as Te,t as Ee,tt as De,u as Oe,z as ke}from"./sdk-selectors.js";import{A as Ae,P as je,U as y,_ as Me,i as Ne,l as Pe,m as Fe,r as Ie,t as Le}from"./gesture-plan-types.js";import{a as Re,c as b,r as x,s as ze,t as Be,u as S}from"./android-input-method-overlays.js";import{createHash as Ve}from"node:crypto";import He from"node:path";import{styleText as Ue}from"node:util";const We=Xe(`public`),Ge=Xe(`internal`),Ke=Xe(`local-cli`),qe={help:`help`};function Je(){return[...Object.values(We),...Object.values(Ke)].sort()}function Ye(e){return Object.values(qe).includes(e)||Object.values(Ge).includes(e)?!0:Je().includes(e)}function Xe(e){let t={};for(let[n,r]of l(e))t[n]=r;return t}const Ze=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Qe=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],$e=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotMaxSize`,names:[`--max-size`],type:`int`,min:1,usageLabel:`--max-size <px>`,usageDescription:`Screenshot/record: downscale so the longest edge is at most <px>`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],et=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],tt=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`},{token:`--max-size`,key:`screenshotMaxSize`,label:`screenshot --max-size`}];function nt(e){return ot({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function rt(e={}){return ot({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function it(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function at(e){let{args:t,flags:n,index:r}=e,i=t[r];return st(i,n,r)??ct({args:t,index:r,flags:n,token:i})??{handled:!1}}function ot(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function st(e,t,n){let r=et.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function ct(e){let t=tt.find(t=>t.token===e.token);if(!t)return;let r=e.args[e.index+1],i=r===void 0?NaN:Number(r);if(!Number.isInteger(i)||i<1)throw new n(`INVALID_ARGS`,`${t.label} requires a positive integer`);return e.flags[t.key]=i,{handled:!0,nextIndex:e.index+1}}function C(e){return e?{message:e}:{}}function lt(e,t){return t?{...e,message:t}:e}function ut(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}const dt=[`in-app`,`system`],ft=[`app`,`device`,`system`];function pt(e){return e===`device`||e===`system`}const mt=[`app`,`frontmost-app`,`desktop`,`menubar`],ht=y(mt,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${mt.join(`|`)}.`});function gt(e){return ht.parse(e)}const _t=[`primary`,`secondary`,`middle`];function vt(e){return e?.clickButton??`primary`}function yt(e){return e.button===`primary`?null:e.commandLabel===`click`?e.platform!==`macos`&&e.platform!==`linux`?new n(`UNSUPPORTED_OPERATION`,`click --button ${e.button} is supported only on macOS and Linux`):e.platform===`macos`&&e.button===`middle`?new n(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof e.count==`number`||typeof e.intervalMs==`number`||typeof e.holdMs==`number`||typeof e.jitterPx==`number`||e.doubleTap===!0?new n(`INVALID_ARGS`,`click --button ${e.button} does not support repeat or gesture modifier flags`):null:new n(`INVALID_ARGS`,`--button is supported only for click`)}function bt(e){return e===`primary`?{}:{button:e}}const xt=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`];function St(e){if(e===void 0)throw new n(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(e?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new n(`INVALID_ARGS`,`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}function w(e){return e.width>0&&e.height>0}function Ct(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function wt(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function Tt(e){return typeof e.parentIndex!=`number`}function T(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function Et(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function E(e){let t=ve(e);if(!t||t!==e.identifier?.trim()||!Dt(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function D(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Dt(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Ot(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function kt(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function O(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const At=[`button`,`switch`,`checkbox`,`radio`],jt=[`button`,`image`,`textview`,`view`];function Mt(e,t,n){for(let r of e){if(t.has(r.index)||!Ft(r))continue;let i=It(kt(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)O(e,n,t)}}}function Nt(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Ut(i))continue;let a=D(E(i));if(!a)continue;let o=r.get(a);if(o&&Bt(o,i,t)){let s=Vt(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Pt(e,t){for(let n of e){if(t.has(n.index)||!Rt(n))continue;let r=D(E(n));if(!r)continue;let i=kt(e,n.index).filter(e=>!t.has(e.index)&&zt(n,e,r));for(let n of i.filter(Lt))O(e,n.index,t);let a=i.filter(e=>!Lt(e)),o=new Set(a.map(e=>D(E(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)O(e,n.index,t)}}function Ft(e){return e.hittable===!0&&!T(e)&&!!(e.rect&&w(e.rect))&&E(e).trim().length===0}function It(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Lt(o)||!Ct(o.rect,t.rect))continue;let e=E(o).trim().replace(/\s+/g,` `),s=D(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function Lt(e){if(e.hittable===!0||T(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Rt(e){return e.hittable===!0&&!T(e)&&!!(e.rect&&w(e.rect))&&!!D(E(e))}function zt(e,t,n){if(!Ut(t)||!Ct(t.rect,e.rect))return!1;let r=D(E(t));return!!(r&&n!==r&&n.includes(r))}function Bt(e,t,n){return!n.has(e.index)&&wt(e.rect,t.rect)&&(Jt(e,t)||qt(e,t))}function Vt(e,t,n,r,i){let a=Wt(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:Ht(c.presentationHints,l,s)}),O(e,o.index,r),i.get(a.index)??a}function Ht(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Ut(e){if(!e.rect||!w(e.rect)||Tt(e)||T(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||Kt(t,jt)}function Wt(e,t){let n=Gt(e);return Gt(t)>n?t:e}function Gt(e){let t=(e.type??``).toLowerCase(),n=0;return Kt(t,At)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function Kt(e,t){return t.some(t=>e.includes(t))}function qt(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:Wt(n,r).index===n.index}function Jt(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function Yt(e,t,n){if(n.raw||!Xt(e))return{nodes:t,filteredCount:0};let r=Zt(t);return{nodes:r,filteredCount:t.length-r.length}}function Xt(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Zt(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Qt(e,t),$t(e,r,t,n),Mt(e,t,n),Pt(e,t),Nt(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Qt(e,t){for(let n of e)!n.rect||w(n.rect)||Tt(n)||O(e,n.index,t)}function $t(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||Tt(i))continue;let a=Ot(i,t,Et);a&&tn(r,a,en(i,e)),O(e,i.index,n)}}function en(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&w(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function tn(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function nn(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||rn(t)?null:t}function rn(e){return/\S+@\S+\.\S+/.test(e)}function an(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=nn(ve(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!on(e)||(n+=e.length);return n>=8}function on(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(sn(e[t]?.rect,e[n]?.rect))return!0;return!1}function sn(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const cn={digest:8*1024,default:24*1024,full:64*1024};function ln(e){return e===`digest`||e===`full`?e:`default`}function un(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function k(e,n=256){return un(t(e),n)}function dn(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function fn(e){return(t,n)=>k(dn(t,e),n)}function pn(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function mn(e,t){let n=ln(t),r=n===`digest`?8:20,i=pn(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function hn(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function gn(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=ln(n),a=cn[i],o=mn(t,n),s=hn(o);if(s<=a)return o;let c=s-a,l=r(mn(t,`full`)),u=_n(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function _n(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:k(e.step.source.path),line:e.step.source.line}},action:k(e.action),cause:{code:e.cause.code,message:k(e.cause.message),...e.cause.hint?{hint:k(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function vn(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...An(n.step),...En(n.kind,n.targetBinding),...yn(n.repairHint,n.resume),...jn(n.screen),...Fn(n.suggestions,n.suggestionCount),...Ln(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
|
|
1
|
+
import{S as e,T as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contracts.js";import{$ as c,A as l,J as u,Q as d,T as f,X as p,Y as m,Z as h}from"./sdk-batch-runner.js";import{d as g}from"./sdk-device.js";import{$ as ee,F as te,G as ne,J as re,K as ie,P as ae,Q as oe,U as se,W as ce,Y as le,Z as ue,a as de,at as fe,c as pe,d as me,et as he,g as ge,h as _e,lt as ve,n as ye,nt as be,o as xe,p as Se,q as Ce,r as we,rt as _,s as v,st as Te,t as Ee,tt as De,u as Oe,z as ke}from"./sdk-selectors.js";import{A as Ae,P as je,U as y,_ as Me,i as Ne,l as Pe,m as Fe,r as Ie,t as Le}from"./gesture-plan-types.js";import{a as Re,c as b,r as x,s as ze,t as Be,u as S}from"./android-input-method-overlays.js";import{createHash as Ve}from"node:crypto";import He from"node:path";import{styleText as Ue}from"node:util";const We=Xe(`public`),Ge=Xe(`internal`),Ke=Xe(`local-cli`),qe={help:`help`};function Je(){return[...Object.values(We),...Object.values(Ke)].sort()}function Ye(e){return Object.values(qe).includes(e)||Object.values(Ge).includes(e)?!0:Je().includes(e)}function Xe(e){let t={};for(let[n,r]of l(e))t[n]=r;return t}const Ze=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Qe=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],$e=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotMaxSize`,names:[`--max-size`],type:`int`,min:1,usageLabel:`--max-size <px>`,usageDescription:`Screenshot/record: downscale so the longest edge is at most <px>`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],et=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],tt=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`},{token:`--max-size`,key:`screenshotMaxSize`,label:`screenshot --max-size`}];function nt(e){return ot({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function rt(e={}){return ot({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function it(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function at(e){let{args:t,flags:n,index:r}=e,i=t[r];return st(i,n,r)??ct({args:t,index:r,flags:n,token:i})??{handled:!1}}function ot(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function st(e,t,n){let r=et.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function ct(e){let t=tt.find(t=>t.token===e.token);if(!t)return;let r=e.args[e.index+1],i=r===void 0?NaN:Number(r);if(!Number.isInteger(i)||i<1)throw new n(`INVALID_ARGS`,`${t.label} requires a positive integer`);return e.flags[t.key]=i,{handled:!0,nextIndex:e.index+1}}function C(e){return e?{message:e}:{}}function w(e,t){return t?{...e,message:t}:e}function lt(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}const ut=[`in-app`,`system`],dt=[`app`,`device`,`system`];function ft(e){return e===`device`||e===`system`}const pt=[`app`,`frontmost-app`,`desktop`,`menubar`],mt=y(pt,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${pt.join(`|`)}.`});function ht(e){return mt.parse(e)}const gt=[`primary`,`secondary`,`middle`];function _t(e){return e?.clickButton??`primary`}function vt(e){return e.button===`primary`?null:e.commandLabel===`click`?e.platform!==`macos`&&e.platform!==`linux`?new n(`UNSUPPORTED_OPERATION`,`click --button ${e.button} is supported only on macOS and Linux`):e.platform===`macos`&&e.button===`middle`?new n(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof e.count==`number`||typeof e.intervalMs==`number`||typeof e.holdMs==`number`||typeof e.jitterPx==`number`||e.doubleTap===!0?new n(`INVALID_ARGS`,`click --button ${e.button} does not support repeat or gesture modifier flags`):null:new n(`INVALID_ARGS`,`--button is supported only for click`)}function yt(e){return e===`primary`?{}:{button:e}}const bt=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`];function xt(e){if(e===void 0)throw new n(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(e?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new n(`INVALID_ARGS`,`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}function T(e){return e.width>0&&e.height>0}function St(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function Ct(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function wt(e){return typeof e.parentIndex!=`number`}function Tt(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function Et(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function E(e){let t=ve(e);if(!t||t!==e.identifier?.trim()||!Dt(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function D(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Dt(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Ot(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function kt(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function O(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const At=[`button`,`switch`,`checkbox`,`radio`],jt=[`button`,`image`,`textview`,`view`];function Mt(e,t,n){for(let r of e){if(t.has(r.index)||!Ft(r))continue;let i=It(kt(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)O(e,n,t)}}}function Nt(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Ut(i))continue;let a=D(E(i));if(!a)continue;let o=r.get(a);if(o&&Bt(o,i,t)){let s=Vt(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Pt(e,t){for(let n of e){if(t.has(n.index)||!Rt(n))continue;let r=D(E(n));if(!r)continue;let i=kt(e,n.index).filter(e=>!t.has(e.index)&&zt(n,e,r));for(let n of i.filter(Lt))O(e,n.index,t);let a=i.filter(e=>!Lt(e)),o=new Set(a.map(e=>D(E(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)O(e,n.index,t)}}function Ft(e){return e.hittable===!0&&!Tt(e)&&!!(e.rect&&T(e.rect))&&E(e).trim().length===0}function It(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Lt(o)||!St(o.rect,t.rect))continue;let e=E(o).trim().replace(/\s+/g,` `),s=D(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function Lt(e){if(e.hittable===!0||Tt(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Rt(e){return e.hittable===!0&&!Tt(e)&&!!(e.rect&&T(e.rect))&&!!D(E(e))}function zt(e,t,n){if(!Ut(t)||!St(t.rect,e.rect))return!1;let r=D(E(t));return!!(r&&n!==r&&n.includes(r))}function Bt(e,t,n){return!n.has(e.index)&&Ct(e.rect,t.rect)&&(Jt(e,t)||qt(e,t))}function Vt(e,t,n,r,i){let a=Wt(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:Ht(c.presentationHints,l,s)}),O(e,o.index,r),i.get(a.index)??a}function Ht(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Ut(e){if(!e.rect||!T(e.rect)||wt(e)||Tt(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||Kt(t,jt)}function Wt(e,t){let n=Gt(e);return Gt(t)>n?t:e}function Gt(e){let t=(e.type??``).toLowerCase(),n=0;return Kt(t,At)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function Kt(e,t){return t.some(t=>e.includes(t))}function qt(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:Wt(n,r).index===n.index}function Jt(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function Yt(e,t,n){if(n.raw||!Xt(e))return{nodes:t,filteredCount:0};let r=Zt(t);return{nodes:r,filteredCount:t.length-r.length}}function Xt(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Zt(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Qt(e,t),$t(e,r,t,n),Mt(e,t,n),Pt(e,t),Nt(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Qt(e,t){for(let n of e)!n.rect||T(n.rect)||wt(n)||O(e,n.index,t)}function $t(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||wt(i))continue;let a=Ot(i,t,Et);a&&tn(r,a,en(i,e)),O(e,i.index,n)}}function en(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&T(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function tn(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function nn(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||rn(t)?null:t}function rn(e){return/\S+@\S+\.\S+/.test(e)}function an(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=nn(ve(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!on(e)||(n+=e.length);return n>=8}function on(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(sn(e[t]?.rect,e[n]?.rect))return!0;return!1}function sn(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const cn={digest:8*1024,default:24*1024,full:64*1024};function ln(e){return e===`digest`||e===`full`?e:`default`}function un(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function k(e,n=256){return un(t(e),n)}function dn(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function fn(e){return(t,n)=>k(dn(t,e),n)}function pn(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function mn(e,t){let n=ln(t),r=n===`digest`?8:20,i=pn(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function hn(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function gn(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=ln(n),a=cn[i],o=mn(t,n),s=hn(o);if(s<=a)return o;let c=s-a,l=r(mn(t,`full`)),u=_n(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function _n(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:k(e.step.source.path),line:e.step.source.line}},action:k(e.action),cause:{code:e.cause.code,message:k(e.cause.message),...e.cause.hint?{hint:k(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function vn(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...An(n.step),...En(n.kind,n.targetBinding),...yn(n.repairHint,n.resume),...jn(n.screen),...Fn(n.suggestions,n.suggestionCount),...Ln(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
|
|
2
2
|
`):null}function yn(e,t){if(typeof e!=`string`)return[];let n=Sn(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function bn(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(!(typeof n!=`number`||typeof r!=`string`||r.length===0))return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function A(e,t){return`replay --from ${e} --plan-digest ${t}`}function xn(e){return e?.repairSessionHeld===!0}function Sn(e,t){let n=Cn(e,bn(t));if(n!==void 0)return xn(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function Cn(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${A(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${Tn(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${A(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${Tn(t)}`;case`caution`:return wn({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return wn({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function wn(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${Tn(n)}`;let r=`if you fixed app state with --no-record actions: ${A(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${A(n.alternateFrom,n.planDigest)}`}.`}function Tn(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function En(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[Dn(e,n.matchCount),...On(n.mismatches),...kn(n.candidates)]:[]}function Dn(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function On(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function kn(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${Pn(e)}`)]}function An(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function jn(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?Mn(t.refs,t.refsGeneration):t?.state===`unavailable`?[Nn(t)]:[]}function Mn(e,t){let n=e.slice(0,8).map(Pn),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function Nn(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function Pn(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function Fn(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(In)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function In(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function Ln(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}const Rn={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function zn(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=M(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:Bn(i,c,!1,o,t)})}return r}function Bn(e,t,n,r,i={}){let a=r??M(e.type??`Element`),o=De(e,a),s=Gn(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=Kn(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&u.push(`same label as parent`);let d=u.map(e=>` [${e}]`).join(``),f=s?` "${s}"`:``;return n?`${c}${l} [${a}]${d}`.trimEnd():`${c}${l} [${a}]${f}${d}`.trimEnd()}function j(e,t){let n=e.label?.trim();if(n&&Un(t,n))return``;let r=e.value?.trim();if(Hn(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||Wn(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function M(e){let t=e,n=e.replace(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:Vn(n)||n||`element`}function Vn(e){return Object.prototype.hasOwnProperty.call(Rn,e)?Rn[e]:void 0}function Hn(e){return e===`text-field`||e===`text-view`||e===`search`}function Un(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:Te(t)}function Wn(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Gn(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?j(e,t):qn(e,t,r.text)||j(e,t)}function Kn(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),Hn(t)&&i.push(`editable`),Jn(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?Xn(i):(i.push(`preview:"${Yn(he(r.text))}"`),i.push(`truncated`),Xn(i))}function qn(e,t,n){let r=fe(e.label);if(r&&r!==n)return r;let i=fe(e.identifier);if(i&&!Wn(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function Jn(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function Yn(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Xn(e){return[...new Set(e)]}function Zn(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function Qn(t,r={}){let i=t instanceof n?e(t):t;process.stderr.write(`Error (${i.code}): ${i.message}\n`),i.hint&&process.stderr.write(`Hint: ${i.hint}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`);let a=vn(i.details);a&&process.stderr.write(`${a}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function $n(e,t={}){let n=e.nodes,r=Array.isArray(n)?n:[],o=a(i(e.backend)?e.backend:void 0),s=Yt(e,r,t),c=rr(e),l=Ar(e,r,t,s),u=l.length>0?`${l.join(`
|
|
3
3
|
`)}\n`:``,d=t.raw?null:er(e);if(d)return`${c}${u}${tr(d)}\n`;let f=t.raw||!o?null:se(s.nodes),p=!!e.truncated,m=f?.nodes??r,h=t.raw||!o?null:lr(e,f,m.length,r.length,s.filteredCount),g=ir(r.length,h,p);return r.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${ar(r)}\n`:t.flatten?`${c}${g}\n${u}${or(m)}${cr(f)}\n`:`${c}${g}\n${u}${sr(m)}${cr(f)}\n`}function er(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0?!0:void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function tr(e){let t=nr(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
|
|
4
4
|
`):e.interactiveOnly?[`Interactive snapshot unchanged since previous read ${t} ago.`,`${e.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
|
|
@@ -11,5 +11,4 @@ import{S as e,T as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contra
|
|
|
11
11
|
`)}`:``}function lr(e,t,n,r,i=0){let a=ur(e);if(i===0&&a)return a;let o=(t?.hiddenCount??0)+i,s=t?t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow):!1;return o>0?{partial:!0,visibleNodeCount:n,totalNodeCount:Math.max(r,a?.totalNodeCount??r),reasons:dr([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function ur(e){let t=e.visibility;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.partial!=`boolean`||typeof n.visibleNodeCount!=`number`||typeof n.totalNodeCount!=`number`||!Array.isArray(n.reasons)?null:{partial:n.partial,visibleNodeCount:n.visibleNodeCount,totalNodeCount:n.totalNodeCount,reasons:n.reasons.filter(e=>typeof e==`string`)}}function dr(e){return[...new Set(e)]}function fr(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=P(n.additions),i=P(n.removals),a=P(n.unchanged),o=F(),s=Pr(e),c=s.length>0?`${s.join(`
|
|
12
12
|
`)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=kr(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return o?I(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?I(e,`red`):e}return o?I(t,`dim`):t}),u=l.length>0?`${l.join(`
|
|
13
13
|
`)}\n`:``;return o?`${c}${u}${[`${I(String(r),`green`)} additions`,`${I(String(i),`red`)} removals`,`${I(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function pr(e){let t=F(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...mr(e,t)),i.push(...hr(e,n,t)),!n&&!r&&(i.push(...gr(e,t)),i.push(..._r(e,t)),i.push(...vr(e,t)),i.push(...br(e,t)),i.push(...xr(e,t))),`${i.join(`
|
|
14
|
-
`)}\n`}function mr(e,t){if(e.match===!0)return[`${t?I(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?I(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=P(e.differentPixels),a=P(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?I(o,`red`):o}`]}function hr(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=Or(e.diffPath),i=n?I(`Diff image:`,`dim`):`Diff image:`,a=n?I(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=Or(e.currentOverlayPath),i=n?I(`Current overlay:`,`dim`):`Current overlay:`,a=n?I(t,`green`):t,o=P(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function gr(e,t){let n=P(e.differentPixels),r=P(e.totalPixels);return[` ${t?I(String(n),`red`):String(n)} different / ${r} total pixels`]}function _r(e,t){let n=Cr(e);return n.length===0?[]:[` ${L(`Hints:`,t)}`,...n.map(e=>` - ${e}`)]}function vr(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${L(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...yr(e));return r}function yr(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. ${e.location} x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff, change=${e.dominantChange}`],i=Dr(e);i&&r.push(` ${i}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:``;r.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return r}function br(e,t){let n=e.ocr?.matches??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint`,t)}`];for(let[e,t]of r.entries()){let n=t.delta;i.push(` ${e+1} | ${JSON.stringify(t.text)} | ${N(n.x)},${N(n.y)} | ${N(n.width)},${N(n.height)} | ${Sr(t.baselineRect)} | ${Sr(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?`ocr-bbox-size-change`:`-`}`)}return i}function xr(e,t){let n=e.nonTextDeltas??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | region | slot | kind | bboxCurrent | nearestText`,t)}`];for(let e of r)i.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:`-`} | ${e.slot} | ${e.likelyKind} | ${Sr(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):`-`}`);return i}function Sr(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function N(e){return e>0?`+${e}`:String(e)}function Cr(e){let t=[],n=e.ocr?.movementClusters??[];for(let e of n.slice(0,2))t.push(`text movement cluster: ${Er(e.texts)} dx=${Tr(e.xRange)}px dy=${Tr(e.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>[`icon`,`toggle`,`chevron`].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(wr).join(`; `)}`);let i=(e.nonTextDeltas??[]).filter(e=>e.likelyKind===`separator`).slice(0,2);return i.length>0&&t.push(`non-text boundaries: ${i.map(wr).join(`; `)}`),t.slice(0,6)}function wr(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:``,n=e.regionIndex?` r${e.regionIndex}`:``;return`${e.likelyKind}${t}${n}`}function Tr(e){return e.min===e.max?N(e.min):`${N(e.min)}..${N(e.max)}`}function Er(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),n=e.length>t.length?` +${e.length-t.length} more`:``;return`${t.join(`, `)}${n}`}function Dr(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,typeof e.densityPercentage==`number`?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,typeof e.baselineLuminance==`number`&&typeof e.currentLuminance==`number`?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>e!==null);return t.length>0?t.join(` `):null}function Or(e){let t=process.cwd(),n=He.relative(t,e);return n===``||!n.startsWith(`..`)&&!He.isAbsolute(n)?n===``?`.`:`.${He.sep}${n}`:e}function P(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function kr(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function F(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function I(e,t,n){return Ue(t,e,n)}function L(e,t){return t?I(e,`dim`):e}function Ar(e,t,n,r={nodes:t,filteredCount:0}){let i=Pr(e);if(jr(e)){let e=Nr(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&an(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function jr(e){return!e.snapshotQuality&&!Mr(e)}function Mr(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function Nr(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function Pr(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function Fr(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||Ir(e,n[n.length-1],r));)t.push(...zr(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...zr(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function Ir(e,t,n){return Lr(e.node,t.node,n)?!1:e.depth<=t.depth}function Lr(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function Rr(e){return zn(e,{summarizeTextSurfaces:!0}).flatMap(e=>[Bn(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...zr({...e,depth:0})])}function zr(e,t){let n=Br(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function Br(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function Vr(e,t={}){let n=F(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?R(`✓`,e):`✓`}return e===`fail`?n?R(`⨯`,`red`):`⨯`:e===`warn`?n?R(`!`,`yellow`):`!`:n?R(`-`,`dim`):`-`}function R(e,t){return I(e,t,{validateStream:!1})}function Hr(e){return`${Vr(Wr(e.status))} ${Gr(e)}`}function Ur(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function Wr(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function Gr(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}const Kr=3e5,qr=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Jr(e){return f({tenantId:e.meta?.tenantId??z(e.flags,`tenant`),runId:e.meta?.runId??z(e.flags,`runId`),leaseId:e.meta?.leaseId??z(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??z(e.flags,`leaseProvider`)??z(e.flags,`provider`),deviceKey:e.meta?.deviceKey??z(e.flags,`deviceKey`),clientId:e.meta?.clientId??z(e.flags,`clientId`)})}function Yr(e){return f({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function Xr(e){return f({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Zr(e){return f({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Qr(e){return f({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function $r(e){return ai(e)}function ei(e){let{ttlMs:t,...n}=ai(e);return n}function ti(e,t,n){let r=f({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...f({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...f({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...f({leaseId:e.leaseId})}}}function ni(e){let t=f({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function ri(e){return e.leaseProvider===`proxy`}function ii(e){return ri(e)?qr.filter(t=>!e[t]):[]}function ai(e){return f({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function z(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function B(e,t,r={}){let i=e[t];if(i===void 0)return;if(!Number.isInteger(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new n(`INVALID_ARGS`,`Expected ${t} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new n(`INVALID_ARGS`,`Expected ${t} to be at most ${r.max}.`);return a}const oi=[`metrics`,`frames`,`memory`,`cpu`,`trace`],si=[`sample`,`snapshot`,`start`,`stop`,`report`],ci=[`profile`],li=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],ui=[`android-hprof`,`memgraph`],di=y(oi),fi=y(si),pi=y(ci),mi=y(li),hi=y(ui),gi=`perf area must be metrics, frames, memory, cpu, or trace`,_i=`perf action must be sample, snapshot, start, stop, or report`,vi=`perf cpu requires profile`,yi=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,bi=`perf memory snapshot --kind must be android-hprof or memgraph`,xi=di.is,Si=fi.is,Ci=pi.is,wi=mi.is,Ti=hi.is,Ei=1e4,Di=2e3,Oi=[`get`,`accept`,`dismiss`,`wait`],ki=`<wifi|airplane|location> <on|off>`,Ai=`location set <lat> <lon>`,ji=`animations <on|off>`,Mi=`appearance <light|dark|toggle>`,Ni=`faceid <match|nonmatch|enroll|unenroll>`,Pi=`touchid <match|nonmatch|enroll|unenroll>`,Fi=`fingerprint <match|nonmatch>`,Ii=`clear-app-state [app-id]`,Li=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Ri=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,zi=`macOS supports only settings ${Mi} and settings ${Ri}. wifi|airplane|location|animations remain unsupported on macOS.`,Bi=[`settings ${ki}`,`settings ${Ai}`,`settings ${ji}`,`settings ${Mi}`,`settings ${Ni}`,`settings ${Pi}`,`settings ${Fi}`,`settings ${Ii}`,`settings ${Li}`,`settings ${Ri}`].join(` | `),Vi=`settings requires ${ki}, ${Ai}, ${ji}, ${Mi}, ${Ni}, ${Pi}, ${Fi}, ${Ii}, ${Li}, or ${Ri}`;function Hi(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function Ui(e){return`Unsupported macOS setting: ${e}. ${zi}`}function Wi(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function Gi(e,t,n){return{deviceId:t,deviceName:n,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function Ki(e,t={}){let n=t.includeSerial??!0,r=qi(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function qi(e){return g(e.platform)?e.identifiers.serial??e.id:void 0}function Ji(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...Ki(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function Yi(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Xi(e){return e.bundleId??e.package??e.app}function Zi(e){return lt({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${Xi(e)}`)}function Qi(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function $i(e){return lt({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${Qi(e)}`)}function ea(e){let t=e.appName??e.appBundleId??e.session;return lt({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?Ki(e.device):{}},t?`Opened: ${t}`:`Opened`)}function ta(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...C(e.session?`Closed: ${e.session}`:`Closed`)}}function na(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...Fe(ra(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function ra(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const ia=1e4;function aa(e,t=`scroll accepts either a relative amount or --pixels, not both`){if(e.amount!==void 0&&e.pixels!==void 0)throw new n(`INVALID_ARGS`,t)}function oa(e,t={}){if(e===void 0)return;let r=t.field??`scroll durationMs`,i=t.max??1e4,a=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new n(`INVALID_ARGS`,a);if(e>i)throw new n(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return e}function sa(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}function ca(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function la(e,t,n={}){let r=ma(e??[]);if(r.length===0)return{canScroll:!1,emptySnapshot:!0,signature:``};let i=ne(r),a=ha(r,i,t,n),o=Ca(a?_a(r,a.index):r);return a?{canScroll:ya(a,i.get(a.index),t),emptySnapshot:!1,signature:o,scope:ba(a,r)}:{canScroll:!1,emptySnapshot:!1,signature:o}}async function ua(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=la(await i(r),t,n);return r&&e.emptySnapshot?await ua({edge:t,target:n,captureNodes:i}):e}catch(e){throw pa(t,r,e)}}async function da(e){let{edge:t,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new n(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function fa(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function pa(e,t,r){return t?new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},r)}function ma(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function ha(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>le(e)&&Da(e.rect));if(a.length===0)return null;let o=ga(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Ea(e.rect,s)).sort(wa);if(e.length>0)return e.find(e=>ya(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>ya(e,t.get(e.index),n)).sort(Ta);return c.length>0?c[0]??null:a.filter(t=>ie(t,e)).sort(Ta)[0]??a.sort(Ta)[0]??null}function ga(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(le(n)&&Da(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function _a(e,t){let n=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index===t||va(e,t,n))}function va(e,t,n){let r=e.parentIndex===void 0?void 0:n.get(e.parentIndex);for(;r;){if(r.index===t)return!0;r=r.parentIndex===void 0?void 0:n.get(r.parentIndex)}return!1}function ya(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function ba(e,t){return[e.identifier,e.label].map(e=>typeof e==`string`?e.trim():``).find(n=>Sa(n)&&xa(n,e,t))}function xa(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function Sa(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function Ca(e){return e.map(e=>{let t=e.rect?[`x`,`y`,`width`,`height`].map(t=>Oa(e.rect?.[t])).join(`,`):``;return[String(e.index??``),String(e.parentIndex??``),String(e.type??``),String(e.label??``),String(e.value??``),t].join(`|`)}).join(`
|
|
15
|
-
`)}function wa(e,t){return V(e.rect)-V(t.rect)}function Ta(e,t){return V(t.rect)-V(e.rect)}function V(e){return e?e.width*e.height:0}function Ea(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function Da(e){return!!(e&&e.width>0&&e.height>0)}function Oa(e){return typeof e==`number`&&Number.isFinite(e)?e.toFixed(1):``}function H(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function U(e){return e.clock?.now()??Date.now()}async function ka(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Aa(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function W(e){return e&&typeof e==`object`?e:void 0}const ja=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function Ma(e,t){return Na(e,t).node}function Na(e,t){if(x(t))return{node:t,reason:`covered`};let n=Pa(e,t);if(n?.rect&&S(n.rect))return{node:n,reason:`same-rect-descendant`};if(Fa(t)&&t.rect&&S(t.rect))return{node:t,reason:`semantic-target`};let r=ae(e,t);return r?.rect&&!x(r)&&S(r.rect)?La(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function Pa(e,t){let n=b(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||x(e))return!1;let t=b(e.rect);return t?ze(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function Fa(e){return[e.type,e.role,e.subrole].map(e=>_(e??``)).some(Ia)}function Ia(e){return e===`tab`||ja.some(t=>e.includes(t))}function La(e,t,n){let r=b(e.rect),i=b(t.rect);if(!r||!i)return!1;let a=Ra(n,r);return!a||!za(i,a)?!1:!ze(r,i)}function Ra(e,t){let n=s(t),r=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>b(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>ue(e,n.x,n.y));return oe(i.length>0?i:r)}function za(e,t){let n=Pe(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Ba(e){return e.hittable===!0||Fa(e)}function Va(e,t){let n=de(v(e),t);return n.id!==void 0||n.label!==void 0?!1:ye(e.value)===null}function Ha(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Ua(e,t){let n=Re(t);return t.filter(t=>t.index!==e.index&&Ha(t,e,n)).sort((e,t)=>e.index-t.index)}function Wa(e,t){let n=S(e.rect);return!n||!t.rect?!1:ue(t.rect,n.x,n.y)}function Ga(e,t){if(!Va(e,t))return e;let n=Ua(e,t);if(n.some(Ba))return e;let r=n.find(e=>v(e).label!==void 0);return!r||!Wa(r,e)?e:r}function Ka(e){return e===`text`||e===`label`||e===`any`}async function qa(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function Ja(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=await i(H(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:U(e)};return r.updateSession&&o&&!Me(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function Ya(e,t,n){if(e.backend.readText){let r=await e.backend.readText(H(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return be(n)}function Xa(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=r(e,a)??(i.fallbackLabel.length>0?te(e,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:s}}function Za(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Qa(e,t,r,i){if(!r)return;let a=v(e),o=pe(e,t);if(!(xe(a,r.identity)&&Oe(o,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:we,observed:a,observedStructural:o,expected:r.identity,expectedStructural:r.structural})}async function G(e,t,n){return await vo(e,t,n.action),t.target.kind===`point`?await eo(e,t,t.target,n):t.target.kind===`ref`?await no(e,t,t.target,n):await ro(e,t,t.target,n)}async function $a(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=ee(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!ue(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function eo(e,t,n,r){let i=await $a(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await to(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function to(e,t){try{return(await K(e,t,!0)).snapshot.nodes}catch{return}}async function no(e,t,n,r){let i=await bo(e,t,n),a=i.resolved;Qa(a.node,i.snapshot.nodes,r.expectedResolvedTarget,r.action);let o=r.promoteToHittableAncestor?mo(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;return ho(o,`Ref ${n.ref}`,r.action),Eo(o,i.snapshot.nodes,n.ref,r.action),{kind:`ref`,point:Co(o,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...lo(e,o,i.snapshot.nodes,r.action,a.resolution)}}async function ro(e,t,r,i){let a=d(r.selector),o=await K(e,t,i.requireInteractive),s=_e(po(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await K(e,t,!1),s=_e(po(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!s||!s.node.rect){let t=_e(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&x(t.node)?go({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,Se(a,s?.diagnostics??[],{unique:!0}),{hint:ge(s?.diagnostics??[])})}Qa(s.node,o.snapshot.nodes,i.expectedResolvedTarget,i.action);let c=i.promoteToHittableAncestor?mo(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector.raw}`}):s.node;return ho(c,`Selector ${s.selector.raw}`,i.action),To(c,o.snapshot.nodes,s.selector.raw,i.action),{kind:`selector`,point:Co(c,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector.raw},...lo(e,c,o.snapshot.nodes,i.action,so(s,o.snapshot.nodes))}}const io={source:`ref`,phase:`pre-action`,kind:`exact`},ao={source:`ref`,phase:`pre-action`,kind:`label-fallback`},oo={source:`runtime`,phase:`pre-action`,kind:`unique`};function so(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:co(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>co(e,t))}:oo}function co(e,t){let n=_(e.type??``),r=ke(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Za(n,256)}:{},...r===void 0?{}:{label:Za(r,256)}}}function lo(e,t,n,r,i){return{node:t,selectorChain:Ee(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:ke(t,n),...fo(t,r),preActionNodes:n,resolution:i,...uo(e,t,n,r)}}function uo(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ga(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Ee(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:ke(i,n)}}}function fo(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function po(e){return e.filter(e=>!x(e))}function mo(e,t,n){let r=Na(e,t);if(r.reason===`covered`)throw go({label:n.label,node:t,action:n.action});return r.node}function ho(e,t,n){if(x(e))throw go({label:t,node:e,action:n})}function go(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${_o(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function _o(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;default:return`be tapped`}}async function K(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(H(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:U(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function vo(e,t,r){if(e.backend.platform!==`macos`)return;let i=await yo(e,t);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function yo(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function bo(e,t,r){let{session:i,snapshot:a}=await qa(e,t.session),o=r.fallbackLabel??``,s=So(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:me});return xo({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function xo(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=So(o.nodes,r.ref,{fallbackLabel:i});return s&&xe(v(a.node),v(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function So(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(wo(s))return{ref:a,node:s,resolution:io};let c=i.fallbackLabel.length>0?te(e,i.fallbackLabel):null;return wo(c)?{ref:a,node:c,resolution:ao}:null}function Co(e,t){let r=S(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function wo(e){return e?S(e.rect)!==null:!1}function To(e,t,n,r){ko(e,t,{message:`Selector ${n} resolved to an off-screen element and is not safe to ${r}`,details:{reason:`offscreen_selector`,selector:n},hint:e=>`${Do(e)} in small steps, retrying ${r} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}function Eo(e,t,n,r){ko(e,t,{message:`Ref ${n} is off-screen and not safe to ${r}`,details:{reason:`offscreen_ref`,ref:o(n)},hint:e=>`${Do(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${r} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Do(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function Oo(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=So(i,n.ref,{fallbackLabel:n.fallbackLabel??``});return a?(ho(a.node,`Ref ${n.ref}`,r),Eo(a.node,i,n.ref,r),{...fo(a.node,r),node:a.node,preActionNodes:i}):{}}function ko(e,t,r){let i=e.rect?re(e,t):null;if(!e.rect||!i||Ce(e,t))return;let a=ce(e,t);throw new n(`COMMAND_FAILED`,r.message,{...r.details,rect:e.rect,viewport:i,...a?{scrollDirection:a}:{},hint:r.hint(a)})}function Ao(e){let t=Buffer.alloc(16);for(let n of e)Mo(t,jo(n));return{digest:`ax1:${Ve(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function jo(e){return Ve(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Mo(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function No(e){let{digest:t,nodeCount:n}=Ao(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Po(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Po(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function Fo(e,t){let n=M(e.type??`Element`),r=j(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o].join(`|`)}function Io(e,t,n={}){let r=zo(Ro(e,n),Ro(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Lo(e,t={}){return Ro(e,t).length}function Ro(e,t){return t.flatten?e.map(e=>({text:Bn(e,0,!1),comparable:Fo(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):zn(e).map(e=>({text:e.text,comparable:Fo(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function zo(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Vo(a,i,s)?q(a,i+1):q(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return Bo(o,e,t,n,r)}}return[]}function Bo(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Vo(i,c,r)?c+1:c-1,u=q(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Vo(e,t,n){return t===-n||t!==n&&q(e,t-1)<q(e,t+1)}function q(e,t){return e.get(t)??0}const Ho=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Uo={strippedIndexes:new Set,refs:new Set};function Wo(e){let t=new Set(e.filter(e=>_(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Uo;let n=new Map(e.map(e=>[e.index,e])),r=Yo(e,n,t),i=new Set(r),a=ns(e,n,r);for(let t of Yo(e,n,a))i.add(t);for(let o of Go(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Go(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=qo(t,n,r);if(o.size===0)return a;let s=Jo(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Ko(n,t,o)&&a.add(n.index);return a}function Ko(e,t,n){if(!e.rect)return!1;let r=rs(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function qo(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=rs(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Jo(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Yo(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)is(i,t,n)&&r.add(i.index);return r}function Xo(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ie(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ne(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Zo(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Be(e)).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:Qo(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Uo:{strippedIndexes:o,refs:s}}function Qo(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Xo(e,t)).map(e=>e.index))}function $o(e,t){let n=Wo(e),r=Zo(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function es(e,t){let{strippedIndexes:n}=$o(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function ts(e,t){return $o(e,t).refs}function ns(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||_(n.type??``)!==`keyboard`)continue;let i=rs(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Ho.has(_(e.type??``))&&!n.has(e.index)&&is(e,t,a))&&r.delete(i)}return r}function rs(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(_(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function is(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const as=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function os(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=U(e),o=a+i,s=!1,c=Math.min(300,Math.max(25,r)),l=0,u,d=0,f,p=a;for(;U(e)<o;){let m=await ls(e,t,o-U(e));if(!m)return{settled:!1,stalled:!0,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f};l+=1,f=m;let h=us(m.snapshot.nodes),g=U(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&ss(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=cs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await ka(e,t);continue}if(h!==u)u=h,d=m.snapshot.nodes.length,p=g;else if(l>=2&&g-p>=r)return{settled:!0,stalled:!1,waitedMs:g-a,captures:l,nodeCount:d,lastCapture:f};let ee=cs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(ee<=0)break;await ka(e,ee)}return{settled:!1,stalled:!1,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f}}function ss(e){return e?.state===`recovered`&&e.backend===`private-ax`}function cs(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function ls(e,t,n){let r=Ja(e,t,{updateSession:!1,interactiveOnly:!0}),i;try{let e=await Promise.race([r,new Promise(e=>{i=setTimeout(()=>e(void 0),n)})]);return e===void 0&&r.catch(()=>{}),e}finally{i!==void 0&&clearTimeout(i)}}function us(e){return e.map(ds).join(`|`)}function ds(e){let t=e.rect?`${Math.round(e.rect.x)},${Math.round(e.rect.y)},${Math.round(e.rect.width)},${Math.round(e.rect.height)}`:``;return`${e.type??``}#${e.label??``}#${e.identifier??``}#${t}`}const fs=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,ps=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function ms(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{let o=await os(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?ps:fs}};let{stored:c,session:l}=await Ts(e,t,o.lastCapture),u=o.lastCapture.snapshot.nodes;return{observation:{...s,...o.settled&&c?vs(gs(n.resolved),u,n.resolved.point,l?.appBundleId):{},...ws(o,c,u.length)},settledNodes:u}}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}function hs(e,t){if(!e)return;let n=No(e),r=t!==void 0&&n.digest!==No(t).digest;return{...n,changedFromBefore:r}}function gs(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function _s(e,t,n){let r=Io(es(e,n),es(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=Cs(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function vs(e,t,n,r){let i=_s(e,t,r);return{diff:i,...ys(i,t,n,r)}}function ys(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=ts(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!bs(o.get(e),n))?{}:Ss(t,i,r)}function bs(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const xs=new Set([`application`,`window`]);function Ss(e,t,n){let r=ts(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!xs.has(M(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=M(e.type??`Element`),n=j(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function Cs(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function ws(e,t,n){return e.stalled?{hint:ps}:e.settled?t?n<5?{hint:as}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:fs}}async function Ts(e,t,n){if(Me(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function Es(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Ds(e,t,n,r,i){let a=await Os(e,t,n,i);return As({...r,...a})}async function Os(e,t,n,r){if(r.settle!==void 0){let i=await ms(e,t,{...r.settle,resolved:n}),a=r.verify?hs(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ks(e,t,n);return i?{evidence:i}:{}}async function ks(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=No((await K(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==No(r).digest;return{...n,changedFromBefore:i}}catch{return}}function As(e){let t=e;if(t.targetHittable!==!1||!js(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function js(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const Ms=async(e,t)=>{let r=await G(e,t,{action:`focus`,requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=Rs(r),a=W(await e.backend.focus(H(e,t),i));return{...r,...a?{backendResult:a}:{},...C(`Focused (${i.x}, ${i.y})`)}},Ns=async(e,t)=>{let r=Es(t),i=await G(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:ca(t.durationMs,`durationMs`,0,12e4),o=Rs(i),s=W(await e.backend.longPress(H(e,t),o,{durationMs:a}));return await Ds(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...C(`Long pressed (${o.x}, ${o.y})`)},r)},Ps=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=Is(t.direction),i=Vs(t.amount,`scroll amount`),a=Us(t.pixels,`scroll pixels`),o=oa(t.durationMs);aa({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await Fs(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:Rs(s)},l=e.backend.scroll,u=async()=>await l(H(e,t),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),d,f=0;if(r.edge){let n=r.edge,i=Ls(s),a=await da({edge:n,captureState:async r=>await zs(e,t,n,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=W(d),m=sa(p);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:f}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...m===void 0?{}:{durationMs:m},...p?{backendResult:p}:{},...C(fa(r.direction,r.edge,f,i,a))}};async function Fs(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await vo(e,t,`scroll`),{kind:`viewport`}):await G(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function Is(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Bs(e,`scroll direction`)}}function Ls(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function Rs(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function zs(e,t,r,i,a){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await ua({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(H(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function Bs(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new n(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Vs(e,t){return e===void 0?void 0:Hs(e,t)}function Hs(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Us(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const Ws=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function J(e){let t=Ks(e),r=Js(t,`kind`,Ws);if(r===`pan`)return{kind:r,origin:Y(t,`origin`),delta:Y(t,`delta`),pointerCount:B(t,`pointerCount`,{min:1,max:2}),durationMs:Gs(t)};if(t.pointerCount!==void 0)throw new n(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:Js(t,`direction`,Ae),origin:Y(t,`origin`),distance:B(t,`distance`,{min:0})}}if(r===`swipe`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:Js(t,`preset`,je)}}if(r===`pinch`)return{kind:r,scale:X(t,`scale`),origin:qs(t,`origin`)};if(r===`rotate`){if(t.velocity!==void 0)throw new n(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:X(t,`degrees`),origin:qs(t,`origin`)}}return{kind:r,origin:Y(t,`origin`),delta:Y(t,`delta`),scale:X(t,`scale`),degrees:X(t,`degrees`),durationMs:Gs(t)}}function Gs(e){let t=B(e,`durationMs`);if(t!==void 0){if(t<16||t>1e4)throw new n(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${Le}.`);return t}}function Ks(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`gesture requires structured object input`);return e}function Y(e,t){let n=Ks(e[t]);return{x:X(n,`x`),y:X(n,`y`)}}function qs(e,t){return e[t]===void 0?void 0:Y(e,t)}function X(e,t){let r=e[t];if(typeof r!=`number`||!Number.isFinite(r))throw new n(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return r}function Js(e,t,r){let i=e[t];if(typeof i!=`string`||!r.includes(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be one of: ${r.join(`, `)}.`);return i}const Ys={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:Xs}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function Xs(e,t){let[n,r,i,a,o]=e,s=Zs(n,i),c=Zs(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function Zs(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function Qs(e,t){let n=Ys[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!$s(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function $s(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ec(e){if(!(!e||typeof e!=`object`||Array.isArray(e))&&e.durationMs!==void 0)throw new n(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function tc(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function Z(e,t){let r=Qs(e,t);if(r)throw new n(`INVALID_ARGS`,tc(r))}function nc(e,t,n){let r=rc(e,t);return r?tc(r,n):void 0}function rc(e,t){if(e===`swipe`)return Qs(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(Ys,n))return Qs(n,t.slice(1))}function ic(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function ac(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{Z(`gesture pan`,r);let{origin:e,delta:i}=ic(r);return J({kind:n,origin:e,delta:i,pointerCount:t,durationMs:uc(r[4])})}case`fling`:return Z(`gesture fling`,r),J({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:uc(r[3])});case`swipe`:return Z(`gesture swipe`,r),J({kind:n,preset:r[0]});case`pinch`:return Z(`gesture pinch`,r),J({kind:n,scale:Number(r[0]),origin:dc(r[1],r[2])});case`rotate`:return Z(`gesture rotate`,r),J({kind:n,degrees:Number(r[0]),origin:dc(r[1],r[2])});case`transform`:{Z(`gesture transform`,r);let{origin:e,delta:t}=ic(r);return J({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:uc(r[6])})}default:return J({kind:n})}}function oc(e){switch(e.kind){case`pan`:return Q([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return Q([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return Q([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?Q([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return Q([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function sc(e,t={}){return Z(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function cc(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function lc(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function uc(e){return e===void 0?void 0:Number(e)}function dc(e,t){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return e===void 0?void 0:{x:Number(e),y:Number(t)}}function Q(e){return e.filter(e=>e!==void 0).map(String)}const fc=/^e\d+$/;function pc(e){if(e[0]?.startsWith(`@`)){let t=xc(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(fc.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=c(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,yc(e,t));return{selector:t.selectorExpression}}return hc(e)}function mc(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:t,label:e.length>=3?xc(e.slice(1,2)):void 0},text:n}}if(fc.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=c(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:hc(e.slice(0,2)),text:e.slice(2).join(` `)}}function hc(e){let t=e[0]??``,r=m(t);if(r){let i=gc(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,_c({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new n(`INVALID_ARGS`,vc(e))}function gc(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function _c(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${u.join(`, `)}. ${p(t)?`Did you mean role=${t} label=${$(n)}?`:`Did you mean label=${$(n)}?`}`}function vc(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>h(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${$(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function yc(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${bc(e,t)??`text="Sign in"`}.`}function bc(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${$(a)}`;return[...e.slice(0,n-1),o].join(` `)}function $(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function xc(e){return e.join(` `).trim()||void 0}function Sc(e,t){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new n(`INVALID_ARGS`,`viewport ${t} must be a positive integer`);return r}const Cc=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],wc=[`medium`,`high`],Tc=`medium`;function Ec(e){return wc.includes(e)}function Dc(e){let t=typeof e==`number`?e:Oc(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function Oc(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function kc(e){if(Ec(e))return e;let t=Dc(e);if(t!==void 0)return t<=7?`medium`:`high`}export{Wi as $,F as $t,K as A,Je as An,Ci as At,Aa as B,$r as Bt,os as C,it as Cn,bi as Ct,io as D,Ge as Dn,xi as Dt,Lo as E,nt as En,Si as Et,qa as F,Yr as Ft,ua as G,Hr as Gt,U as H,ei as Ht,Xa as I,Jr as It,ca as J,pr as Jt,fa as K,Vr as Kt,Ka as L,Qr as Lt,G as M,Kr as Mt,Ja as N,ii as Nt,Qa as O,We as On,wi as Ot,Ya as P,ri as Pt,oa as Q,Zn as Qt,Ma as R,Zr as Rt,as as S,$e as Sn,li as St,Io as T,rt as Tn,ci as Tt,ka as U,Xr as Ut,W as V,ti as Vt,H as W,Ur as Wt,aa as X,$n as Xt,ia as Y,fr as Yt,sa as Z,Qn as Zt,Ms as _,ut as _n,_i as _t,Sc as a,dn as an,Yi as at,Ds as b,Qe as bn,oi as bt,ec as c,_t as cn,Ji as ct,oc as d,vt as dn,Bi as dt,j as en,Gi as et,cc as f,mt as fn,Ui as ft,J as g,dt as gn,Ei as gt,Ws as h,pt as hn,Di as ht,Cc as i,vn as in,Zi as it,Oo as j,B as jt,vo as k,Ye as kn,Ti as kt,nc as l,bt as ln,na as lt,sc as m,ft as mn,Oi as mt,wc as n,gn as nn,Qi as nt,mc as o,xt as on,$i as ot,lc as p,gt as pn,Hi as pt,da as q,I as qt,kc as r,fn as rn,ta as rt,pc as s,St as sn,ea as st,Tc as t,M as tn,Xi as tt,ac as u,yt as un,Vi as ut,Ns as v,C as vn,si as vt,ts as w,at as wn,vi as wt,Es as x,Ze as xn,yi as xt,Ps as y,lt as yn,gi as yt,Na as z,ni as zt};
|
|
14
|
+
`)}\n`}function mr(e,t){if(e.match===!0)return[`${t?I(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?I(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=P(e.differentPixels),a=P(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?I(o,`red`):o}`]}function hr(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=Or(e.diffPath),i=n?I(`Diff image:`,`dim`):`Diff image:`,a=n?I(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=Or(e.currentOverlayPath),i=n?I(`Current overlay:`,`dim`):`Current overlay:`,a=n?I(t,`green`):t,o=P(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function gr(e,t){let n=P(e.differentPixels),r=P(e.totalPixels);return[` ${t?I(String(n),`red`):String(n)} different / ${r} total pixels`]}function _r(e,t){let n=Cr(e);return n.length===0?[]:[` ${L(`Hints:`,t)}`,...n.map(e=>` - ${e}`)]}function vr(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${L(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...yr(e));return r}function yr(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. ${e.location} x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff, change=${e.dominantChange}`],i=Dr(e);i&&r.push(` ${i}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:``;r.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return r}function br(e,t){let n=e.ocr?.matches??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint`,t)}`];for(let[e,t]of r.entries()){let n=t.delta;i.push(` ${e+1} | ${JSON.stringify(t.text)} | ${N(n.x)},${N(n.y)} | ${N(n.width)},${N(n.height)} | ${Sr(t.baselineRect)} | ${Sr(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?`ocr-bbox-size-change`:`-`}`)}return i}function xr(e,t){let n=e.nonTextDeltas??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | region | slot | kind | bboxCurrent | nearestText`,t)}`];for(let e of r)i.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:`-`} | ${e.slot} | ${e.likelyKind} | ${Sr(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):`-`}`);return i}function Sr(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function N(e){return e>0?`+${e}`:String(e)}function Cr(e){let t=[],n=e.ocr?.movementClusters??[];for(let e of n.slice(0,2))t.push(`text movement cluster: ${Er(e.texts)} dx=${Tr(e.xRange)}px dy=${Tr(e.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>[`icon`,`toggle`,`chevron`].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(wr).join(`; `)}`);let i=(e.nonTextDeltas??[]).filter(e=>e.likelyKind===`separator`).slice(0,2);return i.length>0&&t.push(`non-text boundaries: ${i.map(wr).join(`; `)}`),t.slice(0,6)}function wr(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:``,n=e.regionIndex?` r${e.regionIndex}`:``;return`${e.likelyKind}${t}${n}`}function Tr(e){return e.min===e.max?N(e.min):`${N(e.min)}..${N(e.max)}`}function Er(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),n=e.length>t.length?` +${e.length-t.length} more`:``;return`${t.join(`, `)}${n}`}function Dr(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,typeof e.densityPercentage==`number`?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,typeof e.baselineLuminance==`number`&&typeof e.currentLuminance==`number`?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>e!==null);return t.length>0?t.join(` `):null}function Or(e){let t=process.cwd(),n=He.relative(t,e);return n===``||!n.startsWith(`..`)&&!He.isAbsolute(n)?n===``?`.`:`.${He.sep}${n}`:e}function P(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function kr(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function F(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function I(e,t,n){return Ue(t,e,n)}function L(e,t){return t?I(e,`dim`):e}function Ar(e,t,n,r={nodes:t,filteredCount:0}){let i=Pr(e);if(jr(e)){let e=Nr(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&an(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function jr(e){return!e.snapshotQuality&&!Mr(e)}function Mr(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function Nr(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function Pr(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function Fr(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||Ir(e,n[n.length-1],r));)t.push(...zr(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...zr(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function Ir(e,t,n){return Lr(e.node,t.node,n)?!1:e.depth<=t.depth}function Lr(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function Rr(e){return zn(e,{summarizeTextSurfaces:!0}).flatMap(e=>[Bn(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...zr({...e,depth:0})])}function zr(e,t){let n=Br(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function Br(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function Vr(e,t={}){let n=F(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?R(`✓`,e):`✓`}return e===`fail`?n?R(`⨯`,`red`):`⨯`:e===`warn`?n?R(`!`,`yellow`):`!`:n?R(`-`,`dim`):`-`}function R(e,t){return I(e,t,{validateStream:!1})}function Hr(e){return`${Vr(Wr(e.status))} ${Gr(e)}`}function Ur(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function Wr(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function Gr(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}const Kr=3e5,qr=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Jr(e){return f({tenantId:e.meta?.tenantId??z(e.flags,`tenant`),runId:e.meta?.runId??z(e.flags,`runId`),leaseId:e.meta?.leaseId??z(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??z(e.flags,`leaseProvider`)??z(e.flags,`provider`),deviceKey:e.meta?.deviceKey??z(e.flags,`deviceKey`),clientId:e.meta?.clientId??z(e.flags,`clientId`)})}function Yr(e){return f({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function Xr(e){return f({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Zr(e){return f({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Qr(e){return f({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function $r(e){return ai(e)}function ei(e){let{ttlMs:t,...n}=ai(e);return n}function ti(e,t,n){let r=f({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...f({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...f({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...f({leaseId:e.leaseId})}}}function ni(e){let t=f({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function ri(e){return e.leaseProvider===`proxy`}function ii(e){return ri(e)?qr.filter(t=>!e[t]):[]}function ai(e){return f({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function z(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function B(e,t,r={}){let i=e[t];if(i===void 0)return;if(!Number.isInteger(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new n(`INVALID_ARGS`,`Expected ${t} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new n(`INVALID_ARGS`,`Expected ${t} to be at most ${r.max}.`);return a}const oi=[`metrics`,`frames`,`memory`,`cpu`,`trace`],si=[`sample`,`snapshot`,`start`,`stop`,`report`],ci=[`profile`],li=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],ui=[`android-hprof`,`memgraph`],di=y(oi),fi=y(si),pi=y(ci),mi=y(li),hi=y(ui),gi=`perf area must be metrics, frames, memory, cpu, or trace`,_i=`perf action must be sample, snapshot, start, stop, or report`,vi=`perf cpu requires profile`,yi=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,bi=`perf memory snapshot --kind must be android-hprof or memgraph`,xi=di.is,Si=fi.is,Ci=pi.is,wi=mi.is,Ti=hi.is,Ei=1e4,Di=2e3,Oi=[`get`,`accept`,`dismiss`,`wait`],ki=`<wifi|airplane|location> <on|off>`,Ai=`location set <lat> <lon>`,ji=`animations <on|off>`,Mi=`appearance <light|dark|toggle>`,Ni=`faceid <match|nonmatch|enroll|unenroll>`,Pi=`touchid <match|nonmatch|enroll|unenroll>`,Fi=`fingerprint <match|nonmatch>`,Ii=`clear-app-state [app-id]`,Li=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Ri=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,zi=`macOS supports only settings ${Mi} and settings ${Ri}. wifi|airplane|location|animations remain unsupported on macOS.`,Bi=[`settings ${ki}`,`settings ${Ai}`,`settings ${ji}`,`settings ${Mi}`,`settings ${Ni}`,`settings ${Pi}`,`settings ${Fi}`,`settings ${Ii}`,`settings ${Li}`,`settings ${Ri}`].join(` | `),Vi=`settings requires ${ki}, ${Ai}, ${ji}, ${Mi}, ${Ni}, ${Pi}, ${Fi}, ${Ii}, ${Li}, or ${Ri}`;function Hi(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function Ui(e){return`Unsupported macOS setting: ${e}. ${zi}`}function Wi(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function Gi(e,t,n){return{deviceId:t,deviceName:n,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function Ki(e,t={}){let n=t.includeSerial??!0,r=qi(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function qi(e){return g(e.platform)?e.identifiers.serial??e.id:void 0}function Ji(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...Ki(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function Yi(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Xi(e){return e.bundleId??e.package??e.app}function Zi(e){return w({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${Xi(e)}`)}function Qi(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function $i(e){return w({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${Qi(e)}`)}function ea(e){let t=e.appName??e.appBundleId??e.session;return w({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?Ki(e.device):{}},t?`Opened: ${t}`:`Opened`)}function ta(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...C(e.session?`Closed: ${e.session}`:`Closed`)}}function na(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...Fe(ra(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function ra(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const ia=1e4;function aa(e,t=`scroll accepts either a relative amount or --pixels, not both`){if(e.amount!==void 0&&e.pixels!==void 0)throw new n(`INVALID_ARGS`,t)}function oa(e,t={}){if(e===void 0)return;let r=t.field??`scroll durationMs`,i=t.max??1e4,a=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new n(`INVALID_ARGS`,a);if(e>i)throw new n(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return e}function sa(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}function ca(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function la(e,t,n={}){let r=ma(e);if(r.length===0)return{canScroll:!1,emptySnapshot:!0};let i=ne(r),a=ha(r,i,t,n);return a?{canScroll:_a(a,i.get(a.index),t),emptySnapshot:!1,scope:va(a,r)}:{canScroll:!1,emptySnapshot:!1}}async function ua(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=la(await i(r),t,n);return r&&e.emptySnapshot?await ua({edge:t,target:n,captureNodes:i}):e}catch(e){throw pa(t,r,e)}}async function da(e){let{edge:t,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new n(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function fa(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function pa(e,t,r){return t?new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},r)}function ma(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function ha(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>le(e)&&wa(e.rect));if(a.length===0)return null;let o=ga(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Ca(e.rect,s)).sort(xa);if(e.length>0)return e.find(e=>_a(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>_a(e,t.get(e.index),n)).sort(Sa);return c.length>0?c[0]??null:a.filter(t=>ie(t,e)).sort(Sa)[0]??a.sort(Sa)[0]??null}function ga(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(le(n)&&wa(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function _a(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function va(e,t){return[e.identifier,e.label].filter(e=>typeof e==`string`).map(e=>e.trim()).find(n=>ba(n)&&ya(n,e,t))}function ya(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function ba(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function xa(e,t){return V(e.rect)-V(t.rect)}function Sa(e,t){return V(t.rect)-V(e.rect)}function V(e){return e?e.width*e.height:0}function Ca(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function wa(e){return!!(e&&e.width>0&&e.height>0)}function H(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function U(e){return e.clock?.now()??Date.now()}async function Ta(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Ea(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function W(e){return e&&typeof e==`object`?e:void 0}const Da=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function Oa(e,t){return ka(e,t).node}function ka(e,t){if(x(t))return{node:t,reason:`covered`};let n=Aa(e,t);if(n?.rect&&S(n.rect))return{node:n,reason:`same-rect-descendant`};if(ja(t)&&t.rect&&S(t.rect))return{node:t,reason:`semantic-target`};let r=ae(e,t);return r?.rect&&!x(r)&&S(r.rect)?Na(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function Aa(e,t){let n=b(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||x(e))return!1;let t=b(e.rect);return t?ze(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function ja(e){return[e.type,e.role,e.subrole].map(e=>_(e??``)).some(Ma)}function Ma(e){return e===`tab`||Da.some(t=>e.includes(t))}function Na(e,t,n){let r=b(e.rect),i=b(t.rect);if(!r||!i)return!1;let a=Pa(n,r);return!a||!Fa(i,a)?!1:!ze(r,i)}function Pa(e,t){let n=s(t),r=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>b(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>ue(e,n.x,n.y));return oe(i.length>0?i:r)}function Fa(e,t){let n=Pe(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Ia(e){return e.hittable===!0||ja(e)}function La(e,t){let n=de(v(e),t);return n.id!==void 0||n.label!==void 0?!1:ye(e.value)===null}function Ra(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function za(e,t){let n=Re(t);return t.filter(t=>t.index!==e.index&&Ra(t,e,n)).sort((e,t)=>e.index-t.index)}function Ba(e,t){let n=S(e.rect);return!n||!t.rect?!1:ue(t.rect,n.x,n.y)}function Va(e,t){if(!La(e,t))return e;let n=za(e,t);if(n.some(Ia))return e;let r=n.find(e=>v(e).label!==void 0);return!r||!Ba(r,e)?e:r}function Ha(e){return e===`text`||e===`label`||e===`any`}async function Ua(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function Wa(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=await i(H(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:U(e)};return r.updateSession&&o&&!Me(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function Ga(e,t,n){if(e.backend.readText){let r=await e.backend.readText(H(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return be(n)}function Ka(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=r(e,a)??(i.fallbackLabel.length>0?te(e,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:s}}function qa(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Ja(e,t,r,i){if(!r)return;let a=v(e),o=pe(e,t);if(!(xe(a,r.identity)&&Oe(o,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:we,observed:a,observedStructural:o,expected:r.identity,expectedStructural:r.structural})}async function G(e,t,n){return await mo(e,t,n.action),t.target.kind===`point`?await Xa(e,t,t.target,n):t.target.kind===`ref`?await Qa(e,t,t.target,n):await $a(e,t,t.target,n)}async function Ya(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=ee(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!ue(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Xa(e,t,n,r){let i=await Ya(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Za(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function Za(e,t){try{return(await K(e,t,!0)).snapshot.nodes}catch{return}}async function Qa(e,t,n,r){let i=await go(e,t,n),a=i.resolved;Ja(a.node,i.snapshot.nodes,r.expectedResolvedTarget,r.action);let o=r.promoteToHittableAncestor?lo(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;return uo(o,`Ref ${n.ref}`,r.action),So(o,i.snapshot.nodes,n.ref,r.action),{kind:`ref`,point:yo(o,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...ao(e,o,i.snapshot.nodes,r.action,a.resolution)}}async function $a(e,t,r,i){let a=d(r.selector),o=await K(e,t,i.requireInteractive),s=_e(co(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await K(e,t,!1),s=_e(co(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!s||!s.node.rect){let t=_e(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&x(t.node)?fo({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,Se(a,s?.diagnostics??[],{unique:!0}),{hint:ge(s?.diagnostics??[])})}Ja(s.node,o.snapshot.nodes,i.expectedResolvedTarget,i.action);let c=i.promoteToHittableAncestor?lo(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector.raw}`}):s.node;return uo(c,`Selector ${s.selector.raw}`,i.action),xo(c,o.snapshot.nodes,s.selector.raw,i.action),{kind:`selector`,point:yo(c,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector.raw},...ao(e,c,o.snapshot.nodes,i.action,ro(s,o.snapshot.nodes))}}const eo={source:`ref`,phase:`pre-action`,kind:`exact`},to={source:`ref`,phase:`pre-action`,kind:`label-fallback`},no={source:`runtime`,phase:`pre-action`,kind:`unique`};function ro(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:io(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>io(e,t))}:no}function io(e,t){let n=_(e.type??``),r=ke(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:qa(n,256)}:{},...r===void 0?{}:{label:qa(r,256)}}}function ao(e,t,n,r,i){return{node:t,selectorChain:Ee(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:ke(t,n),...so(t,r),preActionNodes:n,resolution:i,...oo(e,t,n,r)}}function oo(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Va(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Ee(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:ke(i,n)}}}function so(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function co(e){return e.filter(e=>!x(e))}function lo(e,t,n){let r=ka(e,t);if(r.reason===`covered`)throw fo({label:n.label,node:t,action:n.action});return r.node}function uo(e,t,n){if(x(e))throw fo({label:t,node:e,action:n})}function fo(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${po(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function po(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;default:return`be tapped`}}async function K(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(H(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:U(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function mo(e,t,r){if(e.backend.platform!==`macos`)return;let i=await ho(e,t);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function ho(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function go(e,t,r){let{session:i,snapshot:a}=await Ua(e,t.session),o=r.fallbackLabel??``,s=vo(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:me});return _o({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function _o(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=vo(o.nodes,r.ref,{fallbackLabel:i});return s&&xe(v(a.node),v(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function vo(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(bo(s))return{ref:a,node:s,resolution:eo};let c=i.fallbackLabel.length>0?te(e,i.fallbackLabel):null;return bo(c)?{ref:a,node:c,resolution:to}:null}function yo(e,t){let r=S(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function bo(e){return e?S(e.rect)!==null:!1}function xo(e,t,n,r){To(e,t,{message:`Selector ${n} resolved to an off-screen element and is not safe to ${r}`,details:{reason:`offscreen_selector`,selector:n},hint:e=>`${Co(e)} in small steps, retrying ${r} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}function So(e,t,n,r){To(e,t,{message:`Ref ${n} is off-screen and not safe to ${r}`,details:{reason:`offscreen_ref`,ref:o(n)},hint:e=>`${Co(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${r} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Co(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function wo(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=vo(i,n.ref,{fallbackLabel:n.fallbackLabel??``});return a?(uo(a.node,`Ref ${n.ref}`,r),So(a.node,i,n.ref,r),{...so(a.node,r),node:a.node,preActionNodes:i}):{}}function To(e,t,r){let i=e.rect?re(e,t):null;if(!e.rect||!i||Ce(e,t))return;let a=ce(e,t);throw new n(`COMMAND_FAILED`,r.message,{...r.details,rect:e.rect,viewport:i,...a?{scrollDirection:a}:{},hint:r.hint(a)})}function Eo(e){let t=Buffer.alloc(16);for(let n of e)Oo(t,Do(n));return{digest:`ax1:${Ve(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Do(e){return Ve(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Oo(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function q(e){let{digest:t,nodeCount:n}=Eo(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=ko(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function ko(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function Ao(e,t){let n=M(e.type??`Element`),r=j(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o].join(`|`)}function jo(e,t,n={}){let r=Po(No(e,n),No(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Mo(e,t={}){return No(e,t).length}function No(e,t){return t.flatten?e.map(e=>({text:Bn(e,0,!1),comparable:Ao(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):zn(e).map(e=>({text:e.text,comparable:Ao(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Po(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Io(a,i,s)?J(a,i+1):J(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return Fo(o,e,t,n,r)}}return[]}function Fo(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Io(i,c,r)?c+1:c-1,u=J(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Io(e,t,n){return t===-n||t!==n&&J(e,t-1)<J(e,t+1)}function J(e,t){return e.get(t)??0}const Lo=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Ro={strippedIndexes:new Set,refs:new Set};function zo(e){let t=new Set(e.filter(e=>_(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Ro;let n=new Map(e.map(e=>[e.index,e])),r=Wo(e,n,t),i=new Set(r),a=Zo(e,n,r);for(let t of Wo(e,n,a))i.add(t);for(let o of Bo(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Bo(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Ho(t,n,r);if(o.size===0)return a;let s=Uo(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Vo(n,t,o)&&a.add(n.index);return a}function Vo(e,t,n){if(!e.rect)return!1;let r=Qo(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function Ho(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=Qo(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Uo(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Wo(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)$o(i,t,n)&&r.add(i.index);return r}function Go(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ie(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ne(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ko(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Be(e)).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:qo(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Ro:{strippedIndexes:o,refs:s}}function qo(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Go(e,t)).map(e=>e.index))}function Jo(e,t){let n=zo(e),r=Ko(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Yo(e,t){let{strippedIndexes:n}=Jo(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Xo(e,t){return Jo(e,t).refs}function Zo(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||_(n.type??``)!==`keyboard`)continue;let i=Qo(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Lo.has(_(e.type??``))&&!n.has(e.index)&&$o(e,t,a))&&r.delete(i)}return r}function Qo(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(_(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function $o(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const es=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function ts(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=U(e),o=a+i,s=!1,c=Math.min(300,Math.max(25,r)),l=0,u,d=0,f,p=a;for(;U(e)<o;){let m=await is(e,t,o-U(e));if(!m)return{settled:!1,stalled:!0,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f};l+=1,f=m;let h=as(m.snapshot.nodes),g=U(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&ns(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=rs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await Ta(e,t);continue}if(h!==u)u=h,d=m.snapshot.nodes.length,p=g;else if(l>=2&&g-p>=r)return{settled:!0,stalled:!1,waitedMs:g-a,captures:l,nodeCount:d,lastCapture:f};let ee=rs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(ee<=0)break;await Ta(e,ee)}return{settled:!1,stalled:!1,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f}}function ns(e){return e?.state===`recovered`&&e.backend===`private-ax`}function rs(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function is(e,t,n){let r=Wa(e,t,{updateSession:!1,interactiveOnly:!0}),i;try{let e=await Promise.race([r,new Promise(e=>{i=setTimeout(()=>e(void 0),n)})]);return e===void 0&&r.catch(()=>{}),e}finally{i!==void 0&&clearTimeout(i)}}function as(e){return e.map(os).join(`|`)}function os(e){let t=e.rect?`${Math.round(e.rect.x)},${Math.round(e.rect.y)},${Math.round(e.rect.width)},${Math.round(e.rect.height)}`:``;return`${e.type??``}#${e.label??``}#${e.identifier??``}#${t}`}const ss=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,cs=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function ls(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{let o=await ts(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?cs:ss}};let{stored:c,session:l}=await bs(e,t,o.lastCapture),u=o.lastCapture.snapshot.nodes;return{observation:{...s,...o.settled&&c?ps(ds(n.resolved),u,n.resolved.point,l?.appBundleId):{},...ys(o,c,u.length)},settledNodes:u}}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}function us(e,t){if(!e)return;let n=q(e),r=t!==void 0&&n.digest!==q(t).digest;return{...n,changedFromBefore:r}}function ds(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function fs(e,t,n){let r=jo(Yo(e,n),Yo(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=vs(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function ps(e,t,n,r){let i=fs(e,t,r);return{diff:i,...ms(i,t,n,r)}}function ms(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Xo(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!hs(o.get(e),n))?{}:_s(t,i,r)}function hs(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const gs=new Set([`application`,`window`]);function _s(e,t,n){let r=Xo(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!gs.has(M(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=M(e.type??`Element`),n=j(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function vs(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function ys(e,t,n){return e.stalled?{hint:cs}:e.settled?t?n<5?{hint:es}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:ss}}async function bs(e,t,n){if(Me(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function xs(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Ss(e,t,n,r,i){let a=await Cs(e,t,n,i);return Ts({...r,...a})}async function Cs(e,t,n,r){if(r.settle!==void 0){let i=await ls(e,t,{...r.settle,resolved:n}),a=r.verify?us(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ws(e,t,n);return i?{evidence:i}:{}}async function ws(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=q((await K(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==q(r).digest;return{...n,changedFromBefore:i}}catch{return}}function Ts(e){let t=e;if(t.targetHittable!==!1||!Es(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Es(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const Ds=async(e,t)=>{let r=await G(e,t,{action:`focus`,requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=Ns(r),a=W(await e.backend.focus(H(e,t),i));return{...r,...a?{backendResult:a}:{},...C(`Focused (${i.x}, ${i.y})`)}},Os=async(e,t)=>{let r=xs(t),i=await G(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:ca(t.durationMs,`durationMs`,0,12e4),o=Ns(i),s=W(await e.backend.longPress(H(e,t),o,{durationMs:a}));return await Ss(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...C(`Long pressed (${o.x}, ${o.y})`)},r)},ks=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=js(t.direction),i=Is(t.amount,`scroll amount`),a=Rs(t.pixels,`scroll pixels`),o=oa(t.durationMs);aa({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await As(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:Ns(s)},l=e.backend.scroll,u=async()=>await l(H(e,t),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),d,f=0;if(r.edge){let n=r.edge,i=Ms(s),a=await da({edge:n,captureState:async r=>await Ps(e,t,n,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=W(d),m=sa(p);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:f}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...m===void 0?{}:{durationMs:m},...p?{backendResult:p}:{},...C(fa(r.direction,r.edge,f,i,a))}};async function As(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await mo(e,t,`scroll`),{kind:`viewport`}):await G(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function js(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Fs(e,`scroll direction`)}}function Ms(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function Ns(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ps(e,t,r,i,a){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await ua({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(H(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function Fs(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new n(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Is(e,t){return e===void 0?void 0:Ls(e,t)}function Ls(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Rs(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const zs=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function Y(e){let t=Vs(e),r=Us(t,`kind`,zs);if(r===`pan`)return{kind:r,origin:X(t,`origin`),delta:X(t,`delta`),pointerCount:B(t,`pointerCount`,{min:1,max:2}),durationMs:Bs(t)};if(t.pointerCount!==void 0)throw new n(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:Us(t,`direction`,Ae),origin:X(t,`origin`),distance:B(t,`distance`,{min:0})}}if(r===`swipe`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:Us(t,`preset`,je)}}if(r===`pinch`)return{kind:r,scale:Z(t,`scale`),origin:Hs(t,`origin`)};if(r===`rotate`){if(t.velocity!==void 0)throw new n(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:Z(t,`degrees`),origin:Hs(t,`origin`)}}return{kind:r,origin:X(t,`origin`),delta:X(t,`delta`),scale:Z(t,`scale`),degrees:Z(t,`degrees`),durationMs:Bs(t)}}function Bs(e){let t=B(e,`durationMs`);if(t!==void 0){if(t<16||t>1e4)throw new n(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${Le}.`);return t}}function Vs(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`gesture requires structured object input`);return e}function X(e,t){let n=Vs(e[t]);return{x:Z(n,`x`),y:Z(n,`y`)}}function Hs(e,t){return e[t]===void 0?void 0:X(e,t)}function Z(e,t){let r=e[t];if(typeof r!=`number`||!Number.isFinite(r))throw new n(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return r}function Us(e,t,r){let i=e[t];if(typeof i!=`string`||!r.includes(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be one of: ${r.join(`, `)}.`);return i}const Ws={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:Gs}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function Gs(e,t){let[n,r,i,a,o]=e,s=Ks(n,i),c=Ks(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function Ks(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function qs(e,t){let n=Ws[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!Js(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function Js(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function Ys(e){if(!(!e||typeof e!=`object`||Array.isArray(e))&&e.durationMs!==void 0)throw new n(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function Xs(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function Q(e,t){let r=qs(e,t);if(r)throw new n(`INVALID_ARGS`,Xs(r))}function Zs(e,t,n){let r=Qs(e,t);return r?Xs(r,n):void 0}function Qs(e,t){if(e===`swipe`)return qs(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(Ws,n))return qs(n,t.slice(1))}function $s(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function ec(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{Q(`gesture pan`,r);let{origin:e,delta:i}=$s(r);return Y({kind:n,origin:e,delta:i,pointerCount:t,durationMs:ac(r[4])})}case`fling`:return Q(`gesture fling`,r),Y({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:ac(r[3])});case`swipe`:return Q(`gesture swipe`,r),Y({kind:n,preset:r[0]});case`pinch`:return Q(`gesture pinch`,r),Y({kind:n,scale:Number(r[0]),origin:oc(r[1],r[2])});case`rotate`:return Q(`gesture rotate`,r),Y({kind:n,degrees:Number(r[0]),origin:oc(r[1],r[2])});case`transform`:{Q(`gesture transform`,r);let{origin:e,delta:t}=$s(r);return Y({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:ac(r[6])})}default:return Y({kind:n})}}function tc(e){switch(e.kind){case`pan`:return $([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return $([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return $([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?$([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return $([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function nc(e,t={}){return Q(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function rc(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function ic(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function ac(e){return e===void 0?void 0:Number(e)}function oc(e,t){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return e===void 0?void 0:{x:Number(e),y:Number(t)}}function $(e){return e.filter(e=>e!==void 0).map(String)}const sc=/^e\d+$/;function cc(e){if(e[0]?.startsWith(`@`)){let t=_c(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(sc.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=c(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,mc(e,t));return{selector:t.selectorExpression}}return uc(e)}function lc(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:t,label:e.length>=3?_c(e.slice(1,2)):void 0},text:n}}if(sc.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=c(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:uc(e.slice(0,2)),text:e.slice(2).join(` `)}}function uc(e){let t=e[0]??``,r=m(t);if(r){let i=dc(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,fc({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new n(`INVALID_ARGS`,pc(e))}function dc(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function fc(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${u.join(`, `)}. ${p(t)?`Did you mean role=${t} label=${gc(n)}?`:`Did you mean label=${gc(n)}?`}`}function pc(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>h(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${gc(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function mc(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${hc(e,t)??`text="Sign in"`}.`}function hc(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${gc(a)}`;return[...e.slice(0,n-1),o].join(` `)}function gc(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function _c(e){return e.join(` `).trim()||void 0}function vc(e,t){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new n(`INVALID_ARGS`,`viewport ${t} must be a positive integer`);return r}const yc=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],bc=[`medium`,`high`],xc=`medium`;function Sc(e){return bc.includes(e)}function Cc(e){let t=typeof e==`number`?e:wc(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function wc(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function Tc(e){if(Sc(e))return e;let t=Cc(e);if(t!==void 0)return t<=7?`medium`:`high`}export{Wi as $,F as $t,K as A,Je as An,Ci as At,Ea as B,$r as Bt,ts as C,it as Cn,bi as Ct,eo as D,Ge as Dn,xi as Dt,Mo as E,nt as En,Si as Et,Ua as F,Yr as Ft,ua as G,Hr as Gt,U as H,ei as Ht,Ka as I,Jr as It,ca as J,pr as Jt,fa as K,Vr as Kt,Ha as L,Qr as Lt,G as M,Kr as Mt,Wa as N,ii as Nt,Ja as O,We as On,wi as Ot,Ga as P,ri as Pt,oa as Q,Zn as Qt,Oa as R,Zr as Rt,es as S,$e as Sn,li as St,jo as T,rt as Tn,ci as Tt,Ta as U,Xr as Ut,W as V,ti as Vt,H as W,Ur as Wt,aa as X,$n as Xt,ia as Y,fr as Yt,sa as Z,Qn as Zt,Ds as _,lt as _n,_i as _t,vc as a,dn as an,Yi as at,Ss as b,Qe as bn,oi as bt,Ys as c,gt as cn,Ji as ct,tc as d,_t as dn,Bi as dt,j as en,Gi as et,rc as f,pt as fn,Ui as ft,Y as g,ut as gn,Ei as gt,zs as h,ft as hn,Di as ht,yc as i,vn as in,Zi as it,wo as j,B as jt,mo as k,Ye as kn,Ti as kt,Zs as l,yt as ln,na as lt,nc as m,dt as mn,Oi as mt,bc as n,gn as nn,Qi as nt,lc as o,bt as on,$i as ot,ic as p,ht as pn,Hi as pt,da as q,I as qt,Tc as r,fn as rn,ta as rt,cc as s,xt as sn,ea as st,xc as t,M as tn,Xi as tt,ec as u,vt as un,Vi as ut,Os as v,C as vn,si as vt,Xo as w,at as wn,vi as wt,xs as x,Ze as xn,yi as xt,ks as y,w as yn,gi as yt,ka as z,ni as zt};
|
package/dist/src/runtime2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{p as n,v as r}from"./sdk-android-adb.js";import{n as i}from"./version.js";import{t as a}from"./timeouts.js";import{l as o}from"./install-artifact.js";import{i as s,n as c,r as l,t as u}from"./device.js";import{n as d}from"./android.js";import f from"node:fs";import p from"node:os";import m from"node:path";import h from"@limrun/api";import{createInstanceClient as g}from"@limrun/api/instance-client";import{createInstanceClient as _}from"@limrun/api/ios-client";function v(e){return e?.trim()||void 0}async function y(e){let t=await g({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),n={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:t},r={exec:async(e,t)=>await T(n,e,t),text:async e=>{await t.setText(e.target,e.text)}},{createAndroidPortReverseManager:i}=await import(`./sdk-android-adb.js`).then(e=>e.t);return r.reverse=i(r),Object.assign(n,{adbProvider:r})}function b(e){return d(e.device,e.adbProvider)}async function x(e,t,n,r){let i=v(r?.packageNameHint);r?.relaunch&&i&&await T(t,[`shell`,`am`,`force-stop`,i],{allowFailure:!0});let a=await e.assets.getOrUpload({path:n,name:j(i,n)});await t.client.sendAsset(a.signedDownloadUrl);let o=i?(await import(`./app-lifecycle.js`).then(e=>e.t)).inferAndroidAppName(i):void 0;return{...i?{packageName:i,launchTarget:i}:{},...o?{appName:o}:{}}}async function S(e,t){await e.adbProvider.reverse?.ensure({local:A(t.devicePort),remote:A(t.hostPort),ownerId:t.name})}async function C(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await w(e),await r(`adb`,[`disconnect`,t],{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function w(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function T(e,t,n){let{adbArgs:r,result:i}=await E(e,t,n);return await D(r,i,n?.allowFailure)}async function E(e,t,n){let i=[`-s`,await O(e),...t];return{adbArgs:i,result:await r(`adb`,i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function D(e,t,n){if(t.exitCode!==0&&n!==!0){let{androidAdbResultError:n}=await import(`./sdk-android-adb.js`).then(e=>e.t);throw n(`Limrun Android ADB command failed`,t,{command:[`adb`,...e].join(` `)})}return t}async function O(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??k(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function k(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function A(e){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${e}`);return`tcp:${e}`}function j(e,t){let n=m.extname(t)||`.apk`;return`${e?.replace(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}function M(e){let t=Array.isArray(e)?e:[e],n=[],r=(e,t,i)=>{let a=n.length;n.push(N(e,{index:a,depth:t,parentIndex:i}));for(let n of ee(e))r(n,t+1,a)};for(let e of t)r(e,0);return n}function N(e,t){return{index:t.index,type:P(e),role:F(e),label:I(e),value:L(e),identifier:R(e),rect:z(e),enabled:e.enabled,selected:e.selected,hittable:e.hittable,depth:t.depth,parentIndex:t.parentIndex}}function P(e){return e.elementType??e.type}function F(e){return e.role??P(e)}function I(e){return e.label??e.AXLabel??void 0}function L(e){return e.value??e.AXValue??void 0}function R(e){return e.identifier??e.AXUniqueId??void 0}function z(e){let t=e.rect??e.frame;if(!(!t||typeof t.x!=`number`||typeof t.y!=`number`||typeof t.width!=`number`||typeof t.height!=`number`))return{x:t.x,y:t.y,width:t.width,height:t.height}}function ee(e){return e.children??e.nodes??e.elements??[]}function B(e){return e.key===`id`?{accessibilityId:e.value}:e.key===`value`?{value:e.value}:{label:e.value}}async function V(e,t){f.mkdirSync(m.dirname(e),{recursive:!0}),await f.promises.writeFile(e,Buffer.from(t,`base64`))}async function H(e){let t=await _({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:t}}async function U(e,t,n,r){let i=await K(n);try{let n=await e.assets.getOrUpload({path:i.uploadPath,name:i.assetName}),a=v((await t.client.installApp(n.signedDownloadUrl,{md5:n.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`})).bundleId)??r?.appIdentifierHint;return{...a?{bundleId:a,launchTarget:a}:{},...i.appName?{appName:i.appName}:{}}}finally{await i.cleanup()}}function W(e){return new G(e)}var G=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.session.client.launchApp(await q(e)),await this.session.client.openUrl(t.url);return}if(o(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await q(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await q(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(B(e))}async doubleTap(e,t){await this.tap(e,t),await this.tap(e,t)}async longPress(){throw X(`longpress`,`Limrun iOS direct sessions do not expose long press yet.`)}async focus(e,t){await this.tap(e,t)}async type(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n),await a(t);return}await this.session.client.typeText(e)}async fill(e,t,n){await this.tap(e,t),await this.session.client.typeText(n)}async fillElementSelector(e,t){await this.session.client.setElementValue(t,B(e))}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){await V(e,(await this.session.client.screenshot()).base64)}async snapshot(e){let t=await this.session.client.elementTree();return{nodes:M(JSON.parse(t)),backend:`xctest`}}async back(){await this.session.client.pressKey(`escape`)}async home(){throw X(`home`,`Limrun iOS direct sessions do not expose home yet.`)}async setOrientation(e){if(e===`portrait-upside-down`)throw X(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async performGesture(){throw X(`gesture`,`Limrun iOS direct sessions do not expose portable gesture execution yet.`)}async appSwitcher(){throw X(`app-switcher`,`Limrun iOS direct sessions do not expose app switcher yet.`)}async tvRemote(){throw X(`tv-remote`,`Limrun iOS direct sessions do not expose tv remote control.`)}async readClipboard(){throw X(`clipboard`,`Limrun iOS direct sessions do not expose clipboard read yet.`)}async writeClipboard(){throw X(`clipboard`,`Limrun iOS direct sessions do not expose clipboard write yet.`)}async setSetting(){throw X(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function K(e){if(!(await f.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:m.basename(e),appName:J(e),cleanup:async()=>{}};let i=await f.promises.mkdtemp(m.join(p.tmpdir(),`agent-device-limrun-ios-app-`)),a=m.join(i,`${m.basename(e)}.zip`),o=await r(`zip`,[`-qr`,a,m.basename(e)],{cwd:m.dirname(e),timeoutMs:12e4});if(o.exitCode!==0)throw await f.promises.rm(i,{recursive:!0,force:!0}),new t(`COMMAND_FAILED`,`Failed to package iOS .app for Limrun install`,{command:[`zip`,`-qr`,a,m.basename(e)].join(` `),...n(o)});return{uploadPath:a,assetName:m.basename(a),appName:await Y(e),cleanup:async()=>{await f.promises.rm(i,{recursive:!0,force:!0})}}}async function q(e){let{resolveIosAppAlias:t}=await import(`./app-resolution.js`).then(e=>e.t);return t(e)}function J(e){return m.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}async function Y(e){let{readIosBundleInfo:t}=await import(`./install-artifact2.js`).then(e=>e.t);return(await t(e)).appName??J(e)}function X(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}var Z=e({LimrunRuntime:()=>$});const Q=`agent-device-cli`;var $=class{limrun;sessions=new Map;options;provider=u;leaseLifecycle={allocate:async e=>await this.allocate(e),release:async e=>await this.release(e)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!s(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e){this.options=e,this.limrun=new h({apiKey:e.apiKey,defaultHeaders:{"x-agent-device-client":Q,"x-agent-device-version":i()}})}ownsDevice(e){return l(e.id)!==void 0}getInteractor(e){let t=this.getSessionForDevice(e);if(t)return t.platform===`ios`?W(t):b(t)}async installApp(e,t,n,r){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t})}async installInstallablePath(e,t,n){let r=this.getSessionForDevice(e);if(r)return r.platform===`ios`?await U(this.limrun,r,t,n):await x(this.limrun,r,t,n)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await S(t,e),te(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear()}async allocate(e){if(e.leaseProvider!==this.provider)return;let t=s(e.backend);if(!t)return;let n=this.sessions.get(e.leaseId);if(n)return{limrunInstanceId:n.instanceId,device:n.device};let r=t===`ios`?await this.createIosSession(e):await this.createAndroidSession(e);return this.sessions.set(e.leaseId,r),{limrunInstanceId:r.instanceId,device:r.device}}async createIosSession(e){let n=await this.limrun.iosInstances.create({wait:!0,metadata:this.buildInstanceMetadata(e),spec:this.options.region?{region:this.options.region}:{}});try{if(!n.status.apiUrl)throw new t(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await H({lease:e,instanceId:n.metadata.id,device:c(`ios`,e,n.metadata.id),apiUrl:n.status.apiUrl,token:n.status.token})}catch(e){throw await this.limrun.iosInstances.delete(n.metadata.id).catch(()=>{}),e}}async createAndroidSession(e){let n=await this.limrun.androidInstances.create({wait:!0,metadata:this.buildInstanceMetadata(e),spec:this.options.region?{region:this.options.region}:{}});try{if(!n.status.apiUrl||!n.status.adbWebSocketUrl)throw new t(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await y({lease:e,instanceId:n.metadata.id,device:c(`android`,e,n.metadata.id),apiUrl:n.status.apiUrl,adbUrl:n.status.adbWebSocketUrl,token:n.status.token})}catch(e){throw await this.limrun.androidInstances.delete(n.metadata.id).catch(()=>{}),e}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:Q}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=s(e.backend);if(!t)return;let n=`provider=${u},leaseId=${e.leaseId}`,r=(t===`ios`?await this.limrun.iosInstances.list({labelSelector:n}):await this.limrun.androidInstances.list({labelSelector:n})).getPaginatedItems().map(e=>e.metadata.id);for(let e of r)t===`ios`?await this.limrun.iosInstances.delete(e):await this.limrun.androidInstances.delete(e);if(r.length!==0)return{limrunInstanceId:r[0],limrunInstanceCount:r.length}}async terminateSession(e){if(e.client.disconnect(),e.platform===`ios`){await this.limrun.iosInstances.delete(e.instanceId);return}await C(e),await this.limrun.androidInstances.delete(e.instanceId)}getSessionForDevice(e){let t=l(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw ne(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};function te(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function ne(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}export{Z as n,$ as t};
|
|
1
|
+
import{t as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{p as n,v as r}from"./sdk-android-adb.js";import{n as i}from"./version.js";import{t as a}from"./timeouts.js";import{r as o}from"./sdk-app-inventory.js";import{l as s}from"./install-artifact.js";import{i as c,n as l,r as u,t as d}from"./device.js";import{n as f}from"./android.js";import p from"node:fs";import m from"node:os";import h from"node:path";import ee from"@limrun/api";import{createInstanceClient as g}from"@limrun/api/instance-client";import{createInstanceClient as _}from"@limrun/api/ios-client";function v(e){return e?.trim()||void 0}async function te(e){let t=await g({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),n={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:t},r={exec:async(e,t)=>await S(n,e,t),text:async e=>{await t.setText(e.target,e.text)}},{createAndroidPortReverseManager:i}=await import(`./sdk-android-adb.js`).then(e=>e.t);return r.reverse=i(r),Object.assign(n,{adbProvider:r})}function y(e){return f(e.device,e.adbProvider)}async function b(e,t,n,r){let i=v(r?.packageNameHint);r?.relaunch&&i&&await S(t,[`shell`,`am`,`force-stop`,i],{allowFailure:!0});let a=await e.assets.getOrUpload({path:n,name:T(i,n)});await t.client.sendAsset(a.signedDownloadUrl);let o=i?(await import(`./app-lifecycle.js`).then(e=>e.t)).inferAndroidAppName(i):void 0;return{...i?{packageName:i,launchTarget:i}:{},...o?{appName:o}:{}}}async function x(e,t){await e.adbProvider.reverse?.ensure({local:w(t.devicePort),remote:w(t.hostPort),ownerId:t.name})}async function ne(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await re(e),await r(`adb`,[`disconnect`,t],{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function re(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function S(e,t,n){let{adbArgs:r,result:i}=await ie(e,t,n);return await ae(r,i,n?.allowFailure)}async function ie(e,t,n){let i=[`-s`,await oe(e),...t];return{adbArgs:i,result:await r(`adb`,i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function ae(e,t,n){if(t.exitCode!==0&&n!==!0){let{androidAdbResultError:n}=await import(`./sdk-android-adb.js`).then(e=>e.t);throw n(`Limrun Android ADB command failed`,t,{command:[`adb`,...e].join(` `)})}return t}async function oe(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??C(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function C(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function w(e){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${e}`);return`tcp:${e}`}function T(e,t){let n=h.extname(t)||`.apk`;return`${e?.replace(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}function E(e){let t=Array.isArray(e)?e:[e],n=[],r=(e,t,i)=>{let a=n.length;n.push(D(e,{index:a,depth:t,parentIndex:i}));for(let n of P(e))r(n,t+1,a)};for(let e of t)r(e,0);return n}function D(e,t){return{index:t.index,type:O(e),role:k(e),label:A(e),value:j(e),identifier:M(e),rect:N(e),enabled:e.enabled,selected:e.selected,hittable:e.hittable,depth:t.depth,parentIndex:t.parentIndex}}function O(e){return e.elementType??e.type}function k(e){return e.role??O(e)}function A(e){return e.label??e.AXLabel??void 0}function j(e){return e.value??e.AXValue??void 0}function M(e){return e.identifier??e.AXUniqueId??void 0}function N(e){let t=e.rect??e.frame;if(!(!t||typeof t.x!=`number`||typeof t.y!=`number`||typeof t.width!=`number`||typeof t.height!=`number`))return{x:t.x,y:t.y,width:t.width,height:t.height}}function P(e){return e.children??e.nodes??e.elements??[]}function F(e){return e.key===`id`?{accessibilityId:e.value}:e.key===`value`?{value:e.value}:{label:e.value}}async function I(e,t){p.mkdirSync(h.dirname(e),{recursive:!0}),await p.promises.writeFile(e,Buffer.from(t,`base64`))}async function L(e){let t=await _({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:t}}async function R(e,t,n,r){let i=await H(n);try{let n=await e.assets.getOrUpload({path:i.uploadPath,name:i.assetName}),a=(await z(t,n.signedDownloadUrl,{md5:n.md5,relaunch:r?.relaunch,appIdentifierHint:r?.appIdentifierHint})).appId;return{...a?{bundleId:a,launchTarget:a}:{},...i.appName?{appName:i.appName}:{}}}finally{await i.cleanup()}}async function z(e,n,r){let i=await e.client.listApps().catch(()=>void 0),o=v((await e.client.installApp(n,{md5:r?.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`})).bundleId),s=v(r?.appIdentifierHint),c=[];for(let t of G){t>0&&await a(t),c=await e.client.listApps();let n=K({resultBundleId:o,requestedBundleId:s,beforeInstallApps:i,afterInstallApps:c});if(n)return{appId:n}}throw new t(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:o,requestedBundleId:s,installedUserApps:c.filter(J).map(e=>e.bundleId).sort()})}function B(e){return new V(e)}var V=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.session.client.launchApp(await U(e)),await this.session.client.openUrl(t.url);return}if(s(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await U(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await U(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(F(e))}async doubleTap(e,t){await this.tap(e,t),await this.tap(e,t)}async longPress(){throw Y(`longpress`,`Limrun iOS direct sessions do not expose long press yet.`)}async focus(e,t){await this.tap(e,t)}async type(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n),await a(t);return}await this.session.client.typeText(e)}async fill(e,t,n){await this.tap(e,t),await this.session.client.typeText(n)}async fillElementSelector(e,t){await this.session.client.setElementValue(t,F(e))}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){await I(e,(await this.session.client.screenshot()).base64)}async snapshot(e){let t=await this.session.client.elementTree();return{nodes:E(JSON.parse(t)),backend:`xctest`}}async back(){await this.session.client.pressKey(`escape`)}async home(){throw Y(`home`,`Limrun iOS direct sessions do not expose home yet.`)}async setOrientation(e){if(e===`portrait-upside-down`)throw Y(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async performGesture(){throw Y(`gesture`,`Limrun iOS direct sessions do not expose portable gesture execution yet.`)}async appSwitcher(){throw Y(`app-switcher`,`Limrun iOS direct sessions do not expose app switcher yet.`)}async tvRemote(){throw Y(`tv-remote`,`Limrun iOS direct sessions do not expose tv remote control.`)}async readClipboard(){throw Y(`clipboard`,`Limrun iOS direct sessions do not expose clipboard read yet.`)}async writeClipboard(){throw Y(`clipboard`,`Limrun iOS direct sessions do not expose clipboard write yet.`)}async setSetting(){throw Y(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function H(e){if(!(await p.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:h.basename(e),appName:W(e),cleanup:async()=>{}};let i=await p.promises.mkdtemp(h.join(m.tmpdir(),`agent-device-limrun-ios-app-`)),a=h.join(i,`${h.basename(e)}.zip`),o=await r(`zip`,[`-qr`,a,h.basename(e)],{cwd:h.dirname(e),timeoutMs:12e4});if(o.exitCode!==0)throw await p.promises.rm(i,{recursive:!0,force:!0}),new t(`COMMAND_FAILED`,`Failed to package iOS .app for Limrun install`,{command:[`zip`,`-qr`,a,h.basename(e)].join(` `),...n(o)});return{uploadPath:a,assetName:h.basename(a),appName:await se(e),cleanup:async()=>{await p.promises.rm(i,{recursive:!0,force:!0})}}}async function U(e){let{resolveIosAppAlias:t}=await import(`./app-resolution.js`).then(e=>e.t);return t(e)}function W(e){return h.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const G=[0,250];function K(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??q(e.beforeInstallApps,e.afterInstallApps)}function q(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>J(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function J(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}async function se(e){let{readIosBundleInfo:t}=await import(`./install-artifact2.js`).then(e=>e.t);return(await t(e)).appName??W(e)}function Y(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}function ce(e){return e.platform===`android`?le(e):X(e)}function le(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:y(e),adb:e.adbProvider,listApps:async e=>{let{listAndroidAppsWithAdb:n}=await import(`./app-helpers.js`).then(e=>e.t);return(await n(t,{filter:o(e),target:`mobile`})).map(e=>({id:e.package,name:e.name}))},getForegroundApp:async()=>{let{getAndroidAppStateWithAdb:e}=await import(`./app-helpers.js`).then(e=>e.t),n=await e(t);return n.package?{appId:n.package,activity:n.activity}:void 0},pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>{let{getAndroidKeyboardStatusWithAdb:e}=await import(`./device-input-state.js`).then(e=>e.t);return await e(t)},dismissKeyboard:async()=>{let{dismissAndroidKeyboardWithAdb:e}=await import(`./device-input-state.js`).then(e=>e.t);return await e(t)},readLogs:async e=>{let{captureAndroidLogcatWithAdb:n}=await import(`./logcat.js`).then(e=>e.n);return await n(t,{lines:e,timeoutMs:5e3})},...Z(e.client),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function X(e){return{platform:`ios`,device:e.device,interactor:B(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>o(t)===`all`||J(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...Z(e.client),installRemoteApp:async(t,n)=>await z(e,t,n),runSimctl:t=>e.client.simctl(t)}}function Z(e){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async({outPath:t})=>await e.stopRecording({localPath:t})}}var ue=e({LimrunRuntime:()=>$});const Q=`agent-device-cli`;var $=class{limrun;sessions=new Map;options;provider=d;leaseLifecycle={allocate:async e=>await this.allocate(e),release:async e=>await this.release(e)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!c(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e){this.options=e,this.limrun=new ee({apiKey:e.apiKey,defaultHeaders:{"x-agent-device-client":Q,"x-agent-device-version":i()}})}ownsDevice(e){return u(e.id)!==void 0}getInteractor(e){let t=this.getSessionForDevice(e);if(t)return t.platform===`ios`?B(t):y(t)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?ce(t):void 0}async installApp(e,t,n,r){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t})}async installInstallablePath(e,t,n){let r=this.getSessionForDevice(e);if(r)return r.platform===`ios`?await R(this.limrun,r,t,n):await b(this.limrun,r,t,n)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await x(t,e),de(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear()}async allocate(e){if(e.leaseProvider!==this.provider)return;let t=c(e.backend);if(!t)return;let n=this.sessions.get(e.leaseId);if(n)return{limrunInstanceId:n.instanceId,device:n.device};let r=t===`ios`?await this.createIosSession(e):await this.createAndroidSession(e);return this.sessions.set(e.leaseId,r),{limrunInstanceId:r.instanceId,device:r.device}}async createIosSession(e){let n=await this.limrun.iosInstances.create({wait:!0,metadata:this.buildInstanceMetadata(e),spec:this.options.region?{region:this.options.region}:{}});try{if(!n.status.apiUrl)throw new t(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await L({lease:e,instanceId:n.metadata.id,device:l(`ios`,e,n.metadata.id),apiUrl:n.status.apiUrl,token:n.status.token})}catch(e){throw await this.limrun.iosInstances.delete(n.metadata.id).catch(()=>{}),e}}async createAndroidSession(e){let n=await this.limrun.androidInstances.create({wait:!0,metadata:this.buildInstanceMetadata(e),spec:this.options.region?{region:this.options.region}:{}});try{if(!n.status.apiUrl||!n.status.adbWebSocketUrl)throw new t(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await te({lease:e,instanceId:n.metadata.id,device:l(`android`,e,n.metadata.id),apiUrl:n.status.apiUrl,adbUrl:n.status.adbWebSocketUrl,token:n.status.token})}catch(e){throw await this.limrun.androidInstances.delete(n.metadata.id).catch(()=>{}),e}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:Q}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=c(e.backend);if(!t)return;let n=`provider=${d},leaseId=${e.leaseId}`,r=(t===`ios`?await this.limrun.iosInstances.list({labelSelector:n}):await this.limrun.androidInstances.list({labelSelector:n})).getPaginatedItems().map(e=>e.metadata.id);for(let e of r)t===`ios`?await this.limrun.iosInstances.delete(e):await this.limrun.androidInstances.delete(e);if(r.length!==0)return{limrunInstanceId:r[0],limrunInstanceCount:r.length}}async terminateSession(e){if(e.client.disconnect(),e.platform===`ios`){await this.limrun.iosInstances.delete(e.instanceId);return}await ne(e),await this.limrun.androidInstances.delete(e.instanceId)}getSessionForDevice(e){let t=u(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw fe(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};function de(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function fe(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}export{ue as n,$ as t};
|
|
@@ -207,4 +207,4 @@ type AndroidTouchCapabilities = {
|
|
|
207
207
|
type AndroidAdbProvider = AndroidAdbProviderBase & AndroidTouchCapabilities;
|
|
208
208
|
declare function createAndroidPortReverseManager(provider: AndroidAdbProvider | AndroidAdbExecutor): AndroidPortReverseProvider;
|
|
209
209
|
//#endregion
|
|
210
|
-
export {
|
|
210
|
+
export { createAndroidPortReverseManager as a, ScrollDirection as c, SwipePreset as d, TransformGestureParams as f, AndroidSnapshotHelperTransport as h, AndroidPortReverseEndpoint as i, ScrollInputDirection as l, AndroidSnapshotHelperInstallReason as m, AndroidAdbExecutorOptions as n, GesturePlan as o, AndroidSnapshotCaptureMode as p, AndroidAdbProvider as r, GesturePointerCount as s, AndroidAdbExecutor as t, SwipePattern as u };
|