agent-device 0.13.1 → 0.13.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/bin/agent-device.mjs +6 -2
- package/dist/src/113.js +1 -1
- package/dist/src/1974.js +2 -2
- package/dist/src/2301.js +1 -0
- package/dist/src/3918.js +29 -29
- package/dist/src/7847.js +1 -1
- package/dist/src/8161.js +3 -0
- package/dist/src/8656.js +1 -1
- package/dist/src/9152.js +1 -1
- package/dist/src/940.js +1 -0
- package/dist/src/9542.js +2 -2
- package/dist/src/index.d.ts +168 -1925
- package/dist/src/index.js +1 -1
- package/dist/src/internal/bin.js +105 -0
- package/dist/src/internal/companion-tunnel.js +1 -0
- package/dist/src/{daemon.js → internal/daemon.js} +10 -10
- package/dist/src/internal/update-check-entry.js +1 -0
- package/dist/src/metro.d.ts +7 -5
- package/dist/src/metro.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/package.json +1 -13
- package/skills/agent-device/references/remote-tenancy.md +6 -7
- package/dist/src/320.js +0 -1
- package/dist/src/8564.js +0 -3
- package/dist/src/9076.js +0 -1
- package/dist/src/backend.d.ts +0 -527
- package/dist/src/backend.js +0 -1
- package/dist/src/bin.js +0 -97
- package/dist/src/commands/index.d.ts +0 -1883
- package/dist/src/commands/index.js +0 -1
- package/dist/src/metro-companion.js +0 -1
- package/dist/src/testing/conformance.d.ts +0 -753
- package/dist/src/testing/conformance.js +0 -1
- package/dist/src/update-check-entry.js +0 -1
- /package/dist/src/{bin.d.ts → internal/bin.d.ts} +0 -0
- /package/dist/src/{daemon.d.ts → internal/companion-tunnel.d.ts} +0 -0
- /package/dist/src/{metro-companion.d.ts → internal/daemon.d.ts} +0 -0
- /package/dist/src/{update-check-entry.d.ts → internal/update-check-entry.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readUpdateCheckWorkerArgs as e,runUpdateCheckWorker as c}from"../113.js";let o=e(process.argv.slice(2));o&&c(o).catch(()=>{process.exitCode=0});
|
package/dist/src/metro.d.ts
CHANGED
|
@@ -4,6 +4,12 @@ export declare function buildBundleUrl(baseUrl: string, platform: 'ios' | 'andro
|
|
|
4
4
|
|
|
5
5
|
export declare function buildIosRuntimeHints(baseUrl: string): MetroRuntimeHints;
|
|
6
6
|
|
|
7
|
+
export declare type CompanionTunnelScope = {
|
|
8
|
+
tenantId: string;
|
|
9
|
+
runId: string;
|
|
10
|
+
leaseId: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
7
13
|
export declare function ensureMetroTunnel(options: EnsureMetroTunnelOptions): Promise<EnsureMetroTunnelResult>;
|
|
8
14
|
|
|
9
15
|
export declare type EnsureMetroTunnelOptions = {
|
|
@@ -75,11 +81,7 @@ export declare type MetroBridgeRuntimePayload = {
|
|
|
75
81
|
launch_url?: string;
|
|
76
82
|
};
|
|
77
83
|
|
|
78
|
-
declare type MetroBridgeScope =
|
|
79
|
-
tenantId: string;
|
|
80
|
-
runId: string;
|
|
81
|
-
leaseId: string;
|
|
82
|
-
};
|
|
84
|
+
export declare type MetroBridgeScope = CompanionTunnelScope;
|
|
83
85
|
|
|
84
86
|
/** Re-export of {@link SessionRuntimeHints} under the Metro-specific alias used by public API consumers. */
|
|
85
87
|
export declare type MetroRuntimeHints = SessionRuntimeHints;
|
package/dist/src/metro.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buildMetroRuntimeHints as e,ensureMetroCompanion as t,reloadMetro as r,stopMetroCompanion as o,prepareMetroRuntime as n}from"./1974.js";import{resolveRuntimeTransportHints as i}from"./8656.js";function s(e){return i(e)}async function a(e){let t=await n({projectRoot:e.projectRoot,kind:e.kind,publicBaseUrl:e.publicBaseUrl,proxyBaseUrl:e.proxyBaseUrl,proxyBearerToken:e.proxyBearerToken,bridgeScope:e.bridgeScope,launchUrl:e.launchUrl,companionProfileKey:e.profileKey,companionConsumerKey:e.consumerKey,metroPort:e.port,listenHost:e.listenHost,statusHost:e.statusHost,startupTimeoutMs:e.startupTimeoutMs,probeTimeoutMs:e.probeTimeoutMs,reuseExisting:e.reuseExisting,installDependenciesIfNeeded:e.installDependenciesIfNeeded,runtimeFilePath:e.runtimeFilePath,logPath:e.logPath,env:e.env});return{iosRuntime:t.iosRuntime,androidRuntime:t.androidRuntime,bridge:t.bridge,started:t.started,reused:t.reused,logPath:t.logPath}}async function u(e){let r=await t(e);return{pid:r.pid,started:r.spawned,logPath:r.logPath}}async function l(e){await o(e)}async function d(e={}){return await r(e)}function p(t){return e(t,"ios")}function m(t){return e(t,"android")}export{buildBundleUrl,normalizeBaseUrl}from"./
|
|
1
|
+
import{buildMetroRuntimeHints as e,ensureMetroCompanion as t,reloadMetro as r,stopMetroCompanion as o,prepareMetroRuntime as n}from"./1974.js";import{resolveRuntimeTransportHints as i}from"./8656.js";function s(e){return i(e)}async function a(e){let t=await n({projectRoot:e.projectRoot,kind:e.kind,publicBaseUrl:e.publicBaseUrl,proxyBaseUrl:e.proxyBaseUrl,proxyBearerToken:e.proxyBearerToken,bridgeScope:e.bridgeScope,launchUrl:e.launchUrl,companionProfileKey:e.profileKey,companionConsumerKey:e.consumerKey,metroPort:e.port,listenHost:e.listenHost,statusHost:e.statusHost,startupTimeoutMs:e.startupTimeoutMs,probeTimeoutMs:e.probeTimeoutMs,reuseExisting:e.reuseExisting,installDependenciesIfNeeded:e.installDependenciesIfNeeded,runtimeFilePath:e.runtimeFilePath,logPath:e.logPath,env:e.env});return{iosRuntime:t.iosRuntime,androidRuntime:t.androidRuntime,bridge:t.bridge,started:t.started,reused:t.reused,logPath:t.logPath}}async function u(e){let r=await t(e);return{pid:r.pid,started:r.spawned,logPath:r.logPath}}async function l(e){await o(e)}async function d(e={}){return await r(e)}function p(t){return e(t,"ios")}function m(t){return e(t,"android")}export{buildBundleUrl,normalizeBaseUrl}from"./2301.js";export{m as buildAndroidRuntimeHints,p as buildIosRuntimeHints,u as ensureMetroTunnel,a as prepareRemoteMetro,d as reloadRemoteMetro,s as resolveRuntimeTransport,l as stopMetroTunnel};
|
package/dist/src/selectors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{findSelectorChainMatch,formatSelectorFailure,isNodeEditable,isNodeVisible,isSelectorToken,parseSelectorChain,resolveSelectorChain,tryParseSelectorChain}from"./
|
|
1
|
+
import"./7847.js";export{findSelectorChainMatch,formatSelectorFailure,isNodeEditable,isNodeVisible,isSelectorToken,parseSelectorChain,resolveSelectorChain,tryParseSelectorChain}from"./940.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-device",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "Agent-driven CLI for mobile UI automation, network inspection, and performance diagnostics across iOS, Android, tvOS, and macOS.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Callstack",
|
|
@@ -20,22 +20,10 @@
|
|
|
20
20
|
"import": "./dist/src/index.js",
|
|
21
21
|
"types": "./dist/src/index.d.ts"
|
|
22
22
|
},
|
|
23
|
-
"./commands": {
|
|
24
|
-
"import": "./dist/src/commands/index.js",
|
|
25
|
-
"types": "./dist/src/commands/index.d.ts"
|
|
26
|
-
},
|
|
27
|
-
"./backend": {
|
|
28
|
-
"import": "./dist/src/backend.js",
|
|
29
|
-
"types": "./dist/src/backend.d.ts"
|
|
30
|
-
},
|
|
31
23
|
"./io": {
|
|
32
24
|
"import": "./dist/src/io.js",
|
|
33
25
|
"types": "./dist/src/io.d.ts"
|
|
34
26
|
},
|
|
35
|
-
"./testing/conformance": {
|
|
36
|
-
"import": "./dist/src/testing/conformance.js",
|
|
37
|
-
"types": "./dist/src/testing/conformance.d.ts"
|
|
38
|
-
},
|
|
39
27
|
"./artifacts": {
|
|
40
28
|
"import": "./dist/src/artifacts.js",
|
|
41
29
|
"types": "./dist/src/artifacts.d.ts"
|
|
@@ -14,7 +14,8 @@ Open this file for remote daemon HTTP flows that let an agent running in a Linux
|
|
|
14
14
|
- `agent-device snapshot --remote-config <path> -i`
|
|
15
15
|
- `agent-device disconnect --remote-config <path>`
|
|
16
16
|
- `agent-device connection status`
|
|
17
|
-
- `
|
|
17
|
+
- `agent-device auth status`
|
|
18
|
+
- `AGENT_DEVICE_DAEMON_AUTH_TOKEN=...` for CI/service-token automation
|
|
18
19
|
|
|
19
20
|
## Most common mistake to avoid
|
|
20
21
|
|
|
@@ -30,9 +31,6 @@ Do not mix an arbitrary `--session` plus ad-hoc daemon, tenant, run, or lease fl
|
|
|
30
31
|
Use this when the agent will run several commands in one session.
|
|
31
32
|
|
|
32
33
|
```bash
|
|
33
|
-
export AGENT_DEVICE_DAEMON_AUTH_TOKEN="YOUR_TOKEN"
|
|
34
|
-
export AGENT_DEVICE_PROXY_TOKEN="$AGENT_DEVICE_DAEMON_AUTH_TOKEN"
|
|
35
|
-
|
|
36
34
|
agent-device connect --remote-config ./remote-config.json
|
|
37
35
|
|
|
38
36
|
ARTIFACT_URL="<trusted-artifact-url>"
|
|
@@ -44,7 +42,7 @@ agent-device fill @e3 "test@example.com"
|
|
|
44
42
|
agent-device disconnect
|
|
45
43
|
```
|
|
46
44
|
|
|
47
|
-
After `connect`, normal commands use the active remote connection. End with `disconnect` to release the lease and stop the owned Metro companion.
|
|
45
|
+
After `connect`, normal commands use the active remote connection. If cloud credentials are missing, `connect` starts login automatically in an interactive shell and stores a revocable CLI session that silently mints short-lived `adc_agent_...` command tokens. The cloud side remains responsible for token expiry, tenant/run claim checks, revocation, one-time device approval, and polling rate limits. End with `disconnect` to release the lease and stop the owned Metro companion.
|
|
48
46
|
|
|
49
47
|
### Self-contained script flow
|
|
50
48
|
|
|
@@ -123,7 +121,7 @@ Optional overrides stay available for advanced cases:
|
|
|
123
121
|
}
|
|
124
122
|
```
|
|
125
123
|
|
|
126
|
-
- Keep
|
|
124
|
+
- Keep service tokens in env/config managed by the operator boundary. Do not persist auth tokens in connection state. Human login uses `agent-device auth login` or implicit `connect` login and stores only the CLI session credential.
|
|
127
125
|
- Omit Metro fields for non-React Native flows.
|
|
128
126
|
- Put `tenant`, `runId`, and `sessionIsolation` in the remote profile so agents can run `agent-device connect --remote-config ./remote-config.json` without extra scope flags. Add `platform`, `leaseBackend`, `session`, or Metro overrides only when the default inference is not enough for that flow.
|
|
129
127
|
- Explicit command-line flags override connected defaults. Use them intentionally when switching session, platform, target, tenant, run, or lease scope.
|
|
@@ -137,7 +135,8 @@ Optional overrides stay available for advanced cases:
|
|
|
137
135
|
|
|
138
136
|
- Start the daemon in HTTP mode with `AGENT_DEVICE_DAEMON_SERVER_MODE=http|dual` on the host.
|
|
139
137
|
- Point the profile or env at the remote host with `daemonBaseUrl` or `AGENT_DEVICE_DAEMON_BASE_URL=http(s)://host:port[/base-path]`.
|
|
140
|
-
- For
|
|
138
|
+
- For humans, run `connect --remote-config <path>` and let it refresh or create the CLI session. Use `agent-device auth status` to inspect it and `agent-device auth logout` to remove it.
|
|
139
|
+
- For CI/non-interactive shells, set `AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...` or pass `--daemon-auth-token`. The client does not start device-code polling in CI by default.
|
|
141
140
|
- Prefer an auth hook such as `AGENT_DEVICE_HTTP_AUTH_HOOK` when the host needs caller validation or tenant injection.
|
|
142
141
|
|
|
143
142
|
## Lease debug fallback
|
package/dist/src/320.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let E="--agent-device-run-metro-companion",_="--agent-device-run-react-devtools-companion",N="AGENT_DEVICE_METRO_COMPANION_SERVER_BASE_URL",O="AGENT_DEVICE_METRO_COMPANION_BEARER_TOKEN",A="AGENT_DEVICE_METRO_COMPANION_LOCAL_BASE_URL",T="AGENT_DEVICE_METRO_COMPANION_LAUNCH_URL",R="AGENT_DEVICE_METRO_COMPANION_STATE_PATH",C="AGENT_DEVICE_METRO_COMPANION_SCOPE_TENANT_ID",I="AGENT_DEVICE_METRO_COMPANION_SCOPE_RUN_ID",e="AGENT_DEVICE_METRO_COMPANION_SCOPE_LEASE_ID",P="AGENT_DEVICE_METRO_COMPANION_REGISTER_PATH",V="AGENT_DEVICE_METRO_COMPANION_UNREGISTER_PATH",S="AGENT_DEVICE_METRO_COMPANION_DEVICE_PORT",M="AGENT_DEVICE_METRO_COMPANION_SESSION";function n(E){let _=E.length;for(;_>0&&47===E.charCodeAt(_-1);)_-=1;return _===E.length?E:E.slice(0,_)}function r(E,_){let N=new URL(`${n(E)}/index.bundle`);return N.searchParams.set("platform",_),N.searchParams.set("dev","true"),N.searchParams.set("minify","false"),N.toString()}export{O as ENV_BEARER_TOKEN,S as ENV_DEVICE_PORT,T as ENV_LAUNCH_URL,A as ENV_LOCAL_BASE_URL,P as ENV_REGISTER_PATH,e as ENV_SCOPE_LEASE_ID,I as ENV_SCOPE_RUN_ID,C as ENV_SCOPE_TENANT_ID,N as ENV_SERVER_BASE_URL,M as ENV_SESSION,R as ENV_STATE_PATH,V as ENV_UNREGISTER_PATH,E as METRO_COMPANION_RUN_ARG,_ as REACT_DEVTOOLS_COMPANION_RUN_ARG,r as buildBundleUrl,n as normalizeBaseUrl};
|
package/dist/src/8564.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";import{AsyncLocalStorage as a}from"node:async_hooks";import i from"node:crypto";import r from"node:os";import{redactDiagnosticData as o,AppError as s}from"./9152.js";import{withSuccessText as l,bindCommands as d,successText as u}from"./9076.js";import{hasBackendEscapeHatch as c,hasBackendCapability as p}from"./backend.js";import{resolveUserPath as m,expandUserHomePath as f}from"./3267.js";function g(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??h(),policy:e.policy??v(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...d(t)}}function h(e=[]){let t=new Map(e.map(e=>[e.name,I(e)]));return{get:e=>I(t.get(e)),set:e=>{t.set(e.name,I(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>I(e))}}function I(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function S(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function v(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function w(e,t){if(!p(e.backend,t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} is not supported by this backend`,{capability:t});if(!e.policy.allowNamedBackendCapabilities.includes(t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} is not allowed by command policy`,{capability:t});if(!c(e.backend,t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} does not implement its escape hatch method`,{capability:t})}function b(){try{let n=y();return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function y(){let a=t.dirname(n(import.meta.url)),i=a;for(let n=0;n<6;n+=1){let n=t.join(i,"package.json");if(e.existsSync(n))return i;i=t.dirname(i)}return a}let P=new a;function k(){return i.randomBytes(8).toString("hex")}async function _(e,t){let n={...e,diagnosticId:`${Date.now().toString(36)}-${i.randomBytes(4).toString("hex")}`,events:[]};return await P.run(n,t)}function N(){let e=P.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function D(t){let n=P.getStore();if(!n)return;let a={ts:new Date().toISOString(),level:t.level??"info",phase:t.phase,session:n.session,requestId:n.requestId,command:n.command,durationMs:t.durationMs,data:t.data?o(t.data):void 0};if(n.events.push(a),!n.debug)return;let i=`[agent-device][diag] ${JSON.stringify(a)}
|
|
2
|
-
`;try{n.logPath&&e.appendFile(n.logPath,i,()=>{}),n.traceLogPath&&e.appendFile(n.traceLogPath,i,()=>{}),n.logPath||n.traceLogPath||process.stderr.write(i)}catch{}}async function $(e,t,n){let a=Date.now();try{let i=await t();return D({level:"info",phase:e,durationMs:Date.now()-a,data:n}),i}catch(t){throw D({level:"error",phase:e,durationMs:Date.now()-a,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function C(n={}){let a=P.getStore();if(!a||!n.force&&!a.debug||0===a.events.length)return null;try{let n=(a.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),i=new Date().toISOString().slice(0,10),s=t.join(r.homedir(),".agent-device","logs",n,i);e.mkdirSync(s,{recursive:!0});let l=new Date().toISOString().replace(/[:.]/g,"-"),d=t.join(s,`${l}-${a.diagnosticId}.ndjson`),u=a.events.map(e=>JSON.stringify(o(e)));return e.writeFileSync(d,`${u.join("\n")}
|
|
3
|
-
`),a.events=[],d}catch{return null}}function j(e){let n,a=(n=(e??"").trim())?m(n):t.join(f("~"),".agent-device");return{baseDir:a,infoPath:t.join(a,"daemon.json"),lockPath:t.join(a,"daemon.lock"),logPath:t.join(a,"daemon.log"),sessionsDir:t.join(a,"sessions")}}function R(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function A(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function O(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function x(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let z=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,B=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,E=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function M(){let e=process.argv[1];return e?T(e):"unknown"}function T(n,a=y()){try{let r=t.resolve(a),o=[t.resolve(n)],s=new Set,l=[];for(;o.length>0;){let n=o.pop();if(!n||s.has(n))continue;s.add(n);let a=e.statSync(n);if(!a.isFile())continue;let i=t.relative(r,n)||n;l.push(`${i}:${a.size}:${Math.trunc(a.mtimeMs)}`);let d=e.readFileSync(n,"utf8");for(let e of function(e){let t=new Set;return L(e,z,t),L(e,B,t),[...t]}(d)){let a=function(e,n){let a=t.resolve(t.dirname(e),n),i=F(a);if(i)return i;for(let e of E){let t=F(`${a}${e}`);if(t)return t}for(let e of E){let n=F(t.join(a,`index${e}`));if(n)return n}return null}(n,e);a&&o.push(a)}}let d=l.sort().join("|"),u=i.createHash("sha1").update(d).digest("hex");return`graph:${l.length}:${u}`}catch{return"unknown"}}function L(e,t,n){t.lastIndex=0;let a=null;for(;null!==(a=t.exec(e));){let e=a[1]?.trim();e?.startsWith(".")&&n.add(e)}}function F(t){try{return e.statSync(t).isFile()?t:null}catch{return null}}function U(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function K(e,t,n){return{deviceId:t,deviceName:n,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function q(e,t={}){let n=t.includeAndroidSerial??!0;return{platform:e.platform,target:e.target,device:e.name,id:e.id,..."ios"===e.platform?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},..."android"===e.platform&&n?{serial:e.android?.serial??e.id}:{}}}function H(e){return{name:e.name,...q(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function J(e){return{platform:e.platform,id:e.id,name:e.name,kind:e.kind,target:e.target,..."boolean"==typeof e.booted?{booted:e.booted}:{}}}function Z(e){let t=e.created?"Created":"Reused",n=e.booted?" (booted)":"";return l({udid:e.udid,device:e.device,runtime:e.runtime,ios_simulator_device_set:e.iosSimulatorDeviceSet??null,created:e.created,booted:e.booted},`${t}: ${e.device} ${e.udid}${n}`)}function V(e){return e.bundleId??e.package??e.app}function W(e){return l({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: ${V(e)}`)}function G(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function Q(e){return l({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: ${G(e)}`)}function X(e){let t=e.appName??e.appBundleId??e.session;return l({session:e.session,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?q(e.device):{}},t?`Opened: ${t}`:"Opened")}function Y(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...u(e.session?`Closed: ${e.session}`:"Closed")}}function ee(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}export{w as assertBackendCapabilityAllowed,U as buildAppIdentifiers,K as buildDeviceIdentifiers,T as computeDaemonCodeSignature,g as createAgentDevice,h as createMemorySessionStore,k as createRequestId,D as emitDiagnostic,y as findProjectRoot,C as flushDiagnosticsToSessionFile,N as getDiagnosticsMeta,S as localCommandPolicy,x as normalizeTenantId,b as readVersion,M as resolveDaemonCodeSignature,j as resolveDaemonPaths,R as resolveDaemonServerMode,A as resolveDaemonTransportPreference,V as resolveDeployResultTarget,G as resolveInstallFromSourceResultTarget,O as resolveSessionIsolationMode,v as restrictedCommandPolicy,Y as serializeCloseResult,W as serializeDeployResult,J as serializeDevice,Z as serializeEnsureSimulatorResult,Q as serializeInstallFromSourceResult,X as serializeOpenResult,H as serializeSessionListEntry,ee as serializeSnapshotResult,$ as withDiagnosticTimer,_ as withDiagnosticsScope};
|
package/dist/src/9076.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{promises as e}from"node:fs";import{PNG as t}from"pngjs";import n from"node:path";import{asAppError as a,AppError as r,normalizeAgentDeviceError as i}from"./9152.js";import{whichCmd as s,runCmd as o}from"./9818.js";import{trimText as l,extractNodeText as c,parseSelectorChain as d,isNodeVisible as u,isNodeEditable as p,buildTextPreview as m,findNearestHittableAncestor as h,buildSelectorChainForNode as f,findSelectorChainMatch as w,resolveSelectorChain as b,findNodeByLabel as g,resolveRefLabel as y,describeTextSurface as x,extractReadableText as k,formatSelectorFailure as v,normalizeType as A,isFillableType as I}from"./7847.js";import{centerOfRect as N,findNodeByRef as M,normalizeRef as R}from"./4057.js";import{findBestMatchesByLocator as S}from"./7556.js";function P(e){return e?{message:e}:{}}function O(e,t){return t?{...e,message:t}:e}function D(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}function _(e,n){try{return t.sync.read(e)}catch(e){throw new r("COMMAND_FAILED",`Failed to decode ${n} as PNG`,{label:n,reason:e instanceof Error?e.message:String(e)})}}async function T(n,a){if(!Number.isInteger(a)||a<1)throw new r("INVALID_ARGS","Screenshot max size must be a positive integer");let i=_(await e.readFile(n),"screenshot"),s=Math.max(i.width,i.height);if(s<=a)return;let o=a/s,l=Math.max(1,Math.round(i.width*o)),c=Math.max(1,Math.round(i.height*o)),d=function(e,n,a){let r=new t({width:n,height:a});for(let t=0;t<a;t+=1){let i=t*e.height/a,s=(t+1)*e.height/a;for(let a=0;a<n;a+=1){let o=a*e.width/n,l=(a+1)*e.width/n,c=0,d=0,u=0,p=0,m=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let n=Math.min(t+1,s)-Math.max(t,i);for(let a=Math.floor(o);a<Math.ceil(l);a+=1){let r=n*(Math.min(a+1,l)-Math.max(a,o)),i=(t*e.width+a)*4;c+=(e.data[i]??0)*r,d+=(e.data[i+1]??0)*r,u+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,m+=r}}let h=(t*r.width+a)*4;r.data[h]=Math.round(c/m),r.data[h+1]=Math.round(d/m),r.data[h+2]=Math.round(u/m),r.data[h+3]=Math.round(p/m)}}return r}(i,l,c);await e.writeFile(n,t.sync.write(d))}async function E(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new r("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw a(e)}}async function $(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new r("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw a(e)}}async function L(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw a(e)}}let C=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new r("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await $(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,surface:t.surface}),void 0!==t.maxSize&&await T(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...P(`Saved screenshot: ${a.path}`)}},U=[0,187,255,255];function F(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function q(e,t,n){return Math.min(Math.max(e,t),n)}let G={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},B={leading:20,trailing:20,separator:10,unknown:0,background:-30};function V(e){return"background"!==e.likelyKind}function X(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function Y(e,t){let n,a=0;for(let r of t){let t=W(e,r.rect);t<=a||(a=t,n=r)}return n}function H(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,W(t,a=n.rect)>0||Math.abs(J(t).y-J(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=function(e){let t=1/0,n=1/0,a=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),a=Math.max(a,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:n,width:a-t,height:r-n}}([e.rect,n.rect])}return t}function z(e,t){let n,a=J(e);for(let e of t){var r,i;let t=Math.sqrt((r=a,i=J(e.rect),(r.x-i.x)**2+(r.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function j(e){let t=K(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function K(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function W(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function J(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function Z(e,t,n){return Math.min(Math.max(e,t),n)}async function Q(e){if(await s("tesseract"))try{let[t,n]=await Promise.all([et(e.baselinePath),et(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=ee(t.stdout,e.width,e.height),r=ee(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=el(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let l=0;l<n.length;l+=1){var s,o;if(a.has(l))continue;let c=n[l];if(el(c.text)!==t)continue;let d=(s=ei(e.normalizedRect),o=ei(c.normalizedRect),(s.x-o.x)**2+(s.y-o.y)**2);d>=i||(r=l,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=eu(t.rect.width/e.rect.width),r=eu(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>en(t)-en(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-ec(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(ea).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>er(t)-er(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function ee(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=eo(t,i,"level"),a=es(t,i,"text").trim(),r=eo(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=eo(t,i,"left"),c=eo(t,i,"top"),d=eo(t,i,"width"),u=eo(t,i,"height");d<=0||u<=0||s.push({key:[es(t,i,"page_num"),es(t,i,"block_num"),es(t,i,"par_num"),es(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:c,width:d,height:u}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=function(e){let t=1/0,n=1/0,a=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),a=Math.max(a,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:n,width:a-t,height:r-n}}(a.map(e=>e.rect)),i=Math.round(100*ec(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:{x:ed(r.x/t),y:ed(r.y/n),width:ed(r.width/t),height:ed(r.height/n)}}})(e,t,n)).filter(e=>null!==e)}function et(e){return o("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function en(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function ea(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function er(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function ei(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function es(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function eo(e,t,n){let a=Number(es(e,t,n));return Number.isFinite(a)?a:0}function el(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function ec(e){return e.reduce((e,t)=>e+t,0)/e.length}function ed(e){return Math.round(100*e*100)/100}function eu(e){return Math.round(1e3*e)/1e3}function ep(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function em(e){return .2126*e.r+.7152*e.g+.0722*e.b}function eh(e){return`#${ef(e.r)}${ef(e.g)}${ef(e.b)}`}function ef(e){return e.toString(16).padStart(2,"0")}function ew(e){return Math.round(100*e*100)/100}let eb=255*Math.sqrt(3);async function eg(a,r,i={}){let s,o,l,c;await ey(a,"Baseline image not found"),await ey(r,"Current screenshot not found");let d=i.outputPath,[u,p]=await Promise.all([e.readFile(a),e.readFile(r)]),m=_(u,"baseline screenshot"),h=_(p,"current screenshot");ex(m.width,m.height,"baseline screenshot",i.maxPixels),ex(h.width,h.height,"current screenshot",i.maxPixels);let f=i.threshold??.1;if(m.width!==h.width||m.height!==h.height){let e=m.width*m.height;return await ek(i.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:m.width,height:m.height},actual:{width:h.width,height:h.height}}}}let w=m.width*m.height,b=f*eb,g=new t({width:m.width,height:m.height}),y=new Uint8Array(w),x=0;for(let e=0,t=0;e<m.data.length;e+=4,t+=1){if(Math.sqrt((m.data[e]-h.data[e])**2+(m.data[e+1]-h.data[e+1])**2+(m.data[e+2]-h.data[e+2])**2)>b){x+=1,y[t]=1;let n=ev(h,e);g.data[e]=eA(n,220,.78),g.data[e+1]=eA(n,0,.78),g.data[e+2]=eA(n,0,.78),g.data[e+3]=255;continue}let n=ev(h,e);g.data[e]=n,g.data[e+1]=n,g.data[e+2]=n,g.data[e+3]=255}let k=x>0?(A=(s=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n,s=new Uint8Array(t.length),o=new Int32Array(t.length),l=[];for(let e=0;e<t.length;e+=1){if(1!==t[e]||1===s[e])continue;let c=0,d=0;o[0]=e,d+=1,s[e]=1;let u=e%r,p=Math.floor(e/r),m={minX:u,minY:p,maxX:u,maxY:p,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0};for(;c<d;){let e=o[c];c+=1,function(e,t,n,a,r){let i=t%n,s=Math.floor(t/n),o=4*t;e.minX=Math.min(e.minX,i),e.minY=Math.min(e.minY,s),e.maxX=Math.max(e.maxX,i),e.maxY=Math.max(e.maxY,s),e.differentPixels+=1,e.baselineRed+=a.data[o],e.baselineGreen+=a.data[o+1],e.baselineBlue+=a.data[o+2],e.currentRed+=r.data[o],e.currentGreen+=r.data[o+1],e.currentBlue+=r.data[o+2]}(m,e,r,n,a);let l=e%r,u=Math.floor(e/r);for(let e=-1;e<=1;e+=1){let n=u+e;if(!(n<0)&&!(n>=i))for(let a=-1;a<=1;a+=1){if(0===a&&0===e)continue;let i=l+a;if(i<0||i>=r)continue;let c=n*r+i;1===t[c]&&1!==s[c]&&(s[c]=1,o[d]=c,d+=1)}}}l.push(m)}return l}(v={diffMask:y,baseline:m,current:h,totalPixels:w,differentPixels:x,maxRegions:i.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(s):s,A.flatMap(e=>{var t,n,a;let r;return(t=e,n=v.baseline.width,a=v.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,v,Math.max(24,Math.round(.03*v.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,v.maxRegions??8)).map((e,t)=>{var n,a,r,i,s,o,l,c,d,u,p;let m,h,f,w,b,g,y,x,k,A,I,N,M,R,S,P,O;return n=e,a=t+1,r={width:v.baseline.width,height:v.baseline.height,totalPixels:v.totalPixels,differentPixels:v.differentPixels},g={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},y={x:Math.round(n.minX+g.width/2),y:Math.round(n.minY+g.height/2)},x=ep(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),k=ep(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=g.width*g.height,I=ew(n.differentPixels/A),N=Math.round(em(x)),M=Math.round(em(k)),R=(i=g,s=r.width,o=r.height,i.width>=.55*s&&i.height>=.12*o?"large-area":i.width>=2.5*i.height?"horizontal-band":i.height>=2.5*i.width?"vertical-band":"compact"),S=(m=A/r.totalPixels)>=.04?"large":m>=.01?"medium":"small",P=(l=x,c=k,h=em(l),Math.abs(f=em(c)-h)>=12?f>0?"brighter":"darker":Math.max(Math.abs(c.r-l.r),Math.abs(c.g-l.g),Math.abs(c.b-l.b))>=12?"color-shift":"mixed"),O=(d=y,u=r.width,p=r.height,w=d.x<u/3?"left":d.x>2*u/3?"right":"center",b=d.y<p/3?"top":d.y>2*p/3?"bottom":"middle","center"===w&&"middle"===b?"center":`${b}-${w}`),{index:a,rect:g,normalizedRect:{x:ew(g.x/r.width),y:ew(g.y/r.height),width:ew(g.width/r.width),height:ew(g.height/r.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:ew(n.differentPixels/r.differentPixels),densityPercentage:I,shape:R,size:S,location:O,averageBaselineColorHex:eh(x),averageCurrentColorHex:eh(k),baselineLuminance:N,currentLuminance:M,dominantChange:P}}):[];if(x>0&&d){var v,A,I;for(let e of k)e.rect.width<4||e.rect.height<4||function(e,t){let n=q(t.x,0,e.width-1),a=q(t.y,0,e.height-1),r=q(t.x+t.width-1,0,e.width-1),i=q(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)F(e,s,a+t,U),F(e,s,i-t,U);for(let s=a;s<=i;s+=1)F(e,n+t,s,U),F(e,r-t,s,U)}}(g,e.rect);await e.mkdir(n.dirname(d),{recursive:!0}),await e.writeFile(d,t.sync.write(g))}else await ek(i.outputPath);let N=x>0?await Q({baselinePath:a,currentPath:r,width:m.width,height:m.height}):void 0,M=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,R=x>0&&N?(o=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}(function(e,t,n){let a=new Uint8Array(e.length),r=new Int32Array(e.length),i=[];for(let s=0;s<e.length;s+=1){if(1!==e[s]||1===a[s])continue;let o=0,l=0;r[0]=s,l+=1,a[s]=1;let c=s%t,d=Math.floor(s/t),u={minX:c,minY:d,maxX:c,maxY:d,differentPixels:0};for(;o<l;){let i=r[o];o+=1;let s=i%t,c=Math.floor(i/t);u.minX=Math.min(u.minX,s),u.minY=Math.min(u.minY,c),u.maxX=Math.max(u.maxX,s),u.maxY=Math.max(u.maxY,c),u.differentPixels+=1;for(let i=-1;i<=1;i+=1){let o=c+i;if(!(o<0)&&!(o>=n))for(let n=-1;n<=1;n+=1){if(0===n&&0===i)continue;let c=s+n;if(c<0||c>=t)continue;let d=o*t+c;1===e[d]&&1!==a[d]&&(a[d]=1,r[l]=d,l+=1)}}}i.push(u)}return i}(function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw]){var i;!function(e,t,n,a){let r=Z(Math.floor(a.x),0,t-1),i=Z(Math.floor(a.y),0,n-1),s=Z(Math.ceil(a.x+a.width),0,t),o=Z(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return r}((I={diffMask:y,width:m.width,height:m.height,regions:k,ocr:N}).diffMask,I.width,I.height,I.ocr),I.width,I.height)),l=H(I.ocr?.currentBlocksRaw??[]),c=H(I.ocr?.baselineBlocksRaw??[]),o.filter(j).map(e=>{var t,n,a,r,i,s,o,d,u,p,m;let h,f,w,b,g,y,x,k,v,A;return t=e,n=I,a=l,r=c,b=function(e,t){let n,a=0;for(let r of t){let t=function(e,t){let n=Math.max(e.x,t.x),a=Math.max(e.y,t.y),r=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return r<=n||i<=a?0:(r-n)*(i-a)}(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(w=K(t),n.regions),g=function(e,t,n){let a=Y(e,t);if(a)return z(e,a.blocks);let r=Y(e,n);return r?z(e,r.blocks):void 0}(w,a,r),y=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(w,g?.block.rect,n.width),x=(i=w,s=y,o=t.differentPixels,d=n,h=i.width/i.height,f=o/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&h>=1.5&&h<=3.8&&f>=.35?"toggle":"trailing"===s&&i.width<=.06*d.width&&i.height<=.04*d.height?"chevron":"leading"===s&&h>=.55&&h<=1.8?"icon":X(i,d)?"background":"visual"),k={...b?{regionIndex:b}:{},slot:y,likelyKind:x,rect:w},{...b?{regionIndex:b}:{},slot:y,likelyKind:x,rect:w,...g?{nearestText:g.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(u=k,p=t.differentPixels,m=n,v=X(u.rect,m)?-35:0,A=20*!!u.regionIndex,G[u.likelyKind]+B[u.slot]+A+v+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*I.height).filter(V).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,I.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],S=w>0?Math.round(x/w*1e4)/100:0;return{...x>0&&d?{diffPath:d}:{},...k.length>0?{regions:k}:{},...M?{ocr:M}:{},...R.length>0?{nonTextDeltas:R}:{},totalPixels:w,differentPixels:x,mismatchPercentage:S,match:0===x}}async function ey(t,n){try{await e.access(t)}catch{throw new r("INVALID_ARGS",`${n}: ${t}`)}}function ex(e,t,n,a){if(null==a||a<=0)return;let i=e*t;if(!(i<=a))throw new r("INVALID_ARGS",`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function ek(t){if(t)try{await e.unlink(t)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function ev(e,t){return eA(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function eA(e,t,n){return Math.round(e*(1-n)+t*n)}function eI(e){return e.width*e.height}function eN(e){return Math.round(100*e*100)/100}let eM=async(e,t)=>{let n,a,i;if(!t.baseline)throw new r("INVALID_ARGS","diff screenshot requires a baseline image");let s=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new r("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),o=t.current??{kind:"live"};if(t.overlayRefs&&!eT(o))throw new r("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let l=await E(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),c=[];try{let r;r=eT(o)?(a=await eR(e,t)).path:(n=await E(e,o,{usage:"diff screenshot current",field:"current"})).path,i=t.out?await $(e,t.out,{field:"diffPath",ext:".png"}):void 0;let d=await eg(l.path,r,{threshold:s,outputPath:i?.path,maxPixels:e.policy.maxImagePixels});eT(o)&&(d=await eS(e,t,i?.path,d,c));let u=d.diffPath?await i?.publish():void 0;return u&&c.push(u),d.diffPath||await i?.cleanup?.(),{...d,...c.length>0?{artifacts:c}:{}}}catch(e){throw await i?.cleanup?.(),e}finally{await l.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}};async function eR(e,t){let n=await L(e,{prefix:"agent-device-diff-current",ext:".png"});try{await eP(e,t,n.path,eO(t))}catch(e){throw await n.cleanup(),e}return n}async function eS(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await e_(n),a;let c=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:eD(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:eD(i.out.clientPath)}:{},...i.out.fileName?{fileName:eD(i.out.fileName)}:{}}:void 0),d=await $(e,c,{field:"currentOverlayPath",ext:".png"});try{let n=await eP(e,t,d.path,{overlayRefs:!0,...eO(t)}),i=await d.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??d.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(o=a.regions,l=n.overlayRefs,o.map(e=>{var t,n;let a,r=(t=e,n=l,a=eI(t.rect),n.map(e=>{var n,r;let i,s,o,l,c=e.overlayRect,d=(n=t.rect,r=c,i=Math.max(n.x,r.x),s=Math.max(n.y,r.y),o=Math.min(n.x+n.width,r.x+r.width),l=Math.min(n.y+n.height,r.y+r.height),o<=i||l<=s?0:(o-i)*(l-s));return d<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:c,overlayCoveragePercentage:eN(d/eI(c)),regionCoveragePercentage:eN(d/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await d.cleanup?.(),e}}async function eP(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new r("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function eO(e){return e.surface?{surface:e.surface}:{}}function eD(e){let t=n.extname(e),a=t?e.slice(0,-t.length):e;return`${a}.current-overlay${t||".png"}`}async function e_(t){try{await e.unlink(eD(t))}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function eT(e){return"live"===e.kind}function eE(e,t={}){let n=[],a=[];for(let r of e){let e=r.depth??0,i=r.label?.trim()||r.value?.trim()||r.identifier?.trim()||"",s=eC(r.type??"Element");if("group"===s&&!i)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let o=n.length;n.push(e),a.push({node:r,depth:o,type:s,text:e$(r,o,!1,s,t)})}return a}function e$(e,t,n,a,r={}){var i,s,o,c,d,u,p,h;let f,w=a??eC(e.type??"Element"),b=x(e,w),g=(i=e,s=w,o=r,c=b,o.summarizeTextSurfaces&&c.shouldSummarize&&function(e,t,n){let a=l(e.label);if(a&&a!==n)return a;let r=l(e.identifier);if(r&&!eF(r)&&r!==n)return r;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,s,c.text)||eL(i,s)),y=" ".repeat(t),k=e.ref?`@${e.ref}`:"",v=(d=e,u=w,p=r,h=b,f=[],(!1===d.enabled&&f.push("disabled"),p.summarizeTextSurfaces&&(!0===d.selected&&f.push("selected"),eU(u)&&f.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),a=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||a.includes("scroll")}(d,u)&&f.push("scrollable"),h.shouldSummarize))?(f.push(`preview:"${m(h.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),f.push("truncated"),[...new Set(f)]):f).map(e=>` [${e}]`).join(""),A=g?` "${g}"`:"";return n?`${y}${k} [${w}]${v}`.trimEnd():`${y}${k} [${w}]${A}${v}`.trimEnd()}function eL(e,t){var n,a;let r,i=e.label?.trim();if(i&&(n=t,a=i,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&(r=a.trim().toLowerCase())&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(r)))return"";let s=e.value?.trim();if(eU(t)){if(s)return s;if(i)return i}else if(i)return i;if(s)return s;let o=e.identifier?.trim();return!o||eF(o)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":o}function eC(e){let t=e.replace(/XCUIElementType/gi,"").toLowerCase(),n=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));switch(t.includes(".")&&(t=t.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),n&&t.includes(".")&&(t=t.slice(t.lastIndexOf(".")+1))),t){case"application":return"application";case"navigationbar":return"navigation-bar";case"tabbar":return"tab-bar";case"button":case"imagebutton":return"button";case"link":return"link";case"cell":return"cell";case"statictext":case"checkedtextview":return"text";case"textfield":case"edittext":return"text-field";case"textview":return n?"text":"text-view";case"textarea":return"text-view";case"switch":return"switch";case"slider":return"slider";case"image":case"imageview":return"image";case"webview":return"webview";case"framelayout":case"linearlayout":case"relativelayout":case"constraintlayout":case"viewgroup":case"view":case"group":return"group";case"listview":case"recyclerview":return"list";case"collectionview":return"collection";case"searchfield":return"search";case"segmentedcontrol":return"segmented-control";case"window":return"window";case"checkbox":return"checkbox";case"radio":return"radio";case"menuitem":return"menu-item";case"toolbar":return"toolbar";case"scrollarea":case"scrollview":case"nestedscrollview":return"scroll-area";case"table":return"table";default:return t||"element"}}function eU(e){return"text-field"===e||"text-view"===e||"search"===e}function eF(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function eq(e,t){let n=eC(e.type??"Element"),a=eL(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function eG(e,t){return t.flatten?e.map(e=>({text:e$(e,0,!1),comparable:eq(e,0)})):eE(e).map(e=>({text:e.text,comparable:eq(e.node,e.depth)}))}function eB(e,t){return e.get(t)??0}function eV(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function eX(e){let t=null,n=-1;for(let a of e){let e=a.width*a.height;e>n&&(t=a,n=e)}return t}function eY(e,t,n,a){return Math.max(e,n)<=Math.min(t,a)}function eH(e){let t=new Map;for(let[n,a]of e.entries())t.set(a.index,n);let n=[],a=[];for(let[r,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;a.length>0&&e<=a[a.length-1].depth;)a.pop();let s="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,o="number"==typeof s&&s<r?s:a[a.length-1]?.index;n.push({...i,index:r,depth:e,parentIndex:o}),a.push({depth:e,index:r})}return n}function ez(e){return new Map(e.map(e=>[e.index,e]))}function ej(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function eK(e){let t=`${e??""}`.toLowerCase();return t.includes("scroll")||t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")||t.includes("collectionview")||"table"===t}function eW(e){return!!eK(e.type)||`${e.role??""} ${e.subrole??""}`.toLowerCase().includes("scroll")}function eJ(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:a,hintedContainers:r}=eQ(e),i=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:i.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let a=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,r=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:a,hiddenContentBelow:r}})(e,r.directionsByContainer)),hiddenCount:0===n.size?0:e.length-i.length,summaryLines:function(e,t,n){let a=new Map;for(let r of e){let e=function(e,t,n){if(!e.rect)return null;let a=e1(e,t,n);return a?e2(e.rect,a):null}(r,t,n);if(!e)continue;let i=a.get(e)??[];i.push(r),a.set(e,i)}return["above","below"].flatMap(e=>{let t=a.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let a of e){let e=ej(a);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),r=1===t.length?"interactive item":"interactive items",i=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${r}${i}`]})}(a.filter(e=>!r.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!ej(e)}(e)),e,t)}}function eZ(e){if(0===e.length)return new Map;let{hintedContainers:t}=eQ(e);var n=t.directionsByContainer;let a=new Map;for(let[e,t]of n){let n={};t.has("above")&&(n.hiddenContentAbove=!0),t.has("below")&&(n.hiddenContentBelow=!0),(n.hiddenContentAbove||n.hiddenContentBelow)&&a.set(e,n)}return a}function eQ(e){let t=ez(e),n=new Set,a=[];for(let r of e){if(e0(r,e,t)){!function(e,t,n){let a=e,r=new Set;for(;a&&!r.has(a.index);)r.add(a.index),t.add(a.index),a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}(r,n,t);continue}a.push(r)}let r=function(e,t,n,a){let r=new Map,i=new Set;for(let e of t){if(!e.rect)continue;let t=e5(e,n,a);if(!t?.rect)continue;let s=e2(e.rect,t.rect);if(!s)continue;let o=r.get(t.index)??new Set;o.add(s),r.set(t.index,o),i.add(e.index)}return function(e,t,n,a){for(let r of e){let e=function(e){let t=function(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add("above"),t.below&&n.add("below"),n.size>0?n:null}(r);if(!e||0===e.size)continue;let i=e5(r,t,n);if(!i)continue;let s=a.get(i.index)??new Set;for(let t of e)s.add(t);a.set(i.index,s)}}(e,n,a,r),{directionsByContainer:r,coveredNodeIndexes:i}}(e,a,n,t);return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:a,hintedContainers:r}}function e0(e,t,n=ez(t)){var a;if(!e.rect)return!0;let r=e1(e,t,n);return!r||(a=e.rect,eY(a.x,a.x+a.width,r.x,r.x+r.width)&&eY(a.y,a.y+a.height,r.y,r.y+r.height))}function e1(e,t,n=ez(t)){let a=function(e,t){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,a=new Set;for(;n&&!a.has(n.index);){if(a.add(n.index),n.rect&&eW(n))return n.rect;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}(e,n);return a||function(e,t){let n=N(t),a=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),r=a.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),i=eX(r.map(e=>e.rect).filter(e=>eV(e,n.x,n.y)));if(i)return i;let s=eX(r.map(e=>e.rect));if(s)return s;let o=eX(a.map(e=>e.rect).filter(e=>eV(e,n.x,n.y)));return o||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function e2(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function e5(e,t,n){let a="number"==typeof e.parentIndex?n.get(e.parentIndex):void 0,r=new Set;for(;a&&!r.has(a.index);){if(r.add(a.index),t.has(a.index)&&eW(a))return a;a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}return null}function e4(e){return"text"===e||"label"===e||"any"===e}function e3(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function e8(e){return e.clock?.now()??Date.now()}async function e6(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}let e7=async(e,t)=>{var n;let a,r,i=await te(e,t);return await e.sessions.set(tt(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:a,snapshotRaw:r}=e;if(r||"macos-helper"===(t=a)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=eJ(n),s=new Set;return i.hiddenCount>0&&s.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&s.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&s.add("scroll-hidden-below"),{partial:s.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...s]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.warnings.length>0?{warnings:i.warnings}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},e9=async(e,t)=>{let n=await te(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=tt(t.session,n);if(!r){let t=function(e,t={}){return eG(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&eB(i,r-1)<eB(i,r+1)?eB(i,r+1):eB(i,r-1)+1,c=l-r;for(;l<n&&c<a&&e[l].comparable===t[c].comparable;)l+=1,c+=1;if(i.set(r,l),l>=n&&c>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,c=l===-a||l!==a&&eB(r,l-1)<eB(r,l+1)?l+1:l-1,d=eB(r,c),u=d-c;for(;s>d&&o>u;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===d?(i.push({kind:"added",text:n[u].text}),o=u):(i.push({kind:"removed",text:t[d].text}),s=d)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(eG(e,n),eG(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function te(e,t){var n,a,i,s,o;let l,c,d,u,p,m;if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let h=t.session??"default",f=await e.sessions.get(h),w=await e.backend.captureSnapshot({session:h,requestId:t.requestId,appId:f?.appId,appBundleId:f?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),b=(n=w,a=e,n.snapshot?n.snapshot:{nodes:n.nodes??[],truncated:n.truncated,backend:n.backend,createdAt:e8(a)}),g=e8(e);return{snapshot:b,result:w,session:f,warnings:(l=[...(i={result:w,snapshot:b,options:t,session:f,capturedAt:b.createdAt??g,runtimeNow:g}).result.warnings??[]],c=!0===i.options.interactiveOnly,d=i.result.analysis,"android"===i.snapshot.backend&&c&&0===i.snapshot.nodes.length&&d&&(d.rawNodeCount??0)>=12&&(l.push(`Interactive snapshot is empty after filtering ${d.rawNodeCount} raw Android nodes. Likely causes: depth too low, transient route change, or collector filtering.`),"number"==typeof i.options.depth&&"number"==typeof d.maxDepth&&d.maxDepth>=i.options.depth+2&&l.push(`Interactive output is empty at depth ${i.options.depth}; retry without -d.`)),p=!!(u=i.session?.snapshot)&&[i.capturedAt,i.runtimeNow].some(e=>{let t=e-u.createdAt;return t>=0&&t<=2e3}),!i.result.freshness&&u&&p&&(s=u.nodes.length,o=i.snapshot.nodes.length,!(s<12)&&o<=Math.floor(.2*s))&&l.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once."),m=i.result.freshness,m?.staleAfterRetries&&"android"===i.snapshot.backend&&("stuck-route"===m.reason?l.push(`Recent ${m.action} was followed by a nearly identical snapshot after ${m.retryCount} automatic retr${1===m.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`):"sharp-drop"===m.reason&&l.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.")),Array.from(new Set(l)))}}function tt(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function tn(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function ta(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function tr(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new r("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function ti(e,t,n={updateSession:!0}){if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let a=t.session??"default",i=await e.sessions.get(a),s=await e.backend.captureSnapshot(e3(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:e8(e)};return n.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:a,session:i,snapshot:o}}async function ts(e,t,n){if(e.backend.readText){let a=await e.backend.readText(e3(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return k(n)}function to(e){return{kind:"selector",selector:e}}function tl(e,t={}){return{kind:"ref",ref:e,...t.fallbackLabel?{fallbackLabel:t.fallbackLabel}:{}}}let tc=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new r("INVALID_ARGS","find requires a value");if("wait"===t.action)return await tg(e,t,n);let a=await ti(e,t,{updateSession:!0,scope:e4(n)?t.query:void 0}),i=S(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];if(!i)throw new r("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let s=`@${i.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:s,node:i}:{kind:"text",ref:s,text:await ts(e,a,i),node:i}},td=async(e,t)=>{if("ref"===t.target.kind){let n=await tr(e,t.session),a=function(e,t,n){let a=R(t);if(!a)throw new r("INVALID_ARGS",n.invalidRefMessage);let i=M(e,a)??(n.fallbackLabel.length>0?g(e,n.fallbackLabel):null);if(!i)throw new r("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:i}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),i=f(a.node,e.backend.platform,{action:"get"}),s={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:s,node:a.node,selectorChain:i}:{kind:"text",target:s,text:await ts(e,n,a.node),node:a.node,selectorChain:i}}let n=await tv(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=f(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let i=await ts(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:i,node:n.node,selectorChain:a}},tu=async(e,t)=>{let n=await td(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new r("COMMAND_FAILED","getText returned non-text result");return n},tp=async(e,t)=>{let n=await td(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new r("COMMAND_FAILED","getAttrs returned non-attrs result");return n},tm=async(e,t)=>{if(!tn(t.predicate))throw new r("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new r("INVALID_ARGS","is text requires expected text value");let n=await ti(e,t,{updateSession:!0}),a=d(t.selector);if("exists"===t.predicate){let i=w(n.snapshot.nodes,a,{platform:e.backend.platform});if(!i)throw new r("COMMAND_FAILED",v(a,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:i.selector.raw,matches:i.matches,selectorChain:a.selectors.map(e=>e.raw)}}let i=b(n.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!i)throw new r("COMMAND_FAILED",v(a,[],{unique:!0}));let s=function(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=c(n),o=p(n,i),l=!0===n.selected,d="text"===t?u(n):function(e,t){if(!0===e.hittable)return!0;if(ta(e.rect))return e0(e,t);if(e.rect)return!1;let n=function(e,t){let n=new Map(t.map(e=>[e.index,e])),a=e,r=new Set;for(;"number"==typeof a.parentIndex&&!r.has(a.index);){r.add(a.index);let e=n.get(a.parentIndex);if(!e)break;if(function(e){let t=A(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||ta(e.rect))}(e))return e;a=e}return null}(e,t);return!!n&&(!0===n.hittable||!!ta(n.rect)&&e0(n,t))}(n,a),m=!1;switch(t){case"visible":m=d;break;case"hidden":m=!d;break;case"editable":m=o;break;case"selected":m=l;break;case"text":m=s===(r??"")}let h="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:d,editable:o,selected:l})}`;return{pass:m,actualText:s,details:h}}({predicate:t.predicate,node:i.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new r("COMMAND_FAILED",`is ${t.predicate} failed for selector ${i.selector.raw}: ${s.details}`);return{predicate:t.predicate,pass:!0,selector:i.selector.raw,..."text"===t.predicate?{text:s.actualText}:{},selectorChain:a.selectors.map(e=>e.raw)}},th=async(e,t)=>await tm(e,{...t,predicate:"visible",selector:t.target.selector}),tf=async(e,t)=>await tm(e,{...t,predicate:"hidden",selector:t.target.selector}),tw=async(e,t)=>{if("sleep"===t.target.kind)return await e6(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await tr(e,t.session),a=R(t.target.ref);if(!a)throw new r("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let i=M(n.snapshot.nodes,a),s=i?y(i,n.snapshot.nodes):void 0;if(!s)throw new r("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await tx(e,t,s,t.target.timeoutMs)}if("selector"===t.target.kind)return await ty(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new r("INVALID_ARGS","wait requires text");return await tx(e,t,t.target.text,t.target.timeoutMs)},tb=async(e,t)=>{let n=await tw(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new r("COMMAND_FAILED","waitForText returned non-text result");return n};async function tg(e,t,n){let a=t.timeoutMs??1e4,i=e8(e);for(;e8(e)-i<a;){if(S((await ti(e,t,{updateSession:!0,scope:e4(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:e8(e)-i};await e6(e,300)}throw new r("COMMAND_FAILED","find wait timed out")}async function ty(e,t,n,a){let i=a??1e4,s=e8(e),o=d(n);for(;e8(e)-s<i;){let n=w((await ti(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:e8(e)-s};await e6(e,300)}throw new r("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function tx(e,t,n,a){let i=a??1e4,s=e8(e);for(;e8(e)-s<i;){if(e.backend.findText?(await e.backend.findText(e3(e,t),n)).found:await tk(e,t,n))return{kind:"text",text:n,waitedMs:e8(e)-s};await e6(e,300)}throw new r("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function tk(e,t,n){return!!g((await ti(e,t,{updateSession:!0})).snapshot.nodes,n)}async function tv(e,t,n,a){let i=await ti(e,{...t,session:n},{updateSession:!0}),s=d(a.selector),o=b(i.snapshot.nodes,s,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!o)throw new r("COMMAND_FAILED",v(s,[],{unique:!0}));return{capture:i,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function tA(e,t,n,a){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>a)throw new r("INVALID_ARGS",`${t} must be an integer between ${n} and ${a}`);return e}function tI(e,t){let n=function(e,t){let n=tM(t.rect);if(!n)return null;let a=t,r=new Set;for(;!r.has(a.ref);){r.add(a.ref);let t=e.filter(e=>{if(e.parentIndex!==a.index||!e.hittable)return!1;let t=tM(e.rect);return!!t&&tR(t,n)});if(1!==t.length)break;a=t[0]}return a===t?null:a}(e,t);if(n?.rect&&tN(n.rect))return n;let a=h(e,t);return a?.rect&&tN(a.rect)?!function(e,t,n){var a,r,i,s;let o,l,c,d=tM(e.rect),u=tM(t.rect);if(!d||!u)return!1;let p=function(e,t){let n=N(t),a=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>tM(e.rect)).filter(e=>null!==e);if(0===a.length)return null;let r=a.filter(e=>eV(e,n.x,n.y));return eX(r.length>0?r:a)}(n,d);return!!p&&(a=u,r=p,o=(i=a,s=r,Math.max(0,Math.min(i.x+i.width,s.x+s.width)-Math.max(i.x,s.x))*Math.max(0,Math.min(i.y+i.height,s.y+s.height)-Math.max(i.y,s.y))),l=a.width*a.height,c=r.width*r.height,!(o<=0)&&!(l<=0)&&!(c<=0)&&!!(o/c>=.9)&&!!(o/l>=.8))&&!tR(d,u)}(t,a,e)?a:t:t}function tN(e){let t=tM(e);if(!t)return null;let n=N(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function tM(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),a=Number(e.width),r=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(a)&&Number.isFinite(r)&&!(a<0)&&!(r<0)?{x:t,y:n,width:a,height:r}:null}function tR(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function tS(e,t,n){if(await tO(e,t,n.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let a=await t_(e,t,t.target),i=a.resolved,s=n.promoteToHittableAncestor?tI(a.snapshot.nodes,i.node):i.node;return function(e,t,n,a){let i=e.rect?e1(e,t):null;if(!(!e.rect||!i||e0(e,t)))throw new r("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${a}`,{reason:"offscreen_ref",ref:R(n),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${a} with the new ref or a selector.`})}(s,a.snapshot.nodes,t.target.ref,n.action),{kind:"ref",point:tE(s,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${i.ref}`},node:s,selectorChain:f(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:y(s,a.snapshot.nodes)}}let a=await tP(e,t,n.requireInteractive),i=d(t.target.selector),s=b(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!s||!s.node.rect)throw new r("COMMAND_FAILED",v(i,s?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?tI(a.snapshot.nodes,s.node):s.node;return{kind:"selector",point:tE(o,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:s.selector.raw},node:o,selectorChain:f(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:y(o,a.snapshot.nodes)}}async function tP(e,t,n){if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let a=t.session??"default",i=await e.sessions.get(a);if(!i)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");let s=await e.backend.captureSnapshot(e3(e,t),{interactiveOnly:n,compact:n}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:e8(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function tO(e,t,n){if("macos"!==e.backend.platform)return;let a=await tD(e,t);if(("desktop"===a||"menubar"===a)&&("menubar"!==a||"click"!==n&&"press"!==n))throw new r("UNSUPPORTED_OPERATION",`${n} is not supported on macOS ${a} sessions yet. Open an app session to act, or use the ${a} surface to inspect.`)}async function tD(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function t_(e,t,n){let a=t.session??"default",i=await e.sessions.get(a);if(!i)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new r("INVALID_ARGS","No snapshot in session. Run snapshot first.");let s=n.fallbackLabel??"",o=tT(i.snapshot.nodes,n.ref,{fallbackLabel:s,requireRect:!0});if(o)return{snapshot:i.snapshot,resolved:o};let l=await tP(e,t,!0),c=tT(l.snapshot.nodes,n.ref,{fallbackLabel:s,requireRect:!0});if(!c)throw new r("COMMAND_FAILED",`Ref ${n.ref} not found or has no bounds`);return{...l,resolved:c}}function tT(e,t,n){let a=R(t);if(!a)throw new r("INVALID_ARGS",`Invalid ref: ${t}`);let i=M(e,a);if(t$(i,n.requireRect))return{ref:a,node:i};let s=n.fallbackLabel.length>0?g(e,n.fallbackLabel):null;return t$(s,n.requireRect)?{ref:a,node:s}:null}function tE(e,t){if(!e.rect)throw new r("COMMAND_FAILED",t);let n=N(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new r("COMMAND_FAILED",t);return n}function t$(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:n,y:a,width:r,height:i}=e.rect;if(!Number.isFinite(Number(n))||!Number.isFinite(Number(a))||!Number.isFinite(Number(r))||!Number.isFinite(Number(i))||0>Number(r)||0>Number(i))return!1;let s=N(e.rect);return Number.isFinite(s.x)&&Number.isFinite(s.y)}let tL=async(e,t)=>{let n=await tS(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new r("UNSUPPORTED_OPERATION","focus is not supported by this backend");let a=tz(await e.backend.focus(e3(e,t),n.point));return{...n,...a?{backendResult:a}:{},...P(`Focused (${n.point.x}, ${n.point.y})`)}},tC=async(e,t)=>{let n=await tS(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new r("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let a=void 0===t.durationMs?void 0:tA(t.durationMs,"durationMs",0,12e4),i=tz(await e.backend.longPress(e3(e,t),n.point,{durationMs:a}));return{...n,...void 0!==a?{durationMs:a}:{},...i?{backendResult:i}:{},...P(`Long pressed (${n.point.x}, ${n.point.y})`)}},tU=async(e,t)=>{var n,a;if(!e.backend.scroll)throw new r("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let i=tV(t.direction,"scroll direction"),s=(n=t.amount,a="scroll amount",void 0===n?void 0:tY(n,a)),o=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new r("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==s&&void 0!==o)throw new r("INVALID_ARGS","scroll accepts either amount or pixels, not both");let l=await tG(e,t),c="viewport"===l.kind?{kind:"viewport"}:{kind:"point",point:l.point},d=tz(await e.backend.scroll(e3(e,t),c,{direction:i,...void 0!==s?{amount:s}:{},...void 0!==o?{pixels:o}:{}}));return{...l,direction:i,...void 0!==s?{amount:s}:{},...void 0!==o?{pixels:o}:{},...d?{backendResult:d}:{},...P(void 0!==o?`Scrolled ${i} by ${o}px`:void 0!==s?`Scrolled ${i} by ${s}`:`Scrolled ${i}`)}},tF=async(e,t)=>{if(!e.backend.swipe)throw new r("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await tB(e,t),a=function(e,t){if(t.to)return{point:tX(t.to,"to")};let n=tV(t.direction,"swipe direction"),a=tY(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-a},direction:n,distance:a};case"down":return{point:{x:e.x,y:e.y+a},direction:n,distance:a};case"left":return{point:{x:e.x-a,y:e.y},direction:n,distance:a};case"right":return{point:{x:e.x+a,y:e.y},direction:n,distance:a}}}(n.point,t),i=void 0===t.durationMs?void 0:tA(t.durationMs,"durationMs",16,1e4),s=tz(await e.backend.swipe(e3(e,t),n.point,a.point,{durationMs:i}));return{kind:"swipe",from:n.point,to:a.point,...a.direction?{direction:a.direction}:{},...void 0!==a.distance?{distance:a.distance}:{},...void 0!==i?{durationMs:i}:{},...n.target?{fromTarget:n.target}:{},...s?{backendResult:s}:{},...P("Swiped")}},tq=async(e,t)=>{if(!e.backend.pinch)throw new r("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await tO(e,t,"pinch");let n=tY(t.scale,"pinch scale"),a=t.center?await tS(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=tz(await e.backend.pinch(e3(e,t),{scale:n,...a?{center:a.point}:{}}));return{kind:"pinch",scale:n,...a?{center:a.point,centerTarget:a}:{},...i?{backendResult:i}:{},...P(`Pinched to scale ${n}`)}};async function tG(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await tO(e,t,"scroll"),{kind:"viewport"}):await tS(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function tB(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await tO(e,t,"swipe"),{point:tX(t.from,"from")};let a=await tS(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a.point,target:a}}if(!t.direction)throw new r("INVALID_ARGS","swipe requires from+to or a direction");return await tO(e,t,"swipe"),{point:N(function(e){let t=e.filter(t=>e0(t,e)).map(e=>e.rect).filter(tH),n=t.length>0?t:e.map(e=>e.rect).filter(tH);if(0===n.length)throw new r("COMMAND_FAILED","Cannot infer viewport for directional swipe");let a=Math.min(...n.map(e=>e.x)),i=Math.min(...n.map(e=>e.y));return{x:a,y:i,width:Math.max(...n.map(e=>e.x+e.width))-a,height:Math.max(...n.map(e=>e.y+e.height))-i}}((await tP(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function tV(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new r("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function tX(e,t){let n=Number(e.x),a=Number(e.y);if(!Number.isFinite(n)||!Number.isFinite(a))throw new r("INVALID_ARGS",`${t} point requires finite x and y`);return{x:n,y:a}}function tY(e,t){if(!Number.isFinite(e)||e<=0)throw new r("INVALID_ARGS",`${t} must be a positive number`);return e}function tH(e){return!!(e&&e.width>0&&e.height>0)}function tz(e){return e&&"object"==typeof e?e:void 0}let tj=async(e,t)=>await tZ(e,t,"press"),tK=async(e,t)=>await tZ(e,t,"click"),tW=async(e,t)=>{var n;if(!t.text)throw new r("INVALID_ARGS","fill requires text");let a=await tS(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new r("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=tQ(await e.backend.fill(e3(e,t),a.point,t.text,{delayMs:t.delayMs})),s="node"in a?a.node.type??"":"",o=s&&!I(s,e.backend.platform)?`fill target ${n=a,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${s}", attempting fill anyway.`:void 0;return{...a,text:t.text,...o?{warning:o}:{},...i?{backendResult:i}:{}}},tJ=async(e,t)=>{let n=t.text;if(!n)throw new r("INVALID_ARGS","type requires text");let a=function(e){let t=e.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}(n);if(a)throw new r("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new r("UNSUPPORTED_OPERATION","type is not supported by this backend");let i=tA(t.delayMs??0,"delay-ms",0,1e4),s=tQ(await e.backend.typeText(e3(e,t),n,{delayMs:i}));return{kind:"text",text:n,delayMs:i,...s?{backendResult:s}:{},...P(`Typed ${Array.from(n).length} chars`)}};async function tZ(e,t,n){let a=await tS(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new r("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=tQ(await e.backend.tap(e3(e,t),a.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...a,...i?{backendResult:i}:{}}}function tQ(e){return e&&"object"==typeof e?e:void 0}let t0=async(e,t={})=>{if(!e.backend.pressBack)throw new r("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new r("INVALID_ARGS","system.back mode must be in-app or system");let a=t9(await e.backend.pressBack(e3(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...P("Back")}},t1=async(e,t={})=>{if(!e.backend.pressHome)throw new r("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=t9(await e.backend.pressHome(e3(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...P("Home")}},t2=async(e,t)=>{if(!e.backend.rotate)throw new r("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new r("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=t9(await e.backend.rotate(e3(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...P(`Rotated to ${n}`)}},t5=async(e,t={})=>{if(!e.backend.setKeyboard)throw new r("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let n=t.action??"status";if("status"!==n&&"get"!==n&&"dismiss"!==n)throw new r("INVALID_ARGS","system.keyboard action must be status, get, or dismiss");let a=await e.backend.setKeyboard(e3(e,t),{action:n}),i=t9(a);if("dismiss"===n){let e=t7(a)?a.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:t7(a)?a:{},...i?{backendResult:i}:{},...P(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:t7(a)?a:{},...i?{backendResult:i}:{}}},t4=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new r("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(e3(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new r("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new r("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new r("INVALID_ARGS","system.clipboard write requires text");let n=t9(await e.backend.setClipboard(e3(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...P("Clipboard updated")}},t3=async(e,t={})=>{if(!e.backend.openSettings)throw new r("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=function(e,t){if(void 0===e)return;let n=e.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}(t.target,"target"),a=t9(await e.backend.openSettings(e3(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...P(n?`Opened settings: ${n}`:"Opened settings")}},t8=async(e,t={})=>{if(!e.backend.handleAlert)throw new r("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let n=t.action??"get";if("get"!==n&&"accept"!==n&&"dismiss"!==n&&"wait"!==n)throw new r("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let a=void 0===t.timeoutMs?void 0:tA(t.timeoutMs,"timeoutMs",0,12e4),i=await e.backend.handleAlert(e3(e,t),n,{timeoutMs:a});var s=n,o=i;if("get"===s){if("alertStatus"!==o.kind)throw new r("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:s,alert:o.alert}}if("wait"===s){if("alertWait"!==o.kind)throw new r("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:s,alert:o.alert,...void 0!==o.waitedMs?{waitedMs:o.waitedMs}:{},...void 0!==o.timedOut?{timedOut:o.timedOut}:{},...P(o.alert?"Alert visible":"Alert wait timed out")}}if("alertHandled"!==o.kind)throw new r("COMMAND_FAILED",`system.alert ${s} returned an invalid backend result`);return{kind:"alertHandled",action:s,handled:o.handled,...o.alert?{alert:o.alert}:{},...o.button?{button:o.button}:{},...P(o.handled?`Alert ${s}ed`:"No alert handled")}},t6=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new r("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=t9(await e.backend.openAppSwitcher(e3(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...P("Opened app switcher")}};function t7(e){return!!(e&&"object"==typeof e)}function t9(e){return e&&"object"==typeof e?e:void 0}let ne=/^[A-Za-z0-9_.:-]{1,64}$/,nt=async(e,t)=>{var n;if(!e.backend.openApp)throw new r("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=no(e.app,"app"),a=no(e.appId,"appId"),i=no(e.bundleId,"bundleId"),s=no(e.packageName,"packageName"),o=no(e.url,"url"),l=no(e.activity,"activity"),c={...n?{app:n}:{},...a?{appId:a}:{},...i?{bundleId:i}:{},...s?{packageName:s}:{},...o?{url:o}:{},...l?{activity:l}:{}};if(!((t=c).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new r("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return c}(t),i=np(await e.backend.openApp(nu(e,t),a,{relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...i?{backendResult:i}:{},...P(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},nn=async(e,t={})=>{if(!e.backend.closeApp)throw new r("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=no(t.app,"app"),a=np(await e.backend.closeApp(nu(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...P(n?`Closed: ${n}`:"Closed app")}},na=async(e,t={})=>{if(!e.backend.listApps)throw new r("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nu(e,t),t.filter??"all")}},nr=async(e,t)=>{if(!e.backend.getAppState)throw new r("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nl(t.app,"app"),a=await e.backend.getAppState(nu(e,t),n);return{kind:"appState",app:n,state:a}},ni=async(e,t)=>{if(!e.backend.pushFile)throw new r("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nl(t.app,"app"),a=await nc(e,t.input);try{let r=await e.backend.pushFile(nu(e,t),a.backendInput,n),i=np(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...P(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},ns=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new r("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let i=function(e){let t=nl(e,"name");if(!ne.test(t))throw new r("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${i}"`,void 0!==n&&nd(n,a,8192);let s=np(await e.backend.triggerAppEvent(nu(e,t),{name:i,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:i,...t.payload?{payload:t.payload}:{},...s?{backendResult:s}:{},...P(`Triggered app event: ${i}`)}};function no(e,t){if(void 0!==e)return nl(e,t)}function nl(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function nc(e,t){if(!t||"object"!=typeof t)throw new r("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nd(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await E(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nd(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new r("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new r("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new r("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new r("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nu(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function np(e){return e&&"object"==typeof e?e:void 0}let nm=async(e,t={})=>{if(!e.backend.listDevices)throw new r("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(e3(e,t),t.filter)}},nh=async(e,t={})=>{if(!e.backend.bootDevice)throw new r("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=function(e){if(!e)return;let t=nA(e.id,"target.id"),n=nA(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}(t.target),a=nM(await e.backend.bootDevice(e3(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...P("Booted device")}},nf=async(e,t)=>{if(!e.backend.ensureSimulator)throw new r("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=nI(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(e3(e,t),{device:n,...t.runtime?{runtime:nI(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},nw=async(e,t)=>await ny(e,t,"install"),nb=async(e,t)=>await ny(e,t,"reinstall"),ng=async(e,t)=>await ny(e,t,"installFromSource");async function ny(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",i=e.backend[a];if(!i)throw new r("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let s="app"in t&&void 0!==t.app?nI(t.app,"app"):void 0;if("installFromSource"!==n&&!s)throw new r("INVALID_ARGS",`admin.${n} requires app`);let o=e3(e,t),l=await nx(e,o,t.source);try{var c,d,u,p,m;let t,a,r,h,f,w,b,g,y=await i.call(e.backend,o,{...s?{app:s}:{},source:l.source});return c=n,d=s,u=l.source,p=y,t=nM(p),a=nN(p,"appName"),r=nN(p,"appId"),h=nN(p,"bundleId"),f=nN(p,"packageName"),w=nN(p,"launchTarget"),b=nN(p,"installablePath"),g=nN(p,"archivePath"),{kind:"reinstall"===c?"appReinstalled":"installFromSource"===c?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...r?{appId:r}:{},...a?{appName:a}:{},...h?{bundleId:h}:{},...f?{packageName:f}:{},...w?{launchTarget:w}:{},...b?{installablePath:b}:{},...g?{archivePath:g}:{},...t?{backendResult:t}:{},...P(`${"reinstall"===c?"Reinstalled":"Installed"}: ${a??w??d??(m=u,"path"===m.kind?m.path:"uploadedArtifact"===m.kind?m.id:m.url)}`)}}finally{await l.cleanup?.()}}async function nx(e,t,n){let a=nv(n),r=await nk(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nv(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nk(e,t){if("url"===t.kind)return{source:t};let n=await E(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nv(e){if(!e||"object"!=typeof e)throw new r("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nI(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nI(e.id,"source.id")};if("url"===e.kind){let t=nI(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new r("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new r("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new r("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function nA(e,t){if(void 0!==e)return nI(e,t)}function nI(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}function nN(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function nM(e){return e&&"object"==typeof e?e:void 0}let nR=async(e,t)=>{let n=nP(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new r("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let i=t.out?await $(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var s,o,l,c,d;let r,u,p=(s=t,o=i?.path,r=void 0===s.fps?void 0:tA(s.fps,"fps",1,60),u=void 0===s.quality?void 0:tA(s.quality,"quality",5,10),{...o?{outPath:o}:{},...void 0!==r?{fps:r}:{},...void 0!==u?{quality:u}:{},...void 0!==s.hideTouches?{showTouches:!0!==s.hideTouches}:{}}),m=await a.call(e.backend,e3(e,t),p),h=await i?.publish();return l=n,c=m,d=h,{..."string"==typeof c.path?{path:c.path}:{},..."string"==typeof c.telemetryPath?{telemetryPath:c.telemetryPath}:{},..."string"==typeof c.warning?{warning:c.warning}:{},...nO(l,c,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await i?.cleanup?.(),e}},nS=async(e,t)=>{let n=nP(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new r("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let i=t.out?await $(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var s,o,l;let r={...i?.path?{outPath:i.path}:{}},c=await a.call(e.backend,e3(e,t),r),d=await i?.publish();return s=n,o=c,l=d,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...nO(s,o,l,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await i?.cleanup?.(),e}};function nP(e,t){if("start"===e||"stop"===e)return e;throw new r("INVALID_ARGS",`${t} action must be start or stop`)}function nO(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...P("start"===e?a.startMessage:a.stopMessage)}}let nD=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function n_(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(nD.test(a))n[a]="[REDACTED]",t=!0;else{let e=nL(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function nT(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n$(t,nC);return nU(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??nL(e,2048)}function nE(e){return n$(e,e=>nL(e,2048))}function n$(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=n$(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(nD.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n$(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function nL(e,t){if(void 0===e)return{redacted:!1};let n=nC(e);return nU(n.value,t,n.redacted)}function nC(e){let t=!1,n=e.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`));return{value:n=(n=(n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,a,r)=>(t=!0,`${String(n)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),redacted:t}}function nU(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}let nF=async(e,t={})=>{var n,a;let i;if(!e.backend.readLogs)throw new r("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return i=!0===(n=await e.backend.readLogs(await nB(e,t),{...nV(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:nY(a.levels,"levels")}:{},...void 0!==a.search?{search:nH(a.search,"search")}:{},...void 0!==a.source?{source:nH(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=nL(e.message,4096),n=nE(e.metadata);return i||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},nq=async(e,t={})=>{var n,a,i;let s;if(!e.backend.dumpNetwork)throw new r("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let o={...nV(i=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new r("INVALID_ARGS","network include must be summary, headers, body, or all")}(i.include)};return n=await e.backend.dumpNetwork(await nB(e,t),o),a=o.include??"summary",s=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{let t=e.url?function(e){try{let t=new URL(e),n=!1;for(let e of Array.from(t.searchParams.keys()))nD.test(e)&&(t.searchParams.set(e,"[REDACTED]"),n=!0);return{value:t.toString(),redacted:n}}catch{return nL(e,2048)}}(e.url):void 0,n="headers"===a||"all"===a?n_(e.requestHeaders):void 0,r="headers"===a||"all"===a?n_(e.responseHeaders):void 0,i="body"===a||"all"===a?nT(e.requestBody):void 0,o="body"===a||"all"===a?nT(e.responseBody):void 0,l=nE(e.metadata);return s||=(t?.redacted??!1)||(n?.redacted??!1)||(r?.redacted??!1)||(i?.redacted??!1)||(o?.redacted??!1)||l.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...t?{url:t.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...n?.value?{requestHeaders:n.value}:{},...r?.value?{responseHeaders:r.value}:{},...i?.value!==void 0?{requestBody:i.value}:{},...o?.value!==void 0?{responseBody:o.value}:{},...l.value?{metadata:l.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:s,...n.notes?{notes:n.notes}:{}}},nG=async(e,t={})=>{var n,a;let i;if(!e.backend.measurePerf)throw new r("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return i=!0===(n=await e.backend.measurePerf(await nB(e,t),{...nX(a=t),...void 0!==a.sampleMs?{sampleMs:tA(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:nY(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=nL(e.message,4096),n=nE(e.metadata);return i||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}};async function nB(e,t){let n=e3(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function nV(e,t,n,a){return{...nX(e),...void 0!==e.cursor?{cursor:nH(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:tA(e.limit,a,1,n)}}function nX(e){return{...void 0!==e.since?{since:nH(e.since,"since")}:{},...void 0!==e.until?{until:nH(e.until,"until")}:{}}}function nY(e,t,n=50){if(!Array.isArray(e))throw new r("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new r("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nH(e,`${t}[${n}]`))}function nH(e,t){let n=e.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nz=[{command:"screenshot",category:"portable-runtime",status:"implemented"},{command:"diff screenshot",category:"portable-runtime",status:"implemented"},{command:"snapshot",category:"portable-runtime",status:"implemented"},{command:"diff snapshot",category:"portable-runtime",status:"implemented"},{command:"capture.screenshot",category:"portable-runtime",status:"implemented"},{command:"capture.diffScreenshot",category:"portable-runtime",status:"implemented"},{command:"capture.snapshot",category:"portable-runtime",status:"implemented"},{command:"capture.diffSnapshot",category:"portable-runtime",status:"implemented"},{command:"find read-only",category:"portable-runtime",status:"implemented"},{command:"get",category:"portable-runtime",status:"implemented"},{command:"is",category:"portable-runtime",status:"implemented"},{command:"wait",category:"portable-runtime",status:"implemented"},{command:"selectors.find",category:"portable-runtime",status:"implemented"},{command:"selectors.get",category:"portable-runtime",status:"implemented"},{command:"selectors.is",category:"portable-runtime",status:"implemented"},{command:"selectors.wait",category:"portable-runtime",status:"implemented"},{command:"alert",category:"portable-runtime",status:"planned"},{command:"click",category:"portable-runtime",status:"implemented"},{command:"press",category:"portable-runtime",status:"implemented"},{command:"fill",category:"portable-runtime",status:"implemented"},{command:"interactions.click",category:"portable-runtime",status:"implemented"},{command:"interactions.press",category:"portable-runtime",status:"implemented"},{command:"interactions.fill",category:"portable-runtime",status:"implemented"},{command:"interactions.typeText",category:"portable-runtime",status:"implemented"},{command:"longpress",category:"portable-runtime",status:"planned"},{command:"swipe",category:"portable-runtime",status:"planned"},{command:"focus",category:"portable-runtime",status:"planned"},{command:"type",category:"portable-runtime",status:"implemented"},{command:"scroll",category:"portable-runtime",status:"planned"},{command:"pinch",category:"portable-runtime",status:"planned"},{command:"interactions.focus",category:"portable-runtime",status:"implemented"},{command:"interactions.longPress",category:"portable-runtime",status:"implemented"},{command:"interactions.swipe",category:"portable-runtime",status:"implemented"},{command:"interactions.scroll",category:"portable-runtime",status:"implemented"},{command:"interactions.pinch",category:"portable-runtime",status:"implemented"},{command:"open",category:"portable-runtime",status:"planned"},{command:"close",category:"portable-runtime",status:"planned"},{command:"apps",category:"portable-runtime",status:"planned"},{command:"appstate",category:"portable-runtime",status:"planned"},{command:"apps.open",category:"portable-runtime",status:"implemented"},{command:"apps.close",category:"portable-runtime",status:"implemented"},{command:"apps.list",category:"portable-runtime",status:"implemented"},{command:"apps.state",category:"portable-runtime",status:"implemented"},{command:"apps.push",category:"portable-runtime",status:"implemented"},{command:"apps.triggerEvent",category:"portable-runtime",status:"implemented"},{command:"back",category:"portable-runtime",status:"planned"},{command:"home",category:"portable-runtime",status:"planned"},{command:"rotate",category:"portable-runtime",status:"planned"},{command:"app-switcher",category:"portable-runtime",status:"planned"},{command:"keyboard",category:"portable-runtime",status:"planned"},{command:"clipboard",category:"portable-runtime",status:"planned"},{command:"settings",category:"portable-runtime",status:"planned"},{command:"system.back",category:"portable-runtime",status:"implemented"},{command:"system.home",category:"portable-runtime",status:"implemented"},{command:"system.rotate",category:"portable-runtime",status:"implemented"},{command:"system.appSwitcher",category:"portable-runtime",status:"implemented"},{command:"system.keyboard",category:"portable-runtime",status:"implemented"},{command:"system.clipboard",category:"portable-runtime",status:"implemented"},{command:"system.settings",category:"portable-runtime",status:"implemented"},{command:"system.alert",category:"portable-runtime",status:"implemented"},{command:"push",category:"portable-runtime",status:"planned"},{command:"trigger-app-event",category:"portable-runtime",status:"planned"},{command:"devices",category:"backend-admin",status:"implemented"},{command:"boot",category:"backend-admin",status:"implemented"},{command:"ensure-simulator",category:"backend-admin",status:"implemented"},{command:"install",category:"backend-admin",status:"implemented"},{command:"reinstall",category:"backend-admin",status:"implemented"},{command:"install-from-source",category:"backend-admin",status:"implemented"},{command:"admin.devices",category:"backend-admin",status:"implemented"},{command:"admin.boot",category:"backend-admin",status:"implemented"},{command:"admin.ensureSimulator",category:"backend-admin",status:"implemented"},{command:"admin.install",category:"backend-admin",status:"implemented"},{command:"admin.reinstall",category:"backend-admin",status:"implemented"},{command:"admin.installFromSource",category:"backend-admin",status:"implemented"},{command:"session",category:"transport-session",status:"planned"},{command:"connect",category:"environment",status:"planned"},{command:"disconnect",category:"environment",status:"planned"},{command:"connection",category:"environment",status:"planned"},{command:"metro",category:"environment",status:"planned"},{command:"react-devtools",category:"environment",status:"implemented"},{command:"record",category:"capability-gated",status:"implemented"},{command:"trace",category:"capability-gated",status:"implemented"},{command:"replay",category:"capability-gated",status:"planned"},{command:"test",category:"capability-gated",status:"planned"},{command:"batch",category:"capability-gated",status:"implemented"},{command:"logs",category:"capability-gated",status:"implemented"},{command:"network",category:"capability-gated",status:"implemented"},{command:"perf",category:"capability-gated",status:"implemented"},{command:"diagnostics.logs",category:"capability-gated",status:"implemented"},{command:"diagnostics.network",category:"capability-gated",status:"implemented"},{command:"diagnostics.perf",category:"capability-gated",status:"implemented"}];async function nj(e,t){let n=function(e,t){let n=t??50;if(!Number.isInteger(n)||n<1||n>50)throw new r("INVALID_ARGS","batch maxSteps must be an integer between 1 and 50");if(!Array.isArray(e)||0===e.length)throw new r("INVALID_ARGS","batch requires a non-empty steps array");if(e.length>n)throw new r("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${n}`);for(let t=0;t<e.length;t+=1){let n=e[t];if(!n||"object"!=typeof n||"string"!=typeof n.command)throw new r("INVALID_ARGS",`Invalid batch step at index ${t}`);if("batch"===n.command)throw new r("INVALID_ARGS",`Batch step ${t+1} cannot run ${n.command}`)}return e}(e.options.steps,e.options.maxSteps),a=Date.now(),i=[];for(let a=0;a<n.length;a+=1){let r=function(e,t,n){var a;return{...e,context:e.context??n,options:{...(a=t).session?{session:a.session}:{},...a.requestId?{requestId:a.requestId}:{},...a.signal?{signal:a.signal}:{},...a.metadata?{metadata:a.metadata}:{},...e.options??{}}}}(n[a],e.options,e.context),s=Date.now(),o=await t(r),l=Date.now()-s;if(o.ok){i.push({step:a+1,command:r.command,ok:!0,data:o.data,durationMs:l});continue}if(i.push({step:a+1,command:r.command,ok:!1,error:o.error,durationMs:l}),!1!==e.options.stopOnError)break}return{kind:"batch",total:n.length,executed:i.length,failed:i.filter(e=>!e.ok).length,totalDurationMs:Date.now()-a,results:i}}function nK(e){let t=async n=>{try{if(function(e){if("batch"===e.command||Object.hasOwn(nJ,e.command))return;let t=nz.find(t=>t.command===e.command);if(t?.status==="planned")throw new r("NOT_IMPLEMENTED",`Command ${e.command} is planned but not implemented in the runtime router yet`,{command:e.command});throw new r("UNSUPPORTED_OPERATION",`Unknown runtime command: ${e.command}`,{command:e.command})}(n),await e.beforeDispatch?.(n),"batch"===n.command)return{ok:!0,data:await nj(n,t)};let a=await e.createRuntime(n);return{ok:!0,data:await nZ(a,n)}}catch(t){return{ok:!1,error:e.formatError?.(t,n)??i(t)}}};return{dispatch:t}}function nW(e){return async(t,n)=>await e(t,n.options)}let nJ={"capture.screenshot":nW(C),"capture.diffScreenshot":nW(eM),"capture.snapshot":nW(e7),"capture.diffSnapshot":nW(e9),"selectors.find":nW(tc),"selectors.get":nW(td),"selectors.is":nW(tm),"selectors.wait":nW(tw),"interactions.click":nW(tK),"interactions.press":nW(tj),"interactions.fill":nW(tW),"interactions.typeText":nW(tJ),"interactions.focus":nW(tL),"interactions.longPress":nW(tC),"interactions.swipe":nW(tF),"interactions.scroll":nW(tU),"interactions.pinch":nW(tq),"system.back":nW(t0),"system.home":nW(t1),"system.rotate":nW(t2),"system.keyboard":nW(t5),"system.clipboard":nW(t4),"system.settings":nW(t3),"system.alert":nW(t8),"system.appSwitcher":nW(t6),"apps.open":nW(nt),"apps.close":nW(nn),"apps.list":nW(na),"apps.state":nW(nr),"apps.push":nW(ni),"apps.triggerEvent":nW(ns),"admin.devices":nW(nm),"admin.boot":nW(nh),"admin.ensureSimulator":nW(nf),"admin.install":nW(nw),"admin.reinstall":nW(nb),"admin.installFromSource":nW(ng),record:nW(nR),trace:nW(nS),"diagnostics.logs":nW(nF),"diagnostics.network":nW(nq),"diagnostics.perf":nW(nG)};async function nZ(e,t){let n=nJ[t.command];if(!n)throw new r("UNSUPPORTED_OPERATION",`Router command ${t.command} is not a runtime command`);return await n(e,t)}let nQ={capture:{screenshot:C,diffScreenshot:eM,snapshot:e7,diffSnapshot:e9},selectors:{find:tc,get:td,getText:tu,getAttrs:tp,is:tm,isVisible:th,isHidden:tf,wait:tw,waitForText:tb},interactions:{click:tK,press:tj,fill:tW,typeText:tJ,focus:tL,longPress:tC,swipe:tF,scroll:tU,pinch:tq},system:{back:t0,home:t1,rotate:t2,keyboard:t5,clipboard:t4,settings:t3,alert:t8,appSwitcher:t6},apps:{open:nt,close:nn,list:na,state:nr,push:ni,triggerEvent:ns},admin:{devices:nm,boot:nh,ensureSimulator:nf,install:nw,reinstall:nb,installFromSource:ng},recording:{record:nR,trace:nS},diagnostics:{logs:nF,network:nq,perf:nG}};function n0(e){return{capture:{screenshot:t=>nQ.capture.screenshot(e,t),diffScreenshot:t=>nQ.capture.diffScreenshot(e,t),snapshot:t=>nQ.capture.snapshot(e,t),diffSnapshot:t=>nQ.capture.diffSnapshot(e,t)},selectors:{find:t=>nQ.selectors.find(e,t),get:t=>nQ.selectors.get(e,t),getText:(t,n={})=>nQ.selectors.getText(e,{...n,target:t}),getAttrs:(t,n={})=>nQ.selectors.getAttrs(e,{...n,target:t}),is:t=>nQ.selectors.is(e,t),isVisible:(t,n={})=>nQ.selectors.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>nQ.selectors.isHidden(e,{...n,target:t}),wait:t=>nQ.selectors.wait(e,t),waitForText:(t,n={})=>nQ.selectors.waitForText(e,{...n,text:t})},interactions:{click:(t,n={})=>nQ.interactions.click(e,{...n,target:t}),press:(t,n={})=>nQ.interactions.press(e,{...n,target:t}),fill:(t,n,a={})=>nQ.interactions.fill(e,{...a,target:t,text:n}),typeText:(t,n={})=>nQ.interactions.typeText(e,{...n,text:t}),focus:(t,n={})=>nQ.interactions.focus(e,{...n,target:t}),longPress:(t,n={})=>nQ.interactions.longPress(e,{...n,target:t}),swipe:t=>nQ.interactions.swipe(e,t),scroll:t=>nQ.interactions.scroll(e,t),pinch:t=>nQ.interactions.pinch(e,t)},system:{back:t=>nQ.system.back(e,t),home:t=>nQ.system.home(e,t),rotate:t=>nQ.system.rotate(e,t),keyboard:t=>nQ.system.keyboard(e,t),clipboard:t=>nQ.system.clipboard(e,t),settings:t=>nQ.system.settings(e,t),alert:t=>nQ.system.alert(e,t),appSwitcher:t=>nQ.system.appSwitcher(e,t)},apps:{open:t=>nQ.apps.open(e,t),close:t=>nQ.apps.close(e,t),list:t=>nQ.apps.list(e,t),state:t=>nQ.apps.state(e,t),push:t=>nQ.apps.push(e,t),triggerEvent:t=>nQ.apps.triggerEvent(e,t)},admin:{devices:t=>nQ.admin.devices(e,t),boot:t=>nQ.admin.boot(e,t),ensureSimulator:t=>nQ.admin.ensureSimulator(e,t),install:t=>nQ.admin.install(e,t),reinstall:t=>nQ.admin.reinstall(e,t),installFromSource:t=>nQ.admin.installFromSource(e,t)},recording:{record:t=>nQ.recording.record(e,t),trace:t=>nQ.recording.trace(e,t)},observability:{logs:t=>nQ.diagnostics.logs(e,t),network:t=>nQ.diagnostics.network(e,t),perf:t=>nQ.diagnostics.perf(e,t)}}}export{n0 as bindCommands,eJ as buildMobileSnapshotPresentation,eE as buildSnapshotDisplayLines,nz as commandCatalog,nQ as commands,nK as createCommandRouter,_ as decodePng,eZ as deriveMobileSnapshotHiddenContentHints,ej as displayNodeLabel,e$ as formatSnapshotLine,eK as isScrollableType,tn as isSupportedPredicate,eH as normalizeSnapshotTree,D as readCommandMessage,tA as requireIntInRange,to as selector,tl as ref,P as successText,O as withSuccessText};
|