agent-device 0.21.2 → 0.21.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.2.apk → agent-device-android-ime-helper-0.21.3.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.3.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.2.manifest.json → agent-device-android-ime-helper-0.21.3.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.2.apk → agent-device-android-snapshot-helper-0.21.3.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.3.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.2.manifest.json → agent-device-android-snapshot-helper-0.21.3.manifest.json} +7 -7
- package/dist/src/agent-device-client.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/cli.js +2 -2
- package/dist/src/client-types.d.ts +1 -1
- package/dist/src/command-schema.js +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +1 -0
- package/dist/src/daemon.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/lease-scope.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +3 -3
- package/dist/src/request-providers.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime2.js +1 -1
- package/dist/src/runtime4.js +5 -5
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screen-recording-runtime.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-remote-config.d.ts +1 -0
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/session-routing.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src3.js +1 -1
- package/dist/src/src4.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.2.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk.sha256 +0 -1
- package/dist/src/config2.js +0 -1
- package/dist/src/provider-device-runtime.js +0 -1
package/dist/src/runtime.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{A as e,C as t,S as n,f as r,g as i,m as a,p as o,w as s}from"./sdk-contracts.js";import{p as c}from"./capture.js";import{r as l,t as u}from"./snapshot-capture-annotations.js";import{f as d,l as f,n as p}from"./android-input-ownership.js";import{Ar as m,Bn as h,Cn as g,Dr as _,En as v,Er as y,Fn as ee,Fr as te,Hn as ne,Hr as re,In as ie,Kn as ae,Ln as oe,Mr as b,Nn as se,Or as ce,Pn as le,Pr as ue,Rr as de,Sr as x,Un as S,Vn as fe,Wn as pe,_n as me,_r as he,bn as ge,dr as _e,gn as C,ir as ve,kn as ye,kr as be,lr as xe,on as Se,ur as Ce,vn as we,wn as Te,xn as Ee}from"./sdk-batch.js";import{n as De}from"./snapshot-scope.js";import{n as w}from"./success-text.js";import{a as Oe,d as ke,f as Ae,i as je,l as Me,n as Ne,o as Pe,p as Fe,r as Ie,t as Le,u as Re}from"./absence-observation-errors.js";import{n as ze,t as Be}from"./mobile-snapshot-semantics.js";import{a as Ve,n as He,o as Ue,t as We}from"./react-native-overlay.js";import{i as T,n as E,t as Ge}from"./rect-center.js";import{a as Ke,n as qe,t as Je}from"./gesture-plan.js";import{n as Ye,o as Xe,r as Ze}from"./android-system-chrome.js";import{a as Qe,l as $e,m as et,n as tt,p as D,r as nt,s as rt,u as it}from"./quality-warnings.js";import{r as at}from"./ios-system-surface.js";import{n as ot}from"./png.js";import{n as st}from"./ios-snapshot-acquisition.js";import ct from"node:path";import{promises as O}from"node:fs";import{createHash as lt}from"node:crypto";function ut(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function dt(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=S(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function ft(e,t,n,r){return e.filter(e=>{if(!ne(S(e),n))return!1;let i=dt(e,t,Math.max(r.length,1));return!i.broken&&fe(i.chain,r)})}const pt=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,mt=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],ht=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function gt(e){if(_t(e).detected)return[`Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.`,`Run: agent-device react-native dismiss-overlay`,`The command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action.`].join(`
|
|
2
2
|
`)}function _t(e){let t=vt(e),n=t.detected?yt(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function vt(e){let t=e.map(bt).join(`
|
|
3
|
-
`).toLowerCase(),n=k(e,Dt),r=k(e,Ue),i=k(e,He,jt),a=k(e,Et),o=St(t),s=Ct(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:Tt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:wt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function yt(e){let t=Nt(e.dismissNodes);if(t)return It(t,Lt(t));let n=Rt(e.collapsedNodes.filter(Mt));return n?.rect?{action:`close-collapsed-banner`,point:Ut(n),rect:n.rect,ref:n.ref,label:A(n)}:null}function bt(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function xt(e){return pt.test(e)}function St(e){return mt.some(t=>t.test(e))}function Ct(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function wt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function Tt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(xt(e.text)||e.hasReactNativeStackFrame)}function Et(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Dt(e){return Ve(e)||Ot(e)||kt(e)}function Ot(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function kt(e){return ht.has(e)}function At(e){return/^!,\s+/.test(e)}function jt(e){return!e.rect||e.rect.height<=180}function Mt(e){let t=A(e)?.trim().toLowerCase()??``;return(Et(t)||At(t))&&We(e)}function k(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function Nt(e){return zt(e,Ft)}function Pt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Ft(e){return[Vt(Pt(e)),Vt(e.hittable),-(e.rect?re(e.rect):1/0)]}function It(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:o(e.rect),rect:e.rect,ref:e.ref,label:A(e)}}function Lt(e){let t=A(e)?.trim().toLowerCase();return t&&Ve(t)?`dismiss`:`close`}function Rt(e){return zt(e,Bt)}function zt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Ht(t(n),t(e)))[0]??null}function Bt(e){return[Vt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Vt(e){return+(e===!0)}function Ht(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function Ut(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round(Wt(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}function A(e){return e.label??e.value??e.identifier}const Gt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Kt={strippedIndexes:new Set,refs:new Set};function qt(e){let t=new Set(e.filter(e=>b(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Kt;let n=new Map(e.map(e=>[e.index,e])),r=Qt(e,n,t),i=new Set(r),a=sn(e,n,r);for(let t of Qt(e,n,a))i.add(t);for(let o of Jt(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Jt(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Xt(t,n,r);if(o.size===0)return a;let s=Zt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Yt(n,t,o)&&a.add(n.index);return a}function Yt(e,t,n){if(!e.rect)return!1;let r=cn(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function Xt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=cn(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Zt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Qt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)ln(i,t,n)&&r.add(i.index);return r}function $t(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ze(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function en(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(p).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:tn(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Kt:{strippedIndexes:o,refs:s}}function tn(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&$t(e,t)).map(e=>e.index))}function nn(e,t){let n=qt(e),r=en(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function rn(e,t){let{strippedIndexes:n}=nn(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function an(e,t){return nn(e,t).refs}function on(e){return qt(e).refs}function sn(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||b(n.type??``)!==`keyboard`)continue;let i=cn(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Gt.has(b(e.type??``))&&!n.has(e.index)&&ln(e,t,a))&&r.delete(i)}return r}function cn(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(b(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function ln(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function un(e,n,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new t(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return e}function dn(e,n,r){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new t(`INVALID_ARGS`,n,r);return{x:i,y:a}}function fn(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??pn(),policy:e.policy??gn(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function pn(e=[]){let t=new Map(e.map(e=>[e.name,j(e)]));return{get:e=>j(t.get(e)),set:e=>{t.set(e.name,j(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>j(e))}}function j(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:mn(e.metadata)}:{}}}function mn(e){try{return structuredClone(e)}catch{return{...e}}}function hn(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function gn(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const _n={defaultTimeoutMs:1e4,intervalMs:300},M={promotedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:C.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:C.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:C.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:_n},wait:{resolution:C.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:_n},readList:{resolution:C.readList,occlusion:`ignore`},findAct:{resolution:C.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:C.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},vn=new WeakMap;function yn(e,t){xn(e)&&vn.set(e,t)}function bn(e){return xn(e)?vn.get(e):void 0}function xn(e){return typeof e==`object`&&!!e||typeof e==`function`}function N(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function P(e){return e.clock?.now()??Date.now()}async function Sn(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Cn(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function F(e){return e&&typeof e==`object`?e:void 0}function wn(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=Ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?En(a):a.matchedNodes.length>1?Tn(a):En(a)}let a=g(e,t,{...r,...me({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:Tn(a.firstMatch):{kind:`none`}}function Tn(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function En(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function Dn(e,t,n){let r=Ee(e,he(t),n);return r?{...r,selector:r.selector.raw}:null}function On(e,t,n,r){let i=wn(e,he(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function kn(e){return e}function An(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const jn=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function I(e){return[e.type,e.role,e.subrole].map(e=>b(e??``)).some(e=>e===`tab`||jn.some(t=>e.includes(t)))}function Mn(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Yn(e);if(!Nn(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Vn(e,n,r).node;for(let n of t.slice(1))if(Vn(e,n,r).node.index!==i.index){let e=In(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Nn(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Pn(i,a,t)&&!Pn(a,i,t))return!1}return!0}function Pn(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Fn(e,t){return In(t,Yn(e))}function In(e,t){if(e.length<2||!Nn(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!I(n)||!e.every(e=>e===n||!I(e)))return null;let r=E(n.rect);return r&&e.every(e=>Ln(E(e.rect),r))?n:null}function Ln(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Rn(e,t){if(!t?.rect||!e.rect||!y(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function zn(e,t){return Vn(e,t)}function Bn(e){let t=Yn(e);return n=>Vn(e,n,t)}function Vn(e,t,n){return f(t)?{node:t,reason:`covered`}:Hn(e,t,n)??Un(t)??Wn(e,t,n)??{node:t,reason:`original`}}function Hn(e,t,n){let r=Kn(e,t,n);return r?.rect&&T(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Un(e){return I(e)&&e.rect&&T(e.rect)?{node:e,reason:`semantic-target`}:null}function Wn(e,t,n){let r=Gn(e,t,n);return!r?.rect||f(r)||!T(r.rect)?null:qn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Gn(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?te(e,t,n.nodesByIndex,e=>r(e)?e:null):ue(e,t,r)}function Kn(e,t,n){let r=E(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||f(e))return!1;let t=E(e.rect);return t?Ge(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function qn(e,t,n,r){let i=E(e.rect),a=E(t.rect);if(!i||!a)return!1;if(Jn(t)&&!Ge(i,a))return!0;let o=_(n,i,r?.viewportRootRects);return!o||!Xn(a,o)?!1:!Ge(i,a)}function Jn(e){let t=b(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Yn(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(y(i)){let e=E(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Xn(e,t){let n=An(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function L(e,t,n,r,i={}){let a=On(tr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Qn(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Zn(t,a);return o?await Qn(e,t,o,i):a}function Zn(e,t){let n=Fn(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Qn(e,t,n,r){let i=await er(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function $n(e,t,n,r){let i=tr(e,t);return{candidates:i,list:Dn(i,n,{...r,requireRect:e.resolution.requireRect})}}async function er(e,t,n,r={}){r.onResolved?.(n,t);let i=nr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||f(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await rr(e,t,i.node,r)}}function tr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!f(e)):t}function nr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=zn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Rn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function rr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function ir(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function ar(e){return e.hittable===!0||I(e)}function or(e,t){let n=oe(S(e),t);return n.id!==void 0||n.label!==void 0?!1:ee(e.value)===null}function sr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function cr(e,t){let n=ut(t);return t.filter(t=>t.index!==e.index&&sr(t,e,n)).sort((e,t)=>e.index-t.index)}function lr(e,t){let n=T(e.rect);return!n||!t.rect?!1:de(t.rect,n.x,n.y)}function ur(e,t){if(!or(e,t))return e;let n=cr(e,t);if(n.some(ar))return e;let r=n.find(e=>S(e).label!==void 0);return!r||!lr(r,e)?e:r}function dr(e,t){return e.find(e=>De(e,t))??null}function R(e,t){let n=ce(e);return n&&m(n)?n:fr(e,t)}function fr(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=ce(e);if(!t||!m(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function pr(e){return e===`text`||e===`label`||e===`any`}function mr(e,t,n,r){if(!(r||e===`web`))return pr(t)?n:void 0}function hr(e){return new t(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function gr(e,n){let r=n??`default`,i=await e.sessions.get(r);if(!i)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new t(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function z(e,n,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await e.sessions.get(a),s=_r(await i(N(e,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),e);return(n.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!D(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function _r(e,t){return e.snapshot?vr(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function vr(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function yr(e,t,n){if(e.backend.readText){let r=await e.backend.readText(N(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Fe(n)}function br(e,n,r){let o=i(n);if(!o)throw new t(`INVALID_ARGS`,r.invalidRefMessage);let s=a(e,o)??(r.fallbackLabel.length>0?dr(e,r.fallbackLabel):null);if(!s)throw new t(`COMMAND_FAILED`,r.notFoundMessage);return{ref:o,node:s}}function xr(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Sr(e){let t=Buffer.alloc(16);for(let n of e)wr(t,Cr(n));return{digest:`ax1:${lt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Cr(e){return lt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function wr(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function Tr(e){let{digest:t,nodeCount:n}=Sr(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Er(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Er(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function B(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function Dr(e,t){if(!(!e||e.surfaceBundleId===t.surfaceBundleId))return{from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`,disclosure:at(t.surfaceBundleId)}}function Or(e,t){let n=Tr(e.nodes),r=Dr(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==Tr(t.nodes).digest;return{...n,changedFromBefore:i}}function kr(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function Ar(e,t,n={}){let r=E(t.rect),i=T(r??void 0);if(!r||!i)return{kind:`invalid`};let a=jr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?Nr(e,t):null,r),s=o?Pr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function jr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>Mr(e,t,r)).filter(I).flatMap(e=>{let t=E(e.rect);if(!t||Ge(t,n))return[];let r=Nr(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function Mr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Nr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function Pr(e,t,n,r){let i=zr(e),a=Lr(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=Lr(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!de(t,s.x,s.y))return[];let c=Fr(s,e,n,r,i);return c?[c]:[]})).sort(Ir)[0]?.point??null}function Fr(e,t,n,r,i){let a=Rr(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function Ir(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function Lr(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function Rr(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function zr(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const V={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Br=`replay_target_guard_mismatch`,Vr=V.landmarkIdentityMismatch;function Hr(e,n,r,i){let{candidates:a,list:o}=$n(i,e,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Mn(a,s);if(l.kind===`ambiguous`)throw new t(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ae(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}function Ur(e,n,r,i,a){if(!r)return;let o=S(e),s=pe(e,n);if(!(h(o,r.identity)&&ae(s,r.structural)))throw new t(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Br,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function H(e,t,n){return await di(e,t,n.action),t.target.kind===`point`?await Gr(e,t,t.target,n):t.target.kind===`ref`?await Yr(e,t,t.target,n):await Xr(e,t,t.target,n)}async function Wr(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=x(i.snapshot.nodes).resolveViewport(a);if(!o)return;let s={x:n.x,y:n.y};if(!de(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Gr(e,t,n,r){let i=await Wr(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Kr(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Kr(e,t){try{return B((await U(e,t,!0)).snapshot)}catch{return}}function qr(e,n){let r=i(e.ref);if(!r)throw new t(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let a=i(n.ref),o=n.node.ref?i(n.node.ref):null;if(a!==r||o!==r||!n.nodes.includes(n.node))throw new t(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},resolved:ti(r,n.node,`exact`)}}async function Jr(e,t,n){let r=await pi(e,t,n);return{tree:B(r.snapshot),resolved:r.resolved}}async function Yr(e,t,n,r){let{tree:a,resolved:o}=r.preresolvedTarget?qr(n,r.preresolvedTarget):await Jr(e,t,n),s=a.nodes,c=await ci({policy:r.pipeline,nodes:s,node:o.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Qr(e,t,r),offscreen:async(i,a)=>await yi(e,t,i,a,n.ref,r)}});return{kind:`ref`,point:gi(c,s,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${i(n.ref)??c.ref}`}}),target:{kind:`ref`,ref:`@${o.ref}`},...ai(e,c,a,r.action,o.resolution)}}async function Xr(e,t,n,r){let i=n.selector,a=await U(e,t,r.requireInteractive),o=Hr(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await U(e,t,!1),o=Hr(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Zr({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,c=await ci({policy:r.pipeline,nodes:a.snapshot.nodes,node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Qr(e,t,r),offscreen:async(n,i)=>await vi(e,t,n,i,s.selector,r)}});return{kind:`selector`,point:gi(c,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}}),target:{kind:`selector`,selector:o.selector},...ai(e,c,B(a.snapshot),r.action,ri(o,a.snapshot.nodes))}}async function Zr(e){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await L(M.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return li({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new t(`COMMAND_FAILED`,ge(i,c,{unique:!0}),{reason:je.selectorNotFound,hint:Te(c)})}function Qr(e,t,n){Ur(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const $r={source:`ref`,phase:`pre-action`,kind:`exact`},ei={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ti(e,t,n){return{ref:e,node:t,resolution:n===`exact`?$r:ei}}const ni={source:`runtime`,phase:`pre-action`,kind:`unique`};function ri(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ii(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ii(e,t))}:ni}function ii(e,t){let n=b(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:xr(n,256)}:{},...r===void 0?{}:{label:xr(r,256)}}}function ai(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:le(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...si(t,r),preAction:n,resolution:i,...oi(e,t,a,r)}}function oi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=ur(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:le(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function si(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function ci(e){let t=await er(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw li({label:e.label,node:t.node,action:e.action});return t.node}function li(e){return new t(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${ui(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function ui(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}async function U(e,n,r){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await e.sessions.get(i);if(!a)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(N(e,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function di(e,n,r){if(e.backend.platform!==`macos`)return;let i=await fi(e,n);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new t(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function fi(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function pi(e,n,r){let{session:i,snapshot:a}=await gr(e,n.session),o=r.fallbackLabel??``,s=hi(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new t(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:we});return mi({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function mi(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=hi(o.nodes,r.ref,{fallbackLabel:i});return s&&h(S(a.node),S(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function hi(e,n,r){let o=i(n);if(!o)throw new t(`INVALID_ARGS`,`Invalid ref: ${n}`);let s=a(e,o);if(_i(s))return ti(o,s,`exact`);let c=r.fallbackLabel.length>0?dr(e,r.fallbackLabel):null;return _i(c)?ti(o,c,`label-fallback`):null}function gi(e,n,r){let i=x(n),a=Ar(n,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new t(`COMMAND_FAILED`,r.invalidMessage):new t(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function _i(e){return e?T(e.rect)!==null:!1}async function vi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${bi(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function yi(e,t,n,r,a,{action:o}){return await Ci(e,t,n,r,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:i(a)},hint:e=>`${bi(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function bi(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function xi(e,t,n,r){let a=(await e.sessions.get(t.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||i(n.ref)===null)return{};let s=hi(o,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!s)return{};let c=M.resolvedTarget,l=await ci({policy:c,nodes:o,node:s.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await yi(e,t,i,a,n.ref,{action:r,pipeline:c})}});return{...si(l,r),node:l,preAction:B(a)}}async function Si(e,t,n,r,i){let a=await xi(e,t,n,r),o=F(await i(N(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:$r,...a,...o?{backendResult:o}:{}}}async function Ci(e,n,r,i,a){let o=x(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await e.backend.confirmOffscreenTargetVisible?.(N(e,n),r,c);if(l)return{...r,rect:l};let u=ze(r,o);throw new t(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function wi(e,t){let n=ke(e.type??`Element`),r=Re(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Ti(e,t,n={}){let r=Oi(Di(e,n),Di(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Ei(e,t={}){return Di(e,t).length}function Di(e,t){return t.flatten?e.map(e=>({text:Ae(e,0,!1),comparable:wi(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:wi(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Oi(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Ai(a,i,s)?W(a,i+1):W(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return ki(o,e,t,n,r)}}return[]}function ki(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Ai(i,c,r)?c+1:c-1,u=W(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Ai(e,t,n){return t===-n||t!==n&&W(e,t-1)<W(e,t+1)}function W(e,t){return e.get(t)??0}async function ji(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Mi(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Ni(e.nodes):e.nodes).map(Ii);return n.sort((e,t)=>Ri(e).localeCompare(Ri(t))),{captureBackend:t,nodes:n}}function Ni(e){let t=x(e);return e.filter(e=>y(e)||t.isVisibleOnScreen(e))}function Pi(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Fi(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function Ii(e){return{identity:`${e.type??``}#${Li(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Li(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Ri(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const zi=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Bi(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=P(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;P(e)<o;){let c=await qi(e,t,o-P(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Vi(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Mi(c.snapshot);_=Ui({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=P(e),ee=Gi({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=Ki({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Sn(e,t);continue}if(!Pi(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=Ki({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await Sn(e,te)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Vi(e,t,n){if(!e||!t||!Hi(t.backend,n))return;let r=t.nodes.some(y),i=e.length<=5;if(!(!r&&!i))return Mi({...t,nodes:e})}function Hi(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Ui(e){return e.requestedQuietMs<500||!Fi(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Wi(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Gi(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Wi(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Ki(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function qi(e,t,n,r){let i=await ji(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Ji=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Yi=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Xi(e,t,n){return await Qi(e,t,{...n,baseline:await ta(e,t,n.resolved),actionPoint:n.resolved.point})}const Zi=async(e,t)=>(await Qi(e,t,t)).observation;async function Qi(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await $i(e,t,n,a,await Bi(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function $i(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Yi:Ji}};let{stored:o,session:s}=await ma(e,t,i.lastCapture),c=B(i.lastCapture.snapshot),l=c.nodes,u=Dr(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?oa(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...fa(i,o,l.length,u)},settledCapture:c}}function ea(e,t){if(e)return Or(e,t)}async function ta(e,t,n){let r=await e.sessions.get(t.session??`default`);return na(n,r)??ia(n.preAction)??ra(r)}function na(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?ia(B(n)):void 0}function ra(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?B(t):{nodes:[]}}function ia(e){return e?.nodes.length?e:void 0}function aa(e,t,n){let r=Ti(rn(e,n),rn(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=da(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function oa(e,t,n,r){let i=aa(e,t,r);return{diff:i,...sa(i,t,n,r)}}function sa(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=an(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!ca(o.get(e),n))?{}:ua(t,i,r)}function ca(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const la=new Set([`application`,`window`]);function ua(e,t,n){let r=an(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!la.has(ke(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=ke(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function da(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function fa(e,t,n,r){let i=pa(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=kr(r);return{hint:i===void 0?a:`${a} ${i}`}}function pa(e,t,n){return e.stalled?{hint:Yi}:e.settled?t?n<5?{hint:zi}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Ji}}async function ma(e,t,n){if(D(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ha(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function ga(e,t,n,r,i){let a=await _a(e,t,n,i);return ya({...r,...a})}async function _a(e,t,n,r){if(r.settle!==void 0){let i=await Xi(e,t,{...r.settle,resolved:n}),a=r.verify?ea(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await va(e,t,n);return i?{evidence:i}:{}}async function va(e,t,n){try{return Or(B((await U(e,t,!0)).snapshot),n.preAction)}catch{return}}function ya(e){let t=e;if(t.targetHittable!==!1||!ba(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function ba(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function xa(e,n){let r=x(e),i=e.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Sa),a=i.length>0?i:e.map(e=>e.rect).filter(Sa);if(a.length===0)throw new t(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Sa(e){return!!(e&&e.width>0&&e.height>0)}async function Ca(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||xa((await U(e,t,!1)).snapshot.nodes,`gesture`)}const wa=async(e,n)=>{let r=await H(e,n,{action:`focus`,requireInteractive:!0,pipeline:M.resolvedTarget});if(!e.backend.focus)throw new t(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=F(await e.backend.focus(N(e,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ta=async(e,n)=>{let r=ha(n),i=await H(e,n,{action:`longPress`,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.longPress)throw new t(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:un(n.durationMs,`durationMs`,0,12e4),o=G(i),s=F(await e.backend.longPress(N(e,n),o,{durationMs:a}));return await ga(e,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},Ea=async(e,n)=>{let r=ha(n),i=r.needsPreActionBaseline?null:await Da(e,n);if(i)return i;let a=await H(e,n,{action:`hover`,requireInteractive:!1,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.hover)throw new t(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=F(await e.backend.hover(N(e,n),o));return await ga(e,n,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},r)};async function Da(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Si(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Oa=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,`drag`);let r=await Ca(e,n),i=await ka(e,n,`source`),a=await ka(e,n,`destination`),o=Je({from:G(i),to:G(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=F(await e.backend.performGesture(N(e,n),o)),{start:c,end:l}=Ke(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Aa(i),destination:Aa(a)},recording:ja(i,a),...s?{backendResult:s}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function ka(e,t,n){let r=t.gesture[n];return await H(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:M.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Aa(e){if(e.kind===`point`||!e.resolution)throw new t(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in e?e.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:e.resolution}}function ja(e,t){let n=Ma(e),r=Ma(t),i=Na(e),a=Na(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Ma(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Na(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Pa=async(e,t)=>await La(e,t,`press`),Fa=async(e,t)=>await La(e,t,`click`),Ia=async(e,n)=>{if(typeof n.text!=`string`)throw new t(`INVALID_ARGS`,`fill requires text`);let r=ha(n),i=r.needsPreActionBaseline?null:await Ba(e,n);if(i)return i;let a=await H(e,n,{action:`fill`,requireInteractive:!0,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.fill)throw new t(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Ra(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&be(s,e.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=F(await e.backend.fill(N(e,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ha(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await ga(e,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function La(e,n,r){let i=ha(n),a=i.needsPreActionBaseline?null:await za(e,n,r);if(a)return a;let o=await H(e,n,{action:r,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.tap)throw new t(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Ra(o),c;try{c=await e.backend.tap(N(e,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw yn(e,o),e}let l=F(c);return await ga(e,n,o,{...o,...l?{backendResult:l}:{}},i)}function Ra(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function za(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Va(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Si(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Ba(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Si(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Va(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Ha(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ua=M.wait.poll.defaultTimeoutMs;function Wa(e,t,n,r,i={}){let a=ir(r),o=n??a.defaultTimeoutMs,s=Y(e),c=no(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await ji(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Ga(r,c.lastUnobservedCause())),o;let f=eo(o.error);return a(f?`runner-restart`:`deadline`),u=f??{},{timedOut:!0,deadline:Ka(f!==void 0,c.readableCaptures())}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:qa(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await ro(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Ga(e,t){return e?`readable`:t?.outcome??`unreadable`}function Ka(e,t){return e?`runner-restart-exhausted`:t===0?`capture-stalled`:`capture-truncated`}function qa(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Ja(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Ya(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...n,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Xa(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.deadlineExceeded,captureTruncated:!0,...n})}function Za(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.targetAbsent,...n})}function Qa(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw $a(r.error,t);if(n)throw r.error}}function $a(e,n){let r=s(e);return new t(r.code,r.message,{reason:V.captureStalled,...r.details,...n},r)}function q(e,t,n){let r=t.failureEvidence();return n===`runner-restart-exhausted`?Ya(e,r):n===`capture-stalled`?(Qa(t,r,t.preserveUnreadableOnStall===!0),Ja(e,r)):n===`capture-truncated`?Xa(e,r):(Qa(t,r,!0),r.readableCaptures===0?Ja(e,r):Za(e,r))}function eo(e){if(!(e instanceof t))return;let n=e.details;if(n?.runnerRestarted===!0)return{runnerRestarted:!0,...J(n,`runnerRestartReason`),...J(n,`runnerRestartCommand`),...J(n,`runnerRestartCommandId`),...J(n,`runnerInvalidatedSessionId`),...J(n,`runnerRestartSessionId`),...J(n,`logPath`),...J(n,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function to(e){return e instanceof t&&e.details?.retriable===!0}function no(e=Xe){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(to(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function ro(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function io(e,t,n){let r=await L(M.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Pe(e,i)}}async function ao(e,t,n){let r=await io(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Ne(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function oo(e,t,n,r,i){let a=Oe(n);if(a)throw Le(a,`wait`);let o=Wa(t,n,i,M.wait,{isUnreadableError:co,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await io((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(a.kind===`sparse`||a.kind===`truncated`)throw Ne(r,a,`wait`);return a}catch(e){throw Xe(e)?Ie(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw l===`runner-restart-exhausted`?q(`wait absent timed out for selector: ${r}`,o,l):c?so(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function so(e,n,r){let i=n.matches!==1;return new t(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${n.matches} match${i?`es`:``} remain`,{reason:V.targetPresent,selector:e,...r,matches:n.matches,firstMatch:n.firstMatch})}function co(e){if(!(e instanceof t))return!1;let n=e.details;return n?.command===`wait`&&n.predicate===`absent`&&(n.observation===`sparse`||n.observation===`truncated`||n.observation===`unreadable`)}function lo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function uo(e,n,r,i,a,o){let s=Wa(n,r,a,M.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let t=await s.capture(async t=>await e.captureSnapshot(n,{...r,signal:t},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(t.timedOut){u=t.deadline;break}let a=t.value;if(a){let e=a.snapshot.nodes,t=lo(await L(M.wait,e,i,{platform:n.backend.platform}));if(t){let n=fo(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new t(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Vr,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function fo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=ut(e),a=ft(t.matchedNodes,i,ie(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:S(r),observedAncestry:dt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function po(e,n,r,i,a){let o=a??Ua,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new t(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:V.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function mo(e,t,n,r,i){let a=Wa(t,n,i,M.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await ho(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function ho(e,t,n,r){return t.backend.findText&&(await t.backend.findText(_o(t,n),r)).found?!0:await go(e,t,n,r)}async function go(e,t,n,r){return!!dr((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function _o(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function vo(e){let n=async(t,n)=>{switch(n.target.kind){case`sleep`:return await ro(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await yo(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await uo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await oo(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await po(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await bo(e,t,n,n.target.text,n.target.timeoutMs);default:return xo(n.target)}};return{waitCommand:n,waitForTextCommand:async(e,r)=>{let i=await n(e,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new t(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function yo(e,n,r,o,s){let c=await e.requireSnapshot(n,r.session),l=i(o);if(!l)throw new t(`INVALID_ARGS`,`Invalid ref: ${o}`);let u=a(c.snapshot.nodes,l),d=u?R(u,c.snapshot.nodes):void 0;if(!d)throw new t(`COMMAND_FAILED`,`Ref ${o} not found or has no label`);return await mo(e,n,r,d,s)}async function bo(e,n,r,i,a){let o=xe(i);if(!o.ok)throw new t(o.code,o.message);return await mo(e,n,r,o.text,a)}function xo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const So=vo({captureSnapshot:z,requireSnapshot:gr,stable:{defaultQuietMs:500,tinyTreeHint:zi,tinyTreeNodeCount:5,capture:Bi}}),Co=So.waitCommand,wo=So.waitForTextCommand,To=async(e,n)=>{let r=n.locator??`any`;if(!n.query)throw new t(`INVALID_ARGS`,v);if(n.action===`wait`)return await ko(e,n,r);if(n.action===`list`)return await Ao(e,n,r);let{capture:i,match:a}=await jo(e,n,r);if(!a)throw new t(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await yr(e,i,a),node:a}},Eo=async(e,t)=>{if(t.target.kind===`ref`){let n=await gr(e,t.session),r=br(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`});Ur(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=le(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await yr(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Mo(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?M.readText:M.readUnique,hooks:{onResolved:(e,n)=>Ur(e,n,t.expectedResolvedTarget,`get`)}}),r=le(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await yr(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Do=async(e,n)=>{let r=await Eo(e,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new t(`COMMAND_FAILED`,`getText returned non-text result`);return r},Oo=async(e,n)=>{let r=await Eo(e,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new t(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function ko(e,t,n){let r=Wa(e,t,t.timeoutMs,M.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await jo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Ao(e,t,n){let r=se(n,t.query),i=await z(e,t,{updateSession:!0,...K()});if(D(i.snapshot.snapshotQuality))throw hr(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?$n(M.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ye(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function jo(e,t,n,r){let i=se(n,t.query),a=await z(e,t,{updateSession:!0,scope:mr(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(D(a.snapshot.snapshotQuality))throw hr(a.snapshot.snapshotQuality);if(i){let t=await L(M.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ye(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Mo(e,n,r,i){let a=await z(e,{...n,session:r},{updateSession:!0,...K()}),o=await L(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(i.selector,[],{unique:!0}),{hint:Te([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const No=async(e,n)=>{let r=Ce(n.predicate);if(!r.ok)throw new t(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=Oe(n);if(e)throw Le(e)}if(i===`text`&&!n.expectedText)throw new t(`INVALID_ARGS`,ve);let a=n.selector,o=await Po(e,n,i,a);return i===`exists`?await Fo(e,o,a):i===`absent`?await ao(o.snapshot,a,e.backend.platform):await Io(e,n,o,i,a)};async function Po(t,n,r,i){try{return await z(t,n,{updateSession:!0,...K(r)})}catch(t){throw r!==`absent`||e(t)?t:Ie(i,t)}}async function Fo(e,n,r){let i=await L(M.readAny,n.snapshot.nodes,r,{platform:e.backend.platform});if(i.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(r,[],{unique:!1}),{hint:Te([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Se(r)}}async function Io(e,n,r,i,a){let o=await L(M.readUnique,r.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,t)=>Ur(e,t,n.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(a,[],{unique:!0}),{command:`is`,reason:je.selectorNotFound,predicate:i,selector:a,hint:Te([])});let s=_e({predicate:i,node:o.node,nodes:r.snapshot.nodes,expectedText:n.expectedText,platform:e.backend.platform});if(!s.pass)throw new t(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:je.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:Se(a),node:o.node,preActionNodes:r.snapshot.nodes}}const Lo=async(e,t)=>await No(e,{...t,predicate:`visible`,selector:t.target.selector}),Ro=async(e,t)=>await No(e,{...t,predicate:`hidden`,selector:t.target.selector}),zo=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,n.gesture.intent);let r=await Ca(e,n),i=qe(n.gesture,r,e.backend.platform),a=F(await e.backend.performGesture(N(e,n),i)),o=Vo(i.pointers,0),s=Vo(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Ho(n.gesture,o,s))}},Bo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Oa(e,{...t,gesture:n}):await zo(e,{...t,gesture:n})};function Vo(e,n){let r=e.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new t(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ho(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:To,get:Eo,getText:Do,getAttrs:Oo,is:No,isVisible:Lo,isHidden:Ro,wait:Co,waitForText:wo},Z={click:Fa,press:Pa,fill:Ia,focus:wa,longPress:Ta,hover:Ea,gesture:Bo,settleObservation:Zi};function Uo(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function Wo(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const Go=[0,187,255,255];function Ko(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||qo(e,n.rect)}function qo(e,t){let n=Jo(t);if(n==null)return;let r=Yo(n.x,0,e.width-1),i=Yo(n.y,0,e.height-1),a=Yo(n.right,0,e.width-1),o=Yo(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Q(e,n,i+t,Go),Q(e,n,o-t,Go);for(let n=i;n<=o;n+=1)Q(e,r+t,n,Go),Q(e,a-t,n,Go)}}function Jo(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Q(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function Yo(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const Xo=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function Zo(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!es(t,a,e))continue;let c=0,l=$o(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Qo({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Qo(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of Xo){let o=s+e.x,u=c+e.y;if(!ts(o,u,i,a))continue;let d=u*i+o;es(t,n,d)&&(l=$o(r,n,l,d))}return l}function $o(e,t,n,r){return t[r]=1,e[n]=r,n+1}function es(e,t,n){return e[n]===1&&t[n]!==1}function ts(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function ns(e,t){return e.flatMap(e=>rs(e,t.baseline.width,t.baseline.height)?is(e,t,us(t.baseline.height)):[e])}function rs(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ls(n)&&r>=t*.35}function is(e,t,n){let r=cs(e,ss(os(as(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>ds(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function as(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function os(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function ss(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function cs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ls(e){return Math.max(48,Math.round(e*.07))}function us(e){return Math.max(24,Math.round(e*.03))}function ds(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=fs(t,a),ps(i,e,t,a,r.baseline,r.current))}return i}function fs(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function ps(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const ms=2.5;function hs(e){let t=gs(e);return ns(t.length<=2e3?ys(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Ss(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function gs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Zo({mask:t,width:i,height:a,hooks:{create:e=>_s(e,i),visit:(e,t)=>vs(e,t,i,n,r)}})}function _s(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function vs(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),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]}function ys(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>bs(e,r,t));if(!e){n.push({...r});continue}xs(e,r)}return n}function bs(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function xs(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Ss(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Cs(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Cs(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:kn({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Es(r,n.width,n.height),size:Ds(s,n.totalPixels),location:ws(i,n.width,n.height),averageBaselineColorHex:ks(a),averageCurrentColorHex:ks(o),baselineLuminance:Math.round(Os(a)),currentLuminance:Math.round(Os(o)),dominantChange:Ts(a,o)}}function Cs(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function ws(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function Ts(e,t){let n=Os(t)-Os(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Es(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ms?`horizontal-band`:e.height>=e.width*ms?`vertical-band`:`compact`}function Ds(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Os(e){return e.r*.2126+e.g*.7152+e.b*.0722}function ks(e){return`#${As(e.r)}${As(e.g)}${As(e.b)}`}function As(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const js=Math.sqrt(3*255**2);async function Ms(e,t,n={}){await Ns(e,`Baseline image not found`),await Ns(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([O.readFile(e),O.readFile(t)]),[o,s]=await Promise.all([$e(i,`baseline screenshot`),$e(a,`current screenshot`)]);Ps(o.width,o.height,`baseline screenshot`,n.maxPixels),Ps(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Fs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*js,{diffData:d,diffMask:f,differentPixels:p}=await rt({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?hs({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new ot.PNG({width:o.width,height:o.height});e.data=d,Ko(e,m),await O.mkdir(ct.dirname(r),{recursive:!0}),await O.writeFile(r,await it(e))}else await Fs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Ns(e,n){try{await O.access(e)}catch{throw new t(`INVALID_ARGS`,`${n}: ${e}`)}}function Ps(e,n,r,i){if(i==null||i<=0)return;let a=e*n;if(!(a<=i))throw new t(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Fs(e){if(e)try{await O.unlink(e)}catch(e){if(!Is(e,`ENOENT`))throw e}}function Is(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Ls(e,t){return e.map(e=>{let n=Rs(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Rs(e,t){let n=re(e.rect);return t.map(t=>{let r=t.overlayRect,i=An(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:zs(i/re(r)),regionCoveragePercentage:zs(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function zs(e){return Math.round(e*100*100)/100}async function Bs(e,n,r){if(n.kind===`path`&&!e.policy.allowLocalInputPaths)throw new t(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(n,r)}catch(e){throw s(e)}}async function Vs(e,n,r){if(n?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new t(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(n,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw s(e)}}async function Hs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw s(e)}}const Us=async(e,n)=>{if(!n.baseline)throw new t(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Ws(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!Qs(i))throw new t(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Bs(e,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let t;Qs(i)?(s=await Gs(e,n),t=s.path):(o=await Bs(e,i,{usage:`diff screenshot current`,field:`current`}),t=o.path),c=n.out?await Vs(e,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Ms(a.path,t,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});Qs(i)&&(u=await Ks(e,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Ws(e){if(e==null||e===``)return .1;let n=Number(e);if(Number.isNaN(n)||n<0||n>1)throw new t(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Gs(e,t){let n=await Hs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await qs(e,t,n.path,Js(t))}catch(e){throw await n.cleanup(),e}return n}async function Ks(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Zs(n),r;let a=await Vs(e,Ys(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await qs(e,t,a.path,{overlayRefs:!0,...Js(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:Ls(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function qs(e,n,r,i={}){if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??e.signal,metadata:n.metadata},r,i)??{}}function Js(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Ys(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:Xs(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:Xs(e.out.clientPath)}:{},...e.out.fileName?{fileName:Xs(e.out.fileName)}:{}}}function Xs(e){let t=ct.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Zs(e){try{await O.unlink(Xs(e))}catch(e){if(!$s(e,`ENOENT`))throw e}}function Qs(e){return e.kind===`live`}function $s(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const ec=async(e,n)=>{if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);c(n);let r=await Vs(e,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await Qe(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function tc(e){let{nodes:t,backend:r,snapshotRaw:i}=e;if(i||!n(r))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Be(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const nc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function rc(e){return e?.systemSurfaceOnly===!0?nc:void 0}function ic(e,t){return e.presentationKey?e:{...e,presentationKey:r(t)}}function ac(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!oc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!sc(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function oc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function sc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>lc(e,t.nodes[n]))}const cc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,role:!0,subrole:!0,label:!0,value:!0,identifier:!0,enabled:!0,selected:!0,focused:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function lc(e,t){return cc.every(n=>e[n]===t[n])&&uc(e.rect,t.rect)&&dc(e.presentationHints,t.presentationHints)&&dc(e.actions,t.actions)}function uc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function dc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const fc=async(e,t)=>{let n=await mc(e,t),r=ac({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(gc(t.session,n));let i=vc(n.snapshot);return d(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:tc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},..._c(n)})},pc=async(e,t)=>{let n=await mc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=gc(t.session,n);if(!i){let t=Ei(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=Ti(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function mc(e,n){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=hc(a,e),s=d(o,ic(o,n)),c=l(a),u=P(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:yc({result:a,annotations:c,snapshot:s,options:n,session:i,capturedAt:s.createdAt??u,runtimeNow:u})}}function hc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t)}}function gc(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 _c(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function vc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:st(e.producer)===`unavailable`&&void 0:e.truncated}function yc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...nt(vc(e.snapshot))),t.push(...wc(e)),e.annotations.quality||(t.push(...xc(e)),t.push(...Cc(e.snapshot.nodes)));let n=gt(e.snapshot.nodes);n&&t.push(n);let r=bc(e.annotations);r&&t.push(r);let i=Tc(e);return i&&t.push(i),t.push(...kc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function bc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return nc}function xc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Sc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Sc(e){return e?b(e.type??``)===`application`:!1}function Cc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function wc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Tc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ec(t,e.snapshot)&&Dc(t,e.capturedAt,e.runtimeNow)&&Ac(t.nodes.length,e.snapshot.nodes.length))return Oc}function Ec(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Dc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Oc=`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.`;function kc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`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.`]:e.reason===`sharp-drop`?[Oc]:[]}function Ac(e,t){return e<12?!1:t<=Math.floor(e*.2)}const jc={screenshot:ec,diffScreenshot:Us,snapshot:fc,diffSnapshot:pc};function Mc(e){return Cn(jc,e)}export{on as A,M as C,gn as D,hn as E,ft as F,_t as M,dt as N,dn as O,ut as P,bn as S,pn as T,Rn as _,Wo as a,F as b,Vr as c,R as d,dr as f,Bn as g,er as h,Bs as i,an as j,un as k,V as l,L as m,rc as n,Uo as o,$n as p,Vs as r,Br as s,Mc as t,Tr as u,Fn as v,fn as w,N as x,Cn as y};
|
|
3
|
+
`).toLowerCase(),n=k(e,Dt),r=k(e,Ue),i=k(e,He,jt),a=k(e,Et),o=St(t),s=Ct(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:Tt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:wt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function yt(e){let t=Nt(e.dismissNodes);if(t)return It(t,Lt(t));let n=Rt(e.collapsedNodes.filter(Mt));return n?.rect?{action:`close-collapsed-banner`,point:Ut(n),rect:n.rect,ref:n.ref,label:A(n)}:null}function bt(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function xt(e){return pt.test(e)}function St(e){return mt.some(t=>t.test(e))}function Ct(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function wt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function Tt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(xt(e.text)||e.hasReactNativeStackFrame)}function Et(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Dt(e){return Ve(e)||Ot(e)||kt(e)}function Ot(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function kt(e){return ht.has(e)}function At(e){return/^!,\s+/.test(e)}function jt(e){return!e.rect||e.rect.height<=180}function Mt(e){let t=A(e)?.trim().toLowerCase()??``;return(Et(t)||At(t))&&We(e)}function k(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function Nt(e){return zt(e,Ft)}function Pt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Ft(e){return[Vt(Pt(e)),Vt(e.hittable),-(e.rect?re(e.rect):1/0)]}function It(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:o(e.rect),rect:e.rect,ref:e.ref,label:A(e)}}function Lt(e){let t=A(e)?.trim().toLowerCase();return t&&Ve(t)?`dismiss`:`close`}function Rt(e){return zt(e,Bt)}function zt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Ht(t(n),t(e)))[0]??null}function Bt(e){return[Vt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Vt(e){return+(e===!0)}function Ht(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function Ut(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round(Wt(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}function A(e){return e.label??e.value??e.identifier}const Gt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Kt={strippedIndexes:new Set,refs:new Set};function qt(e){let t=new Set(e.filter(e=>b(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Kt;let n=new Map(e.map(e=>[e.index,e])),r=Qt(e,n,t),i=new Set(r),a=sn(e,n,r);for(let t of Qt(e,n,a))i.add(t);for(let o of Jt(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Jt(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Xt(t,n,r);if(o.size===0)return a;let s=Zt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Yt(n,t,o)&&a.add(n.index);return a}function Yt(e,t,n){if(!e.rect)return!1;let r=cn(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function Xt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=cn(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Zt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Qt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)ln(i,t,n)&&r.add(i.index);return r}function $t(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ze(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function en(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(p).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:tn(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Kt:{strippedIndexes:o,refs:s}}function tn(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&$t(e,t)).map(e=>e.index))}function nn(e,t){let n=qt(e),r=en(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function rn(e,t){let{strippedIndexes:n}=nn(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function an(e,t){return nn(e,t).refs}function on(e){return qt(e).refs}function sn(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||b(n.type??``)!==`keyboard`)continue;let i=cn(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Gt.has(b(e.type??``))&&!n.has(e.index)&&ln(e,t,a))&&r.delete(i)}return r}function cn(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(b(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function ln(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function un(e,n,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new t(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return e}function dn(e,n,r){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new t(`INVALID_ARGS`,n,r);return{x:i,y:a}}function fn(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??pn(),policy:e.policy??gn(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function pn(e=[]){let t=new Map(e.map(e=>[e.name,j(e)]));return{get:e=>j(t.get(e)),set:e=>{t.set(e.name,j(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>j(e))}}function j(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:mn(e.metadata)}:{}}}function mn(e){try{return structuredClone(e)}catch{return{...e}}}function hn(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function gn(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const _n={defaultTimeoutMs:1e4,intervalMs:300},M={promotedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:C.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:C.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:C.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:_n},wait:{resolution:C.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:_n},readList:{resolution:C.readList,occlusion:`ignore`},findAct:{resolution:C.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:C.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},vn=new WeakMap;function yn(e,t){xn(e)&&vn.set(e,t)}function bn(e){return xn(e)?vn.get(e):void 0}function xn(e){return typeof e==`object`&&!!e||typeof e==`function`}function N(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function P(e){return e.clock?.now()??Date.now()}async function Sn(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Cn(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function F(e){return e&&typeof e==`object`?e:void 0}function wn(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=Ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?En(a):a.matchedNodes.length>1?Tn(a):En(a)}let a=g(e,t,{...r,...me({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:Tn(a.firstMatch):{kind:`none`}}function Tn(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function En(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function Dn(e,t,n){let r=Ee(e,he(t),n);return r?{...r,selector:r.selector.raw}:null}function On(e,t,n,r){let i=wn(e,he(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function kn(e){return e}function An(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const jn=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function I(e){return[e.type,e.role,e.subrole].map(e=>b(e??``)).some(e=>e===`tab`||jn.some(t=>e.includes(t)))}function Mn(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Yn(e);if(!Nn(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Vn(e,n,r).node;for(let n of t.slice(1))if(Vn(e,n,r).node.index!==i.index){let e=In(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Nn(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Pn(i,a,t)&&!Pn(a,i,t))return!1}return!0}function Pn(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Fn(e,t){return In(t,Yn(e))}function In(e,t){if(e.length<2||!Nn(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!I(n)||!e.every(e=>e===n||!I(e)))return null;let r=E(n.rect);return r&&e.every(e=>Ln(E(e.rect),r))?n:null}function Ln(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Rn(e,t){if(!t?.rect||!e.rect||!y(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function zn(e,t){return Vn(e,t)}function Bn(e){let t=Yn(e);return n=>Vn(e,n,t)}function Vn(e,t,n){return f(t)?{node:t,reason:`covered`}:Hn(e,t,n)??Un(t)??Wn(e,t,n)??{node:t,reason:`original`}}function Hn(e,t,n){let r=Kn(e,t,n);return r?.rect&&T(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Un(e){return I(e)&&e.rect&&T(e.rect)?{node:e,reason:`semantic-target`}:null}function Wn(e,t,n){let r=Gn(e,t,n);return!r?.rect||f(r)||!T(r.rect)?null:qn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Gn(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?te(e,t,n.nodesByIndex,e=>r(e)?e:null):ue(e,t,r)}function Kn(e,t,n){let r=E(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||f(e))return!1;let t=E(e.rect);return t?Ge(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function qn(e,t,n,r){let i=E(e.rect),a=E(t.rect);if(!i||!a)return!1;if(Jn(t)&&!Ge(i,a))return!0;let o=_(n,i,r?.viewportRootRects);return!o||!Xn(a,o)?!1:!Ge(i,a)}function Jn(e){let t=b(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Yn(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(y(i)){let e=E(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Xn(e,t){let n=An(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function L(e,t,n,r,i={}){let a=On(tr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Qn(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Zn(t,a);return o?await Qn(e,t,o,i):a}function Zn(e,t){let n=Fn(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Qn(e,t,n,r){let i=await er(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function $n(e,t,n,r){let i=tr(e,t);return{candidates:i,list:Dn(i,n,{...r,requireRect:e.resolution.requireRect})}}async function er(e,t,n,r={}){r.onResolved?.(n,t);let i=nr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||f(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await rr(e,t,i.node,r)}}function tr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!f(e)):t}function nr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=zn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Rn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function rr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function ir(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function ar(e){return e.hittable===!0||I(e)}function or(e,t){let n=oe(S(e),t);return n.id!==void 0||n.label!==void 0?!1:ee(e.value)===null}function sr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function cr(e,t){let n=ut(t);return t.filter(t=>t.index!==e.index&&sr(t,e,n)).sort((e,t)=>e.index-t.index)}function lr(e,t){let n=T(e.rect);return!n||!t.rect?!1:de(t.rect,n.x,n.y)}function ur(e,t){if(!or(e,t))return e;let n=cr(e,t);if(n.some(ar))return e;let r=n.find(e=>S(e).label!==void 0);return!r||!lr(r,e)?e:r}function dr(e,t){return e.find(e=>De(e,t))??null}function R(e,t){let n=ce(e);return n&&m(n)?n:fr(e,t)}function fr(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=ce(e);if(!t||!m(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function pr(e){return e===`text`||e===`label`||e===`any`}function mr(e,t,n,r){if(!(r||e===`web`))return pr(t)?n:void 0}function hr(e){return new t(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function gr(e,n){let r=n??`default`,i=await e.sessions.get(r);if(!i)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new t(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function z(e,n,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await e.sessions.get(a),s=_r(await i(N(e,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),e);return(n.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!D(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function _r(e,t){return e.snapshot?vr(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function vr(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function yr(e,t,n){if(e.backend.readText){let r=await e.backend.readText(N(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Fe(n)}function br(e,n,r){let o=i(n);if(!o)throw new t(`INVALID_ARGS`,r.invalidRefMessage);let s=a(e,o)??(r.fallbackLabel.length>0?dr(e,r.fallbackLabel):null);if(!s)throw new t(`COMMAND_FAILED`,r.notFoundMessage);return{ref:o,node:s}}function xr(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Sr(e){let t=Buffer.alloc(16);for(let n of e)wr(t,Cr(n));return{digest:`ax1:${lt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Cr(e){return lt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function wr(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function Tr(e){let{digest:t,nodeCount:n}=Sr(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Er(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Er(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function B(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function Dr(e,t){if(!(!e||e.surfaceBundleId===t.surfaceBundleId))return{from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`,disclosure:at(t.surfaceBundleId)}}function Or(e,t){let n=Tr(e.nodes),r=Dr(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==Tr(t.nodes).digest;return{...n,changedFromBefore:i}}function kr(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function Ar(e,t,n={}){let r=E(t.rect),i=T(r??void 0);if(!r||!i)return{kind:`invalid`};let a=jr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?Nr(e,t):null,r),s=o?Pr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function jr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>Mr(e,t,r)).filter(I).flatMap(e=>{let t=E(e.rect);if(!t||Ge(t,n))return[];let r=Nr(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function Mr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Nr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function Pr(e,t,n,r){let i=zr(e),a=Lr(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=Lr(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!de(t,s.x,s.y))return[];let c=Fr(s,e,n,r,i);return c?[c]:[]})).sort(Ir)[0]?.point??null}function Fr(e,t,n,r,i){let a=Rr(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function Ir(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function Lr(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function Rr(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function zr(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const V={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Br=`replay_target_guard_mismatch`,Vr=V.landmarkIdentityMismatch;function Hr(e,n,r,i){let{candidates:a,list:o}=$n(i,e,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Mn(a,s);if(l.kind===`ambiguous`)throw new t(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ae(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}function Ur(e,n,r,i,a){if(!r)return;let o=S(e),s=pe(e,n);if(!(h(o,r.identity)&&ae(s,r.structural)))throw new t(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Br,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function H(e,t,n){return await di(e,t,n.action),t.target.kind===`point`?await Gr(e,t,t.target,n):t.target.kind===`ref`?await Yr(e,t,t.target,n):await Xr(e,t,t.target,n)}async function Wr(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=x(i.snapshot.nodes).resolveViewport(a);if(!o)return;let s={x:n.x,y:n.y};if(!de(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Gr(e,t,n,r){let i=await Wr(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Kr(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Kr(e,t){try{return B((await U(e,t,!0)).snapshot)}catch{return}}function qr(e,n){let r=i(e.ref);if(!r)throw new t(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let a=i(n.ref),o=n.node.ref?i(n.node.ref):null;if(a!==r||o!==r||!n.nodes.includes(n.node))throw new t(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},resolved:ti(r,n.node,`exact`)}}async function Jr(e,t,n){let r=await pi(e,t,n);return{tree:B(r.snapshot),resolved:r.resolved}}async function Yr(e,t,n,r){let{tree:a,resolved:o}=r.preresolvedTarget?qr(n,r.preresolvedTarget):await Jr(e,t,n),s=a.nodes,c=await ci({policy:r.pipeline,nodes:s,node:o.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Qr(e,t,r),offscreen:async(i,a)=>await yi(e,t,i,a,n.ref,r)}});return{kind:`ref`,point:gi(c,s,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${i(n.ref)??c.ref}`}}),target:{kind:`ref`,ref:`@${o.ref}`},...ai(e,c,a,r.action,o.resolution)}}async function Xr(e,t,n,r){let i=n.selector,a=await U(e,t,r.requireInteractive),o=Hr(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await U(e,t,!1),o=Hr(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Zr({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,c=await ci({policy:r.pipeline,nodes:a.snapshot.nodes,node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Qr(e,t,r),offscreen:async(n,i)=>await vi(e,t,n,i,s.selector,r)}});return{kind:`selector`,point:gi(c,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}}),target:{kind:`selector`,selector:o.selector},...ai(e,c,B(a.snapshot),r.action,ri(o,a.snapshot.nodes))}}async function Zr(e){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await L(M.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return li({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new t(`COMMAND_FAILED`,ge(i,c,{unique:!0}),{reason:je.selectorNotFound,hint:Te(c)})}function Qr(e,t,n){Ur(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const $r={source:`ref`,phase:`pre-action`,kind:`exact`},ei={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ti(e,t,n){return{ref:e,node:t,resolution:n===`exact`?$r:ei}}const ni={source:`runtime`,phase:`pre-action`,kind:`unique`};function ri(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ii(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ii(e,t))}:ni}function ii(e,t){let n=b(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:xr(n,256)}:{},...r===void 0?{}:{label:xr(r,256)}}}function ai(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:le(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...si(t,r),preAction:n,resolution:i,...oi(e,t,a,r)}}function oi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=ur(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:le(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function si(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function ci(e){let t=await er(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw li({label:e.label,node:t.node,action:e.action});return t.node}function li(e){return new t(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${ui(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function ui(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}async function U(e,n,r){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await e.sessions.get(i);if(!a)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(N(e,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function di(e,n,r){if(e.backend.platform!==`macos`)return;let i=await fi(e,n);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new t(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function fi(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function pi(e,n,r){let{session:i,snapshot:a}=await gr(e,n.session),o=r.fallbackLabel??``,s=hi(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new t(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:we});return mi({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function mi(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=hi(o.nodes,r.ref,{fallbackLabel:i});return s&&h(S(a.node),S(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function hi(e,n,r){let o=i(n);if(!o)throw new t(`INVALID_ARGS`,`Invalid ref: ${n}`);let s=a(e,o);if(_i(s))return ti(o,s,`exact`);let c=r.fallbackLabel.length>0?dr(e,r.fallbackLabel):null;return _i(c)?ti(o,c,`label-fallback`):null}function gi(e,n,r){let i=x(n),a=Ar(n,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new t(`COMMAND_FAILED`,r.invalidMessage):new t(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function _i(e){return e?T(e.rect)!==null:!1}async function vi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${bi(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function yi(e,t,n,r,a,{action:o}){return await Ci(e,t,n,r,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:i(a)},hint:e=>`${bi(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function bi(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function xi(e,t,n,r){let a=(await e.sessions.get(t.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||i(n.ref)===null)return{};let s=hi(o,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!s)return{};let c=M.resolvedTarget,l=await ci({policy:c,nodes:o,node:s.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await yi(e,t,i,a,n.ref,{action:r,pipeline:c})}});return{...si(l,r),node:l,preAction:B(a)}}async function Si(e,t,n,r,i){let a=await xi(e,t,n,r),o=F(await i(N(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:$r,...a,...o?{backendResult:o}:{}}}async function Ci(e,n,r,i,a){let o=x(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await e.backend.confirmOffscreenTargetVisible?.(N(e,n),r,c);if(l)return{...r,rect:l};let u=ze(r,o);throw new t(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function wi(e,t){let n=ke(e.type??`Element`),r=Re(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Ti(e,t,n={}){let r=Oi(Di(e,n),Di(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Ei(e,t={}){return Di(e,t).length}function Di(e,t){return t.flatten?e.map(e=>({text:Ae(e,0,!1),comparable:wi(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:wi(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Oi(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Ai(a,i,s)?W(a,i+1):W(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return ki(o,e,t,n,r)}}return[]}function ki(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Ai(i,c,r)?c+1:c-1,u=W(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Ai(e,t,n){return t===-n||t!==n&&W(e,t-1)<W(e,t+1)}function W(e,t){return e.get(t)??0}async function ji(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Mi(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Ni(e.nodes):e.nodes).map(Ii);return n.sort((e,t)=>Ri(e).localeCompare(Ri(t))),{captureBackend:t,nodes:n}}function Ni(e){let t=x(e);return e.filter(e=>y(e)||t.isVisibleOnScreen(e))}function Pi(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Fi(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function Ii(e){return{identity:`${e.type??``}#${Li(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Li(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Ri(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const zi=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Bi(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=P(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;P(e)<o;){let c=await qi(e,t,o-P(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Vi(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Mi(c.snapshot);_=Ui({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=P(e),ee=Gi({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=Ki({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Sn(e,t);continue}if(!Pi(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=Ki({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await Sn(e,te)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Vi(e,t,n){if(!e||!t||!Hi(t.backend,n))return;let r=t.nodes.some(y),i=e.length<=5;if(!(!r&&!i))return Mi({...t,nodes:e})}function Hi(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Ui(e){return e.requestedQuietMs<500||!Fi(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Wi(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Gi(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Wi(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Ki(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function qi(e,t,n,r){let i=await ji(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Ji=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Yi=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Xi(e,t,n){return await Qi(e,t,{...n,baseline:await ta(e,t,n.resolved),actionPoint:n.resolved.point})}const Zi=async(e,t)=>(await Qi(e,t,t)).observation;async function Qi(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await $i(e,t,n,a,await Bi(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function $i(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Yi:Ji}};let{stored:o,session:s}=await ma(e,t,i.lastCapture),c=B(i.lastCapture.snapshot),l=c.nodes,u=Dr(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?oa(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...fa(i,o,l.length,u)},settledCapture:c}}function ea(e,t){if(e)return Or(e,t)}async function ta(e,t,n){let r=await e.sessions.get(t.session??`default`);return na(n,r)??ia(n.preAction)??ra(r)}function na(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?ia(B(n)):void 0}function ra(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?B(t):{nodes:[]}}function ia(e){return e?.nodes.length?e:void 0}function aa(e,t,n){let r=Ti(rn(e,n),rn(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=da(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function oa(e,t,n,r){let i=aa(e,t,r);return{diff:i,...sa(i,t,n,r)}}function sa(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=an(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!ca(o.get(e),n))?{}:ua(t,i,r)}function ca(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const la=new Set([`application`,`window`]);function ua(e,t,n){let r=an(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!la.has(ke(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=ke(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function da(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function fa(e,t,n,r){let i=pa(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=kr(r);return{hint:i===void 0?a:`${a} ${i}`}}function pa(e,t,n){return e.stalled?{hint:Yi}:e.settled?t?n<5?{hint:zi}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Ji}}async function ma(e,t,n){if(D(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ha(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function ga(e,t,n,r,i){let a=await _a(e,t,n,i);return ya({...r,...a})}async function _a(e,t,n,r){if(r.settle!==void 0){let i=await Xi(e,t,{...r.settle,resolved:n}),a=r.verify?ea(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await va(e,t,n);return i?{evidence:i}:{}}async function va(e,t,n){try{return Or(B((await U(e,t,!0)).snapshot),n.preAction)}catch{return}}function ya(e){let t=e;if(t.targetHittable!==!1||!ba(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function ba(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function xa(e,n){let r=x(e),i=e.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Sa),a=i.length>0?i:e.map(e=>e.rect).filter(Sa);if(a.length===0)throw new t(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Sa(e){return!!(e&&e.width>0&&e.height>0)}async function Ca(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||xa((await U(e,t,!1)).snapshot.nodes,`gesture`)}const wa=async(e,n)=>{let r=await H(e,n,{action:`focus`,requireInteractive:!0,pipeline:M.resolvedTarget});if(!e.backend.focus)throw new t(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=F(await e.backend.focus(N(e,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ta=async(e,n)=>{let r=ha(n),i=await H(e,n,{action:`longPress`,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.longPress)throw new t(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:un(n.durationMs,`durationMs`,0,12e4),o=G(i),s=F(await e.backend.longPress(N(e,n),o,{durationMs:a}));return await ga(e,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},Ea=async(e,n)=>{let r=ha(n),i=r.needsPreActionBaseline?null:await Da(e,n);if(i)return i;let a=await H(e,n,{action:`hover`,requireInteractive:!1,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.hover)throw new t(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=F(await e.backend.hover(N(e,n),o));return await ga(e,n,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},r)};async function Da(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Si(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Oa=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,`drag`);let r=await Ca(e,n),i=await ka(e,n,`source`),a=await ka(e,n,`destination`),o=Je({from:G(i),to:G(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=F(await e.backend.performGesture(N(e,n),o)),{start:c,end:l}=Ke(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Aa(i),destination:Aa(a)},recording:ja(i,a),...s?{backendResult:s}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function ka(e,t,n){let r=t.gesture[n];return await H(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:M.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Aa(e){if(e.kind===`point`||!e.resolution)throw new t(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in e?e.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:e.resolution}}function ja(e,t){let n=Ma(e),r=Ma(t),i=Na(e),a=Na(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Ma(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Na(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Pa=async(e,t)=>await La(e,t,`press`),Fa=async(e,t)=>await La(e,t,`click`),Ia=async(e,n)=>{if(typeof n.text!=`string`)throw new t(`INVALID_ARGS`,`fill requires text`);let r=ha(n),i=r.needsPreActionBaseline?null:await Ba(e,n);if(i)return i;let a=await H(e,n,{action:`fill`,requireInteractive:!0,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.fill)throw new t(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Ra(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&be(s,e.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=F(await e.backend.fill(N(e,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ha(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await ga(e,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function La(e,n,r){let i=ha(n),a=i.needsPreActionBaseline?null:await za(e,n,r);if(a)return a;let o=await H(e,n,{action:r,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.tap)throw new t(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Ra(o),c;try{c=await e.backend.tap(N(e,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw yn(e,o),e}let l=F(c);return await ga(e,n,o,{...o,...l?{backendResult:l}:{}},i)}function Ra(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function za(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Va(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Si(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Ba(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Si(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Va(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Ha(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ua=M.wait.poll.defaultTimeoutMs;function Wa(e,t,n,r,i={}){let a=ir(r),o=n??a.defaultTimeoutMs,s=Y(e),c=no(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await ji(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Ga(r,c.lastUnobservedCause())),o;let f=eo(o.error);return a(f?`runner-restart`:`deadline`),u=f??{},{timedOut:!0,deadline:Ka(f!==void 0,c.readableCaptures())}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:qa(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await ro(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Ga(e,t){return e?`readable`:t?.outcome??`unreadable`}function Ka(e,t){return e?`runner-restart-exhausted`:t===0?`capture-stalled`:`capture-truncated`}function qa(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Ja(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Ya(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...n,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Xa(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.deadlineExceeded,captureTruncated:!0,...n})}function Za(e,n){return new t(`COMMAND_FAILED`,e,{reason:V.targetAbsent,...n})}function Qa(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw $a(r.error,t);if(n)throw r.error}}function $a(e,n){let r=s(e);return new t(r.code,r.message,{reason:V.captureStalled,...r.details,...n},r)}function q(e,t,n){let r=t.failureEvidence();return n===`runner-restart-exhausted`?Ya(e,r):n===`capture-stalled`?(Qa(t,r,t.preserveUnreadableOnStall===!0),Ja(e,r)):n===`capture-truncated`?Xa(e,r):(Qa(t,r,!0),r.readableCaptures===0?Ja(e,r):Za(e,r))}function eo(e){if(!(e instanceof t))return;let n=e.details;if(n?.runnerRestarted===!0)return{runnerRestarted:!0,...J(n,`runnerRestartReason`),...J(n,`runnerRestartCommand`),...J(n,`runnerRestartCommandId`),...J(n,`runnerInvalidatedSessionId`),...J(n,`runnerRestartSessionId`),...J(n,`logPath`),...J(n,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function to(e){return e instanceof t&&e.details?.retriable===!0}function no(e=Xe){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(to(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function ro(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function io(e,t,n){let r=await L(M.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Pe(e,i)}}async function ao(e,t,n){let r=await io(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Ne(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function oo(e,t,n,r,i){let a=Oe(n);if(a)throw Le(a,`wait`);let o=Wa(t,n,i,M.wait,{isUnreadableError:co,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await io((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(a.kind===`sparse`||a.kind===`truncated`)throw Ne(r,a,`wait`);return a}catch(e){throw Xe(e)?Ie(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw l===`runner-restart-exhausted`?q(`wait absent timed out for selector: ${r}`,o,l):c?so(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function so(e,n,r){let i=n.matches!==1;return new t(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${n.matches} match${i?`es`:``} remain`,{reason:V.targetPresent,selector:e,...r,matches:n.matches,firstMatch:n.firstMatch})}function co(e){if(!(e instanceof t))return!1;let n=e.details;return n?.command===`wait`&&n.predicate===`absent`&&(n.observation===`sparse`||n.observation===`truncated`||n.observation===`unreadable`)}function lo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function uo(e,n,r,i,a,o){let s=Wa(n,r,a,M.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let t=await s.capture(async t=>await e.captureSnapshot(n,{...r,signal:t},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(t.timedOut){u=t.deadline;break}let a=t.value;if(a){let e=a.snapshot.nodes,t=lo(await L(M.wait,e,i,{platform:n.backend.platform}));if(t){let n=fo(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new t(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Vr,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function fo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=ut(e),a=ft(t.matchedNodes,i,ie(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:S(r),observedAncestry:dt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function po(e,n,r,i,a){let o=a??Ua,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new t(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:V.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function mo(e,t,n,r,i){let a=Wa(t,n,i,M.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await ho(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function ho(e,t,n,r){return t.backend.findText&&(await t.backend.findText(_o(t,n),r)).found?!0:await go(e,t,n,r)}async function go(e,t,n,r){return!!dr((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function _o(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function vo(e){let n=async(t,n)=>{switch(n.target.kind){case`sleep`:return await ro(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await yo(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await uo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await oo(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await po(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await bo(e,t,n,n.target.text,n.target.timeoutMs);default:return xo(n.target)}};return{waitCommand:n,waitForTextCommand:async(e,r)=>{let i=await n(e,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new t(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function yo(e,n,r,o,s){let c=await e.requireSnapshot(n,r.session),l=i(o);if(!l)throw new t(`INVALID_ARGS`,`Invalid ref: ${o}`);let u=a(c.snapshot.nodes,l),d=u?R(u,c.snapshot.nodes):void 0;if(!d)throw new t(`COMMAND_FAILED`,`Ref ${o} not found or has no label`);return await mo(e,n,r,d,s)}async function bo(e,n,r,i,a){let o=xe(i);if(!o.ok)throw new t(o.code,o.message);return await mo(e,n,r,o.text,a)}function xo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const So=vo({captureSnapshot:z,requireSnapshot:gr,stable:{defaultQuietMs:500,tinyTreeHint:zi,tinyTreeNodeCount:5,capture:Bi}}),Co=So.waitCommand,wo=So.waitForTextCommand,To=async(e,n)=>{let r=n.locator??`any`;if(!n.query)throw new t(`INVALID_ARGS`,v);if(n.action===`wait`)return await ko(e,n,r);if(n.action===`list`)return await Ao(e,n,r);let{capture:i,match:a}=await jo(e,n,r);if(!a)throw new t(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await yr(e,i,a),node:a}},Eo=async(e,t)=>{if(t.target.kind===`ref`){let n=await gr(e,t.session),r=br(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`});Ur(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=le(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await yr(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Mo(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?M.readText:M.readUnique,hooks:{onResolved:(e,n)=>Ur(e,n,t.expectedResolvedTarget,`get`)}}),r=le(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await yr(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Do=async(e,n)=>{let r=await Eo(e,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new t(`COMMAND_FAILED`,`getText returned non-text result`);return r},Oo=async(e,n)=>{let r=await Eo(e,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new t(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function ko(e,t,n){let r=Wa(e,t,t.timeoutMs,M.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await jo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Ao(e,t,n){let r=se(n,t.query),i=await z(e,t,{updateSession:!0,...K()});if(D(i.snapshot.snapshotQuality))throw hr(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?$n(M.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ye(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function jo(e,t,n,r){let i=se(n,t.query),a=await z(e,t,{updateSession:!0,scope:mr(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(D(a.snapshot.snapshotQuality))throw hr(a.snapshot.snapshotQuality);if(i){let t=await L(M.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ye(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Mo(e,n,r,i){let a=await z(e,{...n,session:r},{updateSession:!0,...K()}),o=await L(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(i.selector,[],{unique:!0}),{hint:Te([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const No=async(e,n)=>{let r=Ce(n.predicate);if(!r.ok)throw new t(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=Oe(n);if(e)throw Le(e)}if(i===`text`&&!n.expectedText)throw new t(`INVALID_ARGS`,ve);let a=n.selector,o=await Po(e,n,i,a);return i===`exists`?await Fo(e,o,a):i===`absent`?await ao(o.snapshot,a,e.backend.platform):await Io(e,n,o,i,a)};async function Po(t,n,r,i){try{return await z(t,n,{updateSession:!0,...K(r)})}catch(t){throw r!==`absent`||e(t)?t:Ie(i,t)}}async function Fo(e,n,r){let i=await L(M.readAny,n.snapshot.nodes,r,{platform:e.backend.platform});if(i.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(r,[],{unique:!1}),{hint:Te([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Se(r)}}async function Io(e,n,r,i,a){let o=await L(M.readUnique,r.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,t)=>Ur(e,t,n.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,ge(a,[],{unique:!0}),{command:`is`,reason:je.selectorNotFound,predicate:i,selector:a,hint:Te([])});let s=_e({predicate:i,node:o.node,visibility:x(r.snapshot.nodes),expectedText:n.expectedText,platform:e.backend.platform});if(!s.pass)throw new t(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:je.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:Se(a),node:o.node,preActionNodes:r.snapshot.nodes}}const Lo=async(e,t)=>await No(e,{...t,predicate:`visible`,selector:t.target.selector}),Ro=async(e,t)=>await No(e,{...t,predicate:`hidden`,selector:t.target.selector}),zo=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,n.gesture.intent);let r=await Ca(e,n),i=qe(n.gesture,r,e.backend.platform),a=F(await e.backend.performGesture(N(e,n),i)),o=Vo(i.pointers,0),s=Vo(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Ho(n.gesture,o,s))}},Bo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Oa(e,{...t,gesture:n}):await zo(e,{...t,gesture:n})};function Vo(e,n){let r=e.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new t(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ho(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:To,get:Eo,getText:Do,getAttrs:Oo,is:No,isVisible:Lo,isHidden:Ro,wait:Co,waitForText:wo},Z={click:Fa,press:Pa,fill:Ia,focus:wa,longPress:Ta,hover:Ea,gesture:Bo,settleObservation:Zi};function Uo(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function Wo(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const Go=[0,187,255,255];function Ko(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||qo(e,n.rect)}function qo(e,t){let n=Jo(t);if(n==null)return;let r=Yo(n.x,0,e.width-1),i=Yo(n.y,0,e.height-1),a=Yo(n.right,0,e.width-1),o=Yo(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Q(e,n,i+t,Go),Q(e,n,o-t,Go);for(let n=i;n<=o;n+=1)Q(e,r+t,n,Go),Q(e,a-t,n,Go)}}function Jo(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Q(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function Yo(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const Xo=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function Zo(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!es(t,a,e))continue;let c=0,l=$o(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Qo({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Qo(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of Xo){let o=s+e.x,u=c+e.y;if(!ts(o,u,i,a))continue;let d=u*i+o;es(t,n,d)&&(l=$o(r,n,l,d))}return l}function $o(e,t,n,r){return t[r]=1,e[n]=r,n+1}function es(e,t,n){return e[n]===1&&t[n]!==1}function ts(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function ns(e,t){return e.flatMap(e=>rs(e,t.baseline.width,t.baseline.height)?is(e,t,us(t.baseline.height)):[e])}function rs(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ls(n)&&r>=t*.35}function is(e,t,n){let r=cs(e,ss(os(as(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>ds(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function as(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function os(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function ss(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function cs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ls(e){return Math.max(48,Math.round(e*.07))}function us(e){return Math.max(24,Math.round(e*.03))}function ds(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=fs(t,a),ps(i,e,t,a,r.baseline,r.current))}return i}function fs(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function ps(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const ms=2.5;function hs(e){let t=gs(e);return ns(t.length<=2e3?ys(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Ss(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function gs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Zo({mask:t,width:i,height:a,hooks:{create:e=>_s(e,i),visit:(e,t)=>vs(e,t,i,n,r)}})}function _s(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function vs(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),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]}function ys(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>bs(e,r,t));if(!e){n.push({...r});continue}xs(e,r)}return n}function bs(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function xs(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Ss(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Cs(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Cs(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:kn({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Es(r,n.width,n.height),size:Ds(s,n.totalPixels),location:ws(i,n.width,n.height),averageBaselineColorHex:ks(a),averageCurrentColorHex:ks(o),baselineLuminance:Math.round(Os(a)),currentLuminance:Math.round(Os(o)),dominantChange:Ts(a,o)}}function Cs(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function ws(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function Ts(e,t){let n=Os(t)-Os(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Es(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ms?`horizontal-band`:e.height>=e.width*ms?`vertical-band`:`compact`}function Ds(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Os(e){return e.r*.2126+e.g*.7152+e.b*.0722}function ks(e){return`#${As(e.r)}${As(e.g)}${As(e.b)}`}function As(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const js=Math.sqrt(3*255**2);async function Ms(e,t,n={}){await Ns(e,`Baseline image not found`),await Ns(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([O.readFile(e),O.readFile(t)]),[o,s]=await Promise.all([$e(i,`baseline screenshot`),$e(a,`current screenshot`)]);Ps(o.width,o.height,`baseline screenshot`,n.maxPixels),Ps(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Fs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*js,{diffData:d,diffMask:f,differentPixels:p}=await rt({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?hs({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new ot.PNG({width:o.width,height:o.height});e.data=d,Ko(e,m),await O.mkdir(ct.dirname(r),{recursive:!0}),await O.writeFile(r,await it(e))}else await Fs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Ns(e,n){try{await O.access(e)}catch{throw new t(`INVALID_ARGS`,`${n}: ${e}`)}}function Ps(e,n,r,i){if(i==null||i<=0)return;let a=e*n;if(!(a<=i))throw new t(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Fs(e){if(e)try{await O.unlink(e)}catch(e){if(!Is(e,`ENOENT`))throw e}}function Is(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Ls(e,t){return e.map(e=>{let n=Rs(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Rs(e,t){let n=re(e.rect);return t.map(t=>{let r=t.overlayRect,i=An(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:zs(i/re(r)),regionCoveragePercentage:zs(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function zs(e){return Math.round(e*100*100)/100}async function Bs(e,n,r){if(n.kind===`path`&&!e.policy.allowLocalInputPaths)throw new t(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(n,r)}catch(e){throw s(e)}}async function Vs(e,n,r){if(n?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new t(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(n,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw s(e)}}async function Hs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw s(e)}}const Us=async(e,n)=>{if(!n.baseline)throw new t(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Ws(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!Qs(i))throw new t(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Bs(e,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let t;Qs(i)?(s=await Gs(e,n),t=s.path):(o=await Bs(e,i,{usage:`diff screenshot current`,field:`current`}),t=o.path),c=n.out?await Vs(e,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Ms(a.path,t,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});Qs(i)&&(u=await Ks(e,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Ws(e){if(e==null||e===``)return .1;let n=Number(e);if(Number.isNaN(n)||n<0||n>1)throw new t(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Gs(e,t){let n=await Hs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await qs(e,t,n.path,Js(t))}catch(e){throw await n.cleanup(),e}return n}async function Ks(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Zs(n),r;let a=await Vs(e,Ys(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await qs(e,t,a.path,{overlayRefs:!0,...Js(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:Ls(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function qs(e,n,r,i={}){if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??e.signal,metadata:n.metadata},r,i)??{}}function Js(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Ys(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:Xs(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:Xs(e.out.clientPath)}:{},...e.out.fileName?{fileName:Xs(e.out.fileName)}:{}}}function Xs(e){let t=ct.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Zs(e){try{await O.unlink(Xs(e))}catch(e){if(!$s(e,`ENOENT`))throw e}}function Qs(e){return e.kind===`live`}function $s(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const ec=async(e,n)=>{if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);c(n);let r=await Vs(e,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await Qe(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function tc(e){let{nodes:t,backend:r,snapshotRaw:i}=e;if(i||!n(r))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Be(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const nc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function rc(e){return e?.systemSurfaceOnly===!0?nc:void 0}function ic(e,t){return e.presentationKey?e:{...e,presentationKey:r(t)}}function ac(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!oc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!sc(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function oc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function sc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>lc(e,t.nodes[n]))}const cc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,role:!0,subrole:!0,label:!0,value:!0,identifier:!0,enabled:!0,selected:!0,focused:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function lc(e,t){return cc.every(n=>e[n]===t[n])&&uc(e.rect,t.rect)&&dc(e.presentationHints,t.presentationHints)&&dc(e.actions,t.actions)}function uc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function dc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const fc=async(e,t)=>{let n=await mc(e,t),r=ac({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(gc(t.session,n));let i=vc(n.snapshot);return d(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:tc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},..._c(n)})},pc=async(e,t)=>{let n=await mc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=gc(t.session,n);if(!i){let t=Ei(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=Ti(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function mc(e,n){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=hc(a,e),s=d(o,ic(o,n)),c=l(a),u=P(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:yc({result:a,annotations:c,snapshot:s,options:n,session:i,capturedAt:s.createdAt??u,runtimeNow:u})}}function hc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t)}}function gc(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 _c(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function vc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:st(e.producer)===`unavailable`&&void 0:e.truncated}function yc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...nt(vc(e.snapshot))),t.push(...wc(e)),e.annotations.quality||(t.push(...xc(e)),t.push(...Cc(e.snapshot.nodes)));let n=gt(e.snapshot.nodes);n&&t.push(n);let r=bc(e.annotations);r&&t.push(r);let i=Tc(e);return i&&t.push(i),t.push(...kc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function bc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return nc}function xc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Sc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Sc(e){return e?b(e.type??``)===`application`:!1}function Cc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function wc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Tc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ec(t,e.snapshot)&&Dc(t,e.capturedAt,e.runtimeNow)&&Ac(t.nodes.length,e.snapshot.nodes.length))return Oc}function Ec(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Dc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Oc=`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.`;function kc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`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.`]:e.reason===`sharp-drop`?[Oc]:[]}function Ac(e,t){return e<12?!1:t<=Math.floor(e*.2)}const jc={screenshot:ec,diffScreenshot:Us,snapshot:fc,diffSnapshot:pc};function Mc(e){return Cn(jc,e)}export{on as A,M as C,gn as D,hn as E,ft as F,_t as M,dt as N,dn as O,ut as P,bn as S,pn as T,Rn as _,Wo as a,F as b,Vr as c,R as d,dr as f,Bn as g,er as h,Bs as i,an as j,un as k,V as l,L as m,rc as n,Uo as o,$n as p,Vs as r,Br as s,Mc as t,Tr as u,Fn as v,fn as w,N as x,Cn as y};
|
package/dist/src/runtime2.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Zt as r}from"./sdk-batch.js";import{n as i,r as a,t as o}from"./application-lifecycle-runtime.js";import{i as s}from"./touch-runtime.js";import{A as c,D as l,G as u,H as d,I as f,L as p,N as m,R as h,a as g,b as ee,d as te,g as ne,i as re,m as ie,s as ae,t as oe,v as se,w as ce,x as le,z as ue}from"./alert-runtime.js";import{n as de}from"./audio-probe-runtime.js";import{n as fe}from"./perf-runtime.js";import{a as pe,n as me}from"./durable-resource.js";import{n as he}from"./async-lifecycle.js";import{i as ge,l as _e,n as ve,r as ye,t as be}from"./src7.js";import{t as xe}from"./screen-recording-live-handle.js";import{n as Se,r as Ce,t as we}from"./audio-probe-support.js";import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Zt as r}from"./sdk-batch.js";import{n as i,r as a,t as o}from"./application-lifecycle-runtime.js";import{i as s}from"./touch-runtime.js";import{A as c,D as l,G as u,H as d,I as f,L as p,N as m,R as h,a as g,b as ee,d as te,g as ne,i as re,m as ie,s as ae,t as oe,v as se,w as ce,x as le,z as ue}from"./alert-runtime.js";import{n as de}from"./audio-probe-runtime.js";import{n as fe}from"./perf-runtime.js";import{a as pe,n as me}from"./durable-resource.js";import{n as he}from"./async-lifecycle.js";import{i as ge,l as _e,n as ve,r as ye,t as be}from"./src7.js";import{t as xe}from"./screen-recording-live-handle.js";import{n as Se,r as Ce,t as we}from"./audio-probe-support.js";import{n as Te}from"./screen-recording-runtime.js";import{t as Ee}from"./mp4-atoms.js";import{readAndroidAppStateWithExecutor as De}from"./app-state.js";import{i as Oe,t as ke}from"./gesture-admission.js";import{t as Ae}from"./local-interactor-operation-set.js";import{a as je,i as Me,n as Ne,r as Pe,t as Fe}from"./perf-runtime-operation-builder.js";import{t as Ie}from"./app-log-runtime.js";import{n as _,r as Le}from"./managed-device-scope.js";import{a as v,i as Re,n as ze,o as Be}from"./application-lifecycle-interaction.js";import y from"node:path";import b from"node:fs";function Ve(e){return we(e)?Object.freeze({available:!0}):e.kind===`emulator`?Object.freeze({available:!1,reason:`unsupported-device-backend`,hint:`audio probe capture requires a macOS host.`}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`audio probe capture is supported for Android emulators on macOS hosts.`})}function He(e){let{resolveHost:t,device:n,owner:r}=e;return Object.freeze({...Fe({platform:`Android`,expectedProfileKind:`simpleperf`,start:async e=>await t().start(n,r,e),reattach:async e=>await t().reattach(n,e),cleanup:async e=>await t().cleanup(n,e),writeProfileReport:async e=>await t().writeProfileReport(n,e)}),perfFrames:async({appId:e})=>({metric:e?await Me(t().sampleFrames(n,e)):Ne(`Android`,`package`),sampling:{method:`adb-shell-dumpsys-gfxinfo-framestats`,description:`Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.`,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}),perfMemorySample:async({appId:e})=>({metric:e?await Me(t().sampleMemory(n,e)):Ne(`Android`,`package`),sampling:{method:`adb-shell-dumpsys-meminfo`,description:`Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.`,unit:`kB`,topConsumerLimit:5}}),perfMemorySnapshot:async({appId:e,kind:r,outPath:i,artifactsDir:a})=>{let o=r??`android-hprof`,s=Ue();if(o!==`android-hprof`)return je(`Android`,o,s,`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`);if(!e)throw Pe();let c=i??y.join(a,`memory-android-hprof-${We()}.hprof`);return{artifact:await t().captureMemorySnapshot(n,e,c),support:s,sampling:{method:`adb-shell-am-dumpheap`,description:`Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.`,defaultKind:`android-hprof`,artifactOnly:!0}}}})}function Ue(){return{platform:`android`,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}}function We(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function Ge(t){if(!/^[a-zA-Z0-9._:-]+$/.test(t))throw new e(`INVALID_ARGS`,`Invalid Android package name for logs: ${t}`)}const x=Object.freeze({resourceKind:Ie,version:1,encode:e=>({...e}),decode:e=>e.transport!==`android-logcat-local`&&e.transport!==`android-logcat-transport-composed`||!qe(e.outputPath)||!qe(e.pidPath)?{status:`invalid`,message:`Invalid Android app-log descriptor`}:{status:`decoded`,descriptor:Object.freeze({transport:e.transport,outputPath:e.outputPath,pidPath:e.pidPath})}});function Ke(e){let t=x.decode(e.descriptor);if(t.status!==`decoded`)throw TypeError(t.message);return me({resourceKind:Ie,sessionId:e.sessionId,device:{id:e.device.id,family:`android`,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:pe(x,t.descriptor)})}function qe(e){return typeof e==`string`&&e.trim().length>0}function Je(e){return ye(e,{family:`android`,backend:`android`,label:`Android`,codec:x,startUnavailableHint:`The selected Android transport cannot start a background adb logcat stream.`,cleanupFailureMessage:`Android app-log cleanup did not settle every owned resource`,doctor:async({host:e,device:t,signal:n},r)=>await Ye(e,t.id,r,n),validateStart:({input:e})=>Ge(e.appBundleId),process:async({host:e,device:t,input:n})=>({resolvePid:async r=>await ge(e,Xe(t.id,n.appBundleId),r),command:e=>({kind:`android-adb`,serial:t.id,args:[`logcat`,`-v`,`time`,`--pid`,e],options:{allowFailure:!0}})}),descriptor:({artifacts:e,transport:t})=>({transport:t.mode===`transport-composed`?`android-logcat-transport-composed`:`android-logcat-local`,...e}),envelope:({input:e,device:t,owner:n,descriptor:r})=>Ke({sessionId:e.sessionId,device:t,owner:n,fence:e.fence,descriptor:r})})}async function Ye(e,t,n,r){let i={};return i.adbAvailable=await Ce(async()=>Se(await e.commands.run({executable:`adb`,args:[`-s`,t,`shell`,`echo`,`ok`],allowFailure:!0,timeoutMs:1e3},r)),r),n&&(i.androidPidVisible=await Ce(async()=>!!await ge(e,Xe(t,n),r),r)),{backend:`android`,checks:i,notes:n?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`]}}function Xe(e,t){return{executable:`adb`,args:[`-s`,e,`shell`,`pidof`,t],allowFailure:!0,timeoutMs:5e3}}async function Ze(e,t,n,r){let i=await e.appLogs.readRecent(n.sessionId,n.maxScanLines),a=ve(i.text,{...n,path:i.path,exists:i.exists,lineNumberOffset:i.skippedLines,backend:`android`}),o=[],s=await $e(e,t,n,r);if(s&&n.appBundleId){Ge(n.appBundleId);let c=await tt(e,t,n.appBundleId,r);if(c){let e=ve(c.text,{...n,path:`${i.path} (adb logcat recovery)`,exists:!0,backend:`android`});e.dump.entries.length>0&&(a=be(e,a,n.maxEntries),o.push(s.reason===`stale-active`?`Session app log stream was still bound to prior Android PID ${s.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${c.pids.join(`, `)}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${c.pids.join(`, `)}.`))}}return n.appLogSnapshot?n.appLogSnapshot.state!==`active`&&o.length===0&&o.push(`Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.`):o.push(`Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests.`),a.dump.entries.length===0&&o.push(`No HTTP(s) entries were found in recent session app logs.`),Object.freeze({source:`app-log`,backend:`android`,dump:a.dump,notes:Object.freeze(o)})}async function Qe(e,t,n){n.throwIfAborted();try{let r=await e.commands.run(t,n);return n.throwIfAborted(),r}catch{n.throwIfAborted();return}}async function $e(e,t,n,r){if(!n.appBundleId||n.appLogSnapshot?.state===void 0)return;if(n.appLogSnapshot.state!==`active`)return{reason:`inactive`};let i=et(await e.appLogs.readProcessMarker(n.sessionId));if(!i)return;let a=await nt(e,t.id,n.appBundleId,r);if(!(!a||a===i))return{reason:`stale-active`,trackedPid:i}}function et(e){if(e.status===`decoded`)return/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(e.marker.command)?.[1]}async function tt(e,t,n,r){let i=await nt(e,t.id,n,r),a=await Qe(e,{executable:`adb`,args:[`-s`,t.id,`logcat`,`-d`,`-v`,`time`,`-t`,`4000`],allowFailure:!0,timeoutMs:3e3},r);if(!a||a.exitCode!==0||!a.stdout.trim())return;let o=rt(a.stdout,n,i);if(o.length===0)return;let s=new Set(o),c=a.stdout.split(`
|
|
2
2
|
`).filter(e=>{if(!e.trim())return!1;if(e.includes(n))return!0;let t=/\(\s*(\d+)\)\s*:/.exec(e)?.[1];return!!(t&&s.has(t))}).join(`
|
|
3
3
|
`);return c.trim()?{text:c,pids:o}:void 0}async function nt(e,t,n,r){let i=await Qe(e,{executable:`adb`,args:[`-s`,t,`shell`,`pidof`,n],allowFailure:!0},r);if(!i)return;let a=i.stdout.trim().split(/\s+/)[0];return a&&/^\d+$/.test(a)?a:void 0}function rt(e,t,n){let r=new Set(n?[n]:[]),i=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),a=[RegExp(`\\bStart proc\\s+(\\d+):${i}(?:\\b|/)`,`i`),RegExp(`\\b(\\d+):${i}(?:\\b|/)`,`i`),RegExp(`${i}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,`i`),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${i}`,`i`)];for(let n of e.split(`
|
|
4
4
|
`))if(n.includes(t))for(let e of a){let t=e.exec(n)?.[1];t&&/^\d+$/.test(t)&&r.add(t)}return Object.freeze([...r])}const it=/^(?:\/sdcard|\/data\/local\/tmp)\/agent-device-recording-\d{1,20}\.mp4$/,at=/^(?:\/sdcard|\/data\/local\/tmp)\/agent-device-recording-active\.json$/;function ot(e){return lt(e)&&ut(e)&&dt(e)}function st(e){if(!S(e))return!1;let t=e;return ft(t)&&pt(t)&&mt(t)&&ht(t)&&(t.completion===void 0||xt(t))}function ct(e,t){return St(e,t)&&Ct(e,t.outputPath,t.clientOutputPath)}function lt(e){return e.backend===`adb-screenrecord`&&typeof e.manifestPath==`string`&&at.test(e.manifestPath)&&typeof e.outputPath==`string`}function ut(e){return(e.clientOutputPath===void 0||typeof e.clientOutputPath==`string`)&&C(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`}function dt(e){return wt(e.transportMode)&&Tt(e.exportQuality)&&w(e.activeSessionApp)}function ft(e){return e.version===1&&e.resourceKind===`screen-recording`&&typeof e.fenceToken==`string`&&Number.isInteger(e.fenceGeneration)&&typeof e.sessionId==`string`&&typeof e.deviceId==`string`&&Number.isFinite(e.startedAt)}function pt(e){return typeof e.outputPath==`string`&&(e.clientOutputPath===void 0||typeof e.clientOutputPath==`string`)&&C(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`}function mt(e){return w(e.activeSessionApp)&&Tt(e.exportQuality)&&wt(e.transportMode)&&(e.pendingRemotePath===void 0||Et(e.pendingRemotePath))}function ht(e){return Array.isArray(e.chunks)&&e.chunks.every(gt)&&(e.chunks.length>0||e.pendingRemotePath!==void 0)&&(e.completion===void 0||_t(e.completion))}function gt(e,t){if(!S(e))return!1;let n=e;return n.index===t+1&&Et(n.remotePath)&&Dt(n.remotePid)&&Dt(n.remoteStartTime)}function _t(e){if(!S(e))return!1;let t=e;return vt(t)&&yt(t)&&(t.chunks===void 0||t.chunks.every(bt))}function vt(e){return typeof e.backend==`string`&&typeof e.outPath==`string`&&(e.clientOutPath===void 0||typeof e.clientOutPath==`string`)&&Number.isFinite(e.startedAt)&&Number.isFinite(e.completedAt)&&(e.capturedDurationMs===void 0||Number.isFinite(e.capturedDurationMs))}function yt(e){return C(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&w(e.activeSessionApp)}function bt(e,t){return e.index===t+1&&typeof e.path==`string`&&(e.clientOutPath===void 0||typeof e.clientOutPath==`string`)}function xt(e){let t=e.completion;return t!==void 0&&St(t,e)&&t.startedAt===e.startedAt&&Ct(t,e.outputPath,e.clientOutputPath,e.chunks.length)}function St(e,t){return e.backend===`adb screenrecord`&&e.outPath===t.outputPath&&e.clientOutPath===t.clientOutputPath&&e.scope===t.scope&&e.showTouches===t.showTouches&&e.recordOnlySession===t.recordOnlySession&&Ot(e.activeSessionApp,t.activeSessionApp)}function Ct(e,t,n,r=e.chunks===void 0?1:e.chunks.length){return r===1?e.chunks===void 0:e.chunks?.length===r&&e.chunks.every((e,r)=>e.path===kt(t,r+1)&&e.clientOutPath===(n===void 0?void 0:kt(n,r+1)))}function S(e){return typeof e==`object`&&!!e}function C(e){return e===`app`||e===`device`||e===`system`}function wt(e){return e===`local`||e===`transport-composed`}function Tt(e){return e===void 0||e===`medium`||e===`high`}function w(e){return e===void 0||S(e)&&typeof e.bundleId==`string`&&(e.name===void 0||typeof e.name==`string`)}function Et(e){return typeof e==`string`&&it.test(e)}function Dt(e){return typeof e==`string`&&/^\d+$/.test(e)}function Ot(e,t){return JSON.stringify(e)===JSON.stringify(t)}function kt(e,t){if(t===1)return e;let n=e.lastIndexOf(`.`),r=n>e.lastIndexOf(`/`)?e.slice(0,n):e,i=n>e.lastIndexOf(`/`)?e.slice(n):`.mp4`;return`${r}.part-${String(t).padStart(3,`0`)}${i}`}const T=Object.freeze({resourceKind:Te,version:1,encode:e=>({...e}),decode:e=>ot(e)?{status:`decoded`,descriptor:Object.freeze({backend:`adb-screenrecord`,manifestPath:e.manifestPath,outputPath:e.outputPath,...e.clientOutputPath===void 0?{}:{clientOutputPath:e.clientOutputPath},scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,transportMode:e.transportMode,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},...e.exportQuality===void 0?{}:{exportQuality:e.exportQuality}})}:{status:`invalid`,message:`Invalid Android screen-recording descriptor`}});function E(e,t,n,r,i,a=`local`){return Object.freeze({version:1,resourceKind:`screen-recording`,fenceToken:t.fence.token,fenceGeneration:t.fence.generation,sessionId:t.sessionId,deviceId:e.id,startedAt:n,outputPath:t.outputPath,...t.clientOutputPath===void 0?{}:{clientOutputPath:t.clientOutputPath},scope:t.scope,showTouches:t.showTouches,recordOnlySession:t.recordOnlySession,...t.activeSessionApp===void 0?{}:{activeSessionApp:t.activeSessionApp},...t.exportQuality===void 0?{}:{exportQuality:t.exportQuality},chunks:r,...i===void 0?{}:{pendingRemotePath:i},transportMode:a})}function At(e,t){return Object.freeze({...e,completion:t})}function D(e){try{let t=e&&JSON.parse(e);return st(t)?t:void 0}catch{return}}function jt(e,t,n){return e.deviceId===t.id&&e.deviceId===n.device.id&&e.fenceToken===n.fence.token&&e.fenceGeneration===n.fence.generation&&e.sessionId===n.sessionId}function Mt(e,t){return e.outputPath===t.outputPath&&e.clientOutputPath===t.clientOutputPath&&e.scope===t.scope&&e.showTouches===t.showTouches&&e.recordOnlySession===t.recordOnlySession&&JSON.stringify(e.activeSessionApp)===JSON.stringify(t.activeSessionApp)&&e.exportQuality===t.exportQuality&&e.transportMode===t.transportMode&&(e.completion===void 0||ct(e.completion,t))}function O(e){switch(e){case`missing`:case`ownership-lost`:case`foreign-writer`:return!0;case`owned-alive`:case`uncertain`:return!1}}function Nt(e){switch(e){case`missing`:case`ownership-lost`:return!0;case`foreign-writer`:case`owned-alive`:case`uncertain`:return!1}}const Pt=1e4,Ft=1e3;var k=class extends Error{constructor(e){super(`Android screenrecord launch rollback could not be confirmed`,{cause:e})}};function A(e,t=Date.now()){return[...new Set(e?[e,`/sdcard`,`/data/local/tmp`]:[`/sdcard`,`/data/local/tmp`])].map(e=>`${e}/agent-device-recording-${t}.mp4`)}async function It(e,t,n,r){let i;try{if(i=(await e.start({remotePath:t,quality:n.exportQuality??`medium`},r)).process,!/^\d+$/.test(i.pid)||!/^\d+$/.test(i.startTime)||i.remotePath!==t)throw Error(`Android screenrecord returned an invalid process identity`);if(!await Vt(e,t,i,r))throw Error(`Android screenrecord did not begin producing frames`);return{index:1,remotePath:t,remotePid:i.pid,remoteStartTime:i.startTime}}catch(t){throw i&&Lt(i)&&!await Ht(e,i)?new k(t):r?.aborted?r.reason:t}}function Lt(e){return/^\d+$/.test(e.pid)&&/^\d+$/.test(e.startTime)&&e.remotePath.length>0}async function j(e,t){let n=!1,r;for(let i of[...t].reverse())try{n=await N(e,i)||n}catch(e){r??=e}if(r)throw r;return n}async function Rt(e,t){for(let n of t){let t;for(let r=0;r<3;r+=1){let i=await e.size(n.remotePath);if(typeof i==`number`&&i>0&&i===t)break;if(t=typeof i==`number`&&i>0?i:void 0,r===2)throw Error(`Android recording artifact is not stable: ${n.remotePath}`);await new Promise(e=>setTimeout(e,250))}}}async function zt(e,t,n,r){let i=[];for(let[a,o]of t.entries()){let t=a===0?n:Kt(n,a+1);await Ut(e,o.remotePath,t);let s=a===0||r===void 0?r:Kt(r,a+1);i.push({index:a+1,path:t,...s===void 0?{}:{clientOutPath:s}})}return Object.freeze(i)}async function M(e,t){let n;for(let r of t)try{if(!await e.remove(r.remotePath))throw Error(`failed to remove Android recording artifact: ${r.remotePath}`)}catch(e){n??=e}if(n)throw n}async function Bt(e,t){try{await j(e,t)}finally{await M(e,t)}}async function Vt(e,t,n,r){for(let i=0;i<3;i+=1){if(r?.throwIfAborted(),await e.exists(t,r)===!0)return!0;if(await e.inspect(n,r)!==`owned-alive`)return!1;i<2&&await new Promise(e=>setTimeout(e,250))}return!0}async function Ht(e,t){try{let n=await e.stop(t,{force:!0});return(n===`stopped`||n===`already-missing`)&&await e.remove(t.remotePath)}catch{return!1}}async function N(e,t){if(!t)return!1;let n={pid:t.remotePid,remotePath:t.remotePath,startTime:t.remoteStartTime},r=await e.stop(n);if(r===`already-missing`)return!0;if(r===`ownership-lost`)throw Error(`Android screenrecord ownership could not be confirmed for pid ${t.remotePid}`);if(await Wt(e,n))return!1;let i=await e.stop(n,{force:!0});if(i===`stopped`||i===`already-missing`)return!1;throw Error(`failed to stop Android screenrecord pid ${t.remotePid}`)}async function Ut(e,t,n){for(let r=0;r<3;r+=1){let i=await e.pullPlayable({remotePath:t,outputPath:n});if(i.exitCode===0&&i.playable)return;r+1<3&&await Gt(1e3)}throw Error(`failed to retrieve playable Android recording`)}async function Wt(e,t){for(let n=0;n<=Pt;n+=Ft){let r=await e.inspect(t);if(r===`missing`)return!0;if(O(r))throw Error(`Android screenrecord ownership could not be confirmed for pid ${t.pid}`);n<Pt&&await Gt(Ft)}return!1}function Gt(e){return new Promise(t=>setTimeout(t,e))}function Kt(e,t){let n=y.parse(e);return y.join(n.dir,`${n.name}.part-${String(t).padStart(3,`0`)}${n.ext||`.mp4`}`)}async function P(e,t,n,r){await e.writeManifest({manifestPath:t,contents:JSON.stringify(n)},r)}async function F(e,t){if(!await e.removeManifest(t))throw Error(`failed to remove Android recording manifest: ${t}`)}async function qt(e,t){let n=(await Jt(e)).flatMap(n=>Yt(n,t,e.mode));for(let t of n)await Zt(e,t.evidence,t.manifestPath)}async function Jt(e){return await Promise.all(A(void 0).map(async t=>{let n=e.manifestPathFor(t);return{manifestPath:n,read:await e.readManifest(n)}}))}function Yt(e,t,n){if(e.read.status===`missing`)return[];if(e.read.status!==`read`)throw en(e.manifestPath,e.read.message);let r=D(e.read.contents);if(r===void 0)throw tn(e.manifestPath);if(r.transportMode!==n)throw nn(e.manifestPath,r,n);if(!Xt(r,t))throw rn(e.manifestPath,r,t);return[{manifestPath:e.manifestPath,evidence:r}]}function Xt(e,t){return e.completion!==void 0||e.deviceId!==t.id}async function Zt(e,t,n){if(await Qt(e,t),await M(e,t.chunks),await $t(e,t),await F(e,n),(await e.readManifest(n)).status!==`missing`)throw sn(n)}async function Qt(e,t){for(let n of t.chunks){let t=await e.inspect({pid:n.remotePid,remotePath:n.remotePath,startTime:n.remoteStartTime});if(!Nt(t))throw t===`uncertain`?cn(n.remotePath):an(n.remotePath,t===`owned-alive`?`named-recorder`:`other-recorder`)}let n=t.pendingRemotePath;if(n===void 0)return;let r=await e.probeRunningWriters(n);if(r.writers.length>0)throw an(n,`other-recorder`);if(!r.conclusive)throw cn(n)}async function $t(e,t){let n=t.pendingRemotePath;if(n!==void 0&&!await e.remove(n))throw on(n)}function en(t,n){return new e(`COMMAND_FAILED`,`Android screenrecord native recovery evidence is unavailable: ${t}`,{reason:`native_recovery_evidence_unavailable`,manifestPath:t,hint:`Confirm the device is online and its storage readable, then run record start again.`},Error(n))}function tn(t){return new e(`COMMAND_FAILED`,`Android screenrecord native recovery evidence is unreadable: ${t}`,{reason:`native_recovery_evidence_unreadable`,manifestPath:t,hint:I(t)})}function nn(t,n,r){return new e(`COMMAND_FAILED`,`Android screenrecord native recovery evidence was written by the ${n.transportMode} transport, not this ${r} one: ${t}`,{reason:`native_recovery_evidence_transport_mismatch`,manifestPath:t,evidenceTransportMode:n.transportMode,hint:I(t)})}function rn(t,n,r){return new e(`DEVICE_IN_USE`,`Android screenrecord native recovery evidence already exists: ${t} (open recording of session "${n.sessionId}" on ${r.id})`,{reason:`native_recovery_evidence_open`,manifestPath:t,sessionId:n.sessionId,retriable:!1,hint:`Run record stop --session ${n.sessionId} to retire it, or close that session. If it is already closed, ${I(t)}`})}function an(t,n){let r=n===`named-recorder`;return new e(`DEVICE_IN_USE`,`Android screenrecord recovery evidence is retained: ${r?`its recorder`:`another recorder`} is writing ${t}`,{reason:`native_recording_artifact_claimed`,remotePath:t,writer:n,...r?{retriable:!1}:{},hint:r?`Run record stop for the session that owns that recording before starting another.`:`Android ends any recorder after 180 seconds. Run record start again once that recorder has stopped.`})}function on(t){return new e(`COMMAND_FAILED`,`Android screenrecord recovery evidence could not remove ${t}`,{reason:`native_recording_artifact_removal_failed`,remotePath:t,hint:`Confirm the device is online and run record start again.`})}function sn(t){return new e(`COMMAND_FAILED`,`Android screenrecord recovery evidence removal could not be confirmed: ${t}`,{reason:`native_recovery_evidence_retirement_unconfirmed`,manifestPath:t,hint:`Run record start again; the marker is retired from the beginning.`})}function cn(t){return new e(`COMMAND_FAILED`,`Android screenrecord recovery evidence cannot be safely retired: ${t}`,{reason:`native_recording_recorder_unproven`,remotePath:t,hint:`Confirm the device is online and run record start again.`})}function I(e){return`no recording session can retire this marker; remove it on the device with \`adb shell rm -f ${e}\`.`}async function ln(e){let{transport:t,device:n,input:r,startedAt:i,signal:a,prepareOutput:o}=e;await qt(t,n),await o();let s;for(let e of A(void 0)){let o=t.manifestPathFor(e);await P(t,o,E(n,r,i,[],e,t.mode),a);let c,l;try{l=Date.now(),c=await It(t,e,r,a)}catch(e){if(a.aborted)throw await un(t,o,e),a.reason;await pn(t,o,e),s=e;continue}try{await P(t,o,E(n,r,i,[c],void 0,t.mode),a)}catch(e){throw await dn(t,o,c),e}return{chunk:c,manifestPath:o,startedAtMs:l}}throw s??Error(`Android screenrecord did not begin producing frames`)}async function un(e,t,n){n instanceof k||await F(e,t).catch(()=>{})}async function dn(e,t,n){try{await Bt(e,[n])}catch{return}await F(e,t).catch(()=>{})}async function fn(e){let{transport:t,device:n,input:r,startedAt:i,chunks:a,manifestPath:o,preferredDir:s}=e,c;for(let e of A(s)){await P(t,o,E(n,r,i,a,e,t.mode));try{return await It(t,e,r)}catch(e){if(e instanceof k)throw e;try{await P(t,o,E(n,r,i,a,void 0,t.mode))}catch{throw new k(e)}c=e}}throw c??Error(`failed to start next Android recording chunk`)}async function pn(e,t,n){if(n instanceof k)throw n;try{await F(e,t)}catch{throw new k(n)}}const mn=[`moov`,`mvhd`];function hn(e){let t=_n(e);if(!t)return;let n=t[0];if(n===1)return gn(t.readUInt32BE(20),Number(t.readBigUInt64BE(24)));if(n!==0)return;let r=t.readUInt32BE(16);if(r!==4294967295)return gn(t.readUInt32BE(12),r)}function gn(e,t){if(!(e<=0||t<0||!Number.isSafeInteger(t)))return Math.round(t*1e3/e)}function _n(e){let t=Ee(e,mn);if(!t||!Number.isSafeInteger(t.size))return;let n=t.offset+t.headerSize;if(t.size-t.headerSize<32)return;let r=Buffer.alloc(32),i;try{return i=b.openSync(e,`r`),b.readSync(i,r,0,r.length,n)===r.length?r:void 0}catch{return}finally{i!==void 0&&b.closeSync(i)}}function vn(e){let t=yn(e.chunkPaths);if(t===void 0)return{};let n=e.stoppedAtMs-e.startedAtMs;return n-t<2e3?{capturedDurationMs:t}:{capturedDurationMs:t,idleTailWarning:`Android screenrecord encodes a frame only when the screen changes, so this video ends at the last frame it encoded: it covers ${bn(t)}s of the ${bn(n)}s recording window.`}}function yn(e){let t=0;for(let n of e){let e=hn(n);if(e===void 0)return;t+=e}return t}function bn(e){return(e/1e3).toFixed(1)}function xn(e,t){return Object.freeze({backend:`adb screenrecord`,outPath:e.outputPath,...e.clientOutputPath?{clientOutPath:e.clientOutputPath}:{},startedAt:t,scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.activeSessionApp?{activeSessionApp:e.activeSessionApp}:{},...e.exportQuality?{exportQuality:e.exportQuality}:{},gestureEvents:[]})}async function Sn(e){let{host:t,recording:n,chunks:r,targetLabel:i,reachedLimit:a,startedAtMs:o,stoppedAtMs:s}=e,c=r.length>1,l=await t.screenRecording.finalize.complete({outputPath:n.outPath,showTouches:!c&&n.showTouches,gestureEvents:n.gestureEvents,exportQuality:n.exportQuality??`medium`,targetLabel:i}),u=vn({chunkPaths:r.map(e=>e.path),startedAtMs:o,stoppedAtMs:s}),d=[...l.warning?[l.warning]:[],...a?[`Android adb screenrecord stopped before record stop, likely after reaching the 180s platform limit. The MP4 may be truncated; final interactions after the limit are not in the video.`]:[],...c?[`Android adb screenrecord is capped at 180s, so this recording was split into multiple MP4 chunks.`]:[],...u.idleTailWarning?[u.idleTailWarning]:[]],f=Date.now();return{status:`completed`,result:{backend:n.backend,outPath:n.outPath,...n.clientOutPath?{clientOutPath:n.clientOutPath}:{},startedAt:n.startedAt,completedAt:f,scope:n.scope,showTouches:n.showTouches,recordOnlySession:n.recordOnlySession,...n.activeSessionApp?{activeSessionApp:n.activeSessionApp}:{},...c?{chunks:r}:{},...l,...u.capturedDurationMs===void 0?{}:{capturedDurationMs:u.capturedDurationMs},...d.length?{warning:d.join(` `)}:{},...c&&n.showTouches&&n.gestureEvents.length>0?{overlayWarning:`touch overlay burn-in is skipped for chunked Android recordings; returning raw chunks plus gesture telemetry`}:{}}}}function Cn(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:String(e)}}async function wn(e){let t=Date.now(),n=await j(e.transport,e.evidence.chunks)||e.reachedLimit===!0;await Rt(e.transport,e.evidence.chunks);let r=await zt(e.transport,e.evidence.chunks,e.recording.outPath,e.recording.clientOutPath),i=await Sn({host:e.host,recording:e.recording,chunks:r,targetLabel:`Android recording`,reachedLimit:n,startedAtMs:e.startedAtMs,stoppedAtMs:t});return await P(e.transport,e.manifestPath,At(e.evidence,i.result)),await M(e.transport,e.evidence.chunks),i}async function Tn(e,t,n){try{let r=t.pendingRemotePath;if(await j(e,[...t.chunks,...await En(e,t)]),await M(e,t.chunks),r!==void 0&&!await e.remove(r))throw Error(`failed to remove Android recording artifact: ${r}`);return await F(e,n),{status:`cleaned`}}catch(e){return Cn(e)}}async function En(e,t){let n=t.pendingRemotePath;if(n===void 0)return[];let r=await e.probeRunningWriters(n);if(!r.conclusive)throw Error(`cannot list every recorder writing Android artifact: ${n}`);return r.writers.map((e,r)=>({index:t.chunks.length+1+r,remotePath:n,remotePid:e.pid,remoteStartTime:e.startTime}))}async function Dn(e){let{transport:t,device:n,envelope:r,descriptor:i}=e;if(i.transportMode!==t.mode)return{status:`transport-unavailable`};let a=await t.readManifest(i.manifestPath);if(a.status===`unavailable`)return{status:`transport-unavailable`};let o=a.status===`read`?D(a.contents):void 0;return o&&jt(o,n,r)&&Mt(o,i)?{status:`matched`,evidence:o}:{status:`ownership-lost`}}async function On(e){let t=await e.transport.readManifest(e.manifestPath);if(t.status!==`read`)return;let n=D(t.contents);return n&&kn(n,e)?n:void 0}function kn(e,t){return e.deviceId===t.deviceId&&e.sessionId===t.sessionId&&e.fenceToken===t.fence.token&&e.fenceGeneration===t.fence.generation}async function An(e){let{host:t,transport:n,device:r,input:i}=e,a=T.decode(i.envelope.descriptor.body);if(a.status!==`decoded`)return L(`descriptor-invalid`);let o=await Dn({transport:n,device:r,envelope:i.envelope,descriptor:a.descriptor});return o.status===`matched`?await Mn({host:t,transport:n,device:r,input:i,descriptor:a.descriptor,evidence:o.evidence}):L(o.status===`transport-unavailable`?`transport-not-reattachable`:`ownership-fence-lost`)}async function jn(e){let t=T.decode(e.input.envelope.descriptor.body);if(t.status!==`decoded`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};let n=await Dn({transport:e.transport,device:e.device,envelope:e.input.envelope,descriptor:t.descriptor});return n.status===`matched`?await Tn(e.transport,n.evidence,t.descriptor.manifestPath):n.status===`transport-unavailable`?{status:`cleanup-pending`,reason:`owner-unavailable`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function Mn(e){let{host:t,transport:n,device:r,input:i,descriptor:a,evidence:o}=e;if(o.completion!==void 0&&await Nn(n,o))return{status:`completed`,result:o.completion};if(o.completion!==void 0)return L(`ownership-fence-lost`,`Android recording completed evidence still names a live or unverifiable recorder.`);if(o.pendingRemotePath!==void 0)return L(`transport-not-reattachable`,`Android recording launch was interrupted before its process identity was committed.`);let s=o.chunks.at(-1);if(!s)return{status:`missing`};let c=await n.inspect({pid:s.remotePid,remotePath:s.remotePath,startTime:s.remoteStartTime});if(c!==`owned-alive`&&await n.exists(s.remotePath)!==!0)return L(`transport-not-reattachable`,`Android recording process ended before its artifact could be recovered.`);let l=Pn(i.envelope.sessionId,i.envelope.fence,a),u=!1;return{status:`active`,handle:xe(xn(l,o.startedAt),{finish:async e=>{let r=await wn({host:t,transport:n,evidence:o,manifestPath:a.manifestPath,recording:e,startedAtMs:o.startedAt,reachedLimit:O(c)});return u=!0,r},forceCleanup:async()=>u?{status:`cleaned`}:await jn({transport:n,device:r,input:i})})}}async function Nn(e,t){try{for(let n of t.chunks)if(!O(await e.inspect({pid:n.remotePid,remotePath:n.remotePath,startTime:n.remoteStartTime})))return!1;return!0}catch{return!1}}function Pn(e,t,n){return{sessionId:e,outputPath:n.outputPath,...n.clientOutputPath===void 0?{}:{clientOutputPath:n.clientOutputPath},scope:n.scope,showTouches:n.showTouches,hideTouchesRequested:!1,recordOnlySession:n.recordOnlySession,...n.activeSessionApp===void 0?{}:{activeSessionApp:n.activeSessionApp},...n.exportQuality===void 0?{}:{exportQuality:n.exportQuality},fence:t}}function L(e,t){return{status:`unreattachable`,reason:e,...t===void 0?{}:{message:t}}}async function Fn(e){let{host:t,device:n,owner:r,signal:i}=e,a=await t.screenRecording.android.resolve(n);return Object.freeze({screenRecordingStart:async e=>await In({host:t,transport:a,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async e=>await An({host:t,transport:a,device:n,input:e}),screenRecordingCleanup:async e=>await jn({transport:a,device:n,input:e})})}async function In(e){let{host:n,transport:r,device:i,owner:a,input:o,signal:s}=e;s.throwIfAborted();let c=Date.now(),l=await ln({transport:r,device:i,input:o,startedAt:c,signal:s,prepareOutput:async()=>await n.screenRecording.outputs.prepare(o.outputPath)}),u=l.manifestPath,d=[l.chunk],f,p,m,h=!1,g=()=>{f=setTimeout(()=>{p=ee().catch(e=>{m=e})},17e4),f.unref?.()},ee=async()=>{let e=d.at(-1);if(!e)throw Error(`Android recording has no active chunk`);let t=!1,n;try{n=await fn({transport:r,device:i,input:o,startedAt:c,chunks:d,manifestPath:u,preferredDir:y.posix.dirname(e.remotePath)})}catch(a){await N(r,e),t=!0;try{n=await fn({transport:r,device:i,input:o,startedAt:c,chunks:d,manifestPath:u,preferredDir:y.posix.dirname(e.remotePath)})}catch(e){throw e instanceof Error?e:a}}let a=[...d,{...n,index:d.length+1}];try{await P(r,u,E(i,o,c,a,void 0,r.mode))}catch(a){if(await Bt(r,[n]).catch(()=>{}),t)await P(r,u,E(i,o,c,d,n.remotePath,r.mode)).catch(()=>{});else try{await P(r,u,E(i,o,c,d,void 0,r.mode))}catch{await N(r,e).catch(()=>{}),await P(r,u,E(i,o,c,d,n.remotePath,r.mode)).catch(()=>{})}throw a}d=a,t||await N(r,e),g()};g();let te=xe(xn(o,c),{finish:async e=>{if(f&&clearTimeout(f),await p,m)throw m;let t=await wn({host:n,transport:r,evidence:E(i,o,c,d,void 0,r.mode),manifestPath:u,recording:e,startedAtMs:l.startedAtMs});return h=!0,t},forceCleanup:async()=>{if(f&&clearTimeout(f),h)return{status:`cleaned`};try{await p}catch(e){m=e}let e=await On({transport:r,deviceId:i.id,sessionId:o.sessionId,fence:o.fence,manifestPath:u});return e?await Tn(r,e,u):{status:`cleanup-pending`,reason:`ownership-fence-lost`}}});return Object.freeze({pendingHandle:new he(te),envelope:me({resourceKind:Te,sessionId:o.sessionId,device:t(i),owner:a,fence:o.fence,lifecycle:`open`,descriptor:pe(T,{backend:`adb-screenrecord`,manifestPath:u,outputPath:o.outputPath,...o.clientOutputPath===void 0?{}:{clientOutputPath:o.clientOutputPath},scope:o.scope,showTouches:o.showTouches,recordOnlySession:o.recordOnlySession,...o.activeSessionApp===void 0?{}:{activeSessionApp:o.activeSessionApp},...o.exportQuality===void 0?{}:{exportQuality:o.exportQuality},transportMode:r.mode})})})}const R=12e4,Ln=1e3;async function z(e,t,n,r){return r.throwIfAborted(),await Le(t)?{...t,booted:!0}:t.kind===`emulator`&&(t.booted!==!0||!B(t))?await Rn(e,t,n,r):(t.booted!==!0&&await Hn(e,t.id,R,r),{...t,booted:!0})}async function Rn(e,t,n,r){await zn(e);let i=Un(n),a=Bn(await e.deviceReadiness.androidEmulator.discover(i,r),t.name,n.serial),o=B(a)?a:void 0,s=o?void 0:e.deviceReadiness.androidEmulator.launch(a.name,n.headless);try{let t=o??await Vn(e,a.name,i,n.serial,r);return await Hn(e,t.id,R,r),{...(await e.deviceReadiness.androidEmulator.discover(i,r)).find(e=>e.id===t.id)??t,name:a.name,booted:!0}}catch(t){throw s!==void 0&&r.aborted&&await e.deviceReadiness.androidEmulator.terminate(s),r.throwIfAborted(),t}}async function zn(t){if(await t.toolchains.prepare(`android`),!await t.commands.which(`adb`))throw new e(`TOOL_MISSING`,`adb not found in PATH`);if(!await t.commands.which(`emulator`))throw new e(`TOOL_MISSING`,`emulator not found in PATH`)}function Bn(t,n,r){let i=Wn(t,n,r);if(i)return i;throw new e(`DEVICE_NOT_FOUND`,`No Android emulator AVD named ${n}`,{requestedAvdName:n,availableAvds:t.map(e=>e.name),hint:"Run `emulator -list-avds` and pass an existing AVD name to --device."})}async function Vn(t,n,r,i,a){let o=t.clock.now()+R;for(;t.clock.now()<o;){let e=Wn(await t.deviceReadiness.androidEmulator.discover(r,a),n,i);if(e&&B(e))return e;await t.clock.sleep(Ln,a)}throw new e(`COMMAND_FAILED`,`Android emulator did not appear in time`,{avdName:n,serial:i,timeoutMs:R})}async function Hn(t,n,r,i){let a=t.clock.now()+r;for(;t.clock.now()<a;){if((await t.commands.run({executable:`adb`,args:[`-s`,n,`shell`,`getprop`,`sys.boot_completed`],allowFailure:!0,timeoutMs:Math.min(1e4,Math.max(1e3,a-t.clock.now()))},i)).stdout.trim()===`1`)return;await t.clock.sleep(Ln,i)}throw new e(`COMMAND_FAILED`,`Android device failed to finish booting`,{serial:n,timeoutMs:r,reason:`ANDROID_BOOT_TIMEOUT`})}function Un(e){return{platform:`android`,kind:`emulator`,...e.serial?{serial:e.serial}:{},...e.androidSerialAllowlist?{androidSerialAllowlist:[...e.androidSerialAllowlist]}:{}}}function Wn(e,t,n){let r=Gn(t);return e.find(e=>e.platform===`android`&&e.kind===`emulator`&&Gn(e.name)===r&&(!n||!B(e)||e.id===n))}function B(e){return e.id.startsWith(`emulator-`)}function Gn(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function Kn(e){let{host:t,device:n,signal:r}=e,i=ze({device:n,signal:r,resolveInteractor:t.localInteractors.resolve});return Object.freeze({resolveOpenTarget:async e=>await t.androidApplications.resolveOpenTarget(n,e),prepareApplicationOpen:async e=>{await z(t,n,{headless:!1},r)},openApplication:async e=>await qn(t,i,e),applyRuntimeHints:async e=>await t.androidApplications.applyRuntimeHints(n,e),clearRuntimeHints:async e=>await t.androidApplications.clearRuntimeHints(n,e),closeApplication:async e=>{e.ensureReady&&await z(t,n,{headless:!1},r),await v({device:n,interactor:await i.resolveInteractor(e.execution,e.appBundleId),positionals:e.positionals})},finalizeApplicationClose:async e=>{await t.androidApplications.restoreTestIme(n,{stateDir:e.stateDir});let i=e.shutdownTarget&&n.kind===`emulator`?await t.deviceShutdown.android.shutdownTarget(n,r):void 0;return i===void 0?{}:{shutdown:i}},prepareAppleRunner:Jn,configureProviderPortReverse:Jn})}async function qn(t,n,r){let i={};if(r.relaunch&&r.target){let e=Date.now();await v({device:n.device,interactor:await n.resolveInteractor(r.execution,r.appBundleId),positionals:[r.appBundleId??r.target]}),i.relaunchCloseDurationMs=V(e)}if(a(r.runtimeHints)){if(!r.applyRuntimeHints)throw new e(`COMMAND_FAILED`,`Runtime hint operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});let t=Date.now();await r.applyRuntimeHints({appId:r.appBundleId,values:r.runtimeHints}),i.runtimeHintsDurationMs=V(t)}let o=Date.now();await Be({device:n.device,interactor:await n.resolveInteractor(r.execution,r.appBundleId),positionals:r.positionals,appBundleId:r.appBundleId,execution:r.execution}),i.openDispatchDurationMs=V(o),r.enableTestIme&&await t.androidApplications.activateTestIme(n.device,{stateDir:r.stateDir});let s=Re(r);if(s){let e=Date.now();await Be({device:n.device,interactor:await n.resolveInteractor({...r.execution,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0},r.appBundleId),positionals:[s],appBundleId:r.appBundleId,execution:{...r.execution,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0}}),i.launchUrlDurationMs=V(e)}else i.launchUrlDurationMs=0;let c=await t.androidApplications.inferOpenedAppBundleId(n.device,r.target,r.appBundleId);return c&&await t.androidApplications.resetFramePerfStats(n.device,c),i.postOpenSettleDurationMs=0,{appBundleId:c,timing:i}}function V(e){return Math.max(0,Date.now()-e)}async function Jn(){throw new e(`UNSUPPORTED_OPERATION`,`This lifecycle operation is unavailable for Android.`)}async function H(e,t,n,r,i){U(n);let a=r?void 0:await $n(e,t,i);if(y.extname(n).toLowerCase()===`.aab`?await Qn(e,t,n,i):G(await e.androidTools.installPackage(t,n,{replace:!0},i),`adb install failed`),r)return r;let o=[...await $n(e,t,i)].filter(e=>!a?.has(e));return o.length===1?o[0]:void 0}function U(t){if(_()&&y.extname(t).toLowerCase()===`.aab`)throw new e(`UNSUPPORTED_OPERATION`,`Managed Android deployment does not support app bundles.`,{reason:`managed-bundle-install-unavailable`,hint:`Install an APK on this managed device.`})}async function Yn(e,t,n,r){let i=await W(e,t,[`uninstall`,n],r);if(i.exitCode===0)return;let a=`${i.stdout}\n${i.stderr}`.toLowerCase();a.includes(`unknown package`)||a.includes(`not installed`)||G(i,`adb uninstall failed for ${n}`)}async function Xn(t,n,r,i){let a=r.payload,o=typeof a.action==`string`&&a.action.trim()?a.action.trim():`${r.appId}.TEST_PUSH`,s=[`shell`,`am`,`broadcast`,`-a`,o,`-p`,r.appId];typeof a.receiver==`string`&&a.receiver.trim()&&s.push(`-n`,a.receiver.trim());let c=a.extras??{};if(typeof c!=`object`||!c||Array.isArray(c))throw new e(`INVALID_ARGS`,`Android push payload extras must be an object`);let l=0;for(let[e,t]of Object.entries(c))e&&(er(s,e,t),l+=1);return G(await W(t,n,s,i),`adb push broadcast failed`),{action:o,extrasCount:l}}function Zn(e){let t=new Set([`com`,`android`,`google`,`app`,`apps`,`service`,`services`,`mobile`,`client`]),n=e.split(/[._-]+/).map(e=>e.trim().toLowerCase()).filter(Boolean),r=[...n].reverse().find(e=>!t.has(e))??n.at(-1)??e;return r.charAt(0).toUpperCase()+r.slice(1)}async function Qn(t,n,r,i){if(await t.androidTools.installBundle(n,r,`universal`,i))return;let a=await t.commands.which(`bundletool`),o=t.androidDeployment.bundletoolJar;if(!a&&!o)throw new e(`TOOL_MISSING`,`bundletool not found in PATH. Install bundletool or set AGENT_DEVICE_BUNDLETOOL_JAR.`);let s=a?`bundletool`:`java`,c=a?[]:[`-jar`,o],l=await t.temporaryFiles.create({prefix:`agent-device-aab-`,suffix:`.apks`}),u=l.path;try{G(await t.commands.run({executable:s,args:[...c,`build-apks`,`--bundle`,r,`--output`,u,`--mode`,`universal`]},i),`bundletool build-apks failed`),G(await t.commands.run({executable:s,args:[...c,`install-apks`,`--apks`,u,`--device-id`,n.id]},i),`bundletool install-apks failed`)}finally{await l[Symbol.asyncDispose]()}}async function $n(e,t,n){let r=await W(e,t,[`shell`,`pm`,`list`,`packages`],n);return G(r,`adb package inventory failed`),new Set(r.stdout.split(`
|