agent-device 0.13.2 → 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 -1
- 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/940.js +1 -0
- package/dist/src/9542.js +2 -2
- package/dist/src/index.d.ts +170 -1927
- package/dist/src/index.js +1 -1
- package/dist/src/{bin.js → internal/bin.js} +31 -31
- package/dist/src/internal/companion-tunnel.js +1 -0
- package/dist/src/internal/daemon.js +43 -0
- package/dist/src/internal/update-check-entry.js +1 -0
- package/dist/src/metro.d.ts +5 -3
- package/dist/src/selectors.js +1 -1
- package/package.json +1 -17
- package/dist/src/4993.js +0 -1
- package/dist/src/5721.js +0 -1
- package/dist/src/7166.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/commands/index.d.ts +0 -1883
- package/dist/src/commands/index.js +0 -1
- package/dist/src/daemon.js +0 -43
- package/dist/src/metro-companion.js +0 -1
- package/dist/src/observability.d.ts +0 -91
- package/dist/src/observability.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
package/dist/src/metro.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare function buildBundleUrl(baseUrl: string, platform: 'ios' | 'andro
|
|
|
4
4
|
|
|
5
5
|
export declare function buildIosRuntimeHints(baseUrl: string): MetroRuntimeHints;
|
|
6
6
|
|
|
7
|
-
declare type CompanionTunnelScope = {
|
|
7
|
+
export declare type CompanionTunnelScope = {
|
|
8
8
|
tenantId: string;
|
|
9
9
|
runId: string;
|
|
10
10
|
leaseId: string;
|
|
@@ -17,7 +17,7 @@ export declare type EnsureMetroTunnelOptions = {
|
|
|
17
17
|
serverBaseUrl: string;
|
|
18
18
|
bearerToken: string;
|
|
19
19
|
localBaseUrl: string;
|
|
20
|
-
bridgeScope:
|
|
20
|
+
bridgeScope: MetroBridgeScope;
|
|
21
21
|
launchUrl?: string;
|
|
22
22
|
profileKey?: string;
|
|
23
23
|
consumerKey?: string;
|
|
@@ -81,6 +81,8 @@ export declare type MetroBridgeRuntimePayload = {
|
|
|
81
81
|
launch_url?: string;
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
+
export declare type MetroBridgeScope = CompanionTunnelScope;
|
|
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;
|
|
86
88
|
|
|
@@ -162,7 +164,7 @@ export declare type PrepareRemoteMetroOptions = {
|
|
|
162
164
|
publicBaseUrl?: string;
|
|
163
165
|
proxyBaseUrl?: string;
|
|
164
166
|
proxyBearerToken?: string;
|
|
165
|
-
bridgeScope?:
|
|
167
|
+
bridgeScope?: MetroBridgeScope;
|
|
166
168
|
launchUrl?: string;
|
|
167
169
|
profileKey?: string;
|
|
168
170
|
consumerKey?: string;
|
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,30 +20,14 @@
|
|
|
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"
|
|
42
30
|
},
|
|
43
|
-
"./observability": {
|
|
44
|
-
"import": "./dist/src/observability.js",
|
|
45
|
-
"types": "./dist/src/observability.d.ts"
|
|
46
|
-
},
|
|
47
31
|
"./metro": {
|
|
48
32
|
"import": "./dist/src/metro.js",
|
|
49
33
|
"types": "./dist/src/metro.d.ts"
|
package/dist/src/4993.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let e=["android.shell","ios.runnerCommand","macos.desktopScreenshot"],n={"android.shell":"androidShell","ios.runnerCommand":"iosRunnerCommand","macos.desktopScreenshot":"macosDesktopScreenshot"};function o(e,n){return e.capabilities?.includes(n)??!1}function a(e,o){let a=n[o];return"function"==typeof e.escapeHatches?.[a]}export{n as BACKEND_CAPABILITY_ESCAPE_HATCH_METHODS,e as BACKEND_CAPABILITY_NAMES,o as hasBackendCapability,a as hasBackendEscapeHatch};
|
package/dist/src/5721.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:fs";let t=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),r=/https?:\/\/[^\s"'<>\])]+/i,n=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i],i="<memory>";function s(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>o(e)));for(let e of t.entries){let t=o(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function u(t,r){let n=y(r?.maxEntries,25,1,200),i=r?.include??"summary",s=y(r?.maxPayloadChars,2048,64,16384),u=y(r?.maxScanLines,4e3,100,2e4);return e.existsSync(t)?l(e.readFileSync(t,"utf8"),{...r,path:t}):{path:t,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:i,limits:{maxEntries:n,maxPayloadChars:s,maxScanLines:u}}}function l(e,n){let s=y(n?.maxEntries,25,1,200),u=n?.backend,l=n?.include??"summary",o=y(n?.maxPayloadChars,2048,64,16384),g=y(n?.maxScanLines,4e3,100,2e4),N=e.split("\n"),T=Math.max(0,N.length-g),E=N.slice(T),I=[];for(let e=E.length-1;e>=0&&I.length<s;e-=1){let n=E[e];if(!n?.trim())continue;let i=function(e,n,i,s,u,l){let o=e[n]?.trim();if(!o)return null;let y=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),g=p(y,["method","httpMethod"]),N=p(y,["url","requestUrl"]),T=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(y,["status","statusCode","responseCode"]),E=t.exec(o),I=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),M=(g??I?.[1]??E?.[1])?.toUpperCase(),$=r.exec(o),L=N??$?.[0];if(!L)return null;let O=T??d(o)??void 0;if(!(g||I?.[1]||E?.[1]||void 0!==O||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let S={method:M,url:L,status:O,timestamp:f(o),packetId:m(o)??void 0,durationMs:c(o)??void 0,raw:x(o,l),line:i};if("android"===s&&function(e,t,r){let n=a(t,r,5),i=e.packetId??n.map(e=>m(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let s=i?a(t,r,12).filter(e=>m(e)===i):n;e.timestamp||(e.timestamp=s.map(e=>f(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=s.map(e=>d(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=s.map(e=>c(e)).find(e=>"number"==typeof e))}(S,e,n),"headers"===u||"all"===u){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return b(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,y);e&&(S.headers=x(e,l))}if("body"===u||"all"===u){let e=h(o,y,["requestBody","body","payload","request"]),t=h(o,y,["responseBody","response"]);e&&(S.requestBody=x(e,l)),t&&(S.responseBody=x(t,l))}return S}(E,e,T+e+1,u,l,o);i&&I.push(i)}return{path:n?.path??i,exists:!0,scannedLines:E.length,matchedLines:I.length,entries:I,include:l,limits:{maxEntries:s,maxPayloadChars:o,maxScanLines:g}}}function o(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function a(e,t,r){let n=[],i=Math.max(0,t-r),s=Math.min(e.length-1,t+r);for(let t=i;t<=s;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function d(e){for(let t of n){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function f(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function m(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function c(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function p(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function h(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return b(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function b(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function x(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function y(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}export{i as NETWORK_LOG_MEMORY_PATH,s as mergeNetworkDumps,u as readRecentNetworkTraffic,l as readRecentNetworkTrafficFromText};
|
package/dist/src/7166.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let e=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,r=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function t(e){var t,s;let o=!1,i=e;return{value:(t=i=(i=(i=(i=(i=i.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,r)=>(o=!0,`${String(r)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,r,t,a)=>(o=!0,`${String(r)}[REDACTED]${String(a)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,r)=>(o=!0,`${String(r)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,r)=>(o=!0,`${String(r)}[REDACTED]`))).replaceAll(r,()=>(o=!0,"[REDACTED]")),s=()=>{o=!0},i=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let r=a(e);return r?(r.redacted&&s(),r.value):e}):t),redacted:o}}function a(r){try{let t=new URL(r),a=function(r){let t=!1;for(let a of Array.from(r.searchParams.keys()))e.test(a)&&(r.searchParams.set(a,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",a=!0),{value:t.toString(),redacted:a}}catch{return}}export{t as redactNetworkLogText,a as redactNetworkUrl};
|
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"./4993.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 I,isFillableType as A}from"./7847.js";import{centerOfRect as N,findNodeByRef as M,normalizeRef as R}from"./4057.js";import{findBestMatchesByLocator as S}from"./7556.js";import{redactNetworkLogText as P,redactNetworkUrl as O}from"./7166.js";function D(e){return e?{message:e}:{}}function _(e,t){return t?{...e,message:t}:e}function T(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}function E(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 $(n,a){if(!Number.isInteger(a)||a<1)throw new r("INVALID_ARGS","Screenshot max size must be a positive integer");let i=E(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 L(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 C(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 U(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw a(e)}}let F=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new r("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await C(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 $(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...D(`Saved screenshot: ${a.path}`)}},q=[0,187,255,255];function G(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 V(e,t,n){return Math.min(Math.max(e,t),n)}let B={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},X={leading:20,trailing:20,separator:10,unknown:0,background:-30};function Y(e){return"background"!==e.likelyKind}function H(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function K(e,t){let n,a=0;for(let r of t){let t=Z(e,r.rect);t<=a||(a=t,n=r)}return n}function j(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,Z(t,a=n.rect)>0||Math.abs(Q(t).y-Q(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=Q(e);for(let e of t){var r,i;let t=Math.sqrt((r=a,i=Q(e.rect),(r.x-i.x)**2+(r.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function W(e){let t=J(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function J(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function Z(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function Q(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function ee(e,t,n){return Math.min(Math.max(e,t),n)}async function et(e){if(await s("tesseract"))try{let[t,n]=await Promise.all([ea(e.baselinePath),ea(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=en(t.stdout,e.width,e.height),r=en(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=ed(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(ed(c.text)!==t)continue;let d=(s=eo(e.normalizedRect),o=eo(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=em(t.rect.width/e.rect.width),r=em(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)=>er(t)-er(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-eu(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(ei).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>es(t)-es(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 en(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=ec(t,i,"level"),a=el(t,i,"text").trim(),r=ec(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=ec(t,i,"left"),c=ec(t,i,"top"),d=ec(t,i,"width"),u=ec(t,i,"height");d<=0||u<=0||s.push({key:[el(t,i,"page_num"),el(t,i,"block_num"),el(t,i,"par_num"),el(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*eu(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:{x:ep(r.x/t),y:ep(r.y/n),width:ep(r.width/t),height:ep(r.height/n)}}})(e,t,n)).filter(e=>null!==e)}function ea(e){return o("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function er(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 ei(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 es(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function eo(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function el(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function ec(e,t,n){let a=Number(el(e,t,n));return Number.isFinite(a)?a:0}function ed(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function eu(e){return e.reduce((e,t)=>e+t,0)/e.length}function ep(e){return Math.round(100*e*100)/100}function em(e){return Math.round(1e3*e)/1e3}function eh(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function ef(e){return .2126*e.r+.7152*e.g+.0722*e.b}function ew(e){return`#${eb(e.r)}${eb(e.g)}${eb(e.b)}`}function eb(e){return e.toString(16).padStart(2,"0")}function eg(e){return Math.round(100*e*100)/100}let ey=255*Math.sqrt(3);async function ex(a,r,i={}){let s,o,l,c;await ek(a,"Baseline image not found"),await ek(r,"Current screenshot not found");let d=i.outputPath,[u,p]=await Promise.all([e.readFile(a),e.readFile(r)]),m=E(u,"baseline screenshot"),h=E(p,"current screenshot");ev(m.width,m.height,"baseline screenshot",i.maxPixels),ev(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 eI(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*ey,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=eA(h,e);g.data[e]=eN(n,220,.78),g.data[e+1]=eN(n,0,.78),g.data[e+2]=eN(n,0,.78),g.data[e+3]=255;continue}let n=eA(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?(I=(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,I.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,I,A,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=eh(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),k=eh(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),I=g.width*g.height,A=eg(n.differentPixels/I),N=Math.round(ef(x)),M=Math.round(ef(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=I/r.totalPixels)>=.04?"large":m>=.01?"medium":"small",P=(l=x,c=k,h=ef(l),Math.abs(f=ef(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:eg(g.x/r.width),y:eg(g.y/r.height),width:eg(g.width/r.width),height:eg(g.height/r.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:eg(n.differentPixels/r.differentPixels),densityPercentage:A,shape:R,size:S,location:O,averageBaselineColorHex:ew(x),averageCurrentColorHex:ew(k),baselineLuminance:N,currentLuminance:M,dominantChange:P}}):[];if(x>0&&d){var v,I,A;for(let e of k)e.rect.width<4||e.rect.height<4||function(e,t){let n=V(t.x,0,e.width-1),a=V(t.y,0,e.height-1),r=V(t.x+t.width-1,0,e.width-1),i=V(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)G(e,s,a+t,q),G(e,s,i-t,q);for(let s=a;s<=i;s+=1)G(e,n+t,s,q),G(e,r-t,s,q)}}(g,e.rect);await e.mkdir(n.dirname(d),{recursive:!0}),await e.writeFile(d,t.sync.write(g))}else await eI(i.outputPath);let N=x>0?await et({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=ee(Math.floor(a.x),0,t-1),i=ee(Math.floor(a.y),0,n-1),s=ee(Math.ceil(a.x+a.width),0,t),o=ee(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}((A={diffMask:y,width:m.width,height:m.height,regions:k,ocr:N}).diffMask,A.width,A.height,A.ocr),A.width,A.height)),l=j(A.ocr?.currentBlocksRaw??[]),c=j(A.ocr?.baselineBlocksRaw??[]),o.filter(W).map(e=>{var t,n,a,r,i,s,o,d,u,p,m;let h,f,w,b,g,y,x,k,v,I;return t=e,n=A,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=J(t),n.regions),g=function(e,t,n){let a=K(e,t);if(a)return z(e,a.blocks);let r=K(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":H(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=H(u.rect,m)?-35:0,I=20*!!u.regionIndex,B[u.likelyKind]+X[u.slot]+I+v+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*A.height).filter(Y).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,A.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 ek(t,n){try{await e.access(t)}catch{throw new r("INVALID_ARGS",`${n}: ${t}`)}}function ev(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 eI(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 eA(e,t){return eN(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function eN(e,t,n){return Math.round(e*(1-n)+t*n)}function eM(e){return e.width*e.height}function eR(e){return Math.round(100*e*100)/100}let eS=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&&!e$(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 L(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),c=[];try{let r;r=e$(o)?(a=await eP(e,t)).path:(n=await L(e,o,{usage:"diff screenshot current",field:"current"})).path,i=t.out?await C(e,t.out,{field:"diffPath",ext:".png"}):void 0;let d=await ex(l.path,r,{threshold:s,outputPath:i?.path,maxPixels:e.policy.maxImagePixels});e$(o)&&(d=await eO(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 eP(e,t){let n=await U(e,{prefix:"agent-device-diff-current",ext:".png"});try{await eD(e,t,n.path,e_(t))}catch(e){throw await n.cleanup(),e}return n}async function eO(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await eE(n),a;let c=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:eT(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:eT(i.out.clientPath)}:{},...i.out.fileName?{fileName:eT(i.out.fileName)}:{}}:void 0),d=await C(e,c,{field:"currentOverlayPath",ext:".png"});try{let n=await eD(e,t,d.path,{overlayRefs:!0,...e_(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=eM(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:eR(d/eM(c)),regionCoveragePercentage:eR(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 eD(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 e_(e){return e.surface?{surface:e.surface}:{}}function eT(e){let t=n.extname(e),a=t?e.slice(0,-t.length):e;return`${a}.current-overlay${t||".png"}`}async function eE(t){try{await e.unlink(eT(t))}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function e$(e){return"live"===e.kind}function eL(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=eF(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:eC(r,o,!1,s,t)})}return a}function eC(e,t,n,a,r={}){var i,s,o,c,d,u,p,h;let f,w=a??eF(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&&!eG(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)||eU(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"),eq(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(""),I=g?` "${g}"`:"";return n?`${y}${k} [${w}]${v}`.trimEnd():`${y}${k} [${w}]${I}${v}`.trimEnd()}function eU(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(eq(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||eG(o)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":o}function eF(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 eq(e){return"text-field"===e||"text-view"===e||"search"===e}function eG(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function eV(e,t){let n=eF(e.type??"Element"),a=eU(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 eB(e,t){return t.flatten?e.map(e=>({text:eC(e,0,!1),comparable:eV(e,0)})):eL(e).map(e=>({text:e.text,comparable:eV(e.node,e.depth)}))}function eX(e,t){return e.get(t)??0}function eY(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function eH(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 eK(e,t,n,a){return Math.max(e,n)<=Math.min(t,a)}function ej(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 eW(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function eJ(e){let t=`${e??""}`.toLowerCase();return t.includes("scroll")||t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")||t.includes("collectionview")||"table"===t}function eZ(e){return!!eJ(e.type)||`${e.role??""} ${e.subrole??""}`.toLowerCase().includes("scroll")}function eQ(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:a,hintedContainers:r}=e1(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=e5(e,t,n);return a?e4(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=eW(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")||!!eW(e)}(e)),e,t)}}function e0(e){if(0===e.length)return new Map;let{hintedContainers:t}=e1(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 e1(e){let t=ez(e),n=new Set,a=[];for(let r of e){if(e2(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=e3(e,n,a);if(!t?.rect)continue;let s=e4(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=e3(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 e2(e,t,n=ez(t)){var a;if(!e.rect)return!0;let r=e5(e,t,n);return!r||(a=e.rect,eK(a.x,a.x+a.width,r.x,r.x+r.width)&&eK(a.y,a.y+a.height,r.y,r.y+r.height))}function e5(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&&eZ(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=eH(r.map(e=>e.rect).filter(e=>eY(e,n.x,n.y)));if(i)return i;let s=eH(r.map(e=>e.rect));if(s)return s;let o=eH(a.map(e=>e.rect).filter(e=>eY(e,n.x,n.y)));return o||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function e4(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function e3(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)&&eZ(a))return a;a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}return null}function e8(e){return"text"===e||"label"===e||"any"===e}function e6(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function e7(e){return e.clock?.now()??Date.now()}async function e9(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}let te=async(e,t)=>{var n;let a,r,i=await tn(e,t);return await e.sessions.set(ta(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=eQ(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}:{}})}},tt=async(e,t)=>{let n=await tn(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=ta(t.session,n);if(!r){let t=function(e,t={}){return eB(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&&eX(i,r-1)<eX(i,r+1)?eX(i,r+1):eX(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&&eX(r,l-1)<eX(r,l+1)?l+1:l-1,d=eX(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[]}(eB(e,n),eB(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 tn(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:e7(a)}),g=e7(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 ta(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 tr(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function ti(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 ts(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 to(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(e6(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:e7(e)};return n.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:a,session:i,snapshot:o}}async function tl(e,t,n){if(e.backend.readText){let a=await e.backend.readText(e6(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return k(n)}function tc(e){return{kind:"selector",selector:e}}function td(e,t={}){return{kind:"ref",ref:e,...t.fallbackLabel?{fallbackLabel:t.fallbackLabel}:{}}}let tu=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 tx(e,t,n);let a=await to(e,t,{updateSession:!0,scope:e8(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 tl(e,a,i),node:i}},tp=async(e,t)=>{if("ref"===t.target.kind){let n=await ts(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 tl(e,n,a.node),node:a.node,selectorChain:i}}let n=await tA(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 tl(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:i,node:n.node,selectorChain:a}},tm=async(e,t)=>{let n=await tp(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new r("COMMAND_FAILED","getText returned non-text result");return n},th=async(e,t)=>{let n=await tp(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new r("COMMAND_FAILED","getAttrs returned non-attrs result");return n},tf=async(e,t)=>{if(!tr(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 to(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(ti(e.rect))return e2(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=I(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||ti(e.rect))}(e))return e;a=e}return null}(e,t);return!!n&&(!0===n.hittable||!!ti(n.rect)&&e2(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)}},tw=async(e,t)=>await tf(e,{...t,predicate:"visible",selector:t.target.selector}),tb=async(e,t)=>await tf(e,{...t,predicate:"hidden",selector:t.target.selector}),tg=async(e,t)=>{if("sleep"===t.target.kind)return await e9(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await ts(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 tv(e,t,s,t.target.timeoutMs)}if("selector"===t.target.kind)return await tk(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new r("INVALID_ARGS","wait requires text");return await tv(e,t,t.target.text,t.target.timeoutMs)},ty=async(e,t)=>{let n=await tg(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 tx(e,t,n){let a=t.timeoutMs??1e4,i=e7(e);for(;e7(e)-i<a;){if(S((await to(e,t,{updateSession:!0,scope:e8(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:e7(e)-i};await e9(e,300)}throw new r("COMMAND_FAILED","find wait timed out")}async function tk(e,t,n,a){let i=a??1e4,s=e7(e),o=d(n);for(;e7(e)-s<i;){let n=w((await to(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:e7(e)-s};await e9(e,300)}throw new r("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function tv(e,t,n,a){let i=a??1e4,s=e7(e);for(;e7(e)-s<i;){if(e.backend.findText?(await e.backend.findText(e6(e,t),n)).found:await tI(e,t,n))return{kind:"text",text:n,waitedMs:e7(e)-s};await e9(e,300)}throw new r("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function tI(e,t,n){return!!g((await to(e,t,{updateSession:!0})).snapshot.nodes,n)}async function tA(e,t,n,a){let i=await to(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 tN(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 tM(e,t){let n=function(e,t){let n=tS(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=tS(e.rect);return!!t&&tP(t,n)});if(1!==t.length)break;a=t[0]}return a===t?null:a}(e,t);if(n?.rect&&tR(n.rect))return n;let a=h(e,t);return a?.rect&&tR(a.rect)?!function(e,t,n){var a,r,i,s;let o,l,c,d=tS(e.rect),u=tS(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=>tS(e.rect)).filter(e=>null!==e);if(0===a.length)return null;let r=a.filter(e=>eY(e,n.x,n.y));return eH(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))&&!tP(d,u)}(t,a,e)?a:t:t}function tR(e){let t=tS(e);if(!t)return null;let n=N(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function tS(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 tP(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 tO(e,t,n){if(await t_(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 tE(e,t,t.target),i=a.resolved,s=n.promoteToHittableAncestor?tM(a.snapshot.nodes,i.node):i.node;return function(e,t,n,a){let i=e.rect?e5(e,t):null;if(!(!e.rect||!i||e2(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:tL(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 tD(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?tM(a.snapshot.nodes,s.node):s.node;return{kind:"selector",point:tL(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 tD(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(e6(e,t),{interactiveOnly:n,compact:n}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:e7(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function t_(e,t,n){if("macos"!==e.backend.platform)return;let a=await tT(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 tT(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function tE(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=t$(i.snapshot.nodes,n.ref,{fallbackLabel:s,requireRect:!0});if(o)return{snapshot:i.snapshot,resolved:o};let l=await tD(e,t,!0),c=t$(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 t$(e,t,n){let a=R(t);if(!a)throw new r("INVALID_ARGS",`Invalid ref: ${t}`);let i=M(e,a);if(tC(i,n.requireRect))return{ref:a,node:i};let s=n.fallbackLabel.length>0?g(e,n.fallbackLabel):null;return tC(s,n.requireRect)?{ref:a,node:s}:null}function tL(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 tC(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 tU=async(e,t)=>{let n=await tO(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(e6(e,t),n.point));return{...n,...a?{backendResult:a}:{},...D(`Focused (${n.point.x}, ${n.point.y})`)}},tF=async(e,t)=>{let n=await tO(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:tN(t.durationMs,"durationMs",0,12e4),i=tz(await e.backend.longPress(e6(e,t),n.point,{durationMs:a}));return{...n,...void 0!==a?{durationMs:a}:{},...i?{backendResult:i}:{},...D(`Long pressed (${n.point.x}, ${n.point.y})`)}},tq=async(e,t)=>{var n,a;if(!e.backend.scroll)throw new r("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let i=tY(t.direction,"scroll direction"),s=(n=t.amount,a="scroll amount",void 0===n?void 0:tK(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 tB(e,t),c="viewport"===l.kind?{kind:"viewport"}:{kind:"point",point:l.point},d=tz(await e.backend.scroll(e6(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}:{},...D(void 0!==o?`Scrolled ${i} by ${o}px`:void 0!==s?`Scrolled ${i} by ${s}`:`Scrolled ${i}`)}},tG=async(e,t)=>{if(!e.backend.swipe)throw new r("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await tX(e,t),a=function(e,t){if(t.to)return{point:tH(t.to,"to")};let n=tY(t.direction,"swipe direction"),a=tK(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:tN(t.durationMs,"durationMs",16,1e4),s=tz(await e.backend.swipe(e6(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}:{},...D("Swiped")}},tV=async(e,t)=>{if(!e.backend.pinch)throw new r("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await t_(e,t,"pinch");let n=tK(t.scale,"pinch scale"),a=t.center?await tO(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=tz(await e.backend.pinch(e6(e,t),{scale:n,...a?{center:a.point}:{}}));return{kind:"pinch",scale:n,...a?{center:a.point,centerTarget:a}:{},...i?{backendResult:i}:{},...D(`Pinched to scale ${n}`)}};async function tB(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await t_(e,t,"scroll"),{kind:"viewport"}):await tO(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function tX(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await t_(e,t,"swipe"),{point:tH(t.from,"from")};let a=await tO(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 t_(e,t,"swipe"),{point:N(function(e){let t=e.filter(t=>e2(t,e)).map(e=>e.rect).filter(tj),n=t.length>0?t:e.map(e=>e.rect).filter(tj);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 tD(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function tY(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 tH(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 tK(e,t){if(!Number.isFinite(e)||e<=0)throw new r("INVALID_ARGS",`${t} must be a positive number`);return e}function tj(e){return!!(e&&e.width>0&&e.height>0)}function tz(e){return e&&"object"==typeof e?e:void 0}let tW=async(e,t)=>await t0(e,t,"press"),tJ=async(e,t)=>await t0(e,t,"click"),tZ=async(e,t)=>{var n;if(!t.text)throw new r("INVALID_ARGS","fill requires text");let a=await tO(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=t1(await e.backend.fill(e6(e,t),a.point,t.text,{delayMs:t.delayMs})),s="node"in a?a.node.type??"":"",o=s&&!A(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}:{}}},tQ=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=tN(t.delayMs??0,"delay-ms",0,1e4),s=t1(await e.backend.typeText(e6(e,t),n,{delayMs:i}));return{kind:"text",text:n,delayMs:i,...s?{backendResult:s}:{},...D(`Typed ${Array.from(n).length} chars`)}};async function t0(e,t,n){let a=await tO(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=t1(await e.backend.tap(e6(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 t1(e){return e&&"object"==typeof e?e:void 0}let t2=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=nt(await e.backend.pressBack(e6(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...D("Back")}},t5=async(e,t={})=>{if(!e.backend.pressHome)throw new r("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=nt(await e.backend.pressHome(e6(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...D("Home")}},t4=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=nt(await e.backend.rotate(e6(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...D(`Rotated to ${n}`)}},t3=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(e6(e,t),{action:n}),i=nt(a);if("dismiss"===n){let e=ne(a)?a.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:ne(a)?a:{},...i?{backendResult:i}:{},...D(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:ne(a)?a:{},...i?{backendResult:i}:{}}},t8=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(e6(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=nt(await e.backend.setClipboard(e6(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...D("Clipboard updated")}},t6=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=nt(await e.backend.openSettings(e6(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...D(n?`Opened settings: ${n}`:"Opened settings")}},t7=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:tN(t.timeoutMs,"timeoutMs",0,12e4),i=await e.backend.handleAlert(e6(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}:{},...D(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}:{},...D(o.handled?`Alert ${s}ed`:"No alert handled")}},t9=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new r("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=nt(await e.backend.openAppSwitcher(e6(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...D("Opened app switcher")}};function ne(e){return!!(e&&"object"==typeof e)}function nt(e){return e&&"object"==typeof e?e:void 0}let nn=/^[A-Za-z0-9_.:-]{1,64}$/,na=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=nc(e.app,"app"),a=nc(e.appId,"appId"),i=nc(e.bundleId,"bundleId"),s=nc(e.packageName,"packageName"),o=nc(e.url,"url"),l=nc(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=nh(await e.backend.openApp(nm(e,t),a,{relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...i?{backendResult:i}:{},...D(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},nr=async(e,t={})=>{if(!e.backend.closeApp)throw new r("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nc(t.app,"app"),a=nh(await e.backend.closeApp(nm(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...D(n?`Closed: ${n}`:"Closed app")}},ni=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(nm(e,t),t.filter??"all")}},ns=async(e,t)=>{if(!e.backend.getAppState)throw new r("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nd(t.app,"app"),a=await e.backend.getAppState(nm(e,t),n);return{kind:"appState",app:n,state:a}},no=async(e,t)=>{if(!e.backend.pushFile)throw new r("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nd(t.app,"app"),a=await nu(e,t.input);try{let r=await e.backend.pushFile(nm(e,t),a.backendInput,n),i=nh(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...D(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},nl=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=nd(e,"name");if(!nn.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&&np(n,a,8192);let s=nh(await e.backend.triggerAppEvent(nm(e,t),{name:i,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:i,...t.payload?{payload:t.payload}:{},...s?{backendResult:s}:{},...D(`Triggered app event: ${i}`)}};function nc(e,t){if(void 0!==e)return nd(e,t)}function nd(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function nu(e,t){if(!t||"object"!=typeof t)throw new r("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return np(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await L(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function np(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 nm(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function nh(e){return e&&"object"==typeof e?e:void 0}let nf=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(e6(e,t),t.filter)}},nw=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=nN(e.id,"target.id"),n=nN(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=nS(await e.backend.bootDevice(e6(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...D("Booted device")}},nb=async(e,t)=>{if(!e.backend.ensureSimulator)throw new r("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=nM(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(e6(e,t),{device:n,...t.runtime?{runtime:nM(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},ng=async(e,t)=>await nk(e,t,"install"),ny=async(e,t)=>await nk(e,t,"reinstall"),nx=async(e,t)=>await nk(e,t,"installFromSource");async function nk(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?nM(t.app,"app"):void 0;if("installFromSource"!==n&&!s)throw new r("INVALID_ARGS",`admin.${n} requires app`);let o=e6(e,t),l=await nv(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=nS(p),a=nR(p,"appName"),r=nR(p,"appId"),h=nR(p,"bundleId"),f=nR(p,"packageName"),w=nR(p,"launchTarget"),b=nR(p,"installablePath"),g=nR(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}:{},...D(`${"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 nv(e,t,n){let a=nA(n),r=await nI(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nA(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nI(e,t){if("url"===t.kind)return{source:t};let n=await L(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nA(e){if(!e||"object"!=typeof e)throw new r("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nM(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nM(e.id,"source.id")};if("url"===e.kind){let t=nM(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 nN(e,t){if(void 0!==e)return nM(e,t)}function nM(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}function nR(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function nS(e){return e&&"object"==typeof e?e:void 0}let nP=async(e,t)=>{let n=nD(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 C(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:tN(s.fps,"fps",1,60),u=void 0===s.quality?void 0:tN(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,e6(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}:{},...n_(l,c,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await i?.cleanup?.(),e}},nO=async(e,t)=>{let n=nD(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 C(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,e6(e,t),r),d=await i?.publish();return s=n,o=c,l=d,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...n_(s,o,l,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await i?.cleanup?.(),e}};function nD(e,t){if("start"===e||"stop"===e)return e;throw new r("INVALID_ARGS",`${t} action must be start or stop`)}function n_(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...D("start"===e?a.startMessage:a.stopMessage)}}let nT=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function nE(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(nT.test(a))n[a]="[REDACTED]",t=!0;else{let e=nU(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function n$(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=nC(t,P);return nF(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??nU(e,2048)}function nL(e){return nC(e,e=>nU(e,2048))}function nC(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=nC(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(nT.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=nC(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function nU(e,t){if(void 0===e)return{redacted:!1};let n=P(e);return nF(n.value,t,n.redacted)}function nF(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 nq=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),{...nX(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:nH(a.levels,"levels")}:{},...void 0!==a.search?{search:nK(a.search,"search")}:{},...void 0!==a.source?{source:nK(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=nU(e.message,4096),n=nL(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}:{}}},nG=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={...nX(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=>{var t;let n=e.url?O(t=e.url)??nU(t,2048):void 0,r="headers"===a||"all"===a?nE(e.requestHeaders):void 0,i="headers"===a||"all"===a?nE(e.responseHeaders):void 0,o="body"===a||"all"===a?n$(e.requestBody):void 0,l="body"===a||"all"===a?n$(e.responseBody):void 0,c=nL(e.metadata);return s||=(n?.redacted??!1)||(r?.redacted??!1)||(i?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...r?.value?{requestHeaders:r.value}:{},...i?.value?{responseHeaders:i.value}:{},...o?.value!==void 0?{requestBody:o.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...c.value?{metadata:c.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:s,...n.notes?{notes:n.notes}:{}}},nV=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),{...nY(a=t),...void 0!==a.sampleMs?{sampleMs:tN(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:nH(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=nU(e.message,4096),n=nL(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=e6(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 nX(e,t,n,a){return{...nY(e),...void 0!==e.cursor?{cursor:nK(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:tN(e.limit,a,1,n)}}function nY(e){return{...void 0!==e.since?{since:nK(e.since,"since")}:{},...void 0!==e.until?{until:nK(e.until,"until")}:{}}}function nH(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)=>nK(e,`${t}[${n}]`))}function nK(e,t){let n=e.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nj=[{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:"auth",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 nz(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 nW(e){let t=async n=>{try{if(function(e){if("batch"===e.command||Object.hasOwn(nZ,e.command))return;let t=nj.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 nz(n,t)};let a=await e.createRuntime(n);return{ok:!0,data:await nQ(a,n)}}catch(t){return{ok:!1,error:e.formatError?.(t,n)??i(t)}}};return{dispatch:t}}function nJ(e){return async(t,n)=>await e(t,n.options)}let nZ={"capture.screenshot":nJ(F),"capture.diffScreenshot":nJ(eS),"capture.snapshot":nJ(te),"capture.diffSnapshot":nJ(tt),"selectors.find":nJ(tu),"selectors.get":nJ(tp),"selectors.is":nJ(tf),"selectors.wait":nJ(tg),"interactions.click":nJ(tJ),"interactions.press":nJ(tW),"interactions.fill":nJ(tZ),"interactions.typeText":nJ(tQ),"interactions.focus":nJ(tU),"interactions.longPress":nJ(tF),"interactions.swipe":nJ(tG),"interactions.scroll":nJ(tq),"interactions.pinch":nJ(tV),"system.back":nJ(t2),"system.home":nJ(t5),"system.rotate":nJ(t4),"system.keyboard":nJ(t3),"system.clipboard":nJ(t8),"system.settings":nJ(t6),"system.alert":nJ(t7),"system.appSwitcher":nJ(t9),"apps.open":nJ(na),"apps.close":nJ(nr),"apps.list":nJ(ni),"apps.state":nJ(ns),"apps.push":nJ(no),"apps.triggerEvent":nJ(nl),"admin.devices":nJ(nf),"admin.boot":nJ(nw),"admin.ensureSimulator":nJ(nb),"admin.install":nJ(ng),"admin.reinstall":nJ(ny),"admin.installFromSource":nJ(nx),record:nJ(nP),trace:nJ(nO),"diagnostics.logs":nJ(nq),"diagnostics.network":nJ(nG),"diagnostics.perf":nJ(nV)};async function nQ(e,t){let n=nZ[t.command];if(!n)throw new r("UNSUPPORTED_OPERATION",`Router command ${t.command} is not a runtime command`);return await n(e,t)}let n0={capture:{screenshot:F,diffScreenshot:eS,snapshot:te,diffSnapshot:tt},selectors:{find:tu,get:tp,getText:tm,getAttrs:th,is:tf,isVisible:tw,isHidden:tb,wait:tg,waitForText:ty},interactions:{click:tJ,press:tW,fill:tZ,typeText:tQ,focus:tU,longPress:tF,swipe:tG,scroll:tq,pinch:tV},system:{back:t2,home:t5,rotate:t4,keyboard:t3,clipboard:t8,settings:t6,alert:t7,appSwitcher:t9},apps:{open:na,close:nr,list:ni,state:ns,push:no,triggerEvent:nl},admin:{devices:nf,boot:nw,ensureSimulator:nb,install:ng,reinstall:ny,installFromSource:nx},recording:{record:nP,trace:nO},diagnostics:{logs:nq,network:nG,perf:nV}};function n1(e){return{capture:{screenshot:t=>n0.capture.screenshot(e,t),diffScreenshot:t=>n0.capture.diffScreenshot(e,t),snapshot:t=>n0.capture.snapshot(e,t),diffSnapshot:t=>n0.capture.diffSnapshot(e,t)},selectors:{find:t=>n0.selectors.find(e,t),get:t=>n0.selectors.get(e,t),getText:(t,n={})=>n0.selectors.getText(e,{...n,target:t}),getAttrs:(t,n={})=>n0.selectors.getAttrs(e,{...n,target:t}),is:t=>n0.selectors.is(e,t),isVisible:(t,n={})=>n0.selectors.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>n0.selectors.isHidden(e,{...n,target:t}),wait:t=>n0.selectors.wait(e,t),waitForText:(t,n={})=>n0.selectors.waitForText(e,{...n,text:t})},interactions:{click:(t,n={})=>n0.interactions.click(e,{...n,target:t}),press:(t,n={})=>n0.interactions.press(e,{...n,target:t}),fill:(t,n,a={})=>n0.interactions.fill(e,{...a,target:t,text:n}),typeText:(t,n={})=>n0.interactions.typeText(e,{...n,text:t}),focus:(t,n={})=>n0.interactions.focus(e,{...n,target:t}),longPress:(t,n={})=>n0.interactions.longPress(e,{...n,target:t}),swipe:t=>n0.interactions.swipe(e,t),scroll:t=>n0.interactions.scroll(e,t),pinch:t=>n0.interactions.pinch(e,t)},system:{back:t=>n0.system.back(e,t),home:t=>n0.system.home(e,t),rotate:t=>n0.system.rotate(e,t),keyboard:t=>n0.system.keyboard(e,t),clipboard:t=>n0.system.clipboard(e,t),settings:t=>n0.system.settings(e,t),alert:t=>n0.system.alert(e,t),appSwitcher:t=>n0.system.appSwitcher(e,t)},apps:{open:t=>n0.apps.open(e,t),close:t=>n0.apps.close(e,t),list:t=>n0.apps.list(e,t),state:t=>n0.apps.state(e,t),push:t=>n0.apps.push(e,t),triggerEvent:t=>n0.apps.triggerEvent(e,t)},admin:{devices:t=>n0.admin.devices(e,t),boot:t=>n0.admin.boot(e,t),ensureSimulator:t=>n0.admin.ensureSimulator(e,t),install:t=>n0.admin.install(e,t),reinstall:t=>n0.admin.reinstall(e,t),installFromSource:t=>n0.admin.installFromSource(e,t)},recording:{record:t=>n0.recording.record(e,t),trace:t=>n0.recording.trace(e,t)},observability:{logs:t=>n0.diagnostics.logs(e,t),network:t=>n0.diagnostics.network(e,t),perf:t=>n0.diagnostics.perf(e,t)}}}export{n1 as bindCommands,eQ as buildMobileSnapshotPresentation,eL as buildSnapshotDisplayLines,nj as commandCatalog,n0 as commands,nW as createCommandRouter,E as decodePng,e0 as deriveMobileSnapshotHiddenContentHints,eW as displayNodeLabel,eC as formatSnapshotLine,eJ as isScrollableType,tr as isSupportedPredicate,ej as normalizeSnapshotTree,T as readCommandMessage,tN as requireIntInRange,tc as selector,td as ref,D as successText,_ as withSuccessText};
|