agent-device 0.21.18 → 0.21.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.18.apk → agent-device-android-ime-helper-0.21.19.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.18.manifest.json → agent-device-android-ime-helper-0.21.19.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.18.apk → agent-device-android-snapshot-helper-0.21.19.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.18.manifest.json → agent-device-android-snapshot-helper-0.21.19.manifest.json} +6 -6
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/cache.js +1 -1
- package/dist/src/catalog.js +1 -1
- package/dist/src/cli-help.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/client-types.d.ts +11 -4
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-transport.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/diagnostics2.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/mechanics.js +16 -17
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observe-until.js +1 -0
- package/dist/src/overlay.js +2 -2
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/provider-device-admission.js +1 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/registry.js +36 -36
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -1
- package/dist/src/runner-xctestrun.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-admission.js +1 -0
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +1 -1
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +4 -4
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.d.ts +16 -2
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-selectors.d.ts +9 -0
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +3 -3
- package/dist/src/session2.js +5 -5
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.js +1 -0
- package/dist/src/tree.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/video.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.18.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.18.apk.sha256 +0 -1
- package/dist/src/runner-command-traits.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e,P as t,V as n}from"./sdk-contracts.js";import{m as r}from"./sdk-device.js";import{t as i}from"./parser.js";import{B as a,C as o,E as s,H as c,N as l,O as u,U as d,d as f,h as p,j as m,l as ee,m as te,n as ne,u as re,v as h}from"./host.js";import{d as g,r as _}from"./apple-runner-platform.js";import{_ as ie,a as ae,c as oe,d as se,f as ce,g as le,h as ue,l as v,m as de,n as y,p as b,r as x,v as S,y as fe}from"./runner-cache-metadata.js";import{f as pe,p as me,u as he,v as C}from"./runner-session-types.js";import{n as ge}from"./runner-error-classification.js";import w from"node:path";import T from"node:fs";import _e from"node:crypto";import ve from"node:os";const E=new Set;function D(e){return w.join(e,y)}function ye(e,t){T.mkdirSync(e,{recursive:!0}),T.writeFileSync(D(e),`${JSON.stringify(t,null,2)}\n`)}async function be(e,t){if(e.cache===`external`){P(`preserve`,`external_bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});return}E.add(e.derived),await d({acquire:()=>O(e.derived),task:async()=>{P(`clean`,`bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),M(e.derived),j(e.derived)}})}async function O(e){return await ne({lockDirPath:xe(e),owner:{pid:process.pid,startTime:s(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,pollMs:100,ownerGraceMs:5e3,description:`iOS runner cache lock`})}function xe(e){return w.join(w.dirname(e),`${w.basename(e)}.lock`)}function Se(e,t){!De()&&!t&&!E.has(e)||(P(`clean`,t?`forced_rebuild`:`forced_clean`,{derived:e}),M(e),j(e),E.delete(e))}async function k(e,t,n,r){let{buildRunnerCacheArtifactManifest:i}=await import(`./runner-artifact-manifest.js`),a=i(e,n,r);return ye(e,a.ok?{...t,artifacts:a.artifacts}:t),a.ok?null:(P(`preserve`,`uncertifiable_products`,{derived:e,xctestrunPath:n,...a.refusal?{refusal:a.refusal}:{}}),a.refusal)}function A(t,n){if(t)throw new e(`COMMAND_FAILED`,`The Apple runner products cannot be certified for cache reuse`,{reason:`runner_cache_uncertifiable`,refusalReason:t.reason,refusingPath:t.path??n,...t.reason===`root_unusable`?{}:{resolvesTo:t.target},derived:n,hint:`Inspect ${t.path??n} under ${n}. A symlinked or unreadable product tree must be replaced; run pnpm build:xcuitest with a clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH.`})}function j(e){try{if(!T.existsSync(e))return;if(w.basename(e)!==`derived`){T.rmSync(e,{recursive:!0,force:!0});return}for(let t of T.readdirSync(e,{withFileTypes:!0}))we(t.name)&&T.rmSync(w.join(e,t.name),{recursive:!0,force:!0})}catch{}}const Ce=new Set([y,`Build`,`BuildCache.noindex`,`Index.noindex`,`Logs`,`ModuleCache.noindex`,`SDKStatCaches.noindex`,`SourcePackages`,`TextBasedInstallAPI`,`info.plist`]);function we(e){return Ce.has(e)}function Te(e){try{let t=JSON.parse(T.readFileSync(D(e),`utf8`));return!t||typeof t!=`object`||Array.isArray(t)?null:t}catch{return null}}function Ee(e,t){let n=Te(e);return n?S(x(n))===S(x(t))?{ok:!0,metadata:n}:{ok:!1,reason:`cache_metadata_mismatch`,differences:ae(t,n)}:{ok:!1,reason:`cache_metadata_missing`}}function De(){return p(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)}function M(t,n=process.env){if(n.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!Oe(t))throw new e(`COMMAND_FAILED`,`Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically`,{derivedPath:t,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${w.join(f(),`.tmp`)}.`})}function Oe(e){let t=w.resolve(f(),`.tmp`),n=w.relative(t,w.resolve(e));return n!==``&&!n.startsWith(`..`)&&!w.isAbsolute(n)}async function N(e){let t=Ee(e.derived,e.expectedCacheMetadata);if(!t.ok)return t.reason===`cache_metadata_mismatch`?{reason:t.reason,xctestrunPath:null,productPaths:[],metadataDifferences:t.differences}:{reason:t.reason,xctestrunPath:null,productPaths:[]};let{validateRunnerCacheArtifactManifest:n}=await import(`./runner-artifact-manifest.js`),r=n(e.derived,t.metadata);return r.ok?{reason:`reuse_ready`,xctestrunPath:r.xctestrunPath,productPaths:r.productPaths}:r.mismatch?{reason:`artifact_content_mismatch`,xctestrunPath:null,productPaths:[],mismatch:r.mismatch}:{reason:`artifact_manifest_missing`,xctestrunPath:null,productPaths:[]}}function ke(e,t){P(`rebuild`,e.reason,{derived:t,...e.reason===`cache_metadata_mismatch`?{metadataDifferences:e.metadataDifferences}:{},...e.reason===`artifact_content_mismatch`?{mismatch:e.mismatch}:{}})}function P(e,t,n){ee({level:e===`rebuild`||e===`preserve`?`warn`:`info`,phase:`runner_xctestrun_cache`,data:{action:e,reason:t,...n}})}const Ae=new Set([`RUNNER_PRODUCT_MISSING`,`RUNNER_PRODUCT_REPAIR_FAILED`]),F=[`--force`,`--preserve-metadata=identifier,entitlements,flags,runtime`,`--sign`,`-`];async function I(t,n,i){if(!r(t))return;if(n.length===0)throw new e(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,xctestrunPath:i});let a=Array.from(new Set(n)).sort((e,t)=>t.length-e.length);for(let t of a)if(!T.existsSync(t))throw new e(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,productPath:t,xctestrunPath:i});for(let e of a)await R(e)||await je(e,i)}async function je(e,n){try{let t=w.join(e,`Contents`,`Frameworks`),n=T.existsSync(t)?T.readdirSync(t).sort().map(e=>w.join(t,e)):[];for(let e of n)await m(`codesign`,[...F,e]);await m(`codesign`,[...F,e])}catch(r){let i=t(r,`COMMAND_FAILED`);throw L(e,n,i.message,i.details)}if(!await R(e))throw L(e,n,`Product still fails code signature verification after re-signing`)}function L(t,n,r,i){return new e(`COMMAND_FAILED`,`Failed to repair macOS runner product signature`,{reason:`RUNNER_PRODUCT_REPAIR_FAILED`,productPath:t,xctestrunPath:n,error:r,details:i})}function Me(t){if(!(t instanceof e))return!1;let n=t.details&&typeof t.details==`object`?t.details.reason:void 0;return typeof n==`string`&&Ae.has(n)}async function R(e){return(await m(`codesign`,[`--verify`,`--deep`,`--strict`,e],{allowFailure:!0})).exitCode===0}const z=new Set([`ProductPaths`,`DependentProductPaths`,`TestHostPath`,`TestBundlePath`,`UITargetAppPath`]);async function B(e){let t=await Fe(e);if(!t||t.length===0)return null;let n=w.dirname(e),r=new Set,i=Ne(t,n);for(let e of i.testRootPaths){if(!T.existsSync(e))return null;r.add(e)}for(let e of Pe(i)){if(!e)return null;r.add(e)}return Array.from(r)}function Ne(e,t){let n=[],r=new Set,i=[];for(let a of e){if(a.startsWith(`__TESTHOST__/`)){i.push(a.slice(13));continue}if(!a.startsWith(`__TESTROOT__/`))continue;let e=a.slice(13);n.push(w.join(t,e));let o=Ve(e);o&&r.add(w.join(t,o))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:i}}function Pe(e){return e.hostRelativePaths.map(t=>{let n=e.hostRoots.find(e=>T.existsSync(w.join(e,t)));return n?w.join(n,t):null})}async function Fe(e){let t=await o(e);if(t)return Ie(t);if(process.platform===`darwin`)return null;try{return Be(T.readFileSync(e,`utf8`))}catch{return null}}function Ie(e){let t=new Set;for(let n of[e,...Le(e),...Re(e)])for(let e of ze(n))t.add(e);return Array.from(t)}function Le(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!h(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(h))}return n}function Re(e){return Object.values(e).filter(e=>h(e)&&`TestBundlePath`in e)}function ze(e){let t=new Set;for(let[n,r]of Object.entries(e))if(z.has(n)){if(typeof r==`string`){t.add(r);continue}if(Array.isArray(r))for(let e of r)typeof e==`string`&&t.add(e)}return Array.from(t)}function Be(e){return V(i(e))}function V(e){let t=new Set;return a(e,(e,n)=>{if(z.has(e)){if(n.name===`string`&&n.text){t.add(n.text);return}if(n.name===`array`)for(let e of n.children)e.name===`string`&&e.text&&t.add(e.text)}}),Array.from(t)}function Ve(e){let t=/\.app(?:\/|$)/.exec(e);return!t||t.index===void 0?null:e.slice(0,t.index+4)}const He=[`CFBundleIcons`,`CFBundleIcons~ipad`];async function Ue(e){await H(tt(e))}async function H(e){let t=e.filter(et);if(t.length===0)return;let n=e.filter(e=>W(e)&&!U(e));for(let e of t){let t=$e(e,n);t&&await We(t,e)}}async function We(e,t){let n=Ge(e,t),r=await Ke(e,t);(n||r)&&(await Ye(t),Qe(t))}function Ge(e,t){let n=!1;for(let r of T.readdirSync(e,{withFileTypes:!0}))!r.isFile()||!Ze(r.name)||Xe(w.join(e,r.name),w.join(t,r.name))&&(n=!0);return n}async function Ke(e,t){let n=w.join(e,`Info.plist`),r=w.join(t,`Info.plist`),i=await o(n),a=await o(r);if(!i||!a)return!1;let s=qe(i,a);if(s.length===0)return!1;for(let e of s)await Je(r,e.key,e.value,e.shouldInsert);return!0}function qe(e,t){return He.flatMap(n=>{let r=e[n];return r===void 0||JSON.stringify(t[n])===JSON.stringify(r)?[]:[{key:n,value:r,shouldInsert:t[n]===void 0}]})}async function Je(e,t,n,r){u(await m(`plutil`,[r?`-insert`:`-replace`,t,`-json`,JSON.stringify(n),e],{allowFailure:!0}),`Failed to update XCTest runner icon plist`,{key:t,plistPath:e})}async function Ye(e){u(await m(`codesign`,[`--force`,`--sign`,`-`,`--timestamp=none`,`--generate-entitlement-der`,e],{allowFailure:!0}),`Failed to sign XCTest runner app after icon update`,{runnerAppPath:e})}function Xe(e,t){if(T.existsSync(t)){let n=T.readFileSync(e),r=T.readFileSync(t);return!n.equals(r)&&(T.copyFileSync(e,t),!0)}return T.copyFileSync(e,t),!0}function Ze(e){return/^AppIcon.*\.png$/.test(e)||e===`Assets.car`}function Qe(e){let t=new Date;T.utimesSync(e,t,t)}function $e(e,t){let n=w.dirname(e);return t.find(e=>w.dirname(e)===n&&w.basename(e)===`AgentDeviceRunner.app`)??t.find(t=>w.dirname(t)===n&&t!==e)??null}function et(e){return W(e)&&U(e)&&(e.includes(`Debug-iphonesimulator`)||e.includes(`Release-iphonesimulator`)||e.includes(`Debug-appletvsimulator`)||e.includes(`Release-appletvsimulator`))}function U(e){return w.basename(e).endsWith(`-Runner.app`)}function W(e){return w.basename(e).endsWith(`.app`)}function tt(e){if(!T.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of T.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let i=w.join(e,r.name);if(W(i)){t.push(i);continue}n.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}const G=`AgentDeviceRunner.env`,K=`session`,nt=`${J(`${G}.${K}`)}-`;function rt(e){return q(`${K}-${e.deviceId}-${e.ownerToken}-${e.port}`)}function it(e){return`${nt}${J(q(e))}-[0-9]`}function at(e){let t=e?w.basename(e):``;if(t.startsWith(`${G}.`))return J(t)}function q(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function J(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const ot={PreferredScreenCaptureFormat:`screenshots`,SystemAttachmentLifetime:`keepNever`,UserAttachmentLifetime:`keepNever`};async function st(e,t,n,r={}){let i=r.iosXctestEnvDir?.trim(),a=i?w.resolve(i):w.dirname(e);T.mkdirSync(a,{recursive:!0});let o=q(n),s=w.join(a,`${G}.${o}.json`),c=w.join(a,`${G}.${o}.xctestrun`),l=await ct(e);return Y(l,e=>ut(e,t)),dt(l),await lt(l,s,c),{xctestrunPath:c,jsonPath:s}}async function ct(t){let n=await m(`plutil`,[`-convert`,`json`,`-o`,`-`,t],{allowFailure:!0});if(n.exitCode!==0||!n.stdout.trim())throw new e(`COMMAND_FAILED`,`Failed to read xctestrun plist`,{xctestrunPath:t,stderr:n.stderr});try{let e=JSON.parse(n.stdout);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Root must be an object`);return e}catch(n){throw new e(`COMMAND_FAILED`,`Failed to parse xctestrun JSON`,{xctestrunPath:t,error:String(n)})}}async function lt(e,t,n){T.writeFileSync(t,JSON.stringify(e,null,2)),u(await m(`plutil`,[`-convert`,`xml1`,`-o`,n,t],{allowFailure:!0}),`Failed to write xctestrun plist`,{tmpXctestrunPath:n})}function ut(e,t){e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}}function dt(e){Y(e,e=>Object.assign(e,ot),{requireTestBundlePath:!0})}function Y(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)!e||typeof e!=`object`||ft(e.TestTargets,t,n);for(let n of Object.values(e)){let e=X(n,{requireTestBundlePath:!0});e&&t(e)}}function ft(e,t,n){if(Array.isArray(e))for(let r of e){let e=X(r,n);e&&t(e)}}function X(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;return t.requireTestBundlePath&&!n.TestBundlePath?null:n}const pt=new Map,Z=new Set;async function mt(e,t){let n=ht(t);if(n)return n;let r=f(),i=v(e,r,t.budget),a=b(e,i);return await c(pt,a,async()=>await d({acquire:()=>O(a),task:()=>_t({device:e,options:t,projectRoot:r,expectedCacheMetadata:i,derived:a,forceRebuild:t.forceRunnerXctestrunRebuild===!0})}))}function ht(t){let n=t.iosXctestrunFile?.trim();if(!n)return null;let r=w.resolve(n);if(!T.existsSync(r))throw new e(`COMMAND_FAILED`,`Configured iOS XCTest runner .xctestrun file not found`,{configKey:`iosXctestrunFile`,xctestrunPath:r});let i=t.iosXctestDerivedDataPath?.trim(),a=i?w.resolve(i):gt(r);return P(`reuse`,`external_xctestrun`,{derived:a,xctestrunPath:r}),{xctestrunPath:r,derived:a,cache:`external`,artifact:`valid`,buildMs:0,xctestrunPathSource:`external`}}function gt(e){let t=_e.createHash(`sha1`);t.update(e);let n=t.digest(`hex`).slice(0,12);return w.join(ve.tmpdir(),`agent-device-ios-xctest-derived`,n)}async function _t(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a}=e;Se(a,e.forceRebuild);let o=await N({derived:a,expectedCacheMetadata:i}),s=o.reason===`reuse_ready`?`exact`:`miss`;return await vt({device:t,derived:a,expectedCacheMetadata:i,existing:o,cache:s})||(o.reason!==`reuse_ready`&&ke(o,a),o.reason!==`cache_metadata_missing`&&(M(a),j(a)),await yt({device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a,cache:s,reason:o.reason}))}async function vt(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if(i.reason!==`reuse_ready`)return null;let o=await bt(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`}:null}async function yt(t){let{device:n,options:r,projectRoot:i,expectedCacheMetadata:a,derived:o,cache:s,reason:c}=t,l=fe(i);if(!T.existsSync(l))throw new e(`COMMAND_FAILED`,`iOS runner project not found`,{projectPath:l});let u=oe(r.budget,`runner_xctestrun_build`),d=Date.now();re({type:`command`,status:`progress`,message:`Building Apple runner...`}),await wt(n,l,o,r,u);let f=Math.max(0,Date.now()-d),p=Q(o,n);if(!p)throw new e(`COMMAND_FAILED`,`Failed to locate .xctestrun after build`);let m=await B(p);if(!m)throw new e(`COMMAND_FAILED`,`Runner build is missing expected products`,{xctestrunPath:p});return await I(n,m,p),await H(m),A(await k(o,a,p,m),o),P(`build`,`built_new`,{derived:o,xctestrunPath:p}),{xctestrunPath:p,derived:o,cache:s,artifact:`rebuilt`,buildMs:f,xctestrunPathSource:`build`,reason:c}}async function bt(e,t,n,r){try{return await I(e,r.productPaths,r.xctestrunPath),A(await k(t,n,r.xctestrunPath,r.productPaths),t),P(`reuse`,`reuse_ready`,{derived:t,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!Me(e))throw e;return P(`rebuild`,`repair_failed`,{derived:t,xctestrunPath:r.xctestrunPath}),null}}async function xt(e){try{let t=f(),n=v(e,t);return(await N({derived:b(e,n),expectedCacheMetadata:n})).reason===`reuse_ready`}catch{return!1}}function Q(e,t){let n=St(e);return n.length===0?null:(n.sort((e,n)=>Ct(e,n,t)),n[0]?.path??null)}function St(e){if(!T.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop(),r=T.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=w.join(e,i.name);if(i.isDirectory()){n.push(r);continue}if(i.isFile()&&i.name.endsWith(`.xctestrun`))try{let e=T.statSync(r);t.push({path:r,mtimeMs:e.mtimeMs})}catch{}}}return t}function Ct(e,t,n){if(n){let r=$(t.path,n)-$(e.path,n);if(r!==0)return r}return t.mtimeMs-e.mtimeMs||e.path.localeCompare(t.path)}function $(e,t){let n=0,r=e.toLowerCase();w.basename(r).startsWith(`agentdevicerunner.env.`)&&(n-=1e3),r.includes(`${w.sep}macos${w.sep}`)&&(n-=5e3);let i=g(t);return i.preferred.length>0&&(i.preferred.some(e=>r.includes(e))?n+=2e3:n-=500),i.disallowed.some(e=>r.includes(e))&&(n-=2500),n}async function wt(t,r,i,a,o){let s=ce(process.env),c=ie(process.env,t.kind===`device`,t),u=t.kind===`device`?[`-allowProvisioningUpdates`]:[],d=ue(),f=se(process.env),p=le();try{await l(`xcodebuild`,[`build-for-testing`,`-project`,r,`-scheme`,`AgentDeviceRunner`,`-parallel-testing-enabled`,`NO`,de(t),`1`,...me(t,_(t)),`-derivedDataPath`,i,...d,...f,...p,...s,...u,...c],{detached:!0,timeoutMs:o,signal:a.budget?.signal,onSpawn:e=>{Z.add(e),e.on(`close`,()=>{Z.delete(e)})},onStdoutChunk:e=>{C(e,a.logPath,a.traceLogPath,a.verbose)},onStderrChunk:e=>{C(e,a.logPath,a.traceLogPath,a.verbose)}})}catch(r){if(n(r))throw r;let i=r instanceof e?r:new e(`COMMAND_FAILED`,String(r)),o=he(t),{reason:s,hint:c,matched:l}=ge(new e(i.code,i.message,{...i.details,...o})),u=te(i),d=`xcodebuild build-for-testing failed`;throw new e(`COMMAND_FAILED`,s===`simulator_set_destination_not_found`?pe(d,t,o):d,{reason:s,error:i.message,details:i.details,logPath:a.logPath,hint:c,startupRuleMatched:l,startupHostDeadlineHit:u,...o})}}export{it as a,st as c,be as d,A as f,Z as i,Ue as l,Q as n,at as o,k as p,xt as r,rt as s,mt as t,B as u};
|
|
1
|
+
import{G as e,N as t,P as n}from"./sdk-contracts.js";import{m as r}from"./sdk-device.js";import{t as i}from"./parser.js";import{B as a,C as o,E as s,H as c,N as l,O as u,U as d,d as f,h as p,j as m,l as ee,m as te,n as ne,u as re,v as h}from"./host.js";import{d as g,r as _}from"./apple-runner-platform.js";import{_ as ie,a as ae,c as oe,d as se,f as ce,g as le,h as ue,l as v,m as de,n as y,p as b,r as x,v as S,y as fe}from"./runner-cache-metadata.js";import{f as pe,p as me,u as he,v as C}from"./runner-session-types.js";import{r as ge}from"./runner-error-classification.js";import w from"node:path";import T from"node:fs";import _e from"node:crypto";import ve from"node:os";const E=new Set;function D(e){return w.join(e,y)}function ye(e,t){T.mkdirSync(e,{recursive:!0}),T.writeFileSync(D(e),`${JSON.stringify(t,null,2)}\n`)}async function be(e,t){if(e.cache===`external`){P(`preserve`,`external_bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});return}E.add(e.derived),await d({acquire:()=>O(e.derived),task:async()=>{P(`clean`,`bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),M(e.derived),j(e.derived)}})}async function O(e){return await ne({lockDirPath:xe(e),owner:{pid:process.pid,startTime:s(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,pollMs:100,ownerGraceMs:5e3,description:`iOS runner cache lock`})}function xe(e){return w.join(w.dirname(e),`${w.basename(e)}.lock`)}function Se(e,t){!De()&&!t&&!E.has(e)||(P(`clean`,t?`forced_rebuild`:`forced_clean`,{derived:e}),M(e),j(e),E.delete(e))}async function k(e,t,n,r){let{buildRunnerCacheArtifactManifest:i}=await import(`./runner-artifact-manifest.js`),a=i(e,n,r);return ye(e,a.ok?{...t,artifacts:a.artifacts}:t),a.ok?null:(P(`preserve`,`uncertifiable_products`,{derived:e,xctestrunPath:n,...a.refusal?{refusal:a.refusal}:{}}),a.refusal)}function A(e,n){if(e)throw new t(`COMMAND_FAILED`,`The Apple runner products cannot be certified for cache reuse`,{reason:`runner_cache_uncertifiable`,refusalReason:e.reason,refusingPath:e.path??n,...e.reason===`root_unusable`?{}:{resolvesTo:e.target},derived:n,hint:`Inspect ${e.path??n} under ${n}. A symlinked or unreadable product tree must be replaced; run pnpm build:xcuitest with a clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH.`})}function j(e){try{if(!T.existsSync(e))return;if(w.basename(e)!==`derived`){T.rmSync(e,{recursive:!0,force:!0});return}for(let t of T.readdirSync(e,{withFileTypes:!0}))we(t.name)&&T.rmSync(w.join(e,t.name),{recursive:!0,force:!0})}catch{}}const Ce=new Set([y,`Build`,`BuildCache.noindex`,`Index.noindex`,`Logs`,`ModuleCache.noindex`,`SDKStatCaches.noindex`,`SourcePackages`,`TextBasedInstallAPI`,`info.plist`]);function we(e){return Ce.has(e)}function Te(e){try{let t=JSON.parse(T.readFileSync(D(e),`utf8`));return!t||typeof t!=`object`||Array.isArray(t)?null:t}catch{return null}}function Ee(e,t){let n=Te(e);return n?S(x(n))===S(x(t))?{ok:!0,metadata:n}:{ok:!1,reason:`cache_metadata_mismatch`,differences:ae(t,n)}:{ok:!1,reason:`cache_metadata_missing`}}function De(){return p(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)}function M(e,n=process.env){if(n.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!Oe(e))throw new t(`COMMAND_FAILED`,`Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically`,{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${w.join(f(),`.tmp`)}.`})}function Oe(e){let t=w.resolve(f(),`.tmp`),n=w.relative(t,w.resolve(e));return n!==``&&!n.startsWith(`..`)&&!w.isAbsolute(n)}async function N(e){let t=Ee(e.derived,e.expectedCacheMetadata);if(!t.ok)return t.reason===`cache_metadata_mismatch`?{reason:t.reason,xctestrunPath:null,productPaths:[],metadataDifferences:t.differences}:{reason:t.reason,xctestrunPath:null,productPaths:[]};let{validateRunnerCacheArtifactManifest:n}=await import(`./runner-artifact-manifest.js`),r=n(e.derived,t.metadata);return r.ok?{reason:`reuse_ready`,xctestrunPath:r.xctestrunPath,productPaths:r.productPaths}:r.mismatch?{reason:`artifact_content_mismatch`,xctestrunPath:null,productPaths:[],mismatch:r.mismatch}:{reason:`artifact_manifest_missing`,xctestrunPath:null,productPaths:[]}}function ke(e,t){P(`rebuild`,e.reason,{derived:t,...e.reason===`cache_metadata_mismatch`?{metadataDifferences:e.metadataDifferences}:{},...e.reason===`artifact_content_mismatch`?{mismatch:e.mismatch}:{}})}function P(e,t,n){ee({level:e===`rebuild`||e===`preserve`?`warn`:`info`,phase:`runner_xctestrun_cache`,data:{action:e,reason:t,...n}})}const Ae=new Set([`RUNNER_PRODUCT_MISSING`,`RUNNER_PRODUCT_REPAIR_FAILED`]),F=[`--force`,`--preserve-metadata=identifier,entitlements,flags,runtime`,`--sign`,`-`];async function I(e,n,i){if(!r(e))return;if(n.length===0)throw new t(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,xctestrunPath:i});let a=Array.from(new Set(n)).sort((e,t)=>t.length-e.length);for(let e of a)if(!T.existsSync(e))throw new t(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,productPath:e,xctestrunPath:i});for(let e of a)await R(e)||await je(e,i)}async function je(e,t){try{let t=w.join(e,`Contents`,`Frameworks`),n=T.existsSync(t)?T.readdirSync(t).sort().map(e=>w.join(t,e)):[];for(let e of n)await m(`codesign`,[...F,e]);await m(`codesign`,[...F,e])}catch(r){let i=n(r,`COMMAND_FAILED`);throw L(e,t,i.message,i.details)}if(!await R(e))throw L(e,t,`Product still fails code signature verification after re-signing`)}function L(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to repair macOS runner product signature`,{reason:`RUNNER_PRODUCT_REPAIR_FAILED`,productPath:e,xctestrunPath:n,error:r,details:i})}function Me(e){if(!(e instanceof t))return!1;let n=e.details&&typeof e.details==`object`?e.details.reason:void 0;return typeof n==`string`&&Ae.has(n)}async function R(e){return(await m(`codesign`,[`--verify`,`--deep`,`--strict`,e],{allowFailure:!0})).exitCode===0}const z=new Set([`ProductPaths`,`DependentProductPaths`,`TestHostPath`,`TestBundlePath`,`UITargetAppPath`]);async function B(e){let t=await Fe(e);if(!t||t.length===0)return null;let n=w.dirname(e),r=new Set,i=Ne(t,n);for(let e of i.testRootPaths){if(!T.existsSync(e))return null;r.add(e)}for(let e of Pe(i)){if(!e)return null;r.add(e)}return Array.from(r)}function Ne(e,t){let n=[],r=new Set,i=[];for(let a of e){if(a.startsWith(`__TESTHOST__/`)){i.push(a.slice(13));continue}if(!a.startsWith(`__TESTROOT__/`))continue;let e=a.slice(13);n.push(w.join(t,e));let o=Ve(e);o&&r.add(w.join(t,o))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:i}}function Pe(e){return e.hostRelativePaths.map(t=>{let n=e.hostRoots.find(e=>T.existsSync(w.join(e,t)));return n?w.join(n,t):null})}async function Fe(e){let t=await o(e);if(t)return Ie(t);if(process.platform===`darwin`)return null;try{return Be(T.readFileSync(e,`utf8`))}catch{return null}}function Ie(e){let t=new Set;for(let n of[e,...Le(e),...Re(e)])for(let e of ze(n))t.add(e);return Array.from(t)}function Le(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!h(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(h))}return n}function Re(e){return Object.values(e).filter(e=>h(e)&&`TestBundlePath`in e)}function ze(e){let t=new Set;for(let[n,r]of Object.entries(e))if(z.has(n)){if(typeof r==`string`){t.add(r);continue}if(Array.isArray(r))for(let e of r)typeof e==`string`&&t.add(e)}return Array.from(t)}function Be(e){return V(i(e))}function V(e){let t=new Set;return a(e,(e,n)=>{if(z.has(e)){if(n.name===`string`&&n.text){t.add(n.text);return}if(n.name===`array`)for(let e of n.children)e.name===`string`&&e.text&&t.add(e.text)}}),Array.from(t)}function Ve(e){let t=/\.app(?:\/|$)/.exec(e);return!t||t.index===void 0?null:e.slice(0,t.index+4)}const He=[`CFBundleIcons`,`CFBundleIcons~ipad`];async function Ue(e){await H(tt(e))}async function H(e){let t=e.filter(et);if(t.length===0)return;let n=e.filter(e=>W(e)&&!U(e));for(let e of t){let t=$e(e,n);t&&await We(t,e)}}async function We(e,t){let n=Ge(e,t),r=await Ke(e,t);(n||r)&&(await Ye(t),Qe(t))}function Ge(e,t){let n=!1;for(let r of T.readdirSync(e,{withFileTypes:!0}))!r.isFile()||!Ze(r.name)||Xe(w.join(e,r.name),w.join(t,r.name))&&(n=!0);return n}async function Ke(e,t){let n=w.join(e,`Info.plist`),r=w.join(t,`Info.plist`),i=await o(n),a=await o(r);if(!i||!a)return!1;let s=qe(i,a);if(s.length===0)return!1;for(let e of s)await Je(r,e.key,e.value,e.shouldInsert);return!0}function qe(e,t){return He.flatMap(n=>{let r=e[n];return r===void 0||JSON.stringify(t[n])===JSON.stringify(r)?[]:[{key:n,value:r,shouldInsert:t[n]===void 0}]})}async function Je(e,t,n,r){u(await m(`plutil`,[r?`-insert`:`-replace`,t,`-json`,JSON.stringify(n),e],{allowFailure:!0}),`Failed to update XCTest runner icon plist`,{key:t,plistPath:e})}async function Ye(e){u(await m(`codesign`,[`--force`,`--sign`,`-`,`--timestamp=none`,`--generate-entitlement-der`,e],{allowFailure:!0}),`Failed to sign XCTest runner app after icon update`,{runnerAppPath:e})}function Xe(e,t){if(T.existsSync(t)){let n=T.readFileSync(e),r=T.readFileSync(t);return!n.equals(r)&&(T.copyFileSync(e,t),!0)}return T.copyFileSync(e,t),!0}function Ze(e){return/^AppIcon.*\.png$/.test(e)||e===`Assets.car`}function Qe(e){let t=new Date;T.utimesSync(e,t,t)}function $e(e,t){let n=w.dirname(e);return t.find(e=>w.dirname(e)===n&&w.basename(e)===`AgentDeviceRunner.app`)??t.find(t=>w.dirname(t)===n&&t!==e)??null}function et(e){return W(e)&&U(e)&&(e.includes(`Debug-iphonesimulator`)||e.includes(`Release-iphonesimulator`)||e.includes(`Debug-appletvsimulator`)||e.includes(`Release-appletvsimulator`))}function U(e){return w.basename(e).endsWith(`-Runner.app`)}function W(e){return w.basename(e).endsWith(`.app`)}function tt(e){if(!T.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of T.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let i=w.join(e,r.name);if(W(i)){t.push(i);continue}n.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}const G=`AgentDeviceRunner.env`,K=`session`,nt=`${J(`${G}.${K}`)}-`;function rt(e){return q(`${K}-${e.deviceId}-${e.ownerToken}-${e.port}`)}function it(e){return`${nt}${J(q(e))}-[0-9]`}function at(e){let t=e?w.basename(e):``;if(t.startsWith(`${G}.`))return J(t)}function q(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function J(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const ot={PreferredScreenCaptureFormat:`screenshots`,SystemAttachmentLifetime:`keepNever`,UserAttachmentLifetime:`keepNever`};async function st(e,t,n,r={}){let i=r.iosXctestEnvDir?.trim(),a=i?w.resolve(i):w.dirname(e);T.mkdirSync(a,{recursive:!0});let o=q(n),s=w.join(a,`${G}.${o}.json`),c=w.join(a,`${G}.${o}.xctestrun`),l=await ct(e);return Y(l,e=>ut(e,t)),dt(l),await lt(l,s,c),{xctestrunPath:c,jsonPath:s}}async function ct(e){let n=await m(`plutil`,[`-convert`,`json`,`-o`,`-`,e],{allowFailure:!0});if(n.exitCode!==0||!n.stdout.trim())throw new t(`COMMAND_FAILED`,`Failed to read xctestrun plist`,{xctestrunPath:e,stderr:n.stderr});try{let e=JSON.parse(n.stdout);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Root must be an object`);return e}catch(n){throw new t(`COMMAND_FAILED`,`Failed to parse xctestrun JSON`,{xctestrunPath:e,error:String(n)})}}async function lt(e,t,n){T.writeFileSync(t,JSON.stringify(e,null,2)),u(await m(`plutil`,[`-convert`,`xml1`,`-o`,n,t],{allowFailure:!0}),`Failed to write xctestrun plist`,{tmpXctestrunPath:n})}function ut(e,t){e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}}function dt(e){Y(e,e=>Object.assign(e,ot),{requireTestBundlePath:!0})}function Y(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)!e||typeof e!=`object`||ft(e.TestTargets,t,n);for(let n of Object.values(e)){let e=X(n,{requireTestBundlePath:!0});e&&t(e)}}function ft(e,t,n){if(Array.isArray(e))for(let r of e){let e=X(r,n);e&&t(e)}}function X(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;return t.requireTestBundlePath&&!n.TestBundlePath?null:n}const pt=new Map,Z=new Set;async function mt(e,t){let n=ht(t);if(n)return n;let r=f(),i=v(e,r,t.budget),a=b(e,i);return await c(pt,a,async()=>await d({acquire:()=>O(a),task:()=>_t({device:e,options:t,projectRoot:r,expectedCacheMetadata:i,derived:a,forceRebuild:t.forceRunnerXctestrunRebuild===!0})}))}function ht(e){let n=e.iosXctestrunFile?.trim();if(!n)return null;let r=w.resolve(n);if(!T.existsSync(r))throw new t(`COMMAND_FAILED`,`Configured iOS XCTest runner .xctestrun file not found`,{configKey:`iosXctestrunFile`,xctestrunPath:r});let i=e.iosXctestDerivedDataPath?.trim(),a=i?w.resolve(i):gt(r);return P(`reuse`,`external_xctestrun`,{derived:a,xctestrunPath:r}),{xctestrunPath:r,derived:a,cache:`external`,artifact:`valid`,buildMs:0,xctestrunPathSource:`external`}}function gt(e){let t=_e.createHash(`sha1`);t.update(e);let n=t.digest(`hex`).slice(0,12);return w.join(ve.tmpdir(),`agent-device-ios-xctest-derived`,n)}async function _t(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a}=e;Se(a,e.forceRebuild);let o=await N({derived:a,expectedCacheMetadata:i}),s=o.reason===`reuse_ready`?`exact`:`miss`;return await vt({device:t,derived:a,expectedCacheMetadata:i,existing:o,cache:s})||(o.reason!==`reuse_ready`&&ke(o,a),o.reason!==`cache_metadata_missing`&&(M(a),j(a)),await yt({device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a,cache:s,reason:o.reason}))}async function vt(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if(i.reason!==`reuse_ready`)return null;let o=await bt(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`}:null}async function yt(e){let{device:n,options:r,projectRoot:i,expectedCacheMetadata:a,derived:o,cache:s,reason:c}=e,l=fe(i);if(!T.existsSync(l))throw new t(`COMMAND_FAILED`,`iOS runner project not found`,{projectPath:l});let u=oe(r.budget,`runner_xctestrun_build`),d=Date.now();re({type:`command`,status:`progress`,message:`Building Apple runner...`}),await wt(n,l,o,r,u);let f=Math.max(0,Date.now()-d),p=Q(o,n);if(!p)throw new t(`COMMAND_FAILED`,`Failed to locate .xctestrun after build`);let m=await B(p);if(!m)throw new t(`COMMAND_FAILED`,`Runner build is missing expected products`,{xctestrunPath:p});return await I(n,m,p),await H(m),A(await k(o,a,p,m),o),P(`build`,`built_new`,{derived:o,xctestrunPath:p}),{xctestrunPath:p,derived:o,cache:s,artifact:`rebuilt`,buildMs:f,xctestrunPathSource:`build`,reason:c}}async function bt(e,t,n,r){try{return await I(e,r.productPaths,r.xctestrunPath),A(await k(t,n,r.xctestrunPath,r.productPaths),t),P(`reuse`,`reuse_ready`,{derived:t,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!Me(e))throw e;return P(`rebuild`,`repair_failed`,{derived:t,xctestrunPath:r.xctestrunPath}),null}}async function xt(e){try{let t=f(),n=v(e,t);return(await N({derived:b(e,n),expectedCacheMetadata:n})).reason===`reuse_ready`}catch{return!1}}function Q(e,t){let n=St(e);return n.length===0?null:(n.sort((e,n)=>Ct(e,n,t)),n[0]?.path??null)}function St(e){if(!T.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop(),r=T.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=w.join(e,i.name);if(i.isDirectory()){n.push(r);continue}if(i.isFile()&&i.name.endsWith(`.xctestrun`))try{let e=T.statSync(r);t.push({path:r,mtimeMs:e.mtimeMs})}catch{}}}return t}function Ct(e,t,n){if(n){let r=$(t.path,n)-$(e.path,n);if(r!==0)return r}return t.mtimeMs-e.mtimeMs||e.path.localeCompare(t.path)}function $(e,t){let n=0,r=e.toLowerCase();w.basename(r).startsWith(`agentdevicerunner.env.`)&&(n-=1e3),r.includes(`${w.sep}macos${w.sep}`)&&(n-=5e3);let i=g(t);return i.preferred.length>0&&(i.preferred.some(e=>r.includes(e))?n+=2e3:n-=500),i.disallowed.some(e=>r.includes(e))&&(n-=2500),n}async function wt(n,r,i,a,o){let s=ce(process.env),c=ie(process.env,n.kind===`device`,n),u=n.kind===`device`?[`-allowProvisioningUpdates`]:[],d=ue(),f=se(process.env),p=le();try{await l(`xcodebuild`,[`build-for-testing`,`-project`,r,`-scheme`,`AgentDeviceRunner`,`-parallel-testing-enabled`,`NO`,de(n),`1`,...me(n,_(n)),`-derivedDataPath`,i,...d,...f,...p,...s,...u,...c],{detached:!0,timeoutMs:o,signal:a.budget?.signal,onSpawn:e=>{Z.add(e),e.on(`close`,()=>{Z.delete(e)})},onStdoutChunk:e=>{C(e,a.logPath,a.traceLogPath,a.verbose)},onStderrChunk:e=>{C(e,a.logPath,a.traceLogPath,a.verbose)}})}catch(r){if(e(r))throw r;let i=r instanceof t?r:new t(`COMMAND_FAILED`,String(r)),o=he(n),{reason:s,hint:c,matched:l}=ge(new t(i.code,i.message,{...i.details,...o})),u=te(i),d=`xcodebuild build-for-testing failed`;throw new t(`COMMAND_FAILED`,s===`simulator_set_destination_not_found`?pe(d,n,o):d,{reason:s,error:i.message,details:i.details,logPath:a.logPath,hint:c,startupRuleMatched:l,startupHostDeadlineHit:u,...o})}}export{it as a,st as c,be as d,A as f,Z as i,Ue as l,Q as n,at as o,k as p,xt as r,rt as s,mt as t,B as u};
|
package/dist/src/runner.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{N as t,
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{N as t,R as n,et as r,z as i}from"./sdk-contracts.js";import{O as a}from"./sdk-device.js";import{r as o}from"./touch-runtime.js";import{t as s}from"./runner-cache-metadata.js";import{AsyncLocalStorage as c}from"node:async_hooks";const l=new c;function u(e,t){return{runCommand:e,...t}}function d(e,t,n={}){let r=f(e,n);return m(r?r.provider:t)}function f(e,t={}){let n=l.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}async function p(e,t,n){if(!e)return await n();let r={provider:m(e),deviceId:t.deviceId,requestId:t.requestId};return await l.run(r,n)}function m(e){return typeof e==`function`?{runCommand:e,hasLiveSession:()=>!0}:e}const h=[`tap`,`doubleTap`,`longPress`];function g(e){return typeof e==`string`&&h.includes(e)}function _(e,r){return n(new t(`INVALID_ARGS`,e,{...r,reason:`runner_sequence_invalid`}),`no`)}function v(e,t,n){return _(n,{stepIndex:e,kind:typeof t==`string`?t:void 0})}function y(e){if(!Array.isArray(e)||e.length===0)throw _(`sequence requires at least one step`,{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw _(`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});e.forEach((e,t)=>b(e,t))}function b(e,t){if(!g(e.kind))throw v(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${h.join(`, `)}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw v(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);e.durationMs!==void 0&&x(e.durationMs,0,1e4,t,e.kind,`durationMs`),e.pauseMs!==void 0&&x(e.pauseMs,0,1e4,t,e.kind,`pauseMs`)}function x(e,t,n,r,i,a){if(!Number.isFinite(e)||e<t||e>n)throw v(r,i,`sequence step ${r} (${i}) ${a} must be between ${t} and ${n}`)}function S(e,t){return y(e),{command:`sequence`,steps:e,appBundleId:t}}async function C(e,t,n,r,a){let o=w(T(e,t,n),20).map(e=>S(e,r)),s,c,l=0,u=[],d=0;for(let e of o){let t;try{t=await a(e)}catch(e){throw i(e,l)}s??=t,c=t;let n;try{n=O(t)}catch(e){throw i(D(e,d),l+E(e))}l+=n.completedSteps,u.push(...n.results),d+=e.steps?.length??0}return{...s??{},completedSteps:l,sequenceResults:u,...c?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:c.gestureEndUptimeMs},timingMode:`runner-sequence`}}function w(e,t,n=2e4){let r=[],i=[],a=0;for(let o of e){let e=(o.durationMs??0)+(o.pauseMs??0)+250;i.length>0&&(i.length>=t||a+e>n)&&(r.push(i),i=[],a=0),i.push(o),a+=e}return i.length>0&&r.push(i),r}function T(e,t,n){let r=n.doubleTap?`doubleTap`:n.holdMs>0?`longPress`:`tap`,i=r===`tap`&&a(e);return Array.from({length:n.count},(e,a)=>{let[s,c]=o(a,n.jitterPx);return{kind:r,x:t.x+s,y:t.y+c,...i?{synthesized:!0}:{},...n.holdMs>0?{durationMs:n.holdMs}:{},...a<n.count-1&&n.intervalMs>0?{pauseMs:n.intervalMs}:{}}})}function E(e){let n=e instanceof t?e.details?.completedSteps:void 0;return typeof n==`number`?n:0}function D(e,n){if(n===0||!(e instanceof t)||!e.details)return e;let r=e.details.failedStepIndex;if(typeof r!=`number`)return e;let i=e.details.completedSteps;return new t(e.code,e.message,{...e.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},e.cause)}function O(e){let t=A(e.sequenceResults),n=typeof e.completedSteps==`number`&&Number.isFinite(e.completedSteps)?e.completedSteps:t.filter(e=>e.ok).length,r=t.findIndex(e=>!e.ok),i=typeof e.failedStepIndex==`number`&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:r>=0?r:void 0;if(i!==void 0)throw k(t,n,i);return{results:t,completedSteps:n,failedStepIndex:i}}function k(e,n,i){let a=e[i],o=a?.kind??`step`,s=a?.errorMessage??`sequence step ${i} (${o}) failed`;return new t(r(a?.errorCode),s,{failedStepIndex:i,failedStepKind:o,completedSteps:n,sequenceResults:e,hint:`Run snapshot -i to inspect the current UI, then continue from the observed state.`})}function A(e){return Array.isArray(e)?e.map(e=>{let t=e??{};return{ok:t.ok===!0,kind:typeof t.kind==`string`?t.kind:`unknown`,errorCode:typeof t.errorCode==`string`?t.errorCode:void 0,errorMessage:typeof t.errorMessage==`string`?t.errorMessage:void 0,gestureStartUptimeMs:typeof t.gestureStartUptimeMs==`number`?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:typeof t.gestureEndUptimeMs==`number`?t.gestureEndUptimeMs:void 0}}):[]}var j=e({IOS_RUNNER_CONTAINER_BUNDLE_IDS:()=>s,withAppleRunnerProvider:()=>p});export{u as a,C as i,S as n,d as o,O as r,p as s,j as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{N as e,o as t}from"./sdk-contracts.js";import{n}from"./request-runtime-binding.js";function r(e,n){return t(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:n.reason},n.hint?{hint:n.hint}:void 0)}async function i(e){let t=await s(e.inspectFacts)(e.device);for(let n of e.required){let i=t.operations[n];if(!i.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(i):r(e.command,i)}}return{type:`admitted`,bind:c(e.bindDevice)}}async function a(e){let t=await i({...e,required:e.use.required});if(t.type===`response`)return t;let r=await t.bind(e.device,e.use);return e.readiness&&await n(r),{type:`runtime`,runtime:r}}async function o(e,t){let n=await a(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function s(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}export{r as i,a as n,o as r,i as t};
|
package/dist/src/runtime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e,M as t,N as n,P as r,S as i,V as a,b as o,v as s,x as c}from"./sdk-contracts.js";import{m as l}from"./capture.js";import{r as u,t as d}from"./snapshot-capture-annotations.js";import{f,l as p,n as m}from"./android-input-ownership.js";import{An as h,Ar as g,Bn as _,Dn as v,Er as y,Gn as ee,Ir as b,Jn as te,Jr as ne,Kn as re,Kr as x,Ln as ie,Mr as ae,Nn as oe,Nr as se,On as ce,Pr as le,Rn as S,Rr as ue,Sn as de,Tn as fe,Vn as pe,Vr as me,Wn as he,Xn as ge,Zr as _e,bn as C,cr as ve,hr as ye,jr as be,mr as xe,pr as Se,qn as w,un as Ce,wn as we,xn as Te,xr as Ee,zn as De,zr as Oe}from"./sdk-batch.js";import{r as T}from"./success-text.js";import{a as ke,c as Ae,f as je,g as Me,h as Ne,i as Pe,m as Fe,n as Ie,o as E,p as Le,r as Re,s as ze,u as Be}from"./overlay.js";import{n as Ve,t as He}from"./mobile-snapshot-semantics.js";import{r as D}from"./diagnostics.js";import{t as Ue}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as O,n as k,t as We}from"./rect-center.js";import{a as Ge,n as Ke,t as qe}from"./gesture-plan.js";import{t as Je}from"./android-snapshot-quality.js";import{n as Ye,r as Xe}from"./android-system-chrome.js";import{c as Ze,n as Qe,o as $e,r as et,s as tt}from"./quality-warnings.js";import{i as nt}from"./ios-system-surface.js";import{r as rt}from"./png.js";import{a as it,n as at,o as ot}from"./png-worker-client.js";import{n as st}from"./ios-snapshot-acquisition.js";import ct from"node:path";import{promises as A}from"node:fs";import{createHash as lt}from"node:crypto";function ut(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function dt(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=w(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function ft(e,t,n,r){return e.filter(e=>{if(!re(w(e),n))return!1;let i=dt(e,t,Math.max(r.length,1));return!i.broken&&ee(i.chain,r)})}const pt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),mt={strippedIndexes:new Set,refs:new Set};function ht(e){let t=new Set(e.filter(e=>b(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return mt;let n=new Map(e.map(e=>[e.index,e])),r=bt(e,n,t),i=new Set(r),a=Ot(e,n,r);for(let t of bt(e,n,a))i.add(t);for(let o of gt(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function gt(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=vt(t,n,r);if(o.size===0)return a;let s=yt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&_t(n,t,o)&&a.add(n.index);return a}function _t(e,t,n){if(!e.rect)return!1;let r=kt(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function vt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=kt(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function yt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function bt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)At(i,t,n)&&r.add(i.index);return r}function xt(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Xe(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function St(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(m).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:Ct(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?mt:{strippedIndexes:o,refs:s}}function Ct(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&xt(e,t)).map(e=>e.index))}function wt(e,t){let n=ht(e),r=St(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Tt(e,t){let{strippedIndexes:n}=wt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Et(e,t){return wt(e,t).refs}function Dt(e){return ht(e).refs}function Ot(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||b(n.type??``)!==`keyboard`)continue;let i=kt(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>pt.has(b(e.type??``))&&!n.has(e.index)&&At(e,t,a))&&r.delete(i)}return r}function kt(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(b(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function At(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const jt=3500;function Mt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Nt(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function Pt(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Ft(e){let{pending:t,needsBaselineDistrust:n,hooks:r}=e,i=Date.now(),a=1,o=await It(r,e.initial),s=t.baselineSignature,c=t.baselineBackend,l=!1,u=1500,d=!1;for(;a<2||Date.now()-i<u;){await Ue(200),a+=1;let e=await It(r);if(d=r.signaturesStable(o.signature,e.signature),d){let d=Date.now()-i;if(s&&c!==e.backend){D({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:c,to:e.backend,attempts:a}}),s=e.signature,c=e.backend,l=!0,o=e;continue}let f=Pt({needsBaselineDistrust:n,baselineSignature:s,quietSignature:e.signature,elapsedMs:d,distrustCapMs:jt,classifyBaselineEvidence:r.classifyBaselineEvidence});if(f===`distrust`){u=jt,o=e;continue}return Lt(f,t.action,a,d),Rt(f,t,e,r,l)}o=e}return D({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:a,durationMs:Date.now()-i,lastPairAgreed:d}}),d?{value:o.value}:{value:o.value,postGestureOutcome:Nt(`unsettled`,t)}}async function It(e,t){let n=t??await e.capture();return{value:n,...e.readSurface(n)}}function Lt(e,t,n,r){if(e===`accept-stale`){D({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}D({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function Rt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Nt(`no-effect`,t)}:(D({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function zt(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function Bt(e,t,r){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new n(`INVALID_ARGS`,t,r);return{x:i,y:a}}function Vt(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ht(),policy:e.policy??Kt(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function Ht(e=[]){let t=new Map(e.map(e=>[e.name,Ut(e)]));return{get:e=>Ut(t.get(e)),set:e=>{t.set(e.name,Ut(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>Ut(e))}}function Ut(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Wt(e.metadata)}:{}}}function Wt(e){try{return structuredClone(e)}catch{return{...e}}}function Gt(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Kt(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const qt={defaultTimeoutMs:1e4,intervalMs:300},j={promotedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:C.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:C.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:C.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:C.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:C.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:qt},wait:{resolution:C.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:qt},readList:{resolution:C.readList,occlusion:`ignore`},findAct:{resolution:C.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:C.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},Jt=new WeakMap;function Yt(e,t){Zt(e)&&Jt.set(e,t)}function Xt(e){return Zt(e)?Jt.get(e):void 0}function Zt(e){return typeof e==`object`&&!!e||typeof e==`function`}function M(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function N(e){return e.clock?.now()??Date.now()}async function Qt(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function $t(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function P(e){return e&&typeof e==`object`?e:void 0}function en(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=fe(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?nn(a):a.matchedNodes.length>1?tn(a):nn(a)}let a=v(e,t,{...r,...Te({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:tn(a.firstMatch):{kind:`none`}}function tn(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function nn(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function rn(e,t,n){let r=fe(e,Ee(t),n);return r?{...r,selector:r.selector.raw}:null}function an(e,t,n,r){let i=en(e,Ee(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function on(e){return e}function sn(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const cn=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function F(e){return[e.type,e.role,e.subrole].map(e=>b(e??``)).some(e=>e===`tab`||cn.some(t=>e.includes(t)))}function ln(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=En(e);if(!un(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=vn(e,n,r).node;for(let n of t.slice(1))if(vn(e,n,r).node.index!==i.index){let e=pn(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function un(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!dn(i,a,t)&&!dn(a,i,t))return!1}return!0}function dn(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function fn(e,t){return pn(t,En(e))}function pn(e,t){if(e.length<2||!un(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!F(n)||!e.every(e=>e===n||!F(e)))return null;let r=k(n.rect);return r&&e.every(e=>mn(k(e.rect),r))?n:null}function mn(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function hn(e,t){if(!t?.rect||!e.rect||!g(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function gn(e,t){return vn(e,t)}function _n(e){let t=En(e);return n=>vn(e,n,t)}function vn(e,t,n){return p(t)?{node:t,reason:`covered`}:yn(e,t,n)??bn(t)??xn(e,t,n)??{node:t,reason:`original`}}function yn(e,t,n){let r=Cn(e,t,n);return r?.rect&&O(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function bn(e){return F(e)&&e.rect&&O(e.rect)?{node:e,reason:`semantic-target`}:null}function xn(e,t,n){let r=Sn(e,t,n);return!r?.rect||p(r)||!O(r.rect)?null:wn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Sn(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?Oe(e,t,n.nodesByIndex,e=>r(e)?e:null):ue(e,t,r)}function Cn(e,t,n){let r=k(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||p(e))return!1;let t=k(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function wn(e,t,n,r){let i=k(e.rect),a=k(t.rect);if(!i||!a)return!1;if(Tn(t)&&!We(i,a))return!0;let o=be(n,i,r?.viewportRootRects);return!o||!Dn(a,o)?!1:!We(i,a)}function Tn(e){let t=b(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function En(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(g(i)){let e=k(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Dn(e,t){let n=sn(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function I(e,t,n,r,i={}){let a=an(Mn(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await kn(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=On(t,a);return o?await kn(e,t,o,i):a}function On(e,t){let n=fn(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function kn(e,t,n,r){let i=await jn(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function An(e,t,n,r){let i=Mn(e,t);return{candidates:i,list:rn(i,n,{...r,requireRect:e.resolution.requireRect})}}async function jn(e,t,n,r={}){r.onResolved?.(n,t);let i=Nn(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||p(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Pn(e,t,i.node,r)}}function Mn(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!p(e)):t}function Nn(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=gn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&hn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Pn(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Fn(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function In(e){return e.hittable===!0||F(e)}function Ln(e,t){let n=pe(w(e),t);return n.id!==void 0||n.label!==void 0?!1:De(e.value)===null}function Rn(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function zn(e,t){let n=ut(t);return t.filter(t=>t.index!==e.index&&Rn(t,e,n)).sort((e,t)=>e.index-t.index)}function Bn(e,t){let n=O(e.rect);return!n||!t.rect?!1:x(t.rect,n.x,n.y)}function Vn(e,t){if(!Ln(e,t))return e;let n=zn(e,t);if(n.some(In))return e;let r=n.find(e=>w(e).label!==void 0);return!r||!Bn(r,e)?e:r}function Hn(e,t){return e.find(e=>me(e,t))??null}function L(e,t){let n=ae(e);return n&&le(n)?n:Un(e,t)}function Un(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=ae(e);if(!t||!le(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Wn(e){return e===`text`||e===`label`||e===`any`}function Gn(e,t,n,r){if(!(r||e===`web`))return Wn(t)?n:void 0}function Kn(e){return new n(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function qn(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function R(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=Jn(await i(M(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!tt(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function Jn(e,t){return e.snapshot?Yn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:N(t)}}function Yn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function Xn(e,t,n){if(e.backend.readText){let r=await e.backend.readText(M(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Me(n)}function Zn(t,r,i){let a=e(r);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=o(t,a)??(i.fallbackLabel.length>0?Hn(t,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage,{reason:E.refNotFound,ref:a,hint:de});return{ref:a,node:s}}function Qn(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function $n(e){let t=Buffer.alloc(16);for(let n of e)tr(t,er(n));return{digest:`ax1:${lt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function er(e){return lt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function tr(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function nr(e){let{digest:t,nodeCount:n}=$n(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=rr(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function rr(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function z(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function ir(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:nt(n)}}function ar(e,t){let n=nr(e.nodes),r=ir(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==nr(t.nodes).digest;return{...n,changedFromBefore:i}}function or(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function sr(e,t,n={}){let r=k(t.rect),i=O(r??void 0);if(!r||!i)return{kind:`invalid`};let a=cr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ur(e,t):null,r),s=o?dr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function cr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>lr(e,t,r)).filter(F).flatMap(e=>{let t=k(e.rect);if(!t||We(t,n))return[];let r=ur(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function lr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function ur(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function dr(e,t,n,r){let i=gr(e),a=mr(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=mr(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!x(t,s.x,s.y))return[];let c=fr(s,e,n,r,i);return c?[c]:[]})).sort(pr)[0]?.point??null}function fr(e,t,n,r,i){let a=hr(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function pr(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function mr(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function hr(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function gr(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const B={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},_r=[`runner-start`,`target-discovery`];function vr(e){let t=e?.readinessPhase;return _r.find(e=>e===t)}const yr=`replay_target_guard_mismatch`,br=B.landmarkIdentityMismatch;function xr(e,t,r,i){let{candidates:a,list:o}=An(i,e,t,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=ln(a,s);if(l.kind===`ambiguous`)throw new n(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Fe(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}const Sr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),Cr=new Set([`keyboard`,`key`]);function wr(e){return Cr.has(b(e.type??``))||m(e)}const Tr=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function Er(e){return wr(e)||Tr.has(e.role??``)}function Dr(e,t,n){return n.has(e.index)||Ar(t,n,e.index).length>0}function Or(e){return e!==null&&ne(e)}function V(e){return e.flatMap(e=>ne(e.rect)?[e.rect]:[])}function kr(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of Ar(n,r,e.index))i.add(t);return i}function Ar(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function jr(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function Mr(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function Nr(e){let t=V(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return jr(t.length>0?t:e.anchorRects)}function Pr(e){let t=e.filter(Er),n=kr(e,t);return V(t.filter(e=>!n.has(e.index)))}function Fr(e,t){let n=e.filter(wr),r=V(n);if(r.length===0||!Or(t))return null;let i=e.filter(Er),a=V(i);if(a.length===0)return null;let o=Mr({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=kr(e,i);return Nr({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:V(i.filter(e=>!s.has(e.index)))}:null}function Ir(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:Pr(e.nodes)}:Fr(e.nodes,e.viewport);if(!t)return e.nodes.some(wr)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return Lr(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(Er).map(e=>e.index));return Dr(e.node,n,r)?{kind:`clear`,surface:t}:x(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function Lr(e,t){return t.controlRects.some(t=>x(t,e.x,e.y))?{kind:`clear`,surface:t}:x(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function Rr(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function zr(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=Ir({nodes:e.nodes,viewport:y(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Hr({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Br(e){let t=Ir({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return Vr(e.point,t.surface)}function Vr(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Sr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Sr.hint}function Hr(e){return new n(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${Rr(e.action)} safely`,{...Sr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame})}function Ur(e,t,r,i,a){if(!r)return;let o=w(e),s=te(e,t);if(!(he(o,r.identity)&&ge(s,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:yr,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function H(e,t,n){return await ui(e,t,n.action),t.target.kind===`point`?await Gr(e,t,t.target,n):t.target.kind===`ref`?await Yr(e,t,t.target,n):await Xr(e,t,t.target,n)}async function Wr(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=y(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!x(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:Br({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Gr(e,t,n,r){let i=await Wr(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Kr(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Kr(e,t){try{return z((await U(e,t,!0)).snapshot)}catch{return}}function qr(t,r){let i=e(t.ref);if(!i)throw new n(`INVALID_ARGS`,`Invalid ref: ${t.ref}`);let a=e(r.ref),o=r.node.ref?e(r.node.ref):null;if(a!==i||o!==i||!r.nodes.includes(r.node))throw new n(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:r.nodes,...r.iosSystemSurfaceBundleId?{surfaceBundleId:r.iosSystemSurfaceBundleId}:{}},...r.keyboard?{keyboard:r.keyboard}:{},resolved:ti(i,r.node,`exact`)}}async function Jr(e,t,n){let r=await fi(e,t,n);return{tree:z(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function Yr(t,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?qr(r,i.preresolvedTarget):await Jr(t,n,r),c=a.nodes,{node:l,tapPoint:u}=await ci({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>Qr(e,t,i),offscreen:async(e,a)=>await bi(t,n,e,a,r.ref,i)},resolveTapPoint:t=>gi(t,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${e(r.ref)??t.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...ai(t,l,a,i.action,s.resolution)}}async function Xr(e,t,n,r){let a=n.selector,o=await U(e,t,r.requireInteractive),s=xr(o.snapshot.nodes,a,e.backend.platform,r.pipeline);if((!s||!s.node.rect)&&r.requireInteractive){let n=o.snapshot;o=await U(e,t,!1),i(n,o.snapshot),s=xr(o.snapshot.nodes,a,e.backend.platform,r.pipeline)}if(!s||!s.node.rect)throw await Zr({runtime:e,nodes:o.snapshot.nodes,selectorExpression:a,action:r.action,resolved:s});let c=s,{node:l,tapPoint:u}=await ci({policy:r.pipeline,nodes:o.snapshot.nodes,...o.snapshot.keyboard?{keyboard:o.snapshot.keyboard}:{},node:c.node,action:r.action,label:`Selector ${c.selector}`,hooks:{onResolved:(e,t)=>Qr(e,t,r),offscreen:async(n,i)=>await yi(e,t,n,i,c.selector,r)},resolveTapPoint:e=>gi(e,o.snapshot.nodes,{invalidMessage:`Selector ${s.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${a}`,blockedTargetDetails:{selector:a}})});return{kind:`selector`,point:u,target:{kind:`selector`,selector:s.selector},...ai(e,l,z(o.snapshot),r.action,ri(s,o.snapshot.nodes))}}async function Zr(e){let{runtime:t,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await I(j.coveredDiagnosis,r,i,{platform:t.backend.platform});if(s.kind===`occluded`)return li({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new n(`COMMAND_FAILED`,we(i,c,{unique:!0}),{reason:E.selectorNotFound,hint:ce(c)})}function Qr(e,t,n){Ur(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const $r={source:`ref`,phase:`pre-action`,kind:`exact`},ei={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ti(e,t,n){return{ref:e,node:t,resolution:n===`exact`?$r:ei}}const ni={source:`runtime`,phase:`pre-action`,kind:`unique`};function ri(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ii(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ii(e,t))}:ni}function ii(e,t){let n=b(e.type??``),r=L(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Qn(n,256)}:{},...r===void 0?{}:{label:Qn(r,256)}}}function ai(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:S(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:L(t,a),...si(t,r),preAction:n,resolution:i,...oi(e,t,a,r)}}function oi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Vn(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:S(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:L(i,n)}}}function si(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function ci(e){let t=await jn(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw li({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return zr({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}function li(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${Rr(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}async function U(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(M(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:N(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function ui(e,t,r){if(e.backend.platform!==`macos`)return;let i=await di(e,t);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function di(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function fi(e,t,n){let{session:r,snapshot:i}=await qn(e,t.session),a=n.fallbackLabel??``,o=mi(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw hi(o,n.ref);return pi({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function pi(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=mi(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&he(w(a.node),w(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function mi(t,r,i){let a=e(r);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${r}`);let s=o(t,a);if(vi(s))return{kind:`resolved`,resolved:ti(a,s,`exact`)};let c=i.fallbackLabel.length>0?Hn(t,i.fallbackLabel):null;if(vi(c))return{kind:`resolved`,resolved:ti(a,c,`label-fallback`)};let l=s??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function hi(t,r){let i=e(r)??r;return t.kind===`unusable`?new n(`COMMAND_FAILED`,`Ref ${r} has no usable bounds`,{reason:E.targetBoundsInvalid,ref:i,hint:de}):new n(`COMMAND_FAILED`,`Ref ${r} not found`,{reason:E.refNotFound,ref:i,hint:de})}function gi(e,t,r){let i=y(t),a=sr(t,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new n(`COMMAND_FAILED`,r.invalidMessage,{reason:E.targetBoundsInvalid,..._i(r.blockedTargetDetails)}):new n(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function _i(t){return`ref`in t?{ref:e(t.ref)??t.ref}:t}function vi(e){return e?O(e.rect)!==null:!1}async function yi(e,t,n,r,i,{action:a}){return await wi(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${xi(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function bi(t,n,r,i,a,{action:o}){return await wi(t,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:e(a)},hint:e=>`${xi(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function xi(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Si(t,n,r,i){let a=(await t.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||e(r.ref)===null)return{};let s=mi(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=j.resolvedTarget,{node:u}=await ci({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(e,a)=>await bi(t,n,e,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>O(e.rect)});return{...si(u,i),node:u,preAction:z(a)}}async function Ci(e,t,n,r,i){let a=await Si(e,t,n,r),o=P(await i(M(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:$r,...a,...o?{backendResult:o}:{}}}async function wi(e,t,r,i,a){let o=y(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await e.backend.confirmOffscreenTargetVisible?.(M(e,t),r,c);if(l)return{...r,rect:l};let u=Ve(r,o);throw new n(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function Ti(e,t){let n=c(e.type??`Element`),r=Le(e,n),i=Ne(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Ei(e,t,n={}){let r=ki(Oi(e,n),Oi(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Di(e,t={}){return Oi(e,t).length}function Oi(e,t){return t.flatten?e.map(e=>({text:Fe(e,0,!1),comparable:Ti(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):je(e).map(e=>({text:e.text,comparable:Ti(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function ki(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=ji(a,i,s)?W(a,i+1):W(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return Ai(o,e,t,n,r)}}return[]}function Ai(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=ji(i,c,r)?c+1:c-1,u=W(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function ji(e,t,n){return t===-n||t!==n&&W(e,t-1)<W(e,t+1)}function W(e,t){return e.get(t)??0}async function Mi(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Ni(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Pi(e.nodes):e.nodes).map(Li);return n.sort((e,t)=>zi(e).localeCompare(zi(t))),{captureBackend:t,nodes:n}}function Pi(e){let t=y(e);return e.filter(e=>g(e)||t.isVisibleOnScreen(e))}function Fi(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Ii(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function Li(e){return{identity:`${e.type??``}#${Ri(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Ri(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function zi(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Bi=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Vi(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=N(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=Ze(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;N(e)<o;){let c=await Ji(e,t,o-N(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Hi(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Ni(c.snapshot);_=Wi({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=Ze(c.snapshot.snapshotQuality);let y=N(e),ee=Ki({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=qi({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Qt(e,t);continue}if(!Fi(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let b=qi({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(b<=0)break;await Qt(e,b)}return{settled:!1,stalled:!1,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Hi(e,t,n){if(!e||!t||!Ui(t.backend,n))return;let r=t.nodes.some(g),i=e.length<=5;if(!(!r&&!i))return Ni({...t,nodes:e})}function Ui(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Wi(e){return e.requestedQuietMs<500||!Ii(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Gi(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Ki(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Gi(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function qi(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Ji(e,t,n,r){let i=await Mi(e,t,n,async n=>await R(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Yi=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Xi=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Zi(e,t,n){return await $i(e,t,{...n,baseline:await na(e,t,n.resolved),actionPoint:n.resolved.point})}const Qi=async(e,t)=>(await $i(e,t,t)).observation;async function $i(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await ea(e,t,n,a,await Vi(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function ea(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Xi:Yi}};let{stored:o,session:s}=await ha(e,t,i.lastCapture),c=z(i.lastCapture.snapshot),l=c.nodes,u=ir(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?sa(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...pa(i,o,l.length,u)},settledCapture:c}}function ta(e,t){if(e)return ar(e,t)}async function na(e,t,n){let r=await e.sessions.get(t.session??`default`);return ra(n,r)??aa(n.preAction)??ia(r)}function ra(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?aa(z(n)):void 0}function ia(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?z(t):{nodes:[]}}function aa(e){return e?.nodes.length?e:void 0}function oa(e,t,n){let r=Ei(Tt(e,n),Tt(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=fa(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function sa(e,t,n,r){let i=oa(e,t,r);return{diff:i,...ca(i,t,n,r)}}function ca(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Et(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!la(o.get(e),n))?{}:da(t,i,r)}function la(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const ua=new Set([`application`,`window`]);function da(e,t,n){let r=Et(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ua.has(c(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=c(e.type??`Element`),n=Le(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function fa(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function pa(e,t,n,r){let i=ma(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=or(r);return{hint:i===void 0?a:`${a} ${i}`}}function ma(e,t,n){return e.stalled?{hint:Xi}:e.settled?t?n<5?{hint:Bi}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Yi}}async function ha(e,t,n){if(tt(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ga(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function _a(e,t,n,r,i){let a=await va(e,t,n,i);return ba({...r,...a})}async function va(e,t,n,r){if(r.settle!==void 0){let i=await Zi(e,t,{...r.settle,resolved:n}),a=r.verify?ta(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ya(e,t,n);return i?{evidence:i}:{}}async function ya(e,t,n){try{return ar(z((await U(e,t,!0)).snapshot),n.preAction)}catch{return}}function ba(e){let t=e;if(t.targetHittable!==!1||!xa(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function xa(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function Sa(e,t){let r=y(e),i=e.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Ca),a=i.length>0?i:e.map(e=>e.rect).filter(Ca);if(a.length===0)throw new n(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Ca(e){return!!(e&&e.width>0&&e.height>0)}async function wa(e,t){return await e.backend.resolveGestureViewport?.(M(e,t))||Sa((await U(e,t,!1)).snapshot.nodes,`gesture`)}const Ta=async(e,t)=>{let r=await H(e,t,{action:`focus`,requireInteractive:!0,pipeline:j.resolvedTarget});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=P(await e.backend.focus(M(e,t),i));return{...r,...a?{backendResult:a}:{},...T(`Focused (${i.x}, ${i.y})`)}},Ea=async(e,t)=>{let r=ga(t),i=await H(e,t,{action:`longPress`,requireInteractive:!0,pipeline:j.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:zt(t.durationMs,`durationMs`,0,12e4),o=G(i),s=P(await e.backend.longPress(M(e,t),o,{durationMs:a}));return await _a(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...T(`Long pressed (${o.x}, ${o.y})`)},r)},Da=async(e,t)=>{let r=ga(t),i=r.needsPreActionBaseline?null:await Oa(e,t);if(i)return i;let a=await H(e,t,{action:`hover`,requireInteractive:!1,pipeline:j.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new n(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=P(await e.backend.hover(M(e,t),o));return await _a(e,t,a,{...a,...s?{backendResult:s}:{},...T(`Hovered (${o.x}, ${o.y})`)},r)};async function Oa(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Ci(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const ka=async(e,t)=>{if(!e.backend.performGesture)throw new n(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await ui(e,t,`drag`);let r=await wa(e,t),i=await Aa(e,t,`source`),a=await Aa(e,t,`destination`),o=qe({from:G(i),to:G(a),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},r),s=P(await e.backend.performGesture(M(e,t),o)),{start:c,end:l}=Ge(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:ja(i),destination:ja(a)},recording:Ma(i,a),...s?{backendResult:s}:{},...T(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Aa(e,t,n){let r=t.gesture[n];return await H(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:j.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function ja(e){if(e.kind===`point`||!e.resolution)throw new n(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function Ma(e,t){let n=Na(e),r=Na(t),i=Pa(e),a=Pa(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Na(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Pa(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Fa=async(e,t)=>await Ra(e,t,`press`),Ia=async(e,t)=>await Ra(e,t,`click`),La=async(e,t)=>{if(typeof t.text!=`string`)throw new n(`INVALID_ARGS`,`fill requires text`);let r=ga(t),i=r.needsPreActionBaseline?null:await Va(e,t);if(i)return i;let a=await H(e,t,{action:`fill`,requireInteractive:!0,pipeline:j.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new n(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=za(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&se(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=P(await e.backend.fill(M(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ua(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await _a(e,t,a,{...a,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function Ra(e,t,r){let i=ga(t),a=i.needsPreActionBaseline?null:await Ba(e,t,r);if(a)return a;let o=await H(e,t,{action:r,requireInteractive:!0,pipeline:j.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.tap)throw new n(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=za(o),c;try{c=await e.backend.tap(M(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Yt(e,o),e}let l=P(c);return await _a(e,t,o,{...o,...l?{backendResult:l}:{}},i)}function za(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ba(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Ha(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Ci(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Va(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Ci(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Ha(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 Ua(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Wa=j.wait.poll.defaultTimeoutMs;function Ga(e,t,n,r,i={}){let a=Fn(r),o=n??a.defaultTimeoutMs,s=Y(e),c=oo(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await Mi(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Ka(r,c.lastUnobservedCause())),o;let f=qa(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:Ja(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await so(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Ka(e,t){return e?`readable`:t?.outcome??`unreadable`}function qa(e,t){let r=io(e);if(r)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:r};let i=vr(e instanceof n?e.details:void 0);return i?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:i}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function Ja(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Ya(e,t){return new n(`COMMAND_FAILED`,e,{reason:B.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 Xa(e,t){return new n(`COMMAND_FAILED`,e,{reason:B.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Za(e,t){return new n(`COMMAND_FAILED`,e,{reason:B.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function Qa(e,t){return new n(`COMMAND_FAILED`,e,{reason:B.deadlineExceeded,captureTruncated:!0,...t})}function $a(e,t){return new n(`COMMAND_FAILED`,e,{reason:B.targetAbsent,...t})}function eo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw to(r.error,t);if(n)throw r.error}}function to(e,t){let i=r(e);return new n(i.code,i.message,{reason:B.captureStalled,...i.details,...t},i)}function q(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return Xa(e,r);case`readiness-exhausted`:return eo(t,r,!1),Za(e,r);case`capture-stalled`:return eo(t,r,t.preserveUnreadableOnStall===!0),Ya(e,r);case`capture-truncated`:return Qa(e,r);case void 0:return eo(t,r,!0),r.readableCaptures===0?Ya(e,r):$a(e,r);default:return ro(n)}}function no(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function ro(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function io(e){if(!(e instanceof n))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...J(t,`runnerRestartReason`),...J(t,`runnerRestartCommand`),...J(t,`runnerRestartCommandId`),...J(t,`runnerInvalidatedSessionId`),...J(t,`runnerRestartSessionId`),...J(t,`logPath`),...J(t,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function ao(e){return e instanceof n&&e.details?.retriable===!0}function oo(e=Je){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(ao(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function so(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function co(e,t,n){let r=await I(j.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Ae(e,i)}}async function lo(e,t,n){let r=await co(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Pe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function uo(e,t,n,r,i){let a=ze(n);if(a)throw Re(a,`wait`);let o=Ga(t,n,i,j.wait,{isUnreadableError:po,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await co((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Be(a.kind))throw Pe(r,a,`wait`);return a}catch(e){throw Je(e)?ke(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw no(l)?q(`wait absent timed out for selector: ${r}`,o,l):c?fo(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function fo(e,t,r){let i=t.matches!==1;return new n(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${i?`es`:``} remain`,{reason:B.targetPresent,selector:e,...r,matches:t.matches,firstMatch:t.firstMatch})}function po(e){if(!(e instanceof n))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Be(t.observation)||t.observation===`unreadable`)}function mo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function ho(e,t,r,i,a,o){let s=Ga(t,r,a,j.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let n=await s.capture(async n=>await e.captureSnapshot(t,{...r,signal:n},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(n.timedOut){u=n.deadline;break}let a=n.value;if(a){let e=a.snapshot.nodes,n=mo(await I(j.wait,e,i,{platform:t.backend.platform}));if(n){let t=go(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new n(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:br,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function go(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=ut(e),a=ft(t.matchedNodes,i,_(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:w(r),observedAncestry:dt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function _o(e,t,r,i,a){let o=a??Wa,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(t,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new n(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:B.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function vo(e,t,n,r,i){let a=Ga(t,n,i,j.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await yo(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function yo(e,t,n,r){return t.backend.findText&&(await t.backend.findText(xo(t,n),r)).found?!0:await bo(e,t,n,r)}async function bo(e,t,n,r){return!!Hn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function xo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function So(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await so(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Co(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await ho(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await uo(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await _o(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await wo(e,t,n,n.target.text,n.target.timeoutMs);default:return To(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,r)=>{let i=await t(e,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new n(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function Co(t,r,i,a,s){let c=await t.requireSnapshot(r,i.session),l=e(a);if(!l)throw new n(`INVALID_ARGS`,`Invalid ref: ${a}`);let u=o(c.snapshot.nodes,l);if(!u)throw new n(`COMMAND_FAILED`,`Ref ${a} not found`,{reason:E.refNotFound,ref:l,hint:de});let d=L(u,c.snapshot.nodes);if(!d)throw new n(`COMMAND_FAILED`,`Ref ${a} has no label to wait for`,{reason:E.refUnlabeled,ref:l});return await vo(t,r,i,d,s)}async function wo(e,t,r,i,a){let o=Se(i);if(!o.ok)throw new n(o.code,o.message);return await vo(e,t,r,o.text,a)}function To(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Eo=So({captureSnapshot:R,requireSnapshot:qn,stable:{defaultQuietMs:500,tinyTreeHint:Bi,tinyTreeNodeCount:5,capture:Vi}}),Do=Eo.waitCommand,Oo=Eo.waitForTextCommand,ko=async(e,t)=>{let r=t.locator??`any`;if(!t.query)throw new n(`INVALID_ARGS`,h);if(t.action===`wait`)return await No(e,t,r);if(t.action===`list`)return await Po(e,t,r);let{capture:i,match:a}=await Fo(e,t,r);if(!a)throw new n(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await Xn(e,i,a),node:a}},Ao=async(e,t)=>{if(t.target.kind===`ref`){let n=await qn(e,t.session),r=Zn(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});Ur(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=S(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 Xn(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Io(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?j.readText:j.readUnique,hooks:{onResolved:(e,n)=>Ur(e,n,t.expectedResolvedTarget,`get`)}}),r=S(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 Xn(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}},jo=async(e,t)=>{let r=await Ao(e,{...t,property:`text`,target:t.target});if(r.kind!==`text`)throw new n(`COMMAND_FAILED`,`getText returned non-text result`);return r},Mo=async(e,t)=>{let r=await Ao(e,{...t,property:`attrs`,target:t.target});if(r.kind!==`attrs`)throw new n(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function No(e,t,n){let r=Ga(e,t,t.timeoutMs,j.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Fo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Po(e,t,n){let r=ie(n,t.query),i=await R(e,t,{updateSession:!0,...K()});if(tt(i.snapshot.snapshotQuality))throw Kn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?An(j.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:oe(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Fo(e,t,n,r){let i=ie(n,t.query),a=await R(e,t,{updateSession:!0,scope:Gn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(tt(a.snapshot.snapshotQuality))throw Kn(a.snapshot.snapshotQuality);if(i){let t=await I(j.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:oe(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Io(e,t,r,i){let a=await R(e,{...t,session:r},{updateSession:!0,...K()}),o=await I(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new n(`COMMAND_FAILED`,we(i.selector,[],{unique:!0}),{hint:ce([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Lo=async(e,t)=>{let r=xe(t.predicate);if(!r.ok)throw new n(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=ze(t);if(e)throw Re(e)}if(i===`text`&&!t.expectedText)throw new n(`INVALID_ARGS`,ve);let a=t.selector,o=await Ro(e,t,i,a);return i===`exists`?await zo(e,o,a):i===`absent`?await lo(o.snapshot,a,e.backend.platform):await Bo(e,t,o,i,a)};async function Ro(e,t,n,r){try{return await R(e,t,{updateSession:!0,...K(n)})}catch(e){throw n!==`absent`||a(e)?e:ke(r,e)}}async function zo(e,t,r){let i=await I(j.readAny,t.snapshot.nodes,r,{platform:e.backend.platform});if(i.kind!==`target`)throw new n(`COMMAND_FAILED`,we(r,[],{unique:!1}),{hint:ce([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Ce(r)}}async function Bo(e,t,r,i,a){let o=await I(j.readUnique,r.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,n)=>Ur(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new n(`COMMAND_FAILED`,we(a,[],{unique:!0}),{command:`is`,reason:E.selectorNotFound,predicate:i,selector:a,hint:ce([])});let s=ye({predicate:i,node:o.node,visibility:y(r.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new n(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:E.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:Ce(a),node:o.node,preActionNodes:r.snapshot.nodes}}const Vo=async(e,t)=>await Lo(e,{...t,predicate:`visible`,selector:t.target.selector}),Ho=async(e,t)=>await Lo(e,{...t,predicate:`hidden`,selector:t.target.selector}),Uo=async(e,t)=>{if(!e.backend.performGesture)throw new n(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await ui(e,t,t.gesture.intent);let r=await wa(e,t),i=Ke(t.gesture,r,e.backend.platform),a=P(await e.backend.performGesture(M(e,t),i)),o=Go(i.pointers,0),s=Go(i.pointers,-1);return{kind:t.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...T(Ko(t.gesture,o,s))}},Wo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await ka(e,{...t,gesture:n}):await Uo(e,{...t,gesture:n})};function Go(e,t){let r=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new n(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ko(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:ko,get:Ao,getText:jo,getAttrs:Mo,is:Lo,isVisible:Vo,isHidden:Ho,wait:Do,waitForText:Oo},Z={click:Ia,press:Fa,fill:La,focus:Ta,longPress:Ea,hover:Da,gesture:Wo,settleObservation:Qi};function qo(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function Jo(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const Yo=[0,187,255,255];function Xo(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Zo(e,n.rect)}function Zo(e,t){let n=Qo(t);if(n==null)return;let r=es(n.x,0,e.width-1),i=es(n.y,0,e.height-1),a=es(n.right,0,e.width-1),o=es(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)$o(e,n,i+t,Yo),$o(e,n,o-t,Yo);for(let n=i;n<=o;n+=1)$o(e,r+t,n,Yo),$o(e,a-t,n,Yo)}}function Qo(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 $o(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 es(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const ts=[{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 ns(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(!as(t,a,e))continue;let c=0,l=is(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=rs({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function rs(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 ts){let o=s+e.x,u=c+e.y;if(!os(o,u,i,a))continue;let d=u*i+o;as(t,n,d)&&(l=is(r,n,l,d))}return l}function is(e,t,n,r){return t[r]=1,e[n]=r,n+1}function as(e,t,n){return e[n]===1&&t[n]!==1}function os(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function ss(e,t){return e.flatMap(e=>cs(e,t.baseline.width,t.baseline.height)?ls(e,t,hs(t.baseline.height)):[e])}function cs(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ms(n)&&r>=t*.35}function ls(e,t,n){let r=ps(e,fs(ds(us(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])=>gs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function us(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 ds(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 fs(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 ps(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 ms(e){return Math.max(48,Math.round(e*.07))}function hs(e){return Math.max(24,Math.round(e*.03))}function gs(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??=_s(t,a),vs(i,e,t,a,r.baseline,r.current))}return i}function _s(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 vs(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 ys=2.5;function bs(e){let t=xs(e);return ss(t.length<=2e3?ws(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)=>Ds(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function xs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ns({mask:t,width:i,height:a,hooks:{create:e=>Ss(e,i),visit:(e,t)=>Cs(e,t,i,n,r)}})}function Ss(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 Cs(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 ws(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=>Ts(e,r,t));if(!e){n.push({...r});continue}Es(e,r)}return n}function Ts(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 Es(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 Ds(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=Os(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Os(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:on({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:js(r,n.width,n.height),size:Ms(s,n.totalPixels),location:ks(i,n.width,n.height),averageBaselineColorHex:Ns(a),averageCurrentColorHex:Ns(o),baselineLuminance:Math.round(Q(a)),currentLuminance:Math.round(Q(o)),dominantChange:As(a,o)}}function Os(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function ks(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 As(e,t){let n=Q(t)-Q(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 js(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ys?`horizontal-band`:e.height>=e.width*ys?`vertical-band`:`compact`}function Ms(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Q(e){return e.r*.2126+e.g*.7152+e.b*.0722}function Ns(e){return`#${Ps(e.r)}${Ps(e.g)}${Ps(e.b)}`}function Ps(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Fs=Math.sqrt(3*255**2);async function Is(e,t,n={}){await Ls(e,`Baseline image not found`),await Ls(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([A.readFile(e),A.readFile(t)]),[o,s]=await Promise.all([it(i,`baseline screenshot`),it(a,`current screenshot`)]);Rs(o.width,o.height,`baseline screenshot`,n.maxPixels),Rs(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await zs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Fs,{diffData:d,diffMask:f,differentPixels:p}=await at({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?bs({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new rt.PNG({width:o.width,height:o.height});e.data=d,Xo(e,m),await A.mkdir(ct.dirname(r),{recursive:!0}),await A.writeFile(r,await ot(e))}else await zs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Ls(e,t){try{await A.access(e)}catch{throw new n(`INVALID_ARGS`,`${t}: ${e}`)}}function Rs(e,t,r,i){if(i==null||i<=0)return;let a=e*t;if(!(a<=i))throw new n(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function zs(e){if(e)try{await A.unlink(e)}catch(e){if(!Bs(e,`ENOENT`))throw e}}function Bs(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Vs(e,t){return e.map(e=>{let n=Hs(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Hs(e,t){let n=_e(e.rect);return t.map(t=>{let r=t.overlayRect,i=sn(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Us(i/_e(r)),regionCoveragePercentage:Us(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 Us(e){return Math.round(e*100*100)/100}async function Ws(e,t,i){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new n(`INVALID_ARGS`,`Local ${i.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,i)}catch(e){throw r(e)}}async function Gs(e,t,i){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new n(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...i,visibility:i.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??i.requestedClientPath:i.requestedClientPath})}catch(e){throw r(e)}}async function Ks(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw r(e)}}const qs=async(e,t)=>{if(!t.baseline)throw new n(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Js(t.threshold),i=t.current??{kind:`live`};if(t.overlayRefs&&!nc(i))throw new n(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Ws(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let n;nc(i)?(s=await Ys(e,t),n=s.path):(o=await Ws(e,i,{usage:`diff screenshot current`,field:`current`}),n=o.path),c=t.out?await Gs(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Is(a.path,n,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});nc(i)&&(u=await Xs(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 a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Js(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new n(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function Ys(e,t){let n=await Ks(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Zs(e,t,n.path,Qs(t))}catch(e){throw await n.cleanup(),e}return n}async function Xs(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await tc(n),r;let a=await Gs(e,$s(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Zs(e,t,a.path,{overlayRefs:!0,...Qs(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:Vs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Zs(e,t,r,i={}){if(!e.backend.captureScreenshot)throw new n(`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},r,i)??{}}function Qs(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function $s(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:ec(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:ec(e.out.clientPath)}:{},...e.out.fileName?{fileName:ec(e.out.fileName)}:{}}}function ec(e){let t=ct.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function tc(e){try{await A.unlink(ec(e))}catch(e){if(!rc(e,`ENOENT`))throw e}}function nc(e){return e.kind===`live`}function rc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const ic=async(e,t)=>{if(!e.backend.captureScreenshot)throw new n(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);l(t);let r=await Gs(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;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},r.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),t.scale!==void 0&&await $e(r.path,t.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...T(`Saved screenshot: ${r.path}`)}};function ac(e){let{nodes:n,backend:r,snapshotRaw:i}=e;if(i||!t(r))return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let a=He(n),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:n.length,reasons:[...o]}}const oc=`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 sc(e){return e?.systemSurfaceOnly===!0?oc:void 0}function cc(e,t){return e.presentationKey?e:{...e,presentationKey:s(t)}}function lc(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||!uc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!dc(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 uc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function dc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>pc(e,t.nodes[n]))}const fc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function pc(e,t){return fc.every(n=>e[n]===t[n])&&mc(e.rect,t.rect)&&hc(e.presentationHints,t.presentationHints)&&hc(e.actions,t.actions)}function mc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function hc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const gc=async(e,t)=>{let n=await vc(e,t),r=lc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(bc(t.session,n));let i=Sc(n.snapshot);return f(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:ac({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...d({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...xc(n)})},_c=async(e,t)=>{let n=await vc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=bc(t.session,n);if(!i){let t=Di(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=Ei(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 vc(e,t){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:t.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=yc(a,e),s=f(o,cc(o,t)),c=u(a),l=N(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:Cc({result:a,annotations:c,snapshot:s,options:t,session:i,capturedAt:s.createdAt??l,runtimeNow:l})}}function yc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:N(t),...e.keyboard?{keyboard:e.keyboard}:{}}}function bc(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 xc(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 Sc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:st(e.producer)===`unavailable`&&void 0:e.truncated}function Cc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Qe(e.annotations.quality,e.snapshot.nodes)),t.push(...et(Sc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Mt(e.snapshot.postGestureOutcome)),t.push(...Oc(e)),e.annotations.quality||(t.push(...Tc(e)),t.push(...Dc(e.snapshot.nodes)));let n=Ie(e.snapshot.nodes);n&&t.push(n);let r=wc(e.annotations);r&&t.push(r);let i=kc(e);return i&&t.push(i),t.push(...Nc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function wc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return oc}function Tc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Ec(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Ec(e){return e?b(e.type??``)===`application`:!1}function Dc(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 Oc(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 kc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ac(t,e.snapshot)&&jc(t,e.capturedAt,e.runtimeNow)&&Pc(t.nodes.length,e.snapshot.nodes.length))return Mc}function Ac(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function jc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Mc=`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 Nc(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`?[Mc]:[]}function Pc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Fc={screenshot:ic,diffScreenshot:qs,snapshot:gc,diffSnapshot:_c};function Ic(e){return $t(Fc,e)}export{Mt as A,j as C,Kt as D,Gt as E,ut as F,ft as I,Dt as M,Et as N,Bt as O,dt as P,Xt as S,Ht as T,hn as _,Jo as a,P as b,br as c,L as d,Hn as f,_n as g,jn as h,Ws as i,Ft as j,zt as k,B as l,I as m,sc as n,qo as o,An as p,Gs as r,yr as s,Ic as t,nr as u,fn as v,Vt as w,M as x,$t as y};
|
|
1
|
+
import{E as e,G as t,M as n,N as r,P as i,R as a,S as o,b as s,v as c,x as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{r as d,t as f}from"./snapshot-capture-annotations.js";import{f as p,l as m,n as h}from"./android-input-ownership.js";import{Bn as g,Br as _,Cn as v,Dr as y,En as ee,Fr as te,Gn as ne,Hn as re,Hr as ie,Jn as b,Kn as ae,Lr as x,Mr as oe,Nr as se,On as ce,Pn as le,Pr as ue,Qr as de,Rn as fe,Sn as pe,Sr as me,Tn as he,Vn as ge,Yn as _e,Yr as ve,Zn as ye,dn as be,gr as xe,hr as Se,jn as Ce,jr as we,kn as S,lr as Te,mr as Ee,qn as De,qr as C,zn as Oe,zr as ke}from"./sdk-batch.js";import{r as w}from"./success-text.js";import{a as Ae,c as je,f as Me,g as Ne,h as Pe,i as Fe,m as Ie,n as Le,o as T,p as Re,r as ze,s as Be,u as Ve}from"./overlay.js";import{n as He,t as Ue}from"./mobile-snapshot-semantics.js";import{r as E}from"./diagnostics.js";import"./diagnostics2.js";import{i as D,n as O,t as We}from"./rect-center.js";import{a as Ge,n as Ke,t as qe}from"./gesture-plan.js";import{t as Je}from"./android-snapshot-quality.js";import{n as Ye,r as Xe}from"./android-system-chrome.js";import{t as Ze}from"./observe-until.js";import{n as Qe,t as k}from"./selector-pipeline-policy.js";import{i as $e}from"./ios-system-surface.js";import{c as et,n as tt,o as nt,r as rt,s as A}from"./quality-warnings.js";import{r as it}from"./png.js";import{a as at,n as ot,o as st}from"./png-worker-client.js";import{n as ct}from"./ios-snapshot-acquisition.js";import lt from"node:path";import{promises as j}from"node:fs";import{createHash as ut}from"node:crypto";function dt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function ft(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=b(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function pt(e,t,n,r){return e.filter(e=>{if(!De(b(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&ae(i.chain,r)})}const mt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),ht={strippedIndexes:new Set,refs:new Set};function gt(e){let t=new Set(e.filter(e=>x(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return ht;let n=new Map(e.map(e=>[e.index,e])),r=xt(e,n,t),i=new Set(r),a=kt(e,n,r);for(let t of xt(e,n,a))i.add(t);for(let o of _t(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function _t(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=yt(t,n,r);if(o.size===0)return a;let s=bt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&vt(n,t,o)&&a.add(n.index);return a}function vt(e,t,n){if(!e.rect)return!1;let r=At(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function yt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=At(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function bt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function xt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)jt(i,t,n)&&r.add(i.index);return r}function St(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Xe(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(h).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:wt(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?ht:{strippedIndexes:o,refs:s}}function wt(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&St(e,t)).map(e=>e.index))}function Tt(e,t){let n=gt(e),r=Ct(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Et(e,t){let{strippedIndexes:n}=Tt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Dt(e,t){return Tt(e,t).refs}function Ot(e){return gt(e).refs}function kt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||x(n.type??``)!==`keyboard`)continue;let i=At(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>mt.has(x(e.type??``))&&!n.has(e.index)&&jt(e,t,a))&&r.delete(i)}return r}function At(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(x(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function jt(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Mt={intervalMs:200,budgetMs:1500,minPolls:2},Nt=Mt.budgetMs+2e3;function Pt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Ft(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function It(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Lt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),m=await Ze({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Mt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let m=p(i);if(d=r.signaturesStable(m.signature,f.signature),!d)return{kind:`continue`};let h=a()-o;if(c&&l!==f.backend)return E({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let g=It({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:h,distrustCapMs:Nt,classifyBaselineEvidence:r.classifyBaselineEvidence});return g===`distrust`?{kind:`continue`,budgetMs:Nt}:(Rt(g,t.action,s,h),{kind:`done`,result:zt(g,t,f,r,u)})}});if(m.kind===`done`)return m.result;if(m.kind===`failed`)throw m.error;E({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:m.waitedMs,lastPairAgreed:d}});let h=m.last;return d?{value:h}:{value:h,postGestureOutcome:Ft(`unsettled`,t)}}function Rt(e,t,n,r){if(e===`accept-stale`){E({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}E({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Ft(`no-effect`,t)}:(E({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Bt(e,t,n,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>i)throw new r(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${i}`);return e}function Vt(e,t,n){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new r(`INVALID_ARGS`,t,n);return{x:i,y:a}}function Ht(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ut(),policy:e.policy??qt(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function Ut(e=[]){let t=new Map(e.map(e=>[e.name,Wt(e)]));return{get:e=>Wt(t.get(e)),set:e=>{t.set(e.name,Wt(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>Wt(e))}}function Wt(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Gt(e.metadata)}:{}}}function Gt(e){try{return structuredClone(e)}catch{return{...e}}}function Kt(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function qt(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Jt=new WeakMap;function Yt(e,t){Zt(e)&&Jt.set(e,t)}function Xt(e){return Zt(e)?Jt.get(e):void 0}function Zt(e){return typeof e==`object`&&!!e||typeof e==`function`}function M(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function N(e){return e.clock?.now()??Date.now()}async function Qt(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function $t(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function P(e){return e&&typeof e==`object`?e:void 0}async function F(e,t,n){if(!e.backend.captureSnapshot)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new r(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(M(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:N(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}function en(e){let t=Buffer.alloc(16);for(let n of e)nn(t,tn(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function tn(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function nn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function rn(e){let{digest:t,nodeCount:n}=en(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=an(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function an(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function I(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function on(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:$e(n)}}function sn(e,t){let n=rn(e.nodes),r=on(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==rn(t.nodes).digest;return{...n,changedFromBefore:i}}function cn(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function ln(e,t){let n=l(e.type??`Element`),r=Re(e,n),i=Pe(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function un(e,t,n={}){let r=pn(fn(e,n),fn(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function dn(e,t={}){return fn(e,t).length}function fn(e,t){return t.flatten?e.map(e=>({text:Ie(e,0,!1),comparable:ln(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:ln(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function pn(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=hn(a,i,s)?L(a,i+1):L(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return mn(o,e,t,n,r)}}return[]}function mn(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=hn(i,c,r)?c+1:c-1,u=L(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function hn(e,t,n){return t===-n||t!==n&&L(e,t-1)<L(e,t+1)}function L(e,t){return e.get(t)??0}function gn(e,t){return e.find(e=>ie(e,t))??null}function R(e,t){let n=se(e);return n&&te(n)?n:_n(e,t)}function _n(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=se(e);if(!t||!te(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function vn(e){return e===`text`||e===`label`||e===`any`}function yn(e,t,n,r){if(!(r||e===`web`))return vn(t)?n:void 0}function bn(e){return new r(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function xn(e,t){let n=t??`default`,i=await e.sessions.get(n);if(!i)throw new r(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new r(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:i,snapshot:a}}async function z(e,t,n={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=Sn(await i(M(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!A(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function Sn(e,t){return e.snapshot?Cn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:N(t)}}function Cn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function wn(e,t,n){if(e.backend.readText){let r=await e.backend.readText(M(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Ne(n)}function Tn(t,n,i){let a=e(n);if(!a)throw new r(`INVALID_ARGS`,i.invalidRefMessage);let o=s(t,a)??(i.fallbackLabel.length>0?gn(t,i.fallbackLabel):null);if(!o)throw new r(`COMMAND_FAILED`,i.notFoundMessage,{reason:T.refNotFound,ref:a,hint:v});return{ref:a,node:o}}async function En(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Dn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?On(e.nodes):e.nodes).map(jn);return n.sort((e,t)=>Nn(e).localeCompare(Nn(t))),{captureBackend:t,nodes:n}}function On(e){let t=y(e);return e.filter(e=>we(e)||t.isVisibleOnScreen(e))}function kn(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function An(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function jn(e){return{identity:`${e.type??``}#${Mn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Mn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Nn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Pn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Fn(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=N(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;N(e)<o;){let c=await Hn(e,t,o-N(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=In(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Dn(c.snapshot);_=Rn({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=N(e),ee=Bn({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Qt(e,t);continue}if(!kn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await Qt(e,te)}return{settled:!1,stalled:!1,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h}}function In(e,t,n){if(!e||!t||!Ln(t.backend,n))return;let r=t.nodes.some(we),i=e.length<=5;if(!(!r&&!i))return Dn({...t,nodes:e})}function Ln(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Rn(e){return e.requestedQuietMs<500||!An(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function zn(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Bn(e){if(!(e.resetRequested!==!0||e.alreadyReset||!zn(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Vn(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Hn(e,t,n,r){let i=await En(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Un=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Wn=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Gn(e,t,n){return await qn(e,t,{...n,baseline:await Xn(e,t,n.resolved),actionPoint:n.resolved.point})}const Kn=async(e,t)=>(await qn(e,t,t)).observation;async function qn(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Jn(e,t,n,a,await Fn(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function Jn(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Wn:Un}};let{stored:o,session:s}=await lr(e,t,i.lastCapture),c=I(i.lastCapture.snapshot),l=c.nodes,u=on(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?tr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...sr(i,o,l.length,u)},settledCapture:c}}function Yn(e,t){if(e)return sn(e,t)}async function Xn(e,t,n){let r=await e.sessions.get(t.session??`default`);return Zn(n,r)??$n(n.preAction)??Qn(r)}function Zn(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?$n(I(n)):void 0}function Qn(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?I(t):{nodes:[]}}function $n(e){return e?.nodes.length?e:void 0}function er(e,t,n){let r=un(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=or(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function tr(e,t,n,r){let i=er(e,t,r);return{diff:i,...nr(i,t,n,r)}}function nr(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Dt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!rr(o.get(e),n))?{}:ar(t,i,r)}function rr(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const ir=new Set([`application`,`window`]);function ar(e,t,n){let r=Dt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ir.has(l(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=l(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function or(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function sr(e,t,n,r){let i=cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=cn(r);return{hint:i===void 0?a:`${a} ${i}`}}function cr(e,t,n){return e.stalled?{hint:Wn}:e.settled?t?n<5?{hint:Pn}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Un}}async function lr(e,t,n){if(A(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ur(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function dr(e,t,n,r,i){let a=await fr(e,t,n,i);return mr({...r,...a})}async function fr(e,t,n,r){if(r.settle!==void 0){let i=await Gn(e,t,{...r.settle,resolved:n}),a=r.verify?Yn(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await pr(e,t,n);return i?{evidence:i}:{}}async function pr(e,t,n){try{return sn(I((await F(e,t,!0)).snapshot),n.preAction)}catch{return}}function mr(e){let t=e;if(t.targetHittable!==!1||!hr(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function hr(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function gr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?vr(a):a.matchedNodes.length>1?_r(a):vr(a)}let a=ce(e,t,{...r,...pe({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:_r(a.firstMatch):{kind:`none`}}function _r(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function vr(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function yr(e,t,n){let r=ee(e,me(t),n);return r?{...r,selector:r.selector.raw}:null}function br(e,t,n,r){let i=gr(e,me(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function xr(e){return e}function Sr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Cr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function B(e){return[e.type,e.role,e.subrole].map(e=>x(e??``)).some(e=>e===`tab`||Cr.some(t=>e.includes(t)))}function wr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Vr(e);if(!Tr(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Nr(e,n,r).node;for(let n of t.slice(1))if(Nr(e,n,r).node.index!==i.index){let e=Or(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Tr(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Er(i,a,t)&&!Er(a,i,t))return!1}return!0}function Er(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Dr(e,t){return Or(t,Vr(e))}function Or(e,t){if(e.length<2||!Tr(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!B(n)||!e.every(e=>e===n||!B(e)))return null;let r=O(n.rect);return r&&e.every(e=>kr(O(e.rect),r))?n:null}function kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Ar(e,t){if(!t?.rect||!e.rect||!we(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function jr(e,t){return Nr(e,t)}function Mr(e){let t=Vr(e);return n=>Nr(e,n,t)}function Nr(e,t,n){return m(t)?{node:t,reason:`covered`}:Pr(e,t,n)??Fr(t)??Ir(e,t,n)??{node:t,reason:`original`}}function Pr(e,t,n){let r=Rr(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Fr(e){return B(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function Ir(e,t,n){let r=Lr(e,t,n);return!r?.rect||m(r)||!D(r.rect)?null:zr(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Lr(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?_(e,t,n.nodesByIndex,e=>r(e)?e:null):ke(e,t,r)}function Rr(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||m(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function zr(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(Br(t)&&!We(i,a))return!0;let o=oe(n,i,r?.viewportRootRects);return!o||!Hr(a,o)?!1:!We(i,a)}function Br(e){let t=x(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Vr(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(we(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Hr(e,t){let n=Sr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function V(e,t,n,r,i={}){let a=br(qr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Wr(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Ur(t,a);return o?await Wr(e,t,o,i):a}function Ur(e,t){let n=Dr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Wr(e,t,n,r){let i=await Kr(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Gr(e,t,n,r){let i=qr(e,t);return{candidates:i,list:yr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Kr(e,t,n,r={}){r.onResolved?.(n,t);let i=Jr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||m(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Yr(e,t,i.node,r)}}function qr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!m(e)):t}function Jr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Ar(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Yr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Xr(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const Zr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),Qr=new Set([`keyboard`,`key`]);function $r(e){return Qr.has(x(e.type??``))||h(e)}const ei=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function ti(e){return $r(e)||ei.has(e.role??``)}function ni(e,t,n){return n.has(e.index)||ai(t,n,e.index).length>0}function ri(e){return e!==null&&ve(e)}function H(e){return e.flatMap(e=>ve(e.rect)?[e.rect]:[])}function ii(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of ai(n,r,e.index))i.add(t);return i}function ai(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function oi(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function si(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function ci(e){let t=H(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return oi(t.length>0?t:e.anchorRects)}function li(e){let t=e.filter(ti),n=ii(e,t);return H(t.filter(e=>!n.has(e.index)))}function ui(e,t){let n=e.filter($r),r=H(n);if(r.length===0||!ri(t))return null;let i=e.filter(ti),a=H(i);if(a.length===0)return null;let o=si({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=ii(e,i);return ci({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:H(i.filter(e=>!s.has(e.index)))}:null}function di(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:li(e.nodes)}:ui(e.nodes,e.viewport);if(!t)return e.nodes.some($r)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return fi(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(ti).map(e=>e.index));return ni(e.node,n,r)?{kind:`clear`,surface:t}:C(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function fi(e,t){return t.controlRects.some(t=>C(t,e.x,e.y))?{kind:`clear`,surface:t}:C(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function pi(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function mi(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=di({nodes:e.nodes,viewport:y(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw _i({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function hi(e){let t=di({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return gi(e.point,t.surface)}function gi(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Zr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Zr.hint}function _i(e){return a(new r(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${pi(e.action)} safely`,{...Zr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function vi(e){return a(new r(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${pi(e.action)} safely`,{reason:T.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function yi(e){let t=await Kr(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw vi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return mi({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function bi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${Si(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function xi(t,n,r,i,a,{action:o}){return await Ci(t,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:e(a)},hint:e=>`${Si(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Si(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Ci(e,t,n,i,o){let s=y(i),c=n.rect?s.resolveEffectiveViewport(n):null;if(!n.rect||!c||s.isVisibleOnScreen(n))return n;let l=s.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(M(e,t),n,l);if(u)return{...n,rect:u};let d=He(n,s);throw a(new r(`COMMAND_FAILED`,o.message,{...o.details,rect:n.rect,viewport:c,...d?{scrollDirection:d}:{},hint:o.hint(d)}),`no`)}function wi(e,t,n,i){let{candidates:a,list:o}=Gr(i,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=wr(a,s);if(l.kind===`ambiguous`)throw new r(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ie(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Ti(e,t,n,r){let i=await F(e,t,r.requireInteractive),a=wi(i.snapshot.nodes,n,e.backend.platform,r.pipeline);if((!a||!a.node.rect)&&r.requireInteractive){let s=i.snapshot;i=await F(e,t,!1),o(s,i.snapshot),a=wi(i.snapshot.nodes,n,e.backend.platform,r.pipeline)}return{capture:i,resolved:a}}async function Ei(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await V(k.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return vi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Di(e){let{runtime:t,nodes:n,selectorExpression:i,action:o,resolved:s}=e,c=await Ei({runtime:t,nodes:n,selectorExpression:i,action:o});if(c)return c;let l=s?.diagnostics??[];return a(new r(`COMMAND_FAILED`,he(i,l,{unique:!0}),{reason:T.selectorNotFound,hint:S(l)}),`no`)}async function Oi(e,t,n,i,s){let c=await Ti(e,t,n,i);if(s&&o(s.snapshot,c.capture.snapshot),c.resolved?.node.rect)return c;let l=c.capture.snapshot.snapshotQuality;if(A(l))throw a(new r(`COMMAND_FAILED`,`Selector ${n} was not found in a sparse capture; the tree cannot prove it absent`,{reason:T.captureSparse,snapshotQuality:l,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ei({runtime:e,nodes:c.capture.snapshot.nodes,selectorExpression:n,action:i.action});if(u)throw u;return c}async function ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Di({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function Ai(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Ze({capture:async i=>{let a=await Oi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Je,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?ji(s.error,s):await ki(e,n,r,s)}function ji(e,t){if(!(e instanceof r)||e.details?.reason!==T.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const U={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Mi=[`runner-start`,`target-discovery`];function Ni(e){let t=e?.readinessPhase;return Mi.find(e=>e===t)}const Pi=`replay_target_guard_mismatch`,Fi=U.landmarkIdentityMismatch;function Ii(e,t,n,i,o){if(!n)return;let s=b(e),c=_e(e,t);if(!(ne(s,n.identity)&&ye(c,n.structural)))throw a(new r(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Pi,observed:s,observedStructural:c,expected:n.identity,expectedStructural:n.structural,...o?{targetRole:o}:{}}),`no`)}function Li(e,t,n){Ii(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function Ri(e){return e.hittable===!0||B(e)}function zi(e,t){let n=re(b(e),t);return n.id!==void 0||n.label!==void 0?!1:g(e.value)===null}function Bi(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Vi(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&Bi(t,e,n)).sort((e,t)=>e.index-t.index)}function Hi(e,t){let n=D(e.rect);return!n||!t.rect?!1:C(t.rect,n.x,n.y)}function Ui(e,t){if(!zi(e,t))return e;let n=Vi(e,t);if(n.some(Ri))return e;let r=n.find(e=>b(e).label!==void 0);return!r||!Hi(r,e)?e:r}function Wi(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const Gi={source:`ref`,phase:`pre-action`,kind:`exact`},Ki={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function qi(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Gi:Ki}}const Ji={source:`runtime`,phase:`pre-action`,kind:`unique`};function Yi(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Xi(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Xi(e,t))}:Ji}function Xi(e,t){let n=x(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Wi(n,256)}:{},...r===void 0?{}:{label:Wi(r,256)}}}function Zi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:Oe(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...$i(t,r),preAction:n,resolution:i,...Qi(e,t,a,r)}}function Qi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ui(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Oe(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function $i(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function ea(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=ta(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ra(e,t):null,r),s=o?ia(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function ta(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>na(e,t,r)).filter(B).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=ra(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function na(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function ra(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function ia(e,t,n,r){let i=la(e),a=sa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=sa(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!C(t,s.x,s.y))return[];let c=aa(s,e,n,r,i);return c?[c]:[]})).sort(oa)[0]?.point??null}function aa(e,t,n,r,i){let a=ca(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function oa(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function sa(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function ca(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function la(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function ua(e,t,n){let i=y(t),o=ea(t,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(o.kind===`resolved`)return o.point;throw o.kind===`invalid`?a(new r(`COMMAND_FAILED`,n.invalidMessage,{reason:T.targetBoundsInvalid,...da(n.blockedTargetDetails)}),`no`):a(new r(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:o.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:o.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function da(t){return`ref`in t?{ref:e(t.ref)??t.ref}:t}function fa(t,n){let i=e(t.ref);if(!i)throw new r(`INVALID_ARGS`,`Invalid ref: ${t.ref}`);let a=e(n.ref),o=n.node.ref?e(n.node.ref):null;if(a!==i||o!==i||!n.nodes.includes(n.node))throw new r(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:qi(i,n.node,`exact`)}}async function pa(e,t,n){let r=await ha(e,t,n);return{tree:I(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function ma(t,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?fa(r,i.preresolvedTarget):await pa(t,n,r),c=a.nodes,{node:l,tapPoint:u}=await yi({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>Li(e,t,i),offscreen:async(e,a)=>await xi(t,n,e,a,r.ref,i)},resolveTapPoint:t=>ua(t,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${e(r.ref)??t.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...Zi(t,l,a,i.action,s.resolution)}}async function ha(e,t,n){let{session:r,snapshot:i}=await xn(e,t.session),a=n.fallbackLabel??``,o=_a(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw va(o,n.ref);return ga({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function ga(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=_a(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&ne(b(a.node),b(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function _a(t,n,i){let a=e(n);if(!a)throw new r(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(t,a);if(ya(o))return{kind:`resolved`,resolved:qi(a,o,`exact`)};let c=i.fallbackLabel.length>0?gn(t,i.fallbackLabel):null;if(ya(c))return{kind:`resolved`,resolved:qi(a,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function va(t,n){let i=e(n)??n,o=t.kind===`unusable`?new r(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:T.targetBoundsInvalid,ref:i,hint:v}):new r(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:T.refNotFound,ref:i,hint:v});return a(o,`no`)}function ya(e){return e?D(e.rect)!==null:!1}async function W(e,t,n){return await wa(e,t,n.action),t.target.kind===`point`?await xa(e,t,t.target,n):t.target.kind===`ref`?await ma(e,t,t.target,n):await Ca(e,t,t.target,n)}async function ba(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=y(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!C(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:hi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function xa(e,t,n,r){let i=await ba(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Sa(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Sa(e,t){try{return I((await F(e,t,!0)).snapshot)}catch{return}}async function Ca(e,t,n,r){let i=n.selector,a,o,s,c=Qe(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await Ai(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Ti(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Di({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await yi({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>Li(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,l.selector,r)},resolveTapPoint:e=>ua(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...Zi(e,u,I(a.snapshot),r.action,Yi(o,a.snapshot.nodes))}}async function wa(e,t,n){if(e.backend.platform!==`macos`)return;let i=await Ta(e,t);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||n!==`click`&&n!==`press`))throw new r(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function Ta(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ea(t,n,r,i){let a=(await t.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||e(r.ref)===null)return{};let s=_a(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=k.resolvedTarget,{node:u}=await yi({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(e,a)=>await xi(t,n,e,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...$i(u,i),node:u,preAction:I(a)}}async function Da(e,t,n,r,i){let a=await Ea(e,t,n,r),o=P(await i(M(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Gi,...a,...o?{backendResult:o}:{}}}function Oa(e,t){let n=y(e),i=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(ka),a=i.length>0?i:e.map(e=>e.rect).filter(ka);if(a.length===0)throw new r(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function ka(e){return!!(e&&e.width>0&&e.height>0)}async function Aa(e,t){return await e.backend.resolveGestureViewport?.(M(e,t))||Oa((await F(e,t,!1)).snapshot.nodes,`gesture`)}const ja=async(e,t)=>{let n=await W(e,t,{action:`focus`,requireInteractive:!0,pipeline:k.resolvedTarget});if(!e.backend.focus)throw new r(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(n),a=P(await e.backend.focus(M(e,t),i));return{...n,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ma=async(e,t)=>{let n=ur(t),i=await W(e,t,{action:`longPress`,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new r(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:Bt(t.durationMs,`durationMs`,0,12e4),o=G(i),s=P(await e.backend.longPress(M(e,t),o,{durationMs:a}));return await dr(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},n)},Na=async(e,t)=>{let n=ur(t),i=n.needsPreActionBaseline?null:await Pa(e,t);if(i)return i;let a=await W(e,t,{action:`hover`,requireInteractive:!1,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new r(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=P(await e.backend.hover(M(e,t),o));return await dr(e,t,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},n)};async function Pa(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Da(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Fa=async(e,t)=>{if(!e.backend.performGesture)throw new r(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await wa(e,t,`drag`);let n=await Aa(e,t),i=await Ia(e,t,`source`),a=await Ia(e,t,`destination`),o=qe({from:G(i),to:G(a),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=P(await e.backend.performGesture(M(e,t),o)),{start:c,end:l}=Ge(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:La(i),destination:La(a)},recording:Ra(i,a),...s?{backendResult:s}:{},...w(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Ia(e,t,n){let r=t.gesture[n];return await W(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:k.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function La(e){if(e.kind===`point`||!e.resolution)throw new r(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function Ra(e,t){let n=za(e),r=za(t),i=Ba(e),a=Ba(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function za(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Ba(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(e){if(!e.point)throw new r(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Va=async(e,t)=>await Wa(e,t,`press`),Ha=async(e,t)=>await Wa(e,t,`click`),Ua=async(e,t)=>{if(typeof t.text!=`string`)throw new r(`INVALID_ARGS`,`fill requires text`);let n=ur(t),i=n.needsPreActionBaseline?null:await qa(e,t);if(i)return i;let a=await W(e,t,{action:`fill`,requireInteractive:!0,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new r(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Ga(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&ue(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=P(await e.backend.fill(M(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ya(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await dr(e,t,a,{...a,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function Wa(e,t,n){let i=ur(t),a=i.needsPreActionBaseline?null:await Ka(e,t,n);if(a)return a;let o=await W(e,t,{action:n,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new r(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Ga(o),c;try{c=await e.backend.tap(M(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Yt(e,o),e}let l=P(c);return await dr(e,t,o,{...o,...l?{backendResult:l}:{}},i)}function Ga(e){if(!e.point)throw new r(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ka(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Ja(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Da(e,t,t.target,n,async(e,t)=>await r(e,t))}async function qa(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Da(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Ja(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 Ya(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Xa=k.wait.poll.defaultTimeoutMs;function Za(e,t,n,r,i={}){let a=Xr(r),o=n??a.defaultTimeoutMs,s=Y(e),c=po(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await En(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Qa(r,c.lastUnobservedCause())),o;let f=$a(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:eo(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await mo(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Qa(e,t){return e?`readable`:t?.outcome??`unreadable`}function $a(e,t){let n=uo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let i=Ni(e instanceof r?e.details:void 0);return i?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:i}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function eo(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function to(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.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 no(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function ro(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function io(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.deadlineExceeded,captureTruncated:!0,...t})}function ao(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.targetAbsent,...t})}function oo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw so(r.error,t);if(n)throw r.error}}function so(e,t){let n=i(e);return new r(n.code,n.message,{reason:U.captureStalled,...n.details,...t},n)}function q(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return no(e,r);case`readiness-exhausted`:return oo(t,r,!1),ro(e,r);case`capture-stalled`:return oo(t,r,t.preserveUnreadableOnStall===!0),to(e,r);case`capture-truncated`:return io(e,r);case void 0:return oo(t,r,!0),r.readableCaptures===0?to(e,r):ao(e,r);default:return lo(n)}}function co(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function lo(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function uo(e){if(!(e instanceof r))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...J(t,`runnerRestartReason`),...J(t,`runnerRestartCommand`),...J(t,`runnerRestartCommandId`),...J(t,`runnerInvalidatedSessionId`),...J(t,`runnerRestartSessionId`),...J(t,`logPath`),...J(t,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function fo(e){return e instanceof r&&e.details?.retriable===!0}function po(e=Je){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(fo(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function mo(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function ho(e,t,n){let r=await V(k.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:je(e,i)}}async function go(e,t,n){let r=await ho(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Fe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function _o(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Za(t,n,i,k.wait,{isUnreadableError:yo,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await ho((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Je(e)?Ae(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw co(l)?q(`wait absent timed out for selector: ${r}`,o,l):c?vo(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function vo(e,t,n){let i=t.matches!==1;return new r(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${i?`es`:``} remain`,{reason:U.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function yo(e){if(!(e instanceof r))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Ve(t.observation)||t.observation===`unreadable`)}function bo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function xo(e,t,n,i,a,o){let s=Za(t,n,a,k.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let r=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(r.timedOut){u=r.deadline;break}let a=r.value;if(a){let e=a.snapshot.nodes,n=bo(await V(k.wait,e,i,{platform:t.backend.platform}));if(n){let t=So(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new r(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Fi,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function So(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=dt(e),a=pt(t.matchedNodes,i,ge(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:b(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function Co(e,t,n,i,a){let o=a??Xa,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new r(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:U.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function wo(e,t,n,r,i){let a=Za(t,n,i,k.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await To(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function To(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Do(t,n),r)).found?!0:await Eo(e,t,n,r)}async function Eo(e,t,n,r){return!!gn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Do(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Oo(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await mo(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await ko(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await xo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await _o(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await Co(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await Ao(e,t,n,n.target.text,n.target.timeoutMs);default:return jo(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let i=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(i.kind!==`text`)throw new r(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function ko(t,n,i,a,o){let c=await t.requireSnapshot(n,i.session),l=e(a);if(!l)throw new r(`INVALID_ARGS`,`Invalid ref: ${a}`);let u=s(c.snapshot.nodes,l);if(!u)throw new r(`COMMAND_FAILED`,`Ref ${a} not found`,{reason:T.refNotFound,ref:l,hint:v});let d=R(u,c.snapshot.nodes);if(!d)throw new r(`COMMAND_FAILED`,`Ref ${a} has no label to wait for`,{reason:T.refUnlabeled,ref:l});return await wo(t,n,i,d,o)}async function Ao(e,t,n,i,a){let o=Ee(i);if(!o.ok)throw new r(o.code,o.message);return await wo(e,t,n,o.text,a)}function jo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Mo=Oo({captureSnapshot:z,requireSnapshot:xn,stable:{defaultQuietMs:500,tinyTreeHint:Pn,tinyTreeNodeCount:5,capture:Fn}}),No=Mo.waitCommand,Po=Mo.waitForTextCommand,Fo=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new r(`INVALID_ARGS`,Ce);if(t.action===`wait`)return await zo(e,t,n);if(t.action===`list`)return await Bo(e,t,n);let{capture:i,match:a}=await Vo(e,t,n);if(!a)throw new r(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await wn(e,i,a),node:a}},Io=async(e,t)=>{if(t.target.kind===`ref`){let n=await xn(e,t.session),r=Tn(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`});Ii(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=Oe(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 wn(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Ho(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?k.readText:k.readUnique,hooks:{onResolved:(e,n)=>Ii(e,n,t.expectedResolvedTarget,`get`)}}),r=Oe(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 wn(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}},Lo=async(e,t)=>{let n=await Io(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new r(`COMMAND_FAILED`,`getText returned non-text result`);return n},Ro=async(e,t)=>{let n=await Io(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new r(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function zo(e,t,n){let r=Za(e,t,t.timeoutMs,k.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Vo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Bo(e,t,n){let r=fe(n,t.query),i=await z(e,t,{updateSession:!0,...K()});if(A(i.snapshot.snapshotQuality))throw bn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Gr(k.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:le(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Vo(e,t,n,r){let i=fe(n,t.query),a=await z(e,t,{updateSession:!0,scope:yn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(A(a.snapshot.snapshotQuality))throw bn(a.snapshot.snapshotQuality);if(i){let t=await V(k.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:le(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Ho(e,t,n,i){let a=await z(e,{...t,session:n},{updateSession:!0,...K()}),o=await V(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new r(`COMMAND_FAILED`,he(i.selector,[],{unique:!0}),{hint:S([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Uo=async(e,t)=>{let n=Se(t.predicate);if(!n.ok)throw new r(n.code,n.message,{hint:n.hint});let i=n.predicate;if(i===`absent`){let e=Be(t);if(e)throw ze(e)}if(i===`text`&&!t.expectedText)throw new r(`INVALID_ARGS`,Te);let a=t.selector,o=await Wo(e,t,i,a);return i===`exists`?await Go(e,o,a):i===`absent`?await go(o.snapshot,a,e.backend.platform):await Ko(e,t,o,i,a)};async function Wo(e,n,r,i){try{return await z(e,n,{updateSession:!0,...K(r)})}catch(e){throw r!==`absent`||t(e)?e:Ae(i,e)}}async function Go(e,t,n){let i=await V(k.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(i.kind!==`target`)throw new r(`COMMAND_FAILED`,he(n,[],{unique:!1}),{hint:S([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:be(n)}}async function Ko(e,t,n,i,a){let o=await V(k.readUnique,n.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,n)=>Ii(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new r(`COMMAND_FAILED`,he(a,[],{unique:!0}),{command:`is`,reason:T.selectorNotFound,predicate:i,selector:a,hint:S([])});let s=xe({predicate:i,node:o.node,visibility:y(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new r(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:T.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:be(a),node:o.node,preActionNodes:n.snapshot.nodes}}const qo=async(e,t)=>await Uo(e,{...t,predicate:`visible`,selector:t.target.selector}),Jo=async(e,t)=>await Uo(e,{...t,predicate:`hidden`,selector:t.target.selector}),Yo=async(e,t)=>{if(!e.backend.performGesture)throw new r(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await wa(e,t,t.gesture.intent);let n=await Aa(e,t),i=Ke(t.gesture,n,e.backend.platform),a=P(await e.backend.performGesture(M(e,t),i)),o=Zo(i.pointers,0),s=Zo(i.pointers,-1);return{kind:t.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Qo(t.gesture,o,s))}},Xo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Fa(e,{...t,gesture:n}):await Yo(e,{...t,gesture:n})};function Zo(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 r(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=n;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Qo(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:Fo,get:Io,getText:Lo,getAttrs:Ro,is:Uo,isVisible:qo,isHidden:Jo,wait:No,waitForText:Po},Z={click:Ha,press:Va,fill:Ua,focus:ja,longPress:Ma,hover:Na,gesture:Xo,settleObservation:Kn};function $o(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function es(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const ts=[0,187,255,255];function ns(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||rs(e,n.rect)}function rs(e,t){let n=is(t);if(n==null)return;let r=as(n.x,0,e.width-1),i=as(n.y,0,e.height-1),a=as(n.right,0,e.width-1),o=as(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Q(e,n,i+t,ts),Q(e,n,o-t,ts);for(let n=i;n<=o;n+=1)Q(e,r+t,n,ts),Q(e,a-t,n,ts)}}function is(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Q(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function as(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const os=[{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 ss(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(!us(t,a,e))continue;let c=0,l=ls(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=cs({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function cs(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 os){let o=s+e.x,u=c+e.y;if(!ds(o,u,i,a))continue;let d=u*i+o;us(t,n,d)&&(l=ls(r,n,l,d))}return l}function ls(e,t,n,r){return t[r]=1,e[n]=r,n+1}function us(e,t,n){return e[n]===1&&t[n]!==1}function ds(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function fs(e,t){return e.flatMap(e=>ps(e,t.baseline.width,t.baseline.height)?ms(e,t,bs(t.baseline.height)):[e])}function ps(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ys(n)&&r>=t*.35}function ms(e,t,n){let r=vs(e,_s(gs(hs(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])=>xs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function hs(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 gs(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 _s(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 vs(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 ys(e){return Math.max(48,Math.round(e*.07))}function bs(e){return Math.max(24,Math.round(e*.03))}function xs(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??=Ss(t,a),Cs(i,e,t,a,r.baseline,r.current))}return i}function Ss(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 Cs(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 ws=2.5;function Ts(e){let t=Es(e);return fs(t.length<=2e3?ks(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)=>Ms(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Es(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ss({mask:t,width:i,height:a,hooks:{create:e=>Ds(e,i),visit:(e,t)=>Os(e,t,i,n,r)}})}function Ds(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 Os(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 ks(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=>As(e,r,t));if(!e){n.push({...r});continue}js(e,r)}return n}function As(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 js(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 Ms(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=Ns(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ns(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:xr({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Is(r,n.width,n.height),size:Ls(s,n.totalPixels),location:Ps(i,n.width,n.height),averageBaselineColorHex:zs(a),averageCurrentColorHex:zs(o),baselineLuminance:Math.round(Rs(a)),currentLuminance:Math.round(Rs(o)),dominantChange:Fs(a,o)}}function Ns(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Ps(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 Fs(e,t){let n=Rs(t)-Rs(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 Is(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ws?`horizontal-band`:e.height>=e.width*ws?`vertical-band`:`compact`}function Ls(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Rs(e){return e.r*.2126+e.g*.7152+e.b*.0722}function zs(e){return`#${Bs(e.r)}${Bs(e.g)}${Bs(e.b)}`}function Bs(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Vs=Math.sqrt(3*255**2);async function Hs(e,t,n={}){await Us(e,`Baseline image not found`),await Us(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([j.readFile(e),j.readFile(t)]),[o,s]=await Promise.all([at(i,`baseline screenshot`),at(a,`current screenshot`)]);Ws(o.width,o.height,`baseline screenshot`,n.maxPixels),Ws(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Gs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Vs,{diffData:d,diffMask:f,differentPixels:p}=await ot({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Ts({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new it.PNG({width:o.width,height:o.height});e.data=d,ns(e,m),await j.mkdir(lt.dirname(r),{recursive:!0}),await j.writeFile(r,await st(e))}else await Gs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Us(e,t){try{await j.access(e)}catch{throw new r(`INVALID_ARGS`,`${t}: ${e}`)}}function Ws(e,t,n,i){if(i==null||i<=0)return;let a=e*t;if(!(a<=i))throw new r(`INVALID_ARGS`,`${n} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Gs(e){if(e)try{await j.unlink(e)}catch(e){if(!Ks(e,`ENOENT`))throw e}}function Ks(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function qs(e,t){return e.map(e=>{let n=Js(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Js(e,t){let n=de(e.rect);return t.map(t=>{let r=t.overlayRect,i=Sr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ys(i/de(r)),regionCoveragePercentage:Ys(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 Ys(e){return Math.round(e*100*100)/100}async function Xs(e,t,n){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new r(`INVALID_ARGS`,`Local ${n.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw i(e)}}async function Zs(e,t,n){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new r(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw i(e)}}async function Qs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw i(e)}}const $s=async(e,t)=>{if(!t.baseline)throw new r(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=ec(t.threshold),i=t.current??{kind:`live`};if(t.overlayRefs&&!cc(i))throw new r(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Xs(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let r;cc(i)?(s=await tc(e,t),r=s.path):(o=await Xs(e,i,{usage:`diff screenshot current`,field:`current`}),r=o.path),c=t.out?await Zs(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Hs(a.path,r,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});cc(i)&&(u=await nc(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 a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function ec(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new r(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function tc(e,t){let n=await Qs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await rc(e,t,n.path,ic(t))}catch(e){throw await n.cleanup(),e}return n}async function nc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await sc(n),r;let a=await Zs(e,ac(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await rc(e,t,a.path,{overlayRefs:!0,...ic(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:qs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function rc(e,t,n,i={}){if(!e.backend.captureScreenshot)throw new r(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,i)??{}}function ic(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function ac(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:oc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:oc(e.out.clientPath)}:{},...e.out.fileName?{fileName:oc(e.out.fileName)}:{}}}function oc(e){let t=lt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function sc(e){try{await j.unlink(oc(e))}catch(e){if(!lc(e,`ENOENT`))throw e}}function cc(e){return e.kind===`live`}function lc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const uc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new r(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await Zs(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;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 nt(n.path,t.scale),i=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${n.path}`)}};function dc(e){let{nodes:t,backend:r,snapshotRaw:i}=e;if(i||!n(r))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Ue(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const fc=`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 pc(e){return e?.systemSurfaceOnly===!0?fc:void 0}function mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function hc(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||!gc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!_c(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 gc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function _c(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>yc(e,t.nodes[n]))}const vc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function yc(e,t){return vc.every(n=>e[n]===t[n])&&bc(e.rect,t.rect)&&xc(e.presentationHints,t.presentationHints)&&xc(e.actions,t.actions)}function bc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function xc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Sc=async(e,t)=>{let n=await wc(e,t),r=hc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(Ec(t.session,n));let i=Oc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:dc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...Dc(n)})},Cc=async(e,t)=>{let n=await wc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Ec(t.session,n);if(!i){let t=dn(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=un(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 wc(e,t){if(!e.backend.captureSnapshot)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,i=await e.sessions.get(n),a=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=Tc(a,e),s=p(o,mc(o,t)),c=d(a),l=N(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:kc({result:a,annotations:c,snapshot:s,options:t,session:i,capturedAt:s.createdAt??l,runtimeNow:l})}}function Tc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:N(t),...e.keyboard?{keyboard:e.keyboard}:{}}}function Ec(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 Dc(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 Oc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ct(e.producer)===`unavailable`&&void 0:e.truncated}function kc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...rt(Oc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Pt(e.snapshot.postGestureOutcome)),t.push(...Pc(e)),e.annotations.quality||(t.push(...jc(e)),t.push(...Nc(e.snapshot.nodes)));let n=Le(e.snapshot.nodes);n&&t.push(n);let r=Ac(e.annotations);r&&t.push(r);let i=Fc(e);return i&&t.push(i),t.push(...zc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Ac(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return fc}function jc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Mc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Mc(e){return e?x(e.type??``)===`application`:!1}function Nc(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 Pc(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 Fc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ic(t,e.snapshot)&&Lc(t,e.capturedAt,e.runtimeNow)&&Bc(t.nodes.length,e.snapshot.nodes.length))return Rc}function Ic(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Lc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Rc=`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 zc(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`?[Rc]:[]}function Bc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Vc={screenshot:uc,diffScreenshot:$s,snapshot:Sc,diffSnapshot:Cc};function Hc(e){return $t(Vc,e)}export{Lt as A,Ht as C,Vt as D,qt as E,pt as F,Dt as M,ft as N,Bt as O,dt as P,Xt as S,Kt as T,gn as _,es as a,P as b,Fi as c,V as d,Kr as f,R as g,Dr as h,Xs as i,Ot as j,Pt as k,U as l,Ar as m,pc as n,$o as o,Mr as p,Zs as r,Pi as s,Hc as t,Gr as u,rn as v,Ut as w,M as x,$t as y};
|