agent-device 0.20.4 → 0.20.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.apk → agent-device-android-ime-helper-0.20.6.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.6.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.manifest.json → agent-device-android-ime-helper-0.20.6.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.apk → agent-device-android-snapshot-helper-0.20.6.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.6.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.manifest.json → agent-device-android-snapshot-helper-0.20.6.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +41 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +298 -92
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +126 -187
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +32 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +212 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +118 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +134 -27
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +23 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +10 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -67
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +11 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +2 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +48 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -20
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +177 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +105 -448
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +587 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +18 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.h +72 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.m +89 -0
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android.js +1 -1
- package/dist/src/app-log-request-scope.js +1 -1
- package/dist/src/app-resolution.js +1 -1
- package/dist/src/apps.js +5 -5
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +34 -24
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +15 -15
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/context.js +1 -1
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -0
- package/dist/src/generic.js +1 -1
- package/dist/src/ime-lifecycle.js +3 -3
- package/dist/src/index.d.ts +27 -7
- package/dist/src/input-actions.js +4 -4
- package/dist/src/interaction-runtime.js +1 -0
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction-touch-reference-frame.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +2 -2
- package/dist/src/internal/daemon.js +15 -15
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +23 -2
- package/dist/src/linux.js +1 -1
- package/dist/src/process-exit.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +25 -24
- package/dist/src/remote-config.js +1 -1
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/reporting.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/screenshot-geometry.js +1 -1
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/sdk-android-adb.d.ts +20 -2
- package/dist/src/sdk-android-adb.js +1 -1
- package/dist/src/sdk-batch-runner.js +3 -3
- package/dist/src/sdk-contracts.d.ts +17 -2
- package/dist/src/sdk-finders.d.ts +4 -20
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/{interaction.d.ts → sdk-selectors.d.ts} +98 -3
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -1
- package/dist/src/selectors.d.ts +1 -46
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +9 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/text-surface.js +1 -0
- package/dist/src/viewport-dimension.js +13 -12
- package/dist/src/web.js +1 -1
- package/package.json +42 -34
- package/server.json +3 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.4.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -225
package/dist/src/runtime.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as e,i as t,n,o as r,r as i,t as a}from"./png-worker-contract.js";import{T as o,_ as s,d as c,g as l,l as u,p as d,u as f,v as p}from"./sdk-contracts.js";import{
|
|
2
|
-
`)}function
|
|
3
|
-
`).toLowerCase(),n=w(e,Ot),r=w(e,Mt),i=w(e,Et,Pt),a=w(e,Dt),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=Rt(e.dismissNodes);if(t)return Vt(t,Ht(t));let n=Ut(e.collapsedNodes.filter(Ft));return n?.rect?{action:`close-collapsed-banner`,point:Jt(n),rect:n.rect,ref:n.ref,label:T(n)}:null}function bt(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function xt(e){return lt.test(e)}function St(e){return ut.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){let t=e?.trim().toLowerCase();return t?ft.some(e=>t.includes(e))||dt.some(e=>e.test(t)):!1}function Dt(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Ot(e){return kt(e)||At(e)||jt(e)}function kt(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function At(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function jt(e){return pt.has(e)}function Mt(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function Nt(e){return/^!,\s+/.test(e)}function Pt(e){return!e.rect||e.rect.height<=180}function Ft(e){let t=T(e)?.trim().toLowerCase()??``;return(Dt(t)||Nt(t))&&Lt(e)}function It(e){return e?e.x<=1&&e.y<=1&&e.width>=300&&e.height>=600:!1}function Lt(e){return e.rect?e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180:!1}function w(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 Rt(e){return Wt(e,Bt)}function zt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Bt(e){return[Kt(zt(e)),Kt(e.hittable),-(e.rect?Je(e.rect):1/0)]}function Vt(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:f(e.rect),rect:e.rect,ref:e.ref,label:T(e)}}function Ht(e){let t=T(e)?.trim().toLowerCase();return t&&kt(t)?`dismiss`:`close`}function Ut(e){return Wt(e,Gt)}function Wt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>qt(t(n),t(e)))[0]??null}function Gt(e){return[Kt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Kt(e){return+(e===!0)}function qt(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 Jt(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(Yt(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 Yt(e,t,n){return Math.min(n,Math.max(t,e))}function T(e){return e.label??e.value??e.identifier}function Xt(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}function Zt(e,t){try{let n=st(e),r=S.extname(n)||`.js`;return[S.join(S.dirname(n),`${t}${r}`),S.join(S.dirname(n),`internal`,`${t}${r}`)].find(e=>ot.existsSync(e))??null}catch{return null}}var E=class extends Error{};let D=null,Qt=!1,$t=!1,en=0;const O=new Map;function tn(e){Qt=!0,!$t&&($t=!0,at({level:`warn`,phase:`png_worker_unavailable`,data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function nn(e){let t=O.get(e.id);t&&(O.delete(e.id),k(),e.ok?t.resolve(e.result):t.reject(new s(o(e.error.code),e.error.message,e.error.details)))}function rn(e,t){D===e&&(tn(t.message),D=null,e.terminate().catch(()=>{}),an(new E(`PNG worker failed: ${t.message}`)))}function an(e){let t=[...O.values()];O.clear();for(let n of t)n.reject(e)}function k(){D&&(O.size>0?D.ref():D.unref())}function on(){if(Qt)return null;if(D)return D;let e=Zt(import.meta.url,`png-worker`);if(!e)return tn(`worker entry module not found next to the current module`),null;try{let t=new ct(e,{execArgv:e.endsWith(`.ts`)?[`--experimental-strip-types`]:[]});return t.on(`message`,nn),t.on(`error`,e=>{rn(t,e)}),t.on(`exit`,e=>{rn(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),D=t,t}catch(e){return tn(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}function sn(e){let t=on();if(!t)return Promise.reject(new E(`PNG worker is unavailable`));en+=1;let n=en;return new Promise((r,i)=>{O.set(n,{resolve:r,reject:i}),k();try{t.postMessage({...e,id:n})}catch(e){O.delete(n),k(),i(new E(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}async function A(e,t){try{return await sn(e)}catch(e){if(e instanceof E)return t();throw e}}function cn(){on()}async function ln(){let e=D;D=null,an(new E(`PNG worker terminated`)),e&&await e.terminate()}async function j(n,r){let i=await A({kind:`decode`,png:n,label:r},()=>{let e=t(n,r);return{kind:`decode`,width:e.width,height:e.height,data:e.data}}),o=new e.PNG({width:i.width,height:i.height});return o.data=a(i.data),o}async function M(t){return a((await A({kind:`encode`,width:t.width,height:t.height,data:t.data},()=>({kind:`encode`,png:e.PNG.sync.write(t)}))).png)}async function un(e,r,i){let{kind:a,...o}=await A({kind:`rgb-difference`,firstPng:e,secondPng:r,label:i},()=>({kind:`rgb-difference`,...n(t(e,i),t(r,i))}));return o}async function dn(e){let{kind:t,...n}=await A({kind:`diff-pixels`,...e},()=>({kind:`diff-pixels`,...i(e)}));return{...n,diffData:a(n.diffData)}}const N=[0,187,255,255];function fn(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||pn(e,n.rect)}function pn(e,t){let n=mn(t);if(n==null)return;let r=F(n.x,0,e.width-1),i=F(n.y,0,e.height-1),a=F(n.right,0,e.width-1),o=F(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)P(e,n,i+t,N),P(e,n,o-t,N);for(let n=i;n<=o;n+=1)P(e,r+t,n,N),P(e,a-t,n,N)}}function mn(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 P(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 F(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const hn=[{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 gn(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(!yn(t,a,e))continue;let c=0,l=vn(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=_n({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function _n(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 hn){let o=s+e.x,u=c+e.y;if(!bn(o,u,i,a))continue;let d=u*i+o;yn(t,n,d)&&(l=vn(r,n,l,d))}return l}function vn(e,t,n,r){return t[r]=1,e[n]=r,n+1}function yn(e,t,n){return e[n]===1&&t[n]!==1}function bn(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function xn(e,t){return e.flatMap(e=>Sn(e,t.baseline.width,t.baseline.height)?Cn(e,t,kn(t.baseline.height)):[e])}function Sn(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=On(n)&&r>=t*.35}function Cn(e,t,n){let r=Dn(e,En(Tn(wn(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])=>An(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function wn(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 Tn(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 En(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 Dn(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 On(e){return Math.max(48,Math.round(e*.07))}function kn(e){return Math.max(24,Math.round(e*.03))}function An(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??=jn(t,a),Mn(i,e,t,a,r.baseline,r.current))}return i}function jn(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 Mn(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 Nn=2.5;function Pn(e){let t=Fn(e);return xn(t.length<=2e3?Rn(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)=>Vn(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Fn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return gn({mask:t,width:i,height:a,hooks:{create:e=>In(e,i),visit:(e,t)=>Ln(e,t,i,n,r)}})}function In(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 Ln(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 Rn(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=>zn(e,r,t));if(!e){n.push({...r});continue}Bn(e,r)}return n}function zn(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 Bn(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 Vn(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=Hn(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Hn(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:je({x:L(r.x/n.width),y:L(r.y/n.height),width:L(r.width/n.width),height:L(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:L(e.differentPixels/n.differentPixels),densityPercentage:L(e.differentPixels/s),shape:Gn(r,n.width,n.height),size:Kn(s,n.totalPixels),location:Un(i,n.width,n.height),averageBaselineColorHex:qn(a),averageCurrentColorHex:qn(o),baselineLuminance:Math.round(I(a)),currentLuminance:Math.round(I(o)),dominantChange:Wn(a,o)}}function Hn(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Un(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 Wn(e,t){let n=I(t)-I(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 Gn(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*Nn?`horizontal-band`:e.height>=e.width*Nn?`vertical-band`:`compact`}function Kn(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function I(e){return e.r*.2126+e.g*.7152+e.b*.0722}function qn(e){return`#${Jn(e.r)}${Jn(e.g)}${Jn(e.b)}`}function Jn(e){return e.toString(16).padStart(2,`0`)}function L(e){return Math.round(e*100*100)/100}const Yn=255*Math.sqrt(3);async function Xn(t,n,r={}){await Zn(t,`Baseline image not found`),await Zn(n,`Current screenshot not found`);let i=r.outputPath,[a,o]=await Promise.all([C.readFile(t),C.readFile(n)]),[s,c]=await Promise.all([j(a,`baseline screenshot`),j(o,`current screenshot`)]);Qn(s.width,s.height,`baseline screenshot`,r.maxPixels),Qn(c.width,c.height,`current screenshot`,r.maxPixels);let l=r.threshold??.1;if(s.width!==c.width||s.height!==c.height){let e=s.width*s.height;return await $n(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:s.width,height:s.height},actual:{width:c.width,height:c.height}}}}let u=s.width*s.height,d=l*Yn,{diffData:f,diffMask:p,differentPixels:m}=await dn({baselineData:s.data,currentData:c.data,width:s.width,height:s.height,maxColorDistance:d}),h=m>0?Pn({diffMask:p,baseline:s,current:c,totalPixels:u,differentPixels:m}):[];if(m>0&&i){let t=new e.PNG({width:s.width,height:s.height});t.data=f,fn(t,h),await C.mkdir(S.dirname(i),{recursive:!0}),await C.writeFile(i,await M(t))}else await $n(r.outputPath);let ee=u>0?Math.round(m/u*100*100)/100:0;return{...m>0&&i?{diffPath:i}:{},...h.length>0?{regions:h}:{},totalPixels:u,differentPixels:m,mismatchPercentage:ee,match:m===0}}async function Zn(e,t){try{await C.access(e)}catch{throw new s(`INVALID_ARGS`,`${t}: ${e}`)}}function Qn(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new s(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function $n(e){if(e)try{await C.unlink(e)}catch(e){if(!er(e,`ENOENT`))throw e}}function er(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function tr(e,t){return e.map(e=>{let n=nr(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function nr(e,t){let n=rr(e.rect);return t.map(t=>{let r=t.overlayRect,i=Ne(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:ir(i/rr(r)),regionCoveragePercentage:ir(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 rr(e){return e.width*e.height}function ir(e){return Math.round(e*100*100)/100}async function R(e,t,n){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new s(`INVALID_ARGS`,`Local ${n.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw p(e)}}async function z(e,t,n){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new s(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw p(e)}}async function ar(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw p(e)}}const or=async(e,t)=>{if(!t.baseline)throw new s(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=sr(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!mr(r))throw new s(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await R(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),a,o,c,l=[];try{let s;mr(r)?(o=await cr(e,t),s=o.path):(a=await R(e,r,{usage:`diff screenshot current`,field:`current`}),s=a.path),c=t.out?await z(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Xn(i.path,s,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});mr(r)&&(u=await lr(e,t,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 i.cleanup?.(),await a?.cleanup?.(),await o?.cleanup?.()}};function sr(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new s(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function cr(e,t){let n=await ar(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await ur(e,t,n.path,dr(t))}catch(e){throw await n.cleanup(),e}return n}async function lr(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await pr(n),r;let a=await z(e,fr(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await ur(e,t,a.path,{overlayRefs:!0,...dr(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:tr(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function ur(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new s(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function dr(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function fr(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:B(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:B(e.out.clientPath)}:{},...e.out.fileName?{fileName:B(e.out.fileName)}:{}}}function B(e){let t=S.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function pr(e){try{await C.unlink(B(e))}catch(e){if(!hr(e,`ENOENT`))throw e}}function mr(e){return e.kind===`live`}function hr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}async function gr(e,t){if(!Number.isInteger(t)||t<1)throw new s(`INVALID_ARGS`,`Screenshot max size must be a positive integer`);let n=await j(await C.readFile(e),`screenshot`),r=Math.max(n.width,n.height);if(r<=t)return;let i=t/r,a=vr(n,Math.max(1,Math.round(n.width*i)),Math.max(1,Math.round(n.height*i)));await C.writeFile(e,await M(a))}async function _r(e,t,n){if(!Number.isInteger(t)||t<1||!Number.isInteger(n)||n<1)throw new s(`INVALID_ARGS`,`Screenshot resize dimensions must be positive integers`);let r=await j(await C.readFile(e),`screenshot`);r.width===t&&r.height===n||await C.writeFile(e,await M(vr(r,t,n)))}function vr(t,n,r){let i=new e.PNG({width:n,height:r});for(let e=0;e<r;e+=1){let a=e*t.height/r,o=(e+1)*t.height/r;for(let r=0;r<n;r+=1){let s=r*t.width/n,c=(r+1)*t.width/n,l=0,u=0,d=0,f=0,p=0;for(let e=Math.floor(a);e<Math.ceil(o);e+=1){let n=Math.min(e+1,o)-Math.max(e,a);for(let r=Math.floor(s);r<Math.ceil(c);r+=1){let i=n*(Math.min(r+1,c)-Math.max(r,s)),a=(e*t.width+r)*4;l+=(t.data[a]??0)*i,u+=(t.data[a+1]??0)*i,d+=(t.data[a+2]??0)*i,f+=(t.data[a+3]??0)*i,p+=i}}let m=(e*i.width+r)*4;i.data[m]=Math.round(l/p),i.data[m+1]=Math.round(u/p),i.data[m+2]=Math.round(d/p),i.data[m+3]=Math.round(f/p)}}return i}const yr=async(e,t)=>{if(!e.backend.captureScreenshot)throw new s(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);let n=await z(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r;try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),t.maxSize!==void 0&&await gr(n.path,t.maxSize),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...b(`Saved screenshot: ${n.path}`)}};function br(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!l(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let i=qe(t),a=new Set;return i.hiddenCount>0&&a.add(`offscreen-nodes`),i.nodes.some(e=>e.hiddenContentAbove)&&a.add(`scroll-hidden-above`),i.nodes.some(e=>e.hiddenContentBelow)&&a.add(`scroll-hidden-below`),{partial:a.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:t.length,reasons:[...a]}}const xr=`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 Sr(e){return e?.systemSurfaceOnly===!0?xr:void 0}function Cr(e,t){return e.presentationKey?e:{...e,presentationKey:u(t)}}function wr(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||!Tr(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Er(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 Tr(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Er(e,t){return e.truncated===t.truncated?JSON.stringify(Dr(e.nodes))===JSON.stringify(Dr(t.nodes)):!1}function Dr(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}const Or=async(e,t)=>{let n=await Ar(e,t),r=wr({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});return await e.sessions.set(Mr(t.session,n)),{nodes:n.snapshot.nodes,truncated:n.snapshot.truncated??!1,visibility:br({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...ke({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...Nr(n)}},kr=async(e,t)=>{let n=await Ar(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Mr(t.session,n);if(!i){let t=Oe(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=Te(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 Ar(e,t){if(!e.backend.captureSnapshot)throw new s(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),a=Cr(jr(i,e),t),o=Pe(i),c=le(e);return{snapshot:a,result:i,session:r,annotations:o,warnings:Pr({result:i,annotations:o,snapshot:a,options:t,session:r,capturedAt:a.createdAt??c,runtimeNow:c})}}function jr(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:le(t)}}function Mr(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 Nr(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 Pr(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...ie(e.annotations.quality,e.snapshot.nodes)),t.push(...Rr(e)),e.annotations.quality||(t.push(...Ir(e)),t.push(...Lr(e.snapshot.nodes)));let n=mt(e.snapshot.nodes);n&&t.push(n);let r=Fr(e.annotations);r&&t.push(r);let i=zr(e);return i&&t.push(i),t.push(...Ur(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Fr(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return xr}function Ir(e){return e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1||e.snapshot.nodes[0]?.type!==`Application`?[]:[`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 Lr(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 Rr(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 zr(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Br(t,e.snapshot)&&Vr(t,e.capturedAt,e.runtimeNow)&&Wr(t.nodes.length,e.snapshot.nodes.length))return Hr}function Br(e,t){return e.presentationKey===void 0||t.presentationKey===void 0?!0:e.presentationKey===t.presentationKey}function Vr(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Hr=`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 Ur(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`?[Hr]:[]}function Wr(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Gr={screenshot:yr,diffScreenshot:or,snapshot:Or,diffSnapshot:kr},Kr=async(e,t)=>await Xr(e,t,`press`),qr=async(e,t)=>await Xr(e,t,`click`),Jr=async(e,t)=>{if(!t.text)throw new s(`INVALID_ARGS`,`fill requires text`);let n=ge(t),r=n.needsPreActionBaseline?null:await $r(e,t);if(r)return r;let i=await de(e,t,{action:`fill`,requireInteractive:!0,promoteToHittableAncestor:!1,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.fill)throw new s(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let a=Zr(i),o=v(await e.backend.fill(m(e,t),a,t.text,{delayMs:t.delayMs})),c=`node`in i?i.node?.type??``:``,l=c&&!He(c,e.backend.platform)?`fill target ${ti(i)} resolved to "${c}", attempting fill anyway.`:void 0;return await we(e,t,i,{...i,text:t.text,...l?{warning:l}:{},...o?{backendResult:o}:{}},n)},Yr=async(e,t)=>{let n=t.text;if(!n)throw new s(`INVALID_ARGS`,`type requires text`);let r=ni(n);if(r)throw new s(`INVALID_ARGS`,`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});if(!e.backend.typeText)throw new s(`UNSUPPORTED_OPERATION`,`type is not supported by this backend`);let i=y(t.delayMs??0,`delay-ms`,0,1e4),a=v(await e.backend.typeText(m(e,t),n,{delayMs:i}));return{kind:`text`,text:n,delayMs:i,...a?{backendResult:a}:{},...b(`Typed ${Array.from(n).length} chars`)}};async function Xr(e,t,n){let r=ge(t),i=r.needsPreActionBaseline?null:await Qr(e,t,n);if(i)return i;let a=await de(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.tap)throw new s(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let o=Zr(a),c=v(await e.backend.tap(m(e,t),o,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return await we(e,t,a,{...a,...c?{backendResult:c}:{}},r)}function Zr(e){if(!e.point)throw new s(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Qr(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||ei(t)||t.expectedResolvedTarget)return null;let r=await Ee(e,t,t.target,n),i=v(await e.backend.tapTarget(m(e,t),{kind:`ref`,ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:t.target.ref},resolution:me,...r,...i?{backendResult:i}:{}}}async function $r(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let n=await Ee(e,t,t.target,`fill`),r=v(await e.backend.fillTarget(m(e,t),{kind:`ref`,ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:`ref`,target:{kind:`ref`,ref:t.target.ref},text:t.text,resolution:me,...n,...r?{backendResult:r}:{}}}function ei(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 ti(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function ni(e){return Xt(e)}function V(e){return{includeRects:ri(e.predicate),interactiveOnly:!1}}function ri(e){return e===`visible`||e===`hidden`}function ii(e,t,n){let r=n??1e4,i=oi(e),a=ai(),o=0,s=()=>Math.max(0,r-(oi(e)-i));return{capture:async n=>{let r=o===0;o+=1;let i=await xe(e,t,s(),async e=>await a.attempt(()=>n(e)));return i.timedOut?{timedOut:!0,deadline:r?`capture-stalled`:`capture-truncated`}:i},hasTimeRemaining:()=>s()>0,rethrowIfNeverReadable:a.rethrowIfNeverReadable,sleepUntilNextPoll:async()=>await si(e,t,Math.min(300,s())),timeoutMs:r,waitedMs:()=>oi(e)-i}}function H(e,t){return new s(`COMMAND_FAILED`,e,{reason:`wait_capture_stalled`,captureStalled:!0,timeoutMs:t,hint:`A snapshot capture stalled past the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function U(e,t,n){return new s(`COMMAND_FAILED`,e,n?{reason:`wait_deadline_exceeded`,captureTruncated:!0,timeoutMs:t}:void 0)}function ai(){let e=!1,t;return{attempt:async n=>{try{let t=await n();return e=!0,t}catch(e){if(!se(e))throw e;t=e;return}},rethrowIfNeverReadable:()=>{if(!e&&t!==void 0)throw t}}}function oi(e){return e.clock?.now()??Date.now()}async function si(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}function ci(e){let t=async(t,n)=>{if(n.target.kind===`sleep`)return await hi(t,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};if(n.target.kind===`ref`){let r=await e.requireSnapshot(t,n.session),i=d(n.target.ref);if(!i)throw new s(`INVALID_ARGS`,`Invalid ref: ${n.target.ref}`);let a=c(r.snapshot.nodes,i),o=a?We(a,r.snapshot.nodes):void 0;if(!o)throw new s(`COMMAND_FAILED`,`Ref ${n.target.ref} not found or has no label`);return await di(e,t,n,o,n.target.timeoutMs)}if(n.target.kind===`selector`)return await li(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);if(n.target.kind===`stable`)return await pi(e,t,n,n.target.quietMs,n.target.timeoutMs);let r=Be(n.target.text);if(!r.ok)throw new s(r.code,r.message);return await di(e,t,n,n.target.text,n.target.timeoutMs)};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new s(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function li(e,t,n,r,i,a){let o=ii(t,n,i),c=Fe(r),l=V({selectorChain:c}),u,d;for(;o.hasTimeRemaining();){let r=await o.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...l}));if(r.timedOut){d=r.deadline;break}let i=r.value;if(i){let e=i.snapshot.nodes,n=$e(e,c,{platform:t.backend.platform});if(n){let t=ui(e,n,a);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector.raw,waitedMs:o.waitedMs(),node:t.node,preActionNodes:e};u=t.evidence}}await o.sleepUntilNextPoll()}throw d===`capture-stalled`?H(`wait timed out for selector: ${r}`,o.timeoutMs):u?new s(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Qe,...u}):d===`capture-truncated`?U(`wait timed out for selector: ${r}`,o.timeoutMs,!0):(o.rethrowIfNeverReadable(),U(`wait timed out for selector: ${r}`,o.timeoutMs,!1))}function ui(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=pe(e),a=ae(t.matchedNodes,i,fe(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:et(r),observedAncestry:ee(r,i,Math.max(n.ancestry.length,1)).chain}}}async function di(e,t,n,r,i){let a=ii(t,n,i),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>t.backend.findText?(await t.backend.findText(mi(t,{...n,signal:i}),r)).found:await fi(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 o===`capture-stalled`?H(`wait timed out for text: ${r}`,a.timeoutMs):o===`capture-truncated`?U(`wait timed out for text: ${r}`,a.timeoutMs,!0):(a.rethrowIfNeverReadable(),U(`wait timed out for text: ${r}`,a.timeoutMs,!1))}async function fi(e,t,n,r){return!!Ge((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}async function pi(e,t,n,r,i){let a=i??1e4,o=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:o,timeoutMs:a});if(!c.settled)throw new s(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:`wait_stable_timeout`,...c.stalled?{captureStalled:!0}:{},quietMs:o,timeoutMs:a,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}:{}}}function mi(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}async function hi(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}const gi=ci({captureSnapshot:g,requireSnapshot:ce,stable:{defaultQuietMs:500,tinyTreeHint:_e,tinyTreeNodeCount:5,capture:Se}}),_i=gi.waitCommand,vi=gi.waitForTextCommand,yi=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new s(`INVALID_ARGS`,Re);if(t.action===`wait`)return await Ei(e,t,n);let{capture:r,match:i}=await Di(e,t,n);if(!i)throw new s(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let a=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:a,node:i}:{kind:`text`,ref:a,text:await re(e,r,i),node:i}},bi=async(e,t)=>{if(t.target.kind===`ref`){let n=await ce(e,t.session),r=ye(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`});De(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=tt(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 re(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Oi(e,t,t.session??`default`,{selector:t.target.selector,disambiguateAmbiguous:t.property===`text`});De(n.node,n.capture.snapshot.nodes,t.expectedResolvedTarget,`get`);let r=tt(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 re(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}},xi=async(e,t)=>{let n=await bi(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new s(`COMMAND_FAILED`,`getText returned non-text result`);return n},Si=async(e,t)=>{let n=await bi(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new s(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n},Ci=async(e,t)=>{let n=Ke(t.predicate);if(!n.ok)throw new s(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`text`&&!t.expectedText)throw new s(`INVALID_ARGS`,nt);let i=Fe(t.selector),a=await g(e,t,{updateSession:!0,...V({predicate:r,selectorChain:i})});if(r===`exists`){let t=Ye(a.snapshot.nodes,i,{platform:e.backend.platform});if(!t)throw new s(`COMMAND_FAILED`,x(i,[],{unique:!1}),{hint:Xe([])});return{predicate:r,pass:!0,selector:t.selector.raw,matches:t.matches,selectorChain:i.selectors.map(e=>e.raw)}}let o=Ze(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!o)throw new s(`COMMAND_FAILED`,x(i,[],{unique:!0}),{command:`is`,reason:`selector_not_found`,predicate:r,selector:i.raw,hint:Xe([])});De(o.node,a.snapshot.nodes,t.expectedResolvedTarget,`is`);let c=Ve({predicate:r,node:o.node,nodes:a.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!c.pass)throw new s(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector.raw}: ${c.details}`,{command:`is`,reason:`predicate_failed`,predicate:r,selector:o.selector.raw,predicateDetails:c.details});return{predicate:r,pass:!0,selector:o.selector.raw,...r===`text`?{text:c.actualText}:{},selectorChain:i.selectors.map(e=>e.raw),node:o.node,preActionNodes:a.snapshot.nodes}},wi=async(e,t)=>await Ci(e,{...t,predicate:`visible`,selector:t.target.selector}),Ti=async(e,t)=>await Ci(e,{...t,predicate:`hidden`,selector:t.target.selector});async function Ei(e,t,n){let r=ii(e,t,t.timeoutMs),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Di(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 i===`capture-stalled`?H(`find wait timed out`,r.timeoutMs):i===`capture-truncated`?U(`find wait timed out`,r.timeoutMs,!0):(r.rethrowIfNeverReadable(),U(`find wait timed out`,r.timeoutMs,!1))}async function Di(e,t,n,r){let i=Ie(n,t.query),a=await g(e,t,{updateSession:!0,scope:h(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...V({selectorChain:i})});if(oe(a.snapshot.snapshotQuality))throw ve(a.snapshot.snapshotQuality);return i?{capture:a,match:Ze(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!1})?.node}:{capture:a,match:Le(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Oi(e,t,n,r){let i=Fe(r.selector),a=await g(e,{...t,session:n},{updateSession:!0,...V({selectorChain:i})}),o=Ze(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:r.disambiguateAmbiguous});if(!o)throw new s(`COMMAND_FAILED`,x(i,[],{unique:!0}),{hint:Xe([])});return{capture:a,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function ki(e,t){let n=e.filter(t=>Ue(t,e)).map(e=>e.rect).filter(Ai),r=n.length>0?n:e.map(e=>e.rect).filter(Ai);if(r.length===0)throw new s(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let i=Math.min(...r.map(e=>e.x)),a=Math.min(...r.map(e=>e.y)),o=Math.max(...r.map(e=>e.x+e.width)),c=Math.max(...r.map(e=>e.y+e.height));return{x:i,y:a,width:o-i,height:c-a}}function Ai(e){return!!(e&&e.width>0&&e.height>0)}const ji=async(e,t)=>{if(!e.backend.performGesture)throw new s(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await ue(e,t,t.gesture.intent);let n=await Mi(e,t),r=Ae(t.gesture,n,e.backend.platform),i=v(await e.backend.performGesture(m(e,t),r)),a=Ni(r.pointers,0),o=Ni(r.pointers,-1);return{kind:r.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:a,to:o,...i?{backendResult:i}:{},...b(Pi(t.gesture,a,o))}};async function Mi(e,t){return await e.backend.resolveGestureViewport?.(m(e,t))||ki((await ne(e,t,!1)).snapshot.nodes,`gesture`)}function Ni(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new s(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function Pi(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 W={find:yi,get:bi,getText:xi,getAttrs:Si,is:Ci,isVisible:wi,isHidden:Ti,wait:_i,waitForText:vi},G={click:qr,press:Kr,fill:Jr,typeText:Yr,focus:Ce,longPress:he,scroll:be,gesture:ji};function Fi(e){return{find:t=>W.find(e,t),get:t=>W.get(e,t),getText:(t,n={})=>W.getText(e,{...n,target:t}),getAttrs:(t,n={})=>W.getAttrs(e,{...n,target:t}),is:t=>W.is(e,t),isVisible:(t,n={})=>W.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>W.isHidden(e,{...n,target:t}),wait:t=>W.wait(e,t),waitForText:(t,n={})=>W.waitForText(e,{...n,text:t})}}function Ii(e){return{click:(t,n={})=>G.click(e,{...n,target:t}),press:(t,n={})=>G.press(e,{...n,target:t}),fill:(t,n,r={})=>G.fill(e,{...r,target:t,text:n}),typeText:(t,n={})=>G.typeText(e,{...n,text:t}),focus:(t,n={})=>G.focus(e,{...n,target:t}),longPress:(t,n={})=>G.longPress(e,{...n,target:t}),scroll:t=>G.scroll(e,t),gesture:t=>G.gesture(e,t)}}function K(e,t){if(e!==void 0)return q(e,t)}function q(e,t){let n=e?.trim();if(!n)throw new s(`INVALID_ARGS`,`${t} must be a non-empty string`);return n}const Li=async(e,t={})=>{if(!e.backend.listDevices)throw new s(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(m(e,t),t.filter)}},Ri=async(e,t={})=>{if(!e.backend.bootDevice)throw new s(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let n=Ji(t.target),r=v(await e.backend.bootDevice(m(e,t),n));return{kind:`deviceBooted`,...n?{target:n}:{},...r?{backendResult:r}:{},...b(`Booted device`)}},zi=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new s(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let n=Ji(t.target),r=v(await e.backend.shutdownDevice(m(e,t),n));return{kind:`deviceShutdown`,...n?{target:n}:{},...r?{backendResult:r}:{},...b(`Shutdown device`)}},Bi=async(e,t)=>await Ui(e,t,`install`),Vi=async(e,t)=>await Ui(e,t,`reinstall`),Hi=async(e,t)=>await Ui(e,t,`installFromSource`);async function Ui(e,t,n){let r=n===`reinstall`?`reinstallApp`:`installApp`,i=e.backend[r];if(!i)throw new s(`UNSUPPORTED_OPERATION`,`admin.${n} is not supported by this backend`);let a=`app`in t&&t.app!==void 0?q(t.app,`app`):void 0;if(n!==`installFromSource`&&!a)throw new s(`INVALID_ARGS`,`admin.${n} requires app`);let o=m(e,t),c=await Wi(e,o,t.source);try{let t=await i.call(e.backend,o,{...a?{app:a}:{},source:c.source});return Yi(n,a,c.source,t)}finally{await c.cleanup?.()}}async function Wi(e,t,n){let r=await Gi(e,Ki(n));try{return{source:Ki(e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function Gi(e,t){if(t.kind===`url`)return{source:t};let n=await R(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function Ki(e){if(!e||typeof e!=`object`)throw new s(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:q(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:q(e.id,`source.id`)};if(e.kind===`url`){let t=q(e.url,`source.url`);return qi(t),{kind:`url`,url:t}}throw new s(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function qi(e){let t;try{t=new URL(e)}catch{throw new s(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new s(`INVALID_ARGS`,`Install source URL must use http or https`)}function Ji(e){if(!e)return;let t=K(e.id,`target.id`),n=K(e.name,`target.name`),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...e.headless===void 0?{}:{headless:e.headless}};return Object.keys(r).length>0?r:void 0}function Yi(e,t,n,r){let i=v(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=J(r,`appName`),s=J(r,`appId`),c=J(r,`bundleId`),l=J(r,`packageName`),u=J(r,`launchTarget`),d=J(r,`installablePath`),f=J(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...b(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??Xi(n)}`)}}function J(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function Xi(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const Zi=/^[A-Za-z0-9_.:-]{1,64}$/,Qi=async(e,t)=>{if(!e.backend.openApp)throw new s(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let n=ia(t),r=v(await e.backend.openApp(Y(e,t),n,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:`appOpened`,target:n,relaunch:t.relaunch===!0,...r?{backendResult:r}:{},...b(`Opened: ${oa(n)}`)}},$i=async(e,t={})=>{if(!e.backend.closeApp)throw new s(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let n=K(t.app,`app`),r=v(await e.backend.closeApp(Y(e,t),n));return{kind:`appClosed`,...n?{app:n}:{},...r?{backendResult:r}:{},...b(n?`Closed: ${n}`:`Closed app`)}},ea=async(e,t={})=>{if(!e.backend.listApps)throw new s(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Y(e,t),rt(t.filter))}},ta=async(e,t)=>{if(!e.backend.getAppState)throw new s(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let n=q(t.app,`app`);return{kind:`appState`,app:n,state:await e.backend.getAppState(Y(e,t),n)}},na=async(e,t)=>{if(!e.backend.pushFile)throw new s(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let n=q(t.app,`app`),r=await sa(e,t.input);try{let i=v(await e.backend.pushFile(Y(e,t),r.backendInput,n));return{kind:`appPushed`,app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...b(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},ra=async(e,t)=>{if(!e.backend.triggerAppEvent)throw new s(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let n=ca(t.name);la(t.payload,`apps.triggerEvent payload for "${n}"`);let r=v(await e.backend.triggerAppEvent(Y(e,t),{name:n,...t.payload?{payload:t.payload}:{}}));return{kind:`appEventTriggered`,name:n,...t.payload?{payload:t.payload}:{},...r?{backendResult:r}:{},...b(`Triggered app event: ${n}`)}};function ia(e){let t=K(e.app,`app`),n=K(e.appId,`appId`),r=K(e.bundleId,`bundleId`),i=K(e.packageName,`packageName`),a=K(e.url,`url`),o=K(e.activity,`activity`),c={...t?{app:t}:{},...n?{appId:n}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...a?{url:a}:{},...o?{activity:o}:{}};if(!aa(c))throw new s(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function aa(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function oa(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function sa(e,t){if(!t||typeof t!=`object`)throw new s(`INVALID_ARGS`,`apps.push requires an input`);if(t.kind===`json`)return ua(t.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:t.payload},inputKind:`json`};let n=await R(e,t,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:n.path},inputKind:`file`,...n.cleanup?{cleanup:n.cleanup}:{}}}function ca(e){let t=q(e,`name`);if(!Zi.test(t))throw new s(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return t}function la(e,t){e!==void 0&&ua(e,t,8192)}function ua(e,t,n){if(da(e,t),Buffer.byteLength(fa(e,t),`utf8`)>n)throw new s(`INVALID_ARGS`,`${t} exceeds ${n} bytes`)}function da(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new s(`INVALID_ARGS`,`${t} must be a JSON object`)}function fa(e,t){try{let n=JSON.stringify(e);if(typeof n!=`string`)throw new s(`INVALID_ARGS`,`${t} must be JSON-serializable`);return n}catch{throw new s(`INVALID_ARGS`,`${t} must be JSON-serializable`)}}function Y(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const pa={open:Qi,close:$i,list:ea,state:ta,push:na,triggerEvent:ra},ma={devices:Li,boot:Ri,shutdown:zi,install:Bi,reinstall:Vi,installFromSource:Hi};function ha(e){return{..._(pa,e),list:(t={})=>pa.list(e,{...t,filter:it(t.filter)})}}const ga=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,_a=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function va(e){let t=!1,n=e;return n=n.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`)),n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,r,i)=>(t=!0,`${String(n)}[REDACTED]${String(i)}`)),n=n.replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(_a,()=>(t=!0,`[REDACTED]`)),n=ba(n,()=>{t=!0}),{value:n,redacted:t}}function ya(e){try{let t=new URL(e),n=xa(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function ba(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=ya(e);return n?(n.redacted&&t(),n.value):e}):e}function xa(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))ga.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const X=2048,Sa=4096,Ca=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function wa(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=Q(e.message,Sa),r=ja(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function Ta(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?Oa(e.url):void 0,i=t===`headers`||t===`all`?Da(e.requestHeaders):void 0,a=t===`headers`||t===`all`?Da(e.responseHeaders):void 0,o=t===`body`||t===`all`?ka(e.requestBody):void 0,s=t===`body`||t===`all`?ka(e.responseBody):void 0,c=ja(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function Ea(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=Q(e.message,Sa),r=ja(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function Da(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(Ca.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=Q(i,X);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function Oa(e){return ya(e)??Q(e,X)}function ka(e){return e===void 0?{redacted:!1}:Aa(e)??Q(e,X)}function Aa(e){try{let t=Z(JSON.parse(e),va);return Ma(JSON.stringify(t.value),X,t.redacted)}catch{return}}function ja(e){return Z(e,e=>Q(e,X))}function Z(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=Z(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(Ca.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Z(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function Q(e,t){if(e===void 0)return{redacted:!1};let n=va(e);return Ma(n.value,t,n.redacted)}function Ma(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const Na=async(e,t={})=>{if(!e.backend.readLogs)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return wa(await e.backend.readLogs(await Ia(e,t),La(t)))},Pa=async(e,t={})=>{if(!e.backend.dumpNetwork)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let n=Ra(t);return Ta(await e.backend.dumpNetwork(await Ia(e,t),n),n.include??`summary`)},Fa=async(e,t={})=>{if(!e.backend.measurePerf)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return Ea(await e.backend.measurePerf(await Ia(e,t),za(t)))};async function Ia(e,t){let n=m(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function La(e){return{...Ba(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:Ua(e.levels,`levels`)},...e.search===void 0?{}:{search:q(e.search,`search`)},...e.source===void 0?{}:{source:q(e.source,`source`)}}}function Ra(e){return{...Ba(e,25,200,`network limit`),include:Ha(e.include)}}function za(e){return{...Va(e),...e.sampleMs===void 0?{}:{sampleMs:y(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:Ua(e.metrics,`metrics`,20)}}}function Ba(e,t,n,r){return{...Va(e),...e.cursor===void 0?{}:{cursor:q(e.cursor,`cursor`)},limit:e.limit===void 0?t:y(e.limit,r,1,n)}}function Va(e){return{...e.since===void 0?{}:{since:q(e.since,`since`)},...e.until===void 0?{}:{until:q(e.until,`until`)}}}function Ha(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new s(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function Ua(e,t,n=50){if(!Array.isArray(e))throw new s(`INVALID_ARGS`,`${t} must be an array of strings`);if(e.length>n)throw new s(`INVALID_ARGS`,`${t} must contain at most ${n} entries`);return e.map((e,n)=>q(e,`${t}[${n}]`))}const Wa={logs:Na,network:Pa,perf:Fa},Ga=async(e,t)=>{let n=Za(t.action,`record`),r=n===`start`?e.backend.startRecording:e.backend.stopRecording;if(!r)throw new s(`UNSUPPORTED_OPERATION`,`record ${n} is not supported by this backend`);let i=t.out?await z(e,t.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let a=qa(t,i?.path);return Qa(n,await r.call(e.backend,m(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}},Ka=async(e,t)=>{let n=Za(t.action,`trace`),r=n===`start`?e.backend.startTrace:e.backend.stopTrace;if(!r)throw new s(`UNSUPPORTED_OPERATION`,`trace ${n} is not supported by this backend`);let i=t.out?await z(e,t.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let a={...i?.path?{outPath:i.path}:{}};return $a(n,await r.call(e.backend,m(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}};function qa(e,t){let n={};t&&(n.outPath=t);let r=Ja(e.fps);r!==void 0&&(n.fps=r);let i=Ya(e.maxSize);i!==void 0&&(n.maxSize=i);let a=Xa(e.quality);return a!==void 0&&(n.quality=a),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function Ja(e){return e===void 0?void 0:y(e,`fps`,1,60)}function Ya(e){return e===void 0?void 0:y(e,`maxSize`,1,2**53-1)}function Xa(e){if(e===void 0)return;let t=te(e);if(t===void 0)throw new s(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return t}function Za(e,t){if(e===`start`||e===`stop`)return e;throw new s(`INVALID_ARGS`,`${t} action must be start or stop`)}function Qa(e,t,n){return{...typeof t.path==`string`?{path:t.path}:{},...typeof t.telemetryPath==`string`?{telemetryPath:t.telemetryPath}:{},...typeof t.warning==`string`?{warning:t.warning}:{},...eo(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function $a(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...eo(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function eo(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...b(e===`start`?r.startMessage:r.stopMessage)}}const to={record:Ga,trace:Ka},no=async(e,t={})=>{if(!e.backend.pressBack)throw new s(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let n=t.mode??`in-app`;if(n!==`in-app`&&n!==`system`)throw new s(`INVALID_ARGS`,`system.back mode must be in-app or system`);let r=v(await e.backend.pressBack(m(e,t),{mode:n}));return{kind:`systemBack`,mode:n,...r?{backendResult:r}:{},...b(`Back`)}},ro=async(e,t={})=>{if(!e.backend.pressHome)throw new s(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let n=v(await e.backend.pressHome(m(e,t)));return{kind:`systemHome`,...n?{backendResult:n}:{},...b(`Home`)}},io=async(e,t)=>{if(!e.backend.pressTvRemote)throw new s(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let n=Me(t.button),r=t.durationMs===void 0?void 0:y(t.durationMs,`durationMs`,0,1e4),i=v(await e.backend.pressTvRemote(m(e,t),{button:n,...r===void 0?{}:{durationMs:r}}));return{kind:`tvRemotePressed`,button:n,...r===void 0?{}:{durationMs:r},...i?{backendResult:i}:{},...b(`Pressed TV remote ${n}`)}},ao=async(e,t)=>{if(!e.backend.setOrientation)throw new s(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let n=fo(t.orientation),r=v(await e.backend.setOrientation(m(e,t),n));return{kind:`systemOrientationSet`,orientation:n,...r?{backendResult:r}:{},...b(`Rotated to ${n}`)}},oo=async(e,t={})=>{if(!e.backend.setKeyboard)throw new s(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let n=t.action??`status`;if(!ze(n))throw new s(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let r=await e.backend.setKeyboard(m(e,t),{action:n}),i=v(r),a=bo(r)?r:{};return n===`enter`||n===`return`?mo(a,i):n===`dismiss`?ho(n,a,i):go(n,a,i)},so=async(e,t)=>{if(t.action===`read`){if(!e.backend.getClipboard)throw new s(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let n=await e.backend.getClipboard(m(e,t));return{kind:`clipboardText`,action:`read`,text:typeof n==`string`?n:n.text}}if(t.action!==`write`)throw new s(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new s(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof t.text!=`string`)throw new s(`INVALID_ARGS`,`system.clipboard write requires text`);let n=v(await e.backend.setClipboard(m(e,t),t.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...b(`Clipboard updated`)}},co=async(e,t={})=>{if(!e.backend.openSettings)throw new s(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let n=K(t.target,`target`),r=v(await e.backend.openSettings(m(e,t),n));return{kind:`settingsOpened`,...n?{target:n}:{},...r?{backendResult:r}:{},...b(n?`Opened settings: ${n}`:`Opened settings`)}},lo=async(e,t={})=>{if(!e.backend.handleAlert)throw new s(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let n=t.action??`get`;if(n!==`get`&&n!==`accept`&&n!==`dismiss`&&n!==`wait`)throw new s(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let r=t.timeoutMs===void 0?void 0:y(t.timeoutMs,`timeoutMs`,0,12e4);return po(n,await e.backend.handleAlert(m(e,t),n,{timeoutMs:r}))},uo=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new s(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let n=v(await e.backend.openAppSwitcher(m(e,t)));return{kind:`appSwitcherOpened`,...n?{backendResult:n}:{},...b(`Opened app switcher`)}};function fo(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new s(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function po(e,t){return e===`get`?_o(t):e===`wait`?vo(t):yo(e,t)}function mo(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...b(`Keyboard enter pressed`)}}function ho(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...b(t.dismissed===!1?`Keyboard already hidden`:`Keyboard dismissed`)}}function go(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function _o(e){if(e.kind!==`alertStatus`)throw new s(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function vo(e){if(e.kind!==`alertWait`)throw new s(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...b(e.alert?`Alert visible`:`Alert wait timed out`)}}function yo(e,t){if(t.kind!==`alertHandled`)throw new s(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...b(t.handled?`Alert ${e}ed`:`No alert handled`)}}function bo(e){return!!(e&&typeof e==`object`)}const xo={back:no,home:ro,orientation:ao,keyboard:oo,clipboard:so,settings:co,alert:lo,appSwitcher:uo,tvRemote:io};function So(e){return{capture:_(Gr,e),selectors:Fi(e),interactions:Ii(e),system:_(xo,e),apps:ha(e),admin:_(ma,e),recording:_(to,e),observability:_(Wa,e)}}var Co=r({createAgentDevice:()=>wo,createMemorySessionStore:()=>To,localCommandPolicy:()=>Do,restrictedCommandPolicy:()=>Oo});function wo(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??To(),policy:e.policy??Oo(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...So(t)}}function To(e=[]){let t=new Map(e.map(e=>[e.name,$(e)]));return{get:e=>$(t.get(e)),set:e=>{t.set(e.name,$(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>$(e))}}function $(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Eo(e.metadata)}:{}}}function Eo(e){try{return structuredClone(e)}catch{return{...e}}}function Do(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Oo(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{_r as a,M as c,Xt as d,ht as f,Mt as g,kt as h,Sr as i,cn as l,_t as m,Do as n,un as o,gt as p,Co as r,j as s,wo as t,ln as u};
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./png-worker-contract.js";import{T as o,_ as s,d as c,g as l,l as u,p as d,u as f,v as p}from"./sdk-contracts.js";import{P as m,Pt as h,S as ee,Tt as te,n as ne,r as re,t as ie,xt as ae,y as g,yt as oe}from"./screenshot-geometry.js";import{$t as se,Et as ce,F as le,Ft as ue,G as de,I as fe,N as pe,Ot as me,R as _,an as he,bt as ge,et as _e,j as ve,jt as ye,k as be,pt as xe,q as Se,vt as Ce,wt as we,yt as Te,z as Ee}from"./sdk-batch-runner.js";import{$t as De,A as v,B as Oe,C as ke,D as Ae,E as je,F as Me,I as Ne,L as Pe,M as Fe,N as Ie,P as Le,Q as Re,S as ze,T as Be,X as Ve,Y as He,Z as Ue,_ as We,at as Ge,c as Ke,d as qe,f as Je,fn as y,g as Ye,h as Xe,it as b,j as Ze,k as Qe,l as $e,m as et,ot as x,p as tt,q as nt,rt as S,s as rt,st as C,u as it,w as at,x as ot}from"./viewport-dimension.js";import{M as st}from"./screenshot-result.js";import{d as ct,f as lt}from"./device.js";import{j as ut}from"./sdk-android-adb.js";import w from"node:path";import dt,{promises as T}from"node:fs";import{fileURLToPath as ft}from"node:url";import{Worker as pt}from"node:worker_threads";const mt=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,ht=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],gt=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],_t=[`open debugger to view warnings`,`getsnapshot should be cached to avoid an infinite loop`,`unique "key" prop`,`unique 'key' prop`,`virtualizedlists should never be nested`,`failed prop type`],vt=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function yt(e){if(bt(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
|
+
`)}function bt(e){let t=Ct(e),n=t.detected?wt(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function xt(e){return jt(e.label?.trim())&&Vt(e.rect)}function St(e,t){let n=e.label?.trim();return!n||!xt(e)?!1:t.some(e=>e.label?.trim()===n&&Ht(e))}function Ct(e){let t=e.map(Tt).join(`
|
|
3
|
+
`).toLowerCase(),n=E(e,Nt),r=E(e,Lt),i=E(e,jt,zt),a=E(e,Mt),o=Dt(t),s=Ot(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:At({text:t,hasReactNativeStackFrame:o,hasOverlayControl:kt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function wt(e){let t=Ut(e.dismissNodes);if(t)return Kt(t,qt(t));let n=Jt(e.collapsedNodes.filter(Bt));return n?.rect?{action:`close-collapsed-banner`,point:$t(n),rect:n.rect,ref:n.ref,label:D(n)}:null}function Tt(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function Et(e){return mt.test(e)}function Dt(e){return ht.some(t=>t.test(e))}function Ot(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function kt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function At(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(Et(e.text)||e.hasReactNativeStackFrame)}function jt(e){let t=e?.trim().toLowerCase();return t?_t.some(e=>t.includes(e))||gt.some(e=>e.test(t)):!1}function Mt(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Nt(e){return Pt(e)||Ft(e)||It(e)}function Pt(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function Ft(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function It(e){return vt.has(e)}function Lt(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function Rt(e){return/^!,\s+/.test(e)}function zt(e){return!e.rect||e.rect.height<=180}function Bt(e){let t=D(e)?.trim().toLowerCase()??``;return(Mt(t)||Rt(t))&&Ht(e)}function Vt(e){return e?e.x<=1&&e.y<=1&&e.width>=300&&e.height>=600:!1}function Ht(e){return e.rect?e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180:!1}function E(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 Ut(e){return Yt(e,Gt)}function Wt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Gt(e){return[Zt(Wt(e)),Zt(e.hittable),-(e.rect?he(e.rect):1/0)]}function Kt(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:f(e.rect),rect:e.rect,ref:e.ref,label:D(e)}}function qt(e){let t=D(e)?.trim().toLowerCase();return t&&Pt(t)?`dismiss`:`close`}function Jt(e){return Yt(e,Xt)}function Yt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Qt(t(n),t(e)))[0]??null}function Xt(e){return[Zt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Zt(e){return+(e===!0)}function Qt(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 $t(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(en(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 en(e,t,n){return Math.min(n,Math.max(t,e))}function D(e){return e.label??e.value??e.identifier}function tn(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}function nn(e,t){try{let n=ft(e),r=w.extname(n)||`.js`;return[w.join(w.dirname(n),`${t}${r}`),w.join(w.dirname(n),`internal`,`${t}${r}`)].find(e=>dt.existsSync(e))??null}catch{return null}}var O=class extends Error{};let k=null,rn=!1,an=!1,on=0;const A=new Map;function sn(e){rn=!0,!an&&(an=!0,ut({level:`warn`,phase:`png_worker_unavailable`,data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function cn(e){let t=A.get(e.id);t&&(A.delete(e.id),dn(),e.ok?t.resolve(e.result):t.reject(new s(o(e.error.code),e.error.message,e.error.details)))}function ln(e,t){k===e&&(sn(t.message),k=null,e.terminate().catch(()=>{}),un(new O(`PNG worker failed: ${t.message}`)))}function un(e){let t=[...A.values()];A.clear();for(let n of t)n.reject(e)}function dn(){k&&(A.size>0?k.ref():k.unref())}function fn(){if(rn)return null;if(k)return k;let e=nn(import.meta.url,`png-worker`);if(!e)return sn(`worker entry module not found next to the current module`),null;try{let t=new pt(e,{execArgv:e.endsWith(`.ts`)?[`--experimental-strip-types`]:[]});return t.on(`message`,cn),t.on(`error`,e=>{ln(t,e)}),t.on(`exit`,e=>{ln(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),k=t,t}catch(e){return sn(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}function pn(e){let t=fn();if(!t)return Promise.reject(new O(`PNG worker is unavailable`));on+=1;let n=on;return new Promise((r,i)=>{A.set(n,{resolve:r,reject:i}),dn();try{t.postMessage({...e,id:n})}catch(e){A.delete(n),dn(),i(new O(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}async function j(e,t){try{return await pn(e)}catch(e){if(e instanceof O)return t();throw e}}function mn(){fn()}async function hn(){let e=k;k=null,un(new O(`PNG worker terminated`)),e&&await e.terminate()}async function M(n,r){let i=await j({kind:`decode`,png:n,label:r},()=>{let e=t(n,r);return{kind:`decode`,width:e.width,height:e.height,data:e.data}}),o=new e.PNG({width:i.width,height:i.height});return o.data=a(i.data),o}async function N(t){return a((await j({kind:`encode`,width:t.width,height:t.height,data:t.data},()=>({kind:`encode`,png:e.PNG.sync.write(t)}))).png)}async function gn(e,r,i){let{kind:a,...o}=await j({kind:`rgb-difference`,firstPng:e,secondPng:r,label:i},()=>({kind:`rgb-difference`,...n(t(e,i),t(r,i))}));return o}async function _n(e){let{kind:t,...n}=await j({kind:`diff-pixels`,...e},()=>({kind:`diff-pixels`,...i(e)}));return{...n,diffData:a(n.diffData)}}const P=[0,187,255,255];function vn(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||yn(e,n.rect)}function yn(e,t){let n=bn(t);if(n==null)return;let r=I(n.x,0,e.width-1),i=I(n.y,0,e.height-1),a=I(n.right,0,e.width-1),o=I(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)F(e,n,i+t,P),F(e,n,o-t,P);for(let n=i;n<=o;n+=1)F(e,r+t,n,P),F(e,a-t,n,P)}}function bn(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 F(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 I(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const xn=[{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 Sn(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(!Tn(t,a,e))continue;let c=0,l=wn(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Cn({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Cn(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 xn){let o=s+e.x,u=c+e.y;if(!En(o,u,i,a))continue;let d=u*i+o;Tn(t,n,d)&&(l=wn(r,n,l,d))}return l}function wn(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Tn(e,t,n){return e[n]===1&&t[n]!==1}function En(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function Dn(e,t){return e.flatMap(e=>On(e,t.baseline.width,t.baseline.height)?kn(e,t,Fn(t.baseline.height)):[e])}function On(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Pn(n)&&r>=t*.35}function kn(e,t,n){let r=Nn(e,Mn(jn(An(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])=>In(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function An(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 jn(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 Mn(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 Nn(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 Pn(e){return Math.max(48,Math.round(e*.07))}function Fn(e){return Math.max(24,Math.round(e*.03))}function In(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??=Ln(t,a),Rn(i,e,t,a,r.baseline,r.current))}return i}function Ln(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 Rn(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 zn=2.5;function Bn(e){let t=Vn(e);return Dn(t.length<=2e3?Wn(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)=>qn(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Vn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Sn({mask:t,width:i,height:a,hooks:{create:e=>Hn(e,i),visit:(e,t)=>Un(e,t,i,n,r)}})}function Hn(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 Un(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 Wn(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=>Gn(e,r,t));if(!e){n.push({...r});continue}Kn(e,r)}return n}function Gn(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 Kn(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 qn(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=Jn(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Jn(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:ne({x:R(r.x/n.width),y:R(r.y/n.height),width:R(r.width/n.width),height:R(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:R(e.differentPixels/n.differentPixels),densityPercentage:R(e.differentPixels/s),shape:Zn(r,n.width,n.height),size:Qn(s,n.totalPixels),location:Yn(i,n.width,n.height),averageBaselineColorHex:$n(a),averageCurrentColorHex:$n(o),baselineLuminance:Math.round(L(a)),currentLuminance:Math.round(L(o)),dominantChange:Xn(a,o)}}function Jn(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Yn(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 Xn(e,t){let n=L(t)-L(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 Zn(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*zn?`horizontal-band`:e.height>=e.width*zn?`vertical-band`:`compact`}function Qn(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function L(e){return e.r*.2126+e.g*.7152+e.b*.0722}function $n(e){return`#${er(e.r)}${er(e.g)}${er(e.b)}`}function er(e){return e.toString(16).padStart(2,`0`)}function R(e){return Math.round(e*100*100)/100}const tr=255*Math.sqrt(3);async function nr(t,n,r={}){await rr(t,`Baseline image not found`),await rr(n,`Current screenshot not found`);let i=r.outputPath,[a,o]=await Promise.all([T.readFile(t),T.readFile(n)]),[s,c]=await Promise.all([M(a,`baseline screenshot`),M(o,`current screenshot`)]);ir(s.width,s.height,`baseline screenshot`,r.maxPixels),ir(c.width,c.height,`current screenshot`,r.maxPixels);let l=r.threshold??.1;if(s.width!==c.width||s.height!==c.height){let e=s.width*s.height;return await ar(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:s.width,height:s.height},actual:{width:c.width,height:c.height}}}}let u=s.width*s.height,d=l*tr,{diffData:f,diffMask:p,differentPixels:m}=await _n({baselineData:s.data,currentData:c.data,width:s.width,height:s.height,maxColorDistance:d}),h=m>0?Bn({diffMask:p,baseline:s,current:c,totalPixels:u,differentPixels:m}):[];if(m>0&&i){let t=new e.PNG({width:s.width,height:s.height});t.data=f,vn(t,h),await T.mkdir(w.dirname(i),{recursive:!0}),await T.writeFile(i,await N(t))}else await ar(r.outputPath);let ee=u>0?Math.round(m/u*100*100)/100:0;return{...m>0&&i?{diffPath:i}:{},...h.length>0?{regions:h}:{},totalPixels:u,differentPixels:m,mismatchPercentage:ee,match:m===0}}async function rr(e,t){try{await T.access(e)}catch{throw new s(`INVALID_ARGS`,`${t}: ${e}`)}}function ir(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new s(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function ar(e){if(e)try{await T.unlink(e)}catch(e){if(!or(e,`ENOENT`))throw e}}function or(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function sr(e,t){return e.map(e=>{let n=cr(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function cr(e,t){let n=lr(e.rect);return t.map(t=>{let r=t.overlayRect,i=ie(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:ur(i/lr(r)),regionCoveragePercentage:ur(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 lr(e){return e.width*e.height}function ur(e){return Math.round(e*100*100)/100}async function z(e,t,n){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new s(`INVALID_ARGS`,`Local ${n.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw p(e)}}async function B(e,t,n){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new s(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw p(e)}}async function dr(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw p(e)}}const fr=async(e,t)=>{if(!t.baseline)throw new s(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=pr(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!br(r))throw new s(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await z(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),a,o,c,l=[];try{let s;br(r)?(o=await mr(e,t),s=o.path):(a=await z(e,r,{usage:`diff screenshot current`,field:`current`}),s=a.path),c=t.out?await B(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await nr(i.path,s,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});br(r)&&(u=await hr(e,t,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 i.cleanup?.(),await a?.cleanup?.(),await o?.cleanup?.()}};function pr(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new s(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function mr(e,t){let n=await dr(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await gr(e,t,n.path,_r(t))}catch(e){throw await n.cleanup(),e}return n}async function hr(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await yr(n),r;let a=await B(e,vr(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await gr(e,t,a.path,{overlayRefs:!0,..._r(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:sr(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function gr(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new s(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function _r(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function vr(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:V(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:V(e.out.clientPath)}:{},...e.out.fileName?{fileName:V(e.out.fileName)}:{}}}function V(e){let t=w.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function yr(e){try{await T.unlink(V(e))}catch(e){if(!xr(e,`ENOENT`))throw e}}function br(e){return e.kind===`live`}function xr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}async function Sr(e,t){let{min:n,max:r}=te;if(!Number.isFinite(t)||t<n||t>r)throw new s(`INVALID_ARGS`,`Screenshot scale must be between ${n} and ${r}`);if(t===1)return;let i=await M(await T.readFile(e),`screenshot`),a=Math.max(1,Math.round(i.width*t)),o=Math.max(1,Math.round(i.height*t));await T.writeFile(e,await N(wr(i,a,o)))}async function Cr(e,t,n){if(!Number.isInteger(t)||t<1||!Number.isInteger(n)||n<1)throw new s(`INVALID_ARGS`,`Screenshot resize dimensions must be positive integers`);let r=await M(await T.readFile(e),`screenshot`);r.width===t&&r.height===n||await T.writeFile(e,await N(wr(r,t,n)))}function wr(t,n,r){let i=new e.PNG({width:n,height:r});for(let e=0;e<r;e+=1){let a=e*t.height/r,o=(e+1)*t.height/r;for(let r=0;r<n;r+=1){let s=r*t.width/n,c=(r+1)*t.width/n,l=0,u=0,d=0,f=0,p=0;for(let e=Math.floor(a);e<Math.ceil(o);e+=1){let n=Math.min(e+1,o)-Math.max(e,a);for(let r=Math.floor(s);r<Math.ceil(c);r+=1){let i=n*(Math.min(r+1,c)-Math.max(r,s)),a=(e*t.width+r)*4;l+=(t.data[a]??0)*i,u+=(t.data[a+1]??0)*i,d+=(t.data[a+2]??0)*i,f+=(t.data[a+3]??0)*i,p+=i}}let m=(e*i.width+r)*4;i.data[m]=Math.round(l/p),i.data[m+1]=Math.round(u/p),i.data[m+2]=Math.round(d/p),i.data[m+3]=Math.round(f/p)}}return i}const Tr=async(e,t)=>{if(!e.backend.captureScreenshot)throw new s(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);h(t);let n=await B(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r;try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),t.scale!==void 0&&await Sr(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...y(`Saved screenshot: ${n.path}`)}};function Er(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!l(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let i=re(t),a=new Set;return i.hiddenCount>0&&a.add(`offscreen-nodes`),i.nodes.some(e=>e.hiddenContentAbove)&&a.add(`scroll-hidden-above`),i.nodes.some(e=>e.hiddenContentBelow)&&a.add(`scroll-hidden-below`),{partial:a.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:t.length,reasons:[...a]}}const Dr=`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 Or(e){return e?.systemSurfaceOnly===!0?Dr:void 0}function kr(e,t){return e.presentationKey?e:{...e,presentationKey:u(t)}}function Ar(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||!jr(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Mr(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 jr(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Mr(e,t){return e.truncated===t.truncated?JSON.stringify(Nr(e.nodes))===JSON.stringify(Nr(t.nodes)):!1}function Nr(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}const Pr=async(e,t)=>{let n=await Ir(e,t),r=Ar({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});return await e.sessions.set(Rr(t.session,n)),{nodes:n.snapshot.nodes,truncated:n.snapshot.truncated??!1,visibility:Er({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...oe({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...zr(n)}},Fr=async(e,t)=>{let n=await Ir(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Rr(t.session,n);if(!i){let t=ze(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=ot(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 Ir(e,t){if(!e.backend.captureSnapshot)throw new s(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),a=kr(Lr(i,e),t),o=ae(i),c=Ge(e);return{snapshot:a,result:i,session:r,annotations:o,warnings:Br({result:i,annotations:o,snapshot:a,options:t,session:r,capturedAt:a.createdAt??c,runtimeNow:c})}}function Lr(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:Ge(t)}}function Rr(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 zr(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 Br(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Oe(e.annotations.quality,e.snapshot.nodes)),t.push(...Wr(e)),e.annotations.quality||(t.push(...Hr(e)),t.push(...Ur(e.snapshot.nodes)));let n=yt(e.snapshot.nodes);n&&t.push(n);let r=Vr(e.annotations);r&&t.push(r);let i=Gr(e);return i&&t.push(i),t.push(...Yr(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Vr(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Dr}function Hr(e){return e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1||e.snapshot.nodes[0]?.type!==`Application`?[]:[`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 Ur(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 Wr(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 Gr(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Kr(t,e.snapshot)&&qr(t,e.capturedAt,e.runtimeNow)&&Xr(t.nodes.length,e.snapshot.nodes.length))return Jr}function Kr(e,t){return e.presentationKey===void 0||t.presentationKey===void 0?!0:e.presentationKey===t.presentationKey}function qr(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Jr=`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 Yr(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`?[Jr]:[]}function Xr(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Zr={screenshot:Tr,diffScreenshot:fr,snapshot:Pr,diffSnapshot:Fr},Qr=new WeakMap;function $r(e,t){ti(e)&&Qr.set(e,t)}function ei(e){return ti(e)?Qr.get(e):void 0}function ti(e){return typeof e==`object`&&!!e||typeof e==`function`}const ni=async(e,t)=>await oi(e,t,`press`),ri=async(e,t)=>await oi(e,t,`click`),ii=async(e,t)=>{if(!t.text)throw new s(`INVALID_ARGS`,`fill requires text`);let n=tt(t),r=n.needsPreActionBaseline?null:await li(e,t);if(r)return r;let i=await Ae(e,t,{action:`fill`,requireInteractive:!0,promoteToHittableAncestor:!1,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.fill)throw new s(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let a=si(i),o=`node`in i?i.node?.type??``:``,c=o!==``&&se(o,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.node?.hittable===!1,u=b(await e.backend.fill(x(e,t),a,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=o&&!c?`fill target ${di(i)} resolved to "${o}", attempting fill anyway.`:void 0;return await Je(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)},ai=async(e,t)=>{let n=t.text;if(!n)throw new s(`INVALID_ARGS`,`type requires text`);let r=fi(n);if(r)throw new s(`INVALID_ARGS`,`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});if(!e.backend.typeText)throw new s(`UNSUPPORTED_OPERATION`,`type is not supported by this backend`);let i=C(t.delayMs??0,`delay-ms`,0,1e4),a=b(await e.backend.typeText(x(e,t),n,{delayMs:i}));return{kind:`text`,text:n,delayMs:i,...a?{backendResult:a}:{},...y(`Typed ${Array.from(n).length} chars`)}};async function oi(e,t,n){let r=tt(t),i=r.needsPreActionBaseline?null:await ci(e,t,n);if(i)return i;let a=await Ae(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.tap)throw new s(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let o=si(a),c;try{c=await e.backend.tap(x(e,t),o,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw $r(e,a),e}let l=b(c);return await Je(e,t,a,{...a,...l?{backendResult:l}:{}},r)}function si(e){if(!e.point)throw new s(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function ci(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||ui(t)||t.expectedResolvedTarget)return null;let r=await je(e,t,t.target,n),i=b(await e.backend.tapTarget(x(e,t),{kind:`ref`,ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:t.target.ref},resolution:ke,...r,...i?{backendResult:i}:{}}}async function li(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let n=await je(e,t,t.target,`fill`),r=b(await e.backend.fillTarget(x(e,t),{kind:`ref`,ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:`ref`,target:{kind:`ref`,ref:t.target.ref},text:t.text,resolution:ke,...n,...r?{backendResult:r}:{}}}function ui(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 di(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function fi(e){return tn(e)}function H(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}function pi(e,t,n){let r=n??1e4,i=U(e),a=vi(),o=()=>Math.max(0,r-(U(e)-i));return{capture:async n=>{let r=!1,i=await We(e,t,o(),async e=>await a.attempt(async()=>{let t=await n(e);return r=!0,t}));return i.timedOut?{timedOut:!0,deadline:a.readableCaptures()===0?`capture-stalled`:`capture-truncated`}:(r&&a.recordReadableCapture(),i)},hasTimeRemaining:()=>o()>0,failureEvidence:()=>({timeoutMs:r,readableCaptures:a.readableCaptures(),waitedMs:U(e)-i}),rethrowIfNeverReadable:a.rethrowIfNeverReadable,sleepUntilNextPoll:async()=>await yi(e,t,Math.min(300,o())),timeoutMs:r,waitedMs:()=>U(e)-i}}function mi(e,t){return new s(`COMMAND_FAILED`,e,{reason:g.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function hi(e,t){return new s(`COMMAND_FAILED`,e,{reason:g.deadlineExceeded,captureTruncated:!0,...t})}function gi(e,t){return new s(`COMMAND_FAILED`,e,{reason:g.targetAbsent,...t})}function _i(e,t,n){let r=t.failureEvidence();return n===`capture-stalled`?mi(e,r):n===`capture-truncated`?hi(e,r):(t.rethrowIfNeverReadable(),r.readableCaptures===0?mi(e,r):gi(e,r))}function vi(){let e=0,t;return{attempt:async e=>{try{return await e()}catch(e){if(!Pe(e))throw e;t=e;return}},recordReadableCapture:()=>{e+=1},readableCaptures:()=>e,rethrowIfNeverReadable:()=>{if(e===0&&t!==void 0)throw t}}}function U(e){return e.clock?.now()??Date.now()}async function yi(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}function bi(e){if(e.kind===`ambiguous`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes};if(e.kind===`resolved`)return{selector:e.resolution.selector,selectorIndex:e.resolution.selectorIndex,matchedNodes:e.matchedNodes}}function xi(e){let t=async(t,n)=>{if(n.target.kind===`sleep`)return await Oi(t,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};if(n.target.kind===`ref`){let r=await e.requireSnapshot(t,n.session),i=d(n.target.ref);if(!i)throw new s(`INVALID_ARGS`,`Invalid ref: ${n.target.ref}`);let a=c(r.snapshot.nodes,i),o=a?He(a,r.snapshot.nodes):void 0;if(!o)throw new s(`COMMAND_FAILED`,`Ref ${n.target.ref} not found or has no label`);return await wi(e,t,n,o,n.target.timeoutMs)}if(n.target.kind===`selector`)return await Si(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);if(n.target.kind===`stable`)return await Ei(e,t,n,n.target.quietMs,n.target.timeoutMs);let r=Ce(n.target.text);if(!r.ok)throw new s(r.code,r.message);return await wi(e,t,n,n.target.text,n.target.timeoutMs)};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new s(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function Si(e,t,n,r,i,a){let o=pi(t,n,i),c=H(),l,u;for(;o.hasTimeRemaining();){let i=await o.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(i.timedOut){u=i.deadline;break}let s=i.value;if(s){let e=s.snapshot.nodes,n=bi(fe(e,r,_.wait,{platform:t.backend.platform}));if(n){let t=Ci(e,n,a);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:o.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await o.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new s(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Qe,...l}):_i(`wait timed out for selector: ${r}`,o,u)}function Ci(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=Ue(e),a=Re(t.matchedNodes,i,Se(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:_e(r),observedAncestry:Ve(r,i,Math.max(n.ancestry.length,1)).chain}}}async function wi(e,t,n,r,i){let a=pi(t,n,i),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>t.backend.findText?(await t.backend.findText(Di(t,{...n,signal:i}),r)).found:await Ti(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 _i(`wait timed out for text: ${r}`,a,o)}async function Ti(e,t,n,r){return!!nt((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}async function Ei(e,t,n,r,i){let a=i??1e4,o=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:o,timeoutMs:a});if(!c.settled)throw new s(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:g.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:o,timeoutMs:a,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}:{}}}function Di(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}async function Oi(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}const ki=xi({captureSnapshot:v,requireSnapshot:Fe,stable:{defaultQuietMs:500,tinyTreeHint:Xe,tinyTreeNodeCount:5,capture:Ye}}),Ai=ki.waitCommand,ji=ki.waitForTextCommand,Mi=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new s(`INVALID_ARGS`,me);if(t.action===`wait`)return await zi(e,t,n);if(t.action===`list`)return await Bi(e,t,n);let{capture:r,match:i}=await Vi(e,t,n);if(!i)throw new s(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let a=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:a,node:i}:{kind:`text`,ref:a,text:await Ze(e,r,i),node:i}},Ni=async(e,t)=>{if(t.target.kind===`ref`){let n=await Fe(e,t.session),r=Ie(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`});at(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=de(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 Ze(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Hi(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?_.readText:_.readUnique});at(n.node,n.capture.snapshot.nodes,t.expectedResolvedTarget,`get`);let r=de(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 Ze(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}},Pi=async(e,t)=>{let n=await Ni(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new s(`COMMAND_FAILED`,`getText returned non-text result`);return n},Fi=async(e,t)=>{let n=await Ni(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new s(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n},Ii=async(e,t)=>{let n=Te(t.predicate);if(!n.ok)throw new s(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`text`&&!t.expectedText)throw new s(`INVALID_ARGS`,xe);let i=t.selector,a=await v(e,t,{updateSession:!0,...H(r)});if(r===`exists`){let t=be(a.snapshot.nodes,i,{platform:e.backend.platform});if(!t)throw new s(`COMMAND_FAILED`,we(i,[],{unique:!1}),{hint:ce([])});return{predicate:r,pass:!0,selector:t.selector,matches:t.matches,selectorChain:pe(i)}}let o=le(a.snapshot.nodes,i,{platform:e.backend.platform,...Ee(_.readUnique)});if(!o)throw new s(`COMMAND_FAILED`,we(i,[],{unique:!0}),{command:`is`,reason:`selector_not_found`,predicate:r,selector:i,hint:ce([])});at(o.node,a.snapshot.nodes,t.expectedResolvedTarget,`is`);let c=ge({predicate:r,node:o.node,nodes:a.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!c.pass)throw new s(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector}: ${c.details}`,{command:`is`,reason:`predicate_failed`,predicate:r,selector:o.selector,predicateDetails:c.details});return{predicate:r,pass:!0,selector:o.selector,...r===`text`?{text:c.actualText}:{},selectorChain:pe(i),node:o.node,preActionNodes:a.snapshot.nodes}},Li=async(e,t)=>await Ii(e,{...t,predicate:`visible`,selector:t.target.selector}),Ri=async(e,t)=>await Ii(e,{...t,predicate:`hidden`,selector:t.target.selector});async function zi(e,t,n){let r=pi(e,t,t.timeoutMs),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Vi(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 _i(`find wait timed out`,r,i)}async function Bi(e,t,n){let r=ue(n,t.query),i=await v(e,t,{updateSession:!0,...H()});if(Ne(i.snapshot.snapshotQuality))throw Me(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?ve(i.snapshot.nodes,r,{platform:e.backend.platform})?.matchedNodes??[]:ye(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Vi(e,t,n,r){let i=ue(n,t.query),a=await v(e,t,{updateSession:!0,scope:Le(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...H()});if(Ne(a.snapshot.snapshotQuality))throw Me(a.snapshot.snapshotQuality);return i?{capture:a,match:le(a.snapshot.nodes,i,{platform:e.backend.platform,...Ee(_.readAny)})?.node}:{capture:a,match:ye(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Hi(e,t,n,r){let i=await v(e,{...t,session:n},{updateSession:!0,...H()}),a=le(i.snapshot.nodes,r.selector,{platform:e.backend.platform,...Ee(r.policy)});if(!a)throw new s(`COMMAND_FAILED`,we(r.selector,[],{unique:!0}),{hint:ce([])});return{capture:i,node:a.node,selector:a.selector,ref:`@${a.node.ref}`}}const Ui=async(e,t)=>{if(!e.backend.performGesture)throw new s(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Be(e,t,t.gesture.intent);let n=await it(e,t),r=m(t.gesture,n,e.backend.platform),i=b(await e.backend.performGesture(x(e,t),r)),a=Gi(r.pointers,0),o=Gi(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:a,to:o,...i?{backendResult:i}:{},...y(Ki(t.gesture,a,o))}},Wi=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await rt(e,{...t,gesture:n}):await Ui(e,{...t,gesture:n})};function Gi(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new s(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function Ki(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 W={find:Mi,get:Ni,getText:Pi,getAttrs:Fi,is:Ii,isVisible:Li,isHidden:Ri,wait:Ai,waitForText:ji},G={click:ri,press:ni,fill:ii,typeText:ai,focus:Ke,longPress:$e,scroll:qe,gesture:Wi,settleObservation:et};function qi(e){return{find:t=>W.find(e,t),get:t=>W.get(e,t),getText:(t,n={})=>W.getText(e,{...n,target:t}),getAttrs:(t,n={})=>W.getAttrs(e,{...n,target:t}),is:t=>W.is(e,t),isVisible:(t,n={})=>W.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>W.isHidden(e,{...n,target:t}),wait:t=>W.wait(e,t),waitForText:(t,n={})=>W.waitForText(e,{...n,text:t})}}function Ji(e){return{click:(t,n={})=>G.click(e,{...n,target:t}),press:(t,n={})=>G.press(e,{...n,target:t}),fill:(t,n,r={})=>G.fill(e,{...r,target:t,text:n}),typeText:(t,n={})=>G.typeText(e,{...n,text:t}),focus:(t,n={})=>G.focus(e,{...n,target:t}),longPress:(t,n={})=>G.longPress(e,{...n,target:t}),scroll:t=>G.scroll(e,t),gesture:t=>G.gesture(e,t),settleObservation:t=>G.settleObservation(e,t)}}function K(e,t){if(e!==void 0)return q(e,t)}function q(e,t){let n=e?.trim();if(!n)throw new s(`INVALID_ARGS`,`${t} must be a non-empty string`);return n}const Yi=async(e,t={})=>{if(!e.backend.listDevices)throw new s(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(x(e,t),t.filter)}},Xi=async(e,t={})=>{if(!e.backend.bootDevice)throw new s(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let n=oa(t.target),r=b(await e.backend.bootDevice(x(e,t),n));return{kind:`deviceBooted`,...n?{target:n}:{},...r?{backendResult:r}:{},...y(`Booted device`)}},Zi=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new s(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let n=oa(t.target),r=b(await e.backend.shutdownDevice(x(e,t),n));return{kind:`deviceShutdown`,...n?{target:n}:{},...r?{backendResult:r}:{},...y(`Shutdown device`)}},Qi=async(e,t)=>await ta(e,t,`install`),$i=async(e,t)=>await ta(e,t,`reinstall`),ea=async(e,t)=>await ta(e,t,`installFromSource`);async function ta(e,t,n){let r=n===`reinstall`?`reinstallApp`:`installApp`,i=e.backend[r];if(!i)throw new s(`UNSUPPORTED_OPERATION`,`admin.${n} is not supported by this backend`);let a=`app`in t&&t.app!==void 0?q(t.app,`app`):void 0;if(n!==`installFromSource`&&!a)throw new s(`INVALID_ARGS`,`admin.${n} requires app`);let o=x(e,t),c=await na(e,o,t.source);try{let t=await i.call(e.backend,o,{...a?{app:a}:{},source:c.source});return sa(n,a,c.source,t)}finally{await c.cleanup?.()}}async function na(e,t,n){let r=await ra(e,ia(n));try{return{source:ia(e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function ra(e,t){if(t.kind===`url`)return{source:t};let n=await z(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function ia(e){if(!e||typeof e!=`object`)throw new s(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:q(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:q(e.id,`source.id`)};if(e.kind===`url`){let t=q(e.url,`source.url`);return aa(t),{kind:`url`,url:t}}throw new s(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function aa(e){let t;try{t=new URL(e)}catch{throw new s(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new s(`INVALID_ARGS`,`Install source URL must use http or https`)}function oa(e){if(!e)return;let t=K(e.id,`target.id`),n=K(e.name,`target.name`),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...e.headless===void 0?{}:{headless:e.headless}};return Object.keys(r).length>0?r:void 0}function sa(e,t,n,r){let i=b(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=J(r,`appName`),s=J(r,`appId`),c=J(r,`bundleId`),l=J(r,`packageName`),u=J(r,`launchTarget`),d=J(r,`installablePath`),f=J(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...y(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??ca(n)}`)}}function J(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function ca(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const la=/^[A-Za-z0-9_.:-]{1,64}$/,ua=async(e,t)=>{if(!e.backend.openApp)throw new s(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let n=ga(t),r=b(await e.backend.openApp(Y(e,t),n,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:`appOpened`,target:n,relaunch:t.relaunch===!0,...r?{backendResult:r}:{},...y(`Opened: ${va(n)}`)}},da=async(e,t={})=>{if(!e.backend.closeApp)throw new s(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let n=K(t.app,`app`),r=b(await e.backend.closeApp(Y(e,t),n));return{kind:`appClosed`,...n?{app:n}:{},...r?{backendResult:r}:{},...y(n?`Closed: ${n}`:`Closed app`)}},fa=async(e,t={})=>{if(!e.backend.listApps)throw new s(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Y(e,t),ct(t.filter))}},pa=async(e,t)=>{if(!e.backend.getAppState)throw new s(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let n=q(t.app,`app`);return{kind:`appState`,app:n,state:await e.backend.getAppState(Y(e,t),n)}},ma=async(e,t)=>{if(!e.backend.pushFile)throw new s(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let n=q(t.app,`app`),r=await ya(e,t.input);try{let i=b(await e.backend.pushFile(Y(e,t),r.backendInput,n));return{kind:`appPushed`,app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...y(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},ha=async(e,t)=>{if(!e.backend.triggerAppEvent)throw new s(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let n=ba(t.name);xa(t.payload,`apps.triggerEvent payload for "${n}"`);let r=b(await e.backend.triggerAppEvent(Y(e,t),{name:n,...t.payload?{payload:t.payload}:{}}));return{kind:`appEventTriggered`,name:n,...t.payload?{payload:t.payload}:{},...r?{backendResult:r}:{},...y(`Triggered app event: ${n}`)}};function ga(e){let t=K(e.app,`app`),n=K(e.appId,`appId`),r=K(e.bundleId,`bundleId`),i=K(e.packageName,`packageName`),a=K(e.url,`url`),o=K(e.activity,`activity`),c={...t?{app:t}:{},...n?{appId:n}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...a?{url:a}:{},...o?{activity:o}:{}};if(!_a(c))throw new s(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function _a(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function va(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function ya(e,t){if(!t||typeof t!=`object`)throw new s(`INVALID_ARGS`,`apps.push requires an input`);if(t.kind===`json`)return Sa(t.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:t.payload},inputKind:`json`};let n=await z(e,t,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:n.path},inputKind:`file`,...n.cleanup?{cleanup:n.cleanup}:{}}}function ba(e){let t=q(e,`name`);if(!la.test(t))throw new s(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return t}function xa(e,t){e!==void 0&&Sa(e,t,8192)}function Sa(e,t,n){if(Ca(e,t),Buffer.byteLength(wa(e,t),`utf8`)>n)throw new s(`INVALID_ARGS`,`${t} exceeds ${n} bytes`)}function Ca(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new s(`INVALID_ARGS`,`${t} must be a JSON object`)}function wa(e,t){try{let n=JSON.stringify(e);if(typeof n!=`string`)throw new s(`INVALID_ARGS`,`${t} must be JSON-serializable`);return n}catch{throw new s(`INVALID_ARGS`,`${t} must be JSON-serializable`)}}function Y(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const Ta={open:ua,close:da,list:fa,state:pa,push:ma,triggerEvent:ha},Ea={devices:Yi,boot:Xi,shutdown:Zi,install:Qi,reinstall:$i,installFromSource:ea};function Da(e){return{...S(Ta,e),list:(t={})=>Ta.list(e,{...t,filter:lt(t.filter)})}}const Oa=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,ka=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function Aa(e){let t=!1,n=e;return n=n.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`)),n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,r,i)=>(t=!0,`${String(n)}[REDACTED]${String(i)}`)),n=n.replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(ka,()=>(t=!0,`[REDACTED]`)),n=Ma(n,()=>{t=!0}),{value:n,redacted:t}}function ja(e){try{let t=new URL(e),n=Na(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function Ma(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=ja(e);return n?(n.redacted&&t(),n.value):e}):e}function Na(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))Oa.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const X=2048,Pa=4096,Fa=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function Ia(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=Q(e.message,Pa),r=Ua(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function La(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?Ba(e.url):void 0,i=t===`headers`||t===`all`?za(e.requestHeaders):void 0,a=t===`headers`||t===`all`?za(e.responseHeaders):void 0,o=t===`body`||t===`all`?Va(e.requestBody):void 0,s=t===`body`||t===`all`?Va(e.responseBody):void 0,c=Ua(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function Ra(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=Q(e.message,Pa),r=Ua(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function za(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(Fa.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=Q(i,X);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function Ba(e){return ja(e)??Q(e,X)}function Va(e){return e===void 0?{redacted:!1}:Ha(e)??Q(e,X)}function Ha(e){try{let t=Z(JSON.parse(e),Aa);return Wa(JSON.stringify(t.value),X,t.redacted)}catch{return}}function Ua(e){return Z(e,e=>Q(e,X))}function Z(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=Z(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(Fa.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Z(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function Q(e,t){if(e===void 0)return{redacted:!1};let n=Aa(e);return Wa(n.value,t,n.redacted)}function Wa(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const Ga=async(e,t={})=>{if(!e.backend.readLogs)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return Ia(await e.backend.readLogs(await Ja(e,t),Ya(t)))},Ka=async(e,t={})=>{if(!e.backend.dumpNetwork)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let n=Xa(t);return La(await e.backend.dumpNetwork(await Ja(e,t),n),n.include??`summary`)},qa=async(e,t={})=>{if(!e.backend.measurePerf)throw new s(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return Ra(await e.backend.measurePerf(await Ja(e,t),Za(t)))};async function Ja(e,t){let n=x(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function Ya(e){return{...Qa(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:to(e.levels,`levels`)},...e.search===void 0?{}:{search:q(e.search,`search`)},...e.source===void 0?{}:{source:q(e.source,`source`)}}}function Xa(e){return{...Qa(e,25,200,`network limit`),include:eo(e.include)}}function Za(e){return{...$a(e),...e.sampleMs===void 0?{}:{sampleMs:C(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:to(e.metrics,`metrics`,20)}}}function Qa(e,t,n,r){return{...$a(e),...e.cursor===void 0?{}:{cursor:q(e.cursor,`cursor`)},limit:e.limit===void 0?t:C(e.limit,r,1,n)}}function $a(e){return{...e.since===void 0?{}:{since:q(e.since,`since`)},...e.until===void 0?{}:{until:q(e.until,`until`)}}}function eo(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new s(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function to(e,t,n=50){if(!Array.isArray(e))throw new s(`INVALID_ARGS`,`${t} must be an array of strings`);if(e.length>n)throw new s(`INVALID_ARGS`,`${t} must contain at most ${n} entries`);return e.map((e,n)=>q(e,`${t}[${n}]`))}const no={logs:Ga,network:Ka,perf:qa},ro=async(e,t)=>{let n=co(t.action,`record`),r=n===`start`?e.backend.startRecording:e.backend.stopRecording;if(!r)throw new s(`UNSUPPORTED_OPERATION`,`record ${n} is not supported by this backend`);let i=t.out?await B(e,t.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let a=ao(t,i?.path);return lo(n,await r.call(e.backend,x(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}},io=async(e,t)=>{let n=co(t.action,`trace`),r=n===`start`?e.backend.startTrace:e.backend.stopTrace;if(!r)throw new s(`UNSUPPORTED_OPERATION`,`trace ${n} is not supported by this backend`);let i=t.out?await B(e,t.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let a={...i?.path?{outPath:i.path}:{}};return uo(n,await r.call(e.backend,x(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}};function ao(e,t){let n={};t&&(n.outPath=t);let r=oo(e.fps);r!==void 0&&(n.fps=r);let i=so(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function oo(e){return e===void 0?void 0:C(e,`fps`,1,60)}function so(e){if(e===void 0)return;let t=De(e);if(t===void 0)throw new s(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return t}function co(e,t){if(e===`start`||e===`stop`)return e;throw new s(`INVALID_ARGS`,`${t} action must be start or stop`)}function lo(e,t,n){return{...typeof t.path==`string`?{path:t.path}:{},...typeof t.telemetryPath==`string`?{telemetryPath:t.telemetryPath}:{},...typeof t.warning==`string`?{warning:t.warning}:{},...fo(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function uo(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...fo(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function fo(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...y(e===`start`?r.startMessage:r.stopMessage)}}const po={record:ro,trace:io},mo=async(e,t={})=>{if(!e.backend.pressBack)throw new s(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let n=t.mode??`in-app`;if(n!==`in-app`&&n!==`system`)throw new s(`INVALID_ARGS`,`system.back mode must be in-app or system`);let r=b(await e.backend.pressBack(x(e,t),{mode:n}));return{kind:`systemBack`,mode:n,...r?{backendResult:r}:{},...y(`Back`)}},ho=async(e,t={})=>{if(!e.backend.pressHome)throw new s(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let n=b(await e.backend.pressHome(x(e,t)));return{kind:`systemHome`,...n?{backendResult:n}:{},...y(`Home`)}},go=async(e,t)=>{if(!e.backend.pressTvRemote)throw new s(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let n=ee(t.button),r=t.durationMs===void 0?void 0:C(t.durationMs,`durationMs`,0,1e4),i=b(await e.backend.pressTvRemote(x(e,t),{button:n,...r===void 0?{}:{durationMs:r}}));return{kind:`tvRemotePressed`,button:n,...r===void 0?{}:{durationMs:r},...i?{backendResult:i}:{},...y(`Pressed TV remote ${n}`)}},_o=async(e,t)=>{if(!e.backend.setOrientation)throw new s(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let n=Co(t.orientation),r=b(await e.backend.setOrientation(x(e,t),n));return{kind:`systemOrientationSet`,orientation:n,...r?{backendResult:r}:{},...y(`Rotated to ${n}`)}},vo=async(e,t={})=>{if(!e.backend.setKeyboard)throw new s(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let n=t.action??`status`;if(!st(n))throw new s(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let r=await e.backend.setKeyboard(x(e,t),{action:n}),i=b(r),a=Mo(r)?r:{};return n===`enter`||n===`return`?To(a,i):n===`dismiss`?Eo(n,a,i):Oo(n,a,i)},yo=async(e,t)=>{if(t.action===`read`){if(!e.backend.getClipboard)throw new s(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let n=await e.backend.getClipboard(x(e,t));return{kind:`clipboardText`,action:`read`,text:typeof n==`string`?n:n.text}}if(t.action!==`write`)throw new s(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new s(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof t.text!=`string`)throw new s(`INVALID_ARGS`,`system.clipboard write requires text`);let n=b(await e.backend.setClipboard(x(e,t),t.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...y(`Clipboard updated`)}},bo=async(e,t={})=>{if(!e.backend.openSettings)throw new s(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let n=K(t.target,`target`),r=b(await e.backend.openSettings(x(e,t),n));return{kind:`settingsOpened`,...n?{target:n}:{},...r?{backendResult:r}:{},...y(n?`Opened settings: ${n}`:`Opened settings`)}},xo=async(e,t={})=>{if(!e.backend.handleAlert)throw new s(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let n=t.action??`get`;if(n!==`get`&&n!==`accept`&&n!==`dismiss`&&n!==`wait`)throw new s(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let r=t.timeoutMs===void 0?void 0:C(t.timeoutMs,`timeoutMs`,0,12e4);return wo(n,await e.backend.handleAlert(x(e,t),n,{timeoutMs:r}))},So=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new s(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let n=b(await e.backend.openAppSwitcher(x(e,t)));return{kind:`appSwitcherOpened`,...n?{backendResult:n}:{},...y(`Opened app switcher`)}};function Co(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new s(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function wo(e,t){return e===`get`?ko(t):e===`wait`?Ao(t):jo(e,t)}function To(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...y(`Keyboard enter pressed`)}}function Eo(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...y(Do(t))}}function Do(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function Oo(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function ko(e){if(e.kind!==`alertStatus`)throw new s(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function Ao(e){if(e.kind!==`alertWait`)throw new s(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...y(e.alert?`Alert visible`:`Alert wait timed out`)}}function jo(e,t){if(t.kind!==`alertHandled`)throw new s(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...y(t.handled?`Alert ${e}ed`:`No alert handled`)}}function Mo(e){return!!(e&&typeof e==`object`)}const No={back:mo,home:ho,orientation:_o,keyboard:vo,clipboard:yo,settings:bo,alert:xo,appSwitcher:So,tvRemote:go};function Po(e){return{capture:S(Zr,e),selectors:qi(e),interactions:Ji(e),system:S(No,e),apps:Da(e),admin:S(Ea,e),recording:S(po,e),observability:S(no,e)}}var Fo=r({createAgentDevice:()=>Io,createMemorySessionStore:()=>Lo,localCommandPolicy:()=>zo,restrictedCommandPolicy:()=>Bo});function Io(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Lo(),policy:e.policy??Bo(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...Po(t)}}function Lo(e=[]){let t=new Map(e.map(e=>[e.name,$(e)]));return{get:e=>$(t.get(e)),set:e=>{t.set(e.name,$(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>$(e))}}function $(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Ro(e.metadata)}:{}}}function Ro(e){try{return structuredClone(e)}catch{return{...e}}}function zo(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Bo(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{Lt as _,Or as a,M as c,hn as d,tn as f,Pt as g,St as h,ei as i,N as l,xt as m,zo as n,Cr as o,bt as p,Fo as r,gn as s,Io as t,mn as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{u as t}from"./sdk-batch-runner.js";function n(e){let t=a(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function r(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function i(e){let t=o(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,i=a(e.snapshotQuality);return r({...t?{androidSnapshot:t}:{},...i?{quality:i}:{},...n?{warnings:n}:{}})}function a(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function o(e){return typeof e==`object`&&e?e:void 0}function s(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const c=1e4,l=2e3,u=[`get`,`accept`,`dismiss`,`wait`],d=[`in-app`,`system`],ee=[`primary`,`secondary`,`middle`];function te(e){return e?.clickButton??`primary`}function ne(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function re(e){return e===`primary`?{}:{button:e}}const ie=[`up`,`down`,`left`,`right`,`top`,`bottom`],f=[`up`,`down`,`left`,`right`],p=[`left`,`right`,`left-edge`,`right-edge`],ae=[`one-way`,`ping-pong`],oe=1e4,se=6e4,ce=s(f,{message:e=>`Unknown direction: ${e}`});function le(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=_e(e.amount),i=e.pixels===void 0?Math.round(n*r):v(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function ue(e){_e(e.amount),e.pixels!==void 0&&v(e.pixels)}function de(e,t){if(e===`left`||e===`right`){let n=m(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=g(h(t,n,50),t,8),a=g(h(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function fe(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function m(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=g(h(t,a?50:r,a?r:50),t,8),s=g(h(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function pe(e){let t=he(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function h(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function g(e,t,n){return{x:y(e.x,n,t.referenceWidth),y:y(e.y,n,t.referenceHeight)}}function me(e){return ce.parse(e)}function he(e){let t=e.filter(e=>ge(e.type)&&_(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(_);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),i=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||i<=0))return{x:0,y:0,width:r,height:i}}function ge(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`application`)||t.includes(`window`)}function _(e){return!!e&&e.width>0&&e.height>0}function _e(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function v(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function y(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const b=1e4,x=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function S(n){let r=w(n),i=D(r,`kind`,x);if(i===`pan`)return{kind:i,origin:T(r,`origin`),delta:T(r,`delta`),pointerCount:t(r,`pointerCount`,{min:1,max:2}),durationMs:C(r)};if(r.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(i===`fling`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:i,direction:D(r,`direction`,f),origin:T(r,`origin`),distance:t(r,`distance`,{min:0})}}if(i===`swipe`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:i,preset:D(r,`preset`,p)}}if(i===`pinch`)return{kind:i,scale:E(r,`scale`),origin:ve(r,`origin`)};if(i===`rotate`){if(r.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:i,degrees:E(r,`degrees`),origin:ve(r,`origin`)}}return{kind:i,origin:T(r,`origin`),delta:T(r,`delta`),scale:E(r,`scale`),degrees:E(r,`degrees`),durationMs:C(r)}}function C(n){let r=t(n,`durationMs`);if(r!==void 0){if(r<16||r>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${b}.`);return r}}function w(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function T(e,t){let n=w(e[t]);return{x:E(n,`x`),y:E(n,`y`)}}function ve(e,t){return e[t]===void 0?void 0:T(e,t)}function E(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function D(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const ye={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:be}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function be(e,t){let[n,r,i,a,o]=e,s=O(n,i),c=O(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function O(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function xe(e,t){let n=ye[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!Se(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function Se(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function Ce(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function we(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function k(t,n){let r=xe(t,n);if(r)throw new e(`INVALID_ARGS`,we(r))}function Te(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function Ee(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{k(`gesture pan`,r);let{origin:e,delta:i}=Te(r);return S({kind:n,origin:e,delta:i,pointerCount:t,durationMs:A(r[4])})}case`fling`:return k(`gesture fling`,r),S({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:A(r[3])});case`swipe`:return k(`gesture swipe`,r),S({kind:n,preset:r[0]});case`pinch`:return k(`gesture pinch`,r),S({kind:n,scale:Number(r[0]),origin:je(r[1],r[2])});case`rotate`:return k(`gesture rotate`,r),S({kind:n,degrees:Number(r[0]),origin:je(r[1],r[2])});case`transform`:{k(`gesture transform`,r);let{origin:e,delta:t}=Te(r);return S({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:A(r[6])})}default:return S({kind:n})}}function De(e){switch(e.kind){case`pan`:return j([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return j([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return j([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?j([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return j([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function Oe(e,t={}){return k(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function ke(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function Ae(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function A(e){return e===void 0?void 0:Number(e)}function je(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function j(e){return e.filter(e=>e!==void 0).map(String)}const M={pinchAxisDegrees:-90,frameCount:Math.floor},Me={ios:M,macos:M,android:{pinchAxisDegrees:0,frameCount:Math.round},vega:M,linux:M,web:M};function Ne(e,t,n){let r=Be(t),i=Ue(n);switch(e.intent){case`fling`:return Fe(e,r,i);case`pan`:return Ie(e,r,i);case`pinch`:return P({intent:`pinch`,origin:e.origin??U(r),delta:{x:0,y:0},scale:H(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=V(e.degrees,`gesture rotate degrees`);return P({intent:`rotate`,origin:e.origin??U(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:z(t)},r,i)}case`transform`:{let t=V(e.degrees,`gesture transform degrees`);return P({intent:`transform`,origin:e.origin,delta:e.delta,scale:H(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:R(e.durationMs,z(t),`gesture transform durationMs`)},r,i)}}}function Pe(t){let n=t.pointers[0].samples[0]?.point,r=t.pointers[0].samples.at(-1)?.point;if(!n||!r)throw new e(`INVALID_ARGS`,`single-pointer gesture plan requires samples`);return{start:n,end:r}}function Fe(e,t,n){if(`preset`in e){let{from:r,to:i}=He(e.preset,t);return N(`fling`,r,i,100,t,`endpoint-hold`,n)}if(`from`in e)return N(`fling`,e.from,e.to,100,t,`endpoint-hold`,n);let r=B(e.origin,`gesture fling origin`),i=Ve(e.distance??180,`gesture fling distance`);return N(`fling`,r,W(r,fe(e.direction,i)),100,t,`endpoint-hold`,n)}function Ie(t,n,r){let i=R(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=B(t.origin,`gesture pan origin`);return N(`pan`,e,W(e,B(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`,r)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return P({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function N(e,t,n,r,i,a,o){let s=B(t,`gesture ${e} start`),c=B(n,`gesture ${e} end`),l=F(r,o).map(e=>({offsetMs:e,point:G(s,c,e/r)}));return I(l,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:l}]}}function P(e,t,n){let r=B(e.origin,`gesture ${e.intent} origin`),i=W(r,B(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*ze(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw L({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=F(e.durationMs,n),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:Le({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return I(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function Le(e){let t=e.offsetMs/e.durationMs,n=G(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=We(Re(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function Re(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function ze(e){return e===`pinch`?.4:.25}function F(e,t){let n=e/16,r=Math.max(3,t.frameCount(n));return Array.from({length:r+1},(t,n)=>Math.round(e*n/r))}function I(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw L({...r,viewport:n,sample:o})}}function L(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function Be(t){let n={x:V(t.x,`gesture viewport x`),y:V(t.y,`gesture viewport y`),width:V(t.width,`gesture viewport width`),height:V(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function R(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${b}`);return i}function z(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function B(e,t){return{x:V(e.x,`${t} x`),y:V(e.y,`${t} y`)}}function V(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function H(t,n){let r=V(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Ve(t,n){let r=V(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function U(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function W(e,t){return{x:e.x+t.x,y:e.y+t.y}}function G(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function He(e,t){let n=de(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function Ue(e){return e===void 0?M:Me[e]}function We(e){return e*Math.PI/180}const K={occlusion:{kind:`runtime`,via:`src/snapshot/snapshot-occlusion.ts#isSnapshotNodeInteractionBlocked`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/interaction-targeting.ts#resolveActionableTouchResolution`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...K}),{...K};const Ge=`tapped via non-hittable coordinate fallback`,Ke=1e4;function qe(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function Je(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Ye(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Xe={android:`longpress`,apple:`exact`,vega:`exact`},q={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},J=Object.keys(q),Ze=`<${J.join(`|`)}>`;function Qe(t){let n=t?.toLowerCase();if($e(n))return n;let r=n?it.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${J.join(`, `)}.`)}function $e(e){return typeof e==`string`&&J.includes(e)}function et(e){return q[e].appleRemoteButton}function tt(e){return q[e].androidKeyevent}function nt(e){return q[e].vegaKey}function rt(e){return Xe[e]}const it=new Map(J.flatMap(e=>q[e].aliases.map(t=>[t,e]))),at=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],Y=`<wifi|airplane|location> <on|off>`,X=`location set <lat> <lon>`,ot=`animations <on|off>`,Z=`appearance <light|dark|toggle>`,st=`faceid <match|nonmatch|enroll|unenroll>`,ct=`touchid <match|nonmatch|enroll|unenroll>`,lt=`fingerprint <match|nonmatch>`,ut=`clear-app-state [app-id]`,dt=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Q=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,ft=`macOS supports only settings ${Z} and settings ${Q}. wifi|airplane|location|animations remain unsupported on macOS.`,pt=[`settings ${Y}`,`settings ${X}`,`settings ${ot}`,`settings ${Z}`,`settings ${st}`,`settings ${ct}`,`settings ${lt}`,`settings ${ut}`,`settings ${dt}`,`settings ${Q}`].join(` | `),mt=`settings requires ${Y}, ${X}, ${ot}, ${Z}, ${st}, ${ct}, ${lt}, ${ut}, ${dt}, or ${Q}`;function ht(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function gt(e){return`Unsupported macOS setting: ${e}. ${ft}`}function _t(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function vt(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${at.join(`|`)}`)}function yt(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return $(Number(t),n)}function bt(e){return{latitude:$(e?.latitude,`latitude`),longitude:$(e?.longitude,`longitude`)}}function $(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}function xt(e){return e}function St(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)}export{r as $,Oe as A,m as B,Ne as C,De as D,Ee as E,ae as F,re as G,pe as H,oe as I,d as J,ne as K,p as L,S as M,f as N,ke as O,ie as P,s as Q,se as R,Ge as S,Ce as T,me as U,le as V,ee as W,l as X,u as Y,c as Z,rt as _,mt as a,Ye as b,ht as c,J as d,i as et,Ze as f,nt as g,et as h,bt as i,x as j,Ae as k,_t as l,tt as m,xt as n,pt as o,Qe as p,te as q,yt as r,gt as s,St as t,n as tt,vt as u,Ke as v,Pe as w,Je as x,qe as y,ue as z};
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{Gt as t,Jt as n,Kt as r,Qt as i,Tn as a,Xt as o,Zt as s,dt as c,rn as l,sn as u}from"./sdk-batch-runner.js";const d={min:.01,max:1},f={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function ee(e,t){return t&&Object.hasOwn(t,f.flagKey)?f.migration[e]:void 0}function te(t,n){if(Object.hasOwn(n,f.publicOptionKey)||Object.hasOwn(n,f.flagKey))throw new e(`INVALID_ARGS`,f.migration[t])}const ne=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],re=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ie=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotScale`,names:[`--scale`],type:`number`,min:d.min,max:d.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],ae=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],oe=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],se=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:d.min,max:d.max}];function ce(e){return p({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function le(e={}){return p({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function ue(e={}){return le({...e,screenshotScale:e.screenshotScale??e.scale})}function de(t){let{min:n,max:r}=d;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<n||t.scale>r))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${n} and ${r}`)}function fe(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function pe(t){let{args:n,flags:r,index:i}=t,a=n[i];if(a===f.cliToken)throw new e(`INVALID_ARGS`,f.migration.screenshot);return me(a,r,i)??he({args:n,index:i,flags:r,token:a})??ge({args:n,index:i,flags:r,token:a})??{handled:!1}}function p(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function me(e,t,n){let r=ae.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function he(t){let n=oe.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ge(t){let n=se.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function _e(e){let t=ye(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function m(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function ve(e){let t=be(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=ye(e.snapshotQuality);return m({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function ye(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function be(e){return typeof e==`object`&&e?e:void 0}const h=1500;function xe(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function Se(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return Ce(t)}function Ce(e){if(e.length===0)return;let t=e.slice(1),n=t.length>=3?g(t):void 0,r=t.filter(e=>e.durationMs>=h).length,i=n!==void 0&&n.p95Ms>=h&&r>=2;return{stats:g(e),...i&&n?{warning:ke(n)}:{}}}function we(e){let t=e.filter(e=>e!==void 0),n=t.flatMap(e=>Fe(e.stats));if(n.length===0)return;let r=g(n),i=t.filter(e=>e.warning);return{stats:r,...i.length>0?{warning:Ae({warnedCount:i.length,totalCount:t.length,worst:i.reduce((e,t)=>Math.max(e,t.stats.p95Ms),0),platform:r.platform})}:{}}}function Te(e){if(!a(e))return;let t=je(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function g(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:Ee(t,50),p95Ms:Ee(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:h,...De(e),...Oe(e)}}function Ee(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function De(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Oe(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function ke(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Ae(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots were slow in ${e.warnedCount} of ${e.totalCount} runs (worst run p95 ${e.worst}ms). Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function je(e){if(!a(e))return;let t=Me(e);if(t)return{...t,...Pe(e)}}function Me(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function Ne(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function Pe(e){let t=typeof e.platform==`string`?e.platform:void 0,n=a(e.backends)?Ne(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Fe(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const Ie=1e4,Le=2e3,Re=[`get`,`accept`,`dismiss`,`wait`],ze=[`in-app`,`system`],Be=[`primary`,`secondary`,`middle`];function Ve(e){return e?.clickButton??`primary`}function He(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function Ue(e){return e===`primary`?{}:{button:e}}function We(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const Ge=[`up`,`down`,`left`,`right`,`top`,`bottom`],_=[`up`,`down`,`left`,`right`],Ke=[`left`,`right`,`left-edge`,`right-edge`],qe=[`one-way`,`ping-pong`],Je=1e4,Ye=6e4,Xe=We(_,{message:e=>`Unknown direction: ${e}`});function Ze(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=x(e.amount),i=e.pixels===void 0?Math.round(n*r):S(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function Qe(e){x(e.amount),e.pixels!==void 0&&S(e.pixels)}function $e(e,t){if(e===`left`||e===`right`){let n=tt(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=y(v(t,n,50),t,8),a=y(v(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function et(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function tt(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=y(v(t,a?50:r,a?r:50),t,8),s=y(v(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function nt(e){let t=it(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function v(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function y(e,t,n){return{x:at(e.x,n,t.referenceWidth),y:at(e.y,n,t.referenceHeight)}}function rt(e){return Xe.parse(e)}function it(e){let t=e.filter(e=>o(e)&&b(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(b);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),i=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||i<=0))return{x:0,y:0,width:r,height:i}}function b(e){return!!e&&e.width>0&&e.height>0}function x(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function S(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function at(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const C=1e4,ot=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function w(t){let n=E(t),r=k(n,`kind`,ot);if(r===`pan`)return{kind:r,origin:D(n,`origin`),delta:D(n,`delta`),pointerCount:c(n,`pointerCount`,{min:1,max:2}),durationMs:T(n)};if(r===`drag`)return st(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:k(n,`direction`,_),origin:D(n,`origin`),distance:c(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:k(n,`preset`,Ke)}}if(r===`pinch`)return{kind:r,scale:O(n,`scale`),origin:ct(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:O(n,`degrees`),origin:ct(n,`origin`)}}return{kind:r,origin:D(n,`origin`),delta:D(n,`delta`),scale:O(n,`scale`),degrees:O(n,`degrees`),durationMs:T(n)}}function st(t){let n=c(t,`sourceHoldMs`,{min:1,max:1e4}),r=c(t,`moveMs`,{min:16,max:1e4}),i=c(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${C}`);return{kind:`drag`,source:lt(t,`source`),destination:lt(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function T(t){let n=c(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${C}.`);return n}}function E(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function D(e,t){let n=E(e[t]);return{x:O(n,`x`),y:O(n,`y`)}}function ct(e,t){return e[t]===void 0?void 0:D(e,t)}function O(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function lt(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function k(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const ut={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:dt}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function dt(e,t){let[n,r,i,a,o]=e,s=ft(n,i),c=ft(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function ft(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function A(e,t){let n=ut[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!pt(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function pt(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function mt(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function j(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function M(t,n){let r=A(t,n);if(r)throw new e(`INVALID_ARGS`,j(r))}function ht(e,t,n){let r=gt(e,t);return r?j(r,n):void 0}function gt(e,t){if(e===`swipe`)return A(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(ut,n))return A(n,t.slice(1))}function N(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function P(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{M(`gesture pan`,r);let{origin:e,delta:i}=N(r);return w({kind:n,origin:e,delta:i,pointerCount:t,durationMs:F(r[4])})}case`fling`:return M(`gesture fling`,r),w({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:F(r[3])});case`swipe`:return M(`gesture swipe`,r),w({kind:n,preset:r[0]});case`pinch`:return M(`gesture pinch`,r),w({kind:n,scale:Number(r[0]),origin:I(r[1],r[2])});case`rotate`:return M(`gesture rotate`,r),w({kind:n,degrees:Number(r[0]),origin:I(r[1],r[2])});case`transform`:{M(`gesture transform`,r);let{origin:e,delta:t}=N(r);return w({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:F(r[6])})}case`drag`:return M(`gesture drag`,r),w({kind:n,source:r[0],destination:r[1],sourceHoldMs:F(r[2]),moveMs:F(r[3]),destinationHoldMs:F(r[4])});default:return w({kind:n})}}function _t(e){if(e[0]!==`drag`)return;let t=P(e);return t.kind===`drag`?t:void 0}function vt(e){switch(e.kind){case`pan`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return L([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return L([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?L([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function yt(e,t={}){return M(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function bt(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function xt(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:bt(e).gesture}function St(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function F(e){return e===void 0?void 0:Number(e)}function I(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function L(e){return e.filter(e=>e!==void 0).map(String)}const R={pinchAxisDegrees:-90,samplingProfile:`default`},Ct={ios:R,macos:R,android:{pinchAxisDegrees:0,samplingProfile:`android`},vega:R,linux:R,web:R};function wt(e,t,n){let r=Pt(t),i=Ht(n);switch(e.intent){case`fling`:return Ot(e,r);case`pan`:return kt(e,r,i);case`pinch`:return B({intent:`pinch`,origin:e.origin??zt(r),delta:{x:0,y:0},scale:Lt(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=K(e.degrees,`gesture rotate degrees`);return B({intent:`rotate`,origin:e.origin??zt(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:W(t)},r,i)}case`transform`:{let t=K(e.degrees,`gesture transform degrees`);return B({intent:`transform`,origin:e.origin,delta:e.delta,scale:Lt(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:U(e.durationMs,W(t),`gesture transform durationMs`)},r,i)}}}function Tt(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Et(t,n){let r=Pt(n),i=Ft(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=U(t.moveMs,500,`gesture drag moveMs`),o=It(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${C}`);return Dt(z(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function Dt(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Ot(e,t){if(`preset`in e){let{from:n,to:r}=Vt(e.preset,t);return z(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return z(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=G(e.origin,`gesture fling origin`),r=Rt(e.distance??180,`gesture fling distance`);return z(`fling`,n,q(n,et(e.direction,r)),100,t,`endpoint-hold`)}function kt(t,n,r){let i=U(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=G(t.origin,`gesture pan origin`);return z(`pan`,e,q(e,G(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return B({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function z(e,t,n,r,i,a){let o=G(t,`gesture ${e} start`),s=G(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return H(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function B(e,t,n){let r=G(e.origin,`gesture ${e.intent} origin`),i=q(r,G(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Mt(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw Nt({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=V(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:At({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return H(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function At(e){let t=e.offsetMs/e.durationMs,n=Bt(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Ut(jt(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function jt(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Mt(e){return e===`pinch`?.4:.25}function V(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function H(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw Nt({...r,viewport:n,sample:o})}}function Nt(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function Pt(t){let n={x:K(t.x,`gesture viewport x`),y:K(t.y,`gesture viewport y`),width:K(t.width,`gesture viewport width`),height:K(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function U(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${C}`);return i}function Ft(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${C}`);return i}function It(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${C}`);return i}function W(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function G(e,t){return{x:K(e.x,`${t} x`),y:K(e.y,`${t} y`)}}function K(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Lt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Rt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function zt(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function q(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Bt(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Vt(e,t){let n=$e(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function Ht(e){return e===void 0?R:Ct[e]}function Ut(e){return e*Math.PI/180}const Wt={occlusion:{kind:`runtime`,via:`src/snapshot/snapshot-occlusion.ts#isSnapshotNodeInteractionBlocked`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/interaction-targeting.ts#resolveActionableTouchResolution`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...Wt}),{...Wt};const Gt=`tapped via non-hittable coordinate fallback`,Kt=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],qt=1e4;function Jt(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function Yt(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Xt(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Zt={android:`longpress`,apple:`exact`,vega:`exact`},J={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},Y=Object.keys(J),Qt=`<${Y.join(`|`)}>`;function $t(t){let n=t?.toLowerCase();if(en(n))return n;let r=n?on.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Y.join(`, `)}.`)}function en(e){return typeof e==`string`&&Y.includes(e)}function tn(e){return J[e].appleRemoteButton}function nn(e){return J[e].androidKeyevent}function rn(e){return J[e].vegaKey}function an(e){return Zt[e]}const on=new Map(Y.flatMap(e=>J[e].aliases.map(t=>[t,e]))),sn={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},cn=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],ln=`<wifi|airplane|location> <on|off>`,un=`location set <lat> <lon>`,dn=`animations <on|off>`,X=`appearance <light|dark|toggle>`,fn=`faceid <match|nonmatch|enroll|unenroll>`,pn=`touchid <match|nonmatch|enroll|unenroll>`,mn=`fingerprint <match|nonmatch>`,hn=`clear-app-state [app-id]`,gn=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Z=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,_n=`macOS supports only settings ${X} and settings ${Z}. wifi|airplane|location|animations remain unsupported on macOS.`,vn=[`settings ${ln}`,`settings ${un}`,`settings ${dn}`,`settings ${X}`,`settings ${fn}`,`settings ${pn}`,`settings ${mn}`,`settings ${hn}`,`settings ${gn}`,`settings ${Z}`].join(` | `),yn=`settings requires ${ln}, ${un}, ${dn}, ${X}, ${fn}, ${pn}, ${mn}, ${hn}, ${gn}, or ${Z}`;function bn(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function xn(e){return`Unsupported macOS setting: ${e}. ${_n}`}function Sn(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function Cn(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${cn.join(`|`)}`)}function wn(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return Q(Number(t),n)}function Tn(e){return{latitude:Q(e?.latitude,`latitude`),longitude:Q(e?.longitude,`longitude`)}}function Q(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}function En(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function $(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function Dn(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function On(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=kn(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function kn(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function An(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=Mn(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Rn(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:zn(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Hn(e)),e,t)}}function jn(e){if(e.length===0)return new Map;let{hintedContainers:t}=Mn(e);return Ln(t.directionsByContainer)}function Mn(e){let t=u(e),n=new Set,i=[];for(let a of e){if(r(a,e,t)){Wn(a,n,t);continue}i.push(a)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:i,hintedContainers:In(e,i,n,t)}}function Nn(e,t){return e.hittable&&n(e.rect,t)}function Pn(e,t,r=u(t)){if(!e.rect)return null;let a=s(e,t,r);if(a&&!l(e.rect,a)){let t=Fn(e.rect,a);if(t)return t}let o=i(t,e.rect);if(o&&!n(e.rect,o)){let t=Fn(e.rect,o);if(t)return t}return null}function Fn(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function In(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=Gn(e,n,r);if(!t?.rect)continue;let s=Vn(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Kn(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function Ln(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Rn(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function zn(e,t,n){let r=new Map;for(let i of e){let e=Bn(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=Un(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Bn(e,t,n){if(!e.rect)return null;let r=s(e,t,n);return r?Vn(e.rect,r):null}function Vn(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Hn(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!$(e)}function Un(e){let t=new Set,n=[];for(let r of e){let e=$(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Wn(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function Gn(e,n,r){return t(e,r,e=>n.has(e.index))}function Kn(e,t,n,r,i){for(let a of e){let e=qn(a);if(!e||e.size===0)continue;let o=Gn(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function qn(e){let t=On(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function Jn(e){return e}function Yn(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)}export{Ye as $,Yt as A,le as At,_t as B,nn as C,re as Ct,qt as D,fe as Dt,an as E,ie as Et,Bt as F,yt as G,vt as H,V as I,_ as J,ot as K,Tt as L,Kt as M,ce as Mt,Et as N,te as Nt,Jt as O,pe as Ot,wt as P,de as Pt,Ke as Q,mt as R,$t as S,f as St,rn as T,d as Tt,xt as U,P as V,St as W,qe as X,Ge as Y,Je as Z,Sn as _,Se as _t,jn as a,We as at,Y as b,ve as bt,Dn as c,He as ct,wn as d,Re as dt,Qe as et,Tn as f,Le as ft,bn as g,xe as gt,xn as h,Te as ht,Pn as i,rt as it,Gt as j,ue as jt,Xt as k,ee as kt,$ as l,Ve as lt,vn as m,we as mt,Jn as n,Ze as nt,Nn as o,Be as ot,yn as p,Ie as pt,w as q,An as r,nt as rt,On as s,Ue as st,Yn as t,tt,En as u,ze as ut,Cn as v,Ce as vt,tn as w,ne as wt,Qt as x,_e as xt,sn as y,m as yt,ht as z};
|