agent-device 0.21.16 → 0.21.17
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.16.apk → agent-device-android-ime-helper-0.21.17.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.17.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.16.manifest.json → agent-device-android-ime-helper-0.21.17.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.apk → agent-device-android-snapshot-helper-0.21.17.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.manifest.json → agent-device-android-snapshot-helper-0.21.17.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +31 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +9 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +40 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +4 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +1 -1
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.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-browser-tool.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/app-catalog.js +1 -1
- package/dist/src/app-deployment-resolution.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +1 -1
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/archive.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/cache.js +1 -0
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +6 -5
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +5 -5
- package/dist/src/clipboard-shell-response.js +1 -1
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-tools.js +3 -3
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- 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 -0
- package/dist/src/daemon-process.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -2
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/{stop-sequence.js → device-readiness-runtime.js} +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/doctor2.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/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/format.js +1 -2
- package/dist/src/gesture-admission.js +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host.js +1 -1
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-binding.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.js +1 -1
- package/dist/src/inventory.js +1 -1
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/legacy-xctest-device-set.js +1 -0
- package/dist/src/limrun-download-file.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +10 -10
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/observation.js +1 -1
- package/dist/src/overlay.js +3 -3
- package/dist/src/owner-identity.js +3 -3
- 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/perf-target.js +1 -1
- package/dist/src/perf.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-app-log-process.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +2 -2
- package/dist/src/platform-runtime-runtime-hints.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-size.js +1 -1
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/recording.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +36 -36
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/reporting.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +3 -3
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-command-traits.js +1 -0
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +2 -2
- package/dist/src/runner-exchange.js +1 -0
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-owner-facade.js +1 -1
- package/dist/src/runner-session-types.js +1 -0
- package/dist/src/runner-start-budget.js +1 -0
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-xctestrun.js +1 -0
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +3 -3
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -5
- 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-admission-ledger.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -1
- package/dist/src/screen-recording-options.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screen-recording-transport.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.d.ts +4 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +1 -1
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +10 -0
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-routing.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 +1 -1
- package/dist/src/session2.js +5 -4
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.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/src8.js +2 -2
- package/dist/src/string-enum.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/target-evidence.js +1 -0
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +2 -2
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/vars.js +2 -0
- package/dist/src/verified-file.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/viewport.js +1 -1
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/dist/src/webdriver-source.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.16.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.16.apk.sha256 +0 -1
- package/dist/src/capture-disclosure.js +0 -1
- package/dist/src/fold-runtime.js +0 -1
- package/dist/src/native-build-cache.js +0 -1
package/dist/src/runtime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,M as t,N as n,T as r,b as i,j as a,v as o,x as s}from"./sdk-contracts.js";import{m as c}from"./capture.js";import{r as l,t as u}from"./snapshot-capture-annotations.js";import{f as d,l as f,n as p}from"./android-input-ownership.js";import{An as m,Ar as h,Bn as g,Dn as _,Er as v,Gn as y,Ir as b,Jn as ee,Jr as te,Kn as ne,Kr as x,Ln as re,Mr as ie,Nn as ae,Nr as oe,On as se,Pr as ce,Rn as le,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 S,cr as ve,hr as ye,jr as be,mr as xe,pr as Se,qn as C,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 w}from"./success-text.js";import{_ as ke,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{t as We}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as D,n as O,t as Ge}from"./rect-center.js";import{a as Ke,n as qe,t as Je}from"./gesture-plan.js";import{t as Ye}from"./android-snapshot-quality.js";import{n as Xe,r as Ze}from"./android-system-chrome.js";import{c as Qe,n as $e,o as et,r as tt,s as nt}from"./quality-warnings.js";import{a as rt,n as it,o as at}from"./png-worker-client.js";import{r as ot}from"./png.js";import{i as st}from"./ios-system-surface.js";import{n as ct}from"./ios-snapshot-acquisition.js";import lt from"node:path";import{promises as k}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=C(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(!ne(C(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&y(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=>b(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(Xe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ze(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(p).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set: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||b(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(b(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(b(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=3500;function Nt({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 Pt(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function Ft(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 It(e){let{pending:t,needsBaselineDistrust:n,hooks:r}=e,i=Date.now(),a=1,o=await Lt(r,e.initial),s=t.baselineSignature,c=t.baselineBackend,l=!1,u=1500,d=!1;for(;a<2||Date.now()-i<u;){await We(200),a+=1;let e=await Lt(r);if(d=r.signaturesStable(o.signature,e.signature),d){let d=Date.now()-i;if(s&&c!==e.backend){E({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=Ft({needsBaselineDistrust:n,baselineSignature:s,quietSignature:e.signature,elapsedMs:d,distrustCapMs:Mt,classifyBaselineEvidence:r.classifyBaselineEvidence});if(f===`distrust`){u=Mt,o=e;continue}return Rt(f,t.action,a,d),zt(f,t,e,r,l)}o=e}return E({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:Pt(`unsettled`,t)}}async function Lt(e,t){let n=t??await e.capture();return{value:n,...e.readSurface(n)}}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:Pt(`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})}const A={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`},Bt=[`runner-start`,`target-discovery`];function Vt(e){let t=e?.readinessPhase;return Bt.find(e=>e===t)}const Ht=`replay_target_guard_mismatch`,Ut=A.landmarkIdentityMismatch;function Wt(e,t){return e.find(e=>me(e,t))??null}function j(e,t){let n=ie(e);return n&&ce(n)?n:Gt(e,t)}function Gt(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=ie(e);if(!t||!ce(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 Kt(e){return e}function qt(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 Jt=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function M(e){return[e.type,e.role,e.subrole].map(e=>b(e??``)).some(e=>e===`tab`||Jt.some(t=>e.includes(t)))}function Yt(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=pn(e);if(!Xt(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=an(e,n,r).node;for(let n of t.slice(1))if(an(e,n,r).node.index!==i.index){let e=$t(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Xt(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(!Zt(i,a,t)&&!Zt(a,i,t))return!1}return!0}function Zt(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 Qt(e,t){return $t(t,pn(e))}function $t(e,t){if(e.length<2||!Xt(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(!M(n)||!e.every(e=>e===n||!M(e)))return null;let r=O(n.rect);return r&&e.every(e=>en(O(e.rect),r))?n:null}function en(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 tn(e,t){if(!t?.rect||!e.rect||!h(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 nn(e,t){return an(e,t)}function rn(e){let t=pn(e);return n=>an(e,n,t)}function an(e,t,n){return f(t)?{node:t,reason:`covered`}:on(e,t,n)??sn(t)??cn(e,t,n)??{node:t,reason:`original`}}function on(e,t,n){let r=un(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function sn(e){return M(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function cn(e,t,n){let r=ln(e,t,n);return!r?.rect||f(r)||!D(r.rect)?null:dn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function ln(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 un(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||f(e))return!1;let t=O(e.rect);return t?Ge(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function dn(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(fn(t)&&!Ge(i,a))return!0;let o=be(n,i,r?.viewportRootRects);return!o||!mn(a,o)?!1:!Ge(i,a)}function fn(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 pn(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(h(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function mn(e,t){let n=qt(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}function hn(e,n,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new t(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return e}function gn(e,n,r){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new t(`INVALID_ARGS`,n,r);return{x:i,y:a}}function _n(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??vn(),policy:e.policy??Sn(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function vn(e=[]){let t=new Map(e.map(e=>[e.name,yn(e)]));return{get:e=>yn(t.get(e)),set:e=>{t.set(e.name,yn(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>yn(e))}}function yn(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:bn(e.metadata)}:{}}}function bn(e){try{return structuredClone(e)}catch{return{...e}}}function xn(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Sn(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Cn={defaultTimeoutMs:1e4,intervalMs:300},N={promotedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:S.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:S.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:S.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Cn},wait:{resolution:S.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Cn},readList:{resolution:S.readList,occlusion:`ignore`},findAct:{resolution:S.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:S.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},wn=new WeakMap;function Tn(e,t){Dn(e)&&wn.set(e,t)}function En(e){return Dn(e)?wn.get(e):void 0}function Dn(e){return typeof e==`object`&&!!e||typeof e==`function`}function P(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function F(e){return e.clock?.now()??Date.now()}async function On(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function kn(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function I(e){return e&&typeof e==`object`?e:void 0}function An(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`?Mn(a):a.matchedNodes.length>1?jn(a):Mn(a)}let a=_(e,t,{...r,...Te({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:jn(a.firstMatch):{kind:`none`}}function jn(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Mn(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 Nn(e,t,n){let r=fe(e,Ee(t),n);return r?{...r,selector:r.selector.raw}:null}function Pn(e,t,n,r){let i=An(e,Ee(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}async function L(e,t,n,r,i={}){let a=Pn(zn(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await In(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Fn(t,a);return o?await In(e,t,o,i):a}function Fn(e,t){let n=Qt(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function In(e,t,n,r){let i=await Rn(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Ln(e,t,n,r){let i=zn(e,t);return{candidates:i,list:Nn(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Rn(e,t,n,r={}){r.onResolved?.(n,t);let i=Bn(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||f(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Vn(e,t,i.node,r)}}function zn(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!f(e)):t}function Bn(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=nn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&tn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Vn(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 Hn(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function Un(e){return e.hittable===!0||M(e)}function Wn(e,t){let n=pe(C(e),t);return n.id!==void 0||n.label!==void 0?!1:De(e.value)===null}function Gn(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 Kn(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&Gn(t,e,n)).sort((e,t)=>e.index-t.index)}function qn(e,t){let n=D(e.rect);return!n||!t.rect?!1:x(t.rect,n.x,n.y)}function Jn(e,t){if(!Wn(e,t))return e;let n=Kn(e,t);if(n.some(Un))return e;let r=n.find(e=>C(e).label!==void 0);return!r||!qn(r,e)?e:r}function Yn(e){return e===`text`||e===`label`||e===`any`}function Xn(e,t,n,r){if(!(r||e===`web`))return Yn(t)?n:void 0}function Zn(e){return new t(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function Qn(e,n){let r=n??`default`,i=await e.sessions.get(r);if(!i)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new t(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function R(e,n,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await e.sessions.get(a),s=$n(await i(P(e,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),e);return(n.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!nt(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function $n(e,t){return e.snapshot?er(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:F(t)}}function er(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 tr(e,t,n){if(e.backend.readText){let r=await e.backend.readText(P(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return ke(n)}function nr(e,n,a){let o=r(n);if(!o)throw new t(`INVALID_ARGS`,a.invalidRefMessage);let s=i(e,o)??(a.fallbackLabel.length>0?Wt(e,a.fallbackLabel):null);if(!s)throw new t(`COMMAND_FAILED`,a.notFoundMessage,{reason:T.refNotFound,ref:o,hint:de});return{ref:o,node:s}}function rr(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 ir(e){let t=Buffer.alloc(16);for(let n of e)or(t,ar(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function ar(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function or(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function sr(e){let{digest:t,nodeCount:n}=ir(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=cr(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function cr(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 lr(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:st(n)}}function ur(e,t){let n=sr(e.nodes),r=lr(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==sr(t.nodes).digest;return{...n,changedFromBefore:i}}function dr(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 fr(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=pr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?hr(e,t):null,r),s=o?gr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function pr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>mr(e,t,r)).filter(M).flatMap(e=>{let t=O(e.rect);if(!t||Ge(t,n))return[];let r=hr(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function mr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function hr(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 gr(e,t,n,r){let i=xr(e),a=yr(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=yr(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=_r(s,e,n,r,i);return c?[c]:[]})).sort(vr)[0]?.point??null}function _r(e,t,n,r,i){let a=br(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 vr(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function yr(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 br(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 xr(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function Sr(e,n,r,i){let{candidates:a,list:o}=Ln(i,e,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Yt(a,s);if(l.kind===`ambiguous`)throw new t(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Pe(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 Cr=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."}),wr=new Set([`keyboard`,`key`]);function Tr(e){return wr.has(b(e.type??``))||p(e)}const Er=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function Dr(e){return Tr(e)||Er.has(e.role??``)}function Or(e,t,n){return n.has(e.index)||jr(t,n,e.index).length>0}function kr(e){return e!==null&&te(e)}function B(e){return e.flatMap(e=>te(e.rect)?[e.rect]:[])}function Ar(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 jr(n,r,e.index))i.add(t);return i}function jr(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 Mr(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 Nr(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 Pr(e){let t=B(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return Mr(t.length>0?t:e.anchorRects)}function Fr(e){let t=e.filter(Dr),n=Ar(e,t);return B(t.filter(e=>!n.has(e.index)))}function Ir(e,t){let n=e.filter(Tr),r=B(n);if(r.length===0||!kr(t))return null;let i=e.filter(Dr),a=B(i);if(a.length===0)return null;let o=Nr({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=Ar(e,i);return Pr({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:B(i.filter(e=>!s.has(e.index)))}:null}function Lr(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:Fr(e.nodes)}:Ir(e.nodes,e.viewport);if(!t)return e.nodes.some(Tr)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return Rr(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(Dr).map(e=>e.index));return Or(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 Rr(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 zr(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 Br(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=Lr({nodes:e.nodes,viewport:v(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Ur({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Vr(e){let t=Lr({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return Hr(e.point,t.surface)}function Hr(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Cr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Cr.hint}function Ur(e){return new t(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${zr(e.action)} safely`,{...Cr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame})}function Wr(e,n,r,i,a){if(!r)return;let o=C(e),s=ee(e,n);if(!(he(o,r.identity)&&ge(s,r.structural)))throw new t(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Ht,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function V(e,t,n){return await di(e,t,n.action),t.target.kind===`point`?await Kr(e,t,t.target,n):t.target.kind===`ref`?await Xr(e,t,t.target,n):await Zr(e,t,t.target,n)}async function Gr(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=v(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.`:Vr({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Kr(e,t,n,r){let i=await Gr(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await qr(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function qr(e,t){try{return z((await H(e,t,!0)).snapshot)}catch{return}}function Jr(e,n){let i=r(e.ref);if(!i)throw new t(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let a=r(n.ref),o=n.node.ref?r(n.node.ref):null;if(a!==i||o!==i||!n.nodes.includes(n.node))throw new t(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:ni(i,n.node,`exact`)}}async function Yr(e,t,n){let r=await pi(e,t,n);return{tree:z(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function Xr(e,t,n,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?Jr(n,i.preresolvedTarget):await Yr(e,t,n),c=a.nodes,{node:l,tapPoint:u}=await li({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>$r(e,t,i),offscreen:async(r,a)=>await xi(e,t,r,a,n.ref,i)},resolveTapPoint:e=>_i(e,c,{invalidMessage:`Ref ${n.ref} has no usable bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${r(n.ref)??e.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...oi(e,l,a,i.action,s.resolution)}}async function Zr(e,t,n,r){let i=n.selector,a=await H(e,t,r.requireInteractive),o=Sr(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive){let n=a.snapshot;a=await H(e,t,!1),s(n,a.snapshot),o=Sr(a.snapshot.nodes,i,e.backend.platform,r.pipeline)}if(!o||!o.node.rect)throw await Qr({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let c=o,{node:l,tapPoint:u}=await li({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:c.node,action:r.action,label:`Selector ${c.selector}`,hooks:{onResolved:(e,t)=>$r(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,c.selector,r)},resolveTapPoint:e=>_i(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:u,target:{kind:`selector`,selector:o.selector},...oi(e,l,z(a.snapshot),r.action,ii(o,a.snapshot.nodes))}}async function Qr(e){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await L(N.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return ui({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new t(`COMMAND_FAILED`,we(i,c,{unique:!0}),{reason:T.selectorNotFound,hint:se(c)})}function $r(e,t,n){Wr(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const ei={source:`ref`,phase:`pre-action`,kind:`exact`},ti={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ni(e,t,n){return{ref:e,node:t,resolution:n===`exact`?ei:ti}}const ri={source:`runtime`,phase:`pre-action`,kind:`unique`};function ii(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ai(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ai(e,t))}:ri}function ai(e,t){let n=b(e.type??``),r=j(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:rr(n,256)}:{},...r===void 0?{}:{label:rr(r,256)}}}function oi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:le(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:j(t,a),...ci(t,r),preAction:n,resolution:i,...si(e,t,a,r)}}function si(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Jn(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:le(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:j(i,n)}}}function ci(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 li(e){let t=await Rn(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw ui({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return Br({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 ui(e){return new t(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${zr(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 H(e,n,r){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await e.sessions.get(i);if(!a)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(P(e,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:F(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function di(e,n,r){if(e.backend.platform!==`macos`)return;let i=await fi(e,n);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new t(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function fi(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function pi(e,t,n){let{session:r,snapshot:i}=await Qn(e,t.session),a=n.fallbackLabel??``,o=hi(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw gi(o,n.ref);return mi({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function mi(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=hi(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&he(C(a.node),C(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function hi(e,n,a){let o=r(n);if(!o)throw new t(`INVALID_ARGS`,`Invalid ref: ${n}`);let s=i(e,o);if(yi(s))return{kind:`resolved`,resolved:ni(o,s,`exact`)};let c=a.fallbackLabel.length>0?Wt(e,a.fallbackLabel):null;if(yi(c))return{kind:`resolved`,resolved:ni(o,c,`label-fallback`)};let l=s??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function gi(e,n){let i=r(n)??n;return e.kind===`unusable`?new t(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:T.targetBoundsInvalid,ref:i,hint:de}):new t(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:T.refNotFound,ref:i,hint:de})}function _i(e,n,r){let i=v(n),a=fr(n,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new t(`COMMAND_FAILED`,r.invalidMessage,{reason:T.targetBoundsInvalid,...vi(r.blockedTargetDetails)}):new t(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function vi(e){return`ref`in e?{ref:r(e.ref)??e.ref}:e}function yi(e){return e?D(e.rect)!==null:!1}async function bi(e,t,n,r,i,{action:a}){return await Ti(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(e,t,n,i,a,{action:o}){return await Ti(e,t,n,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:r(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){let a=(await e.sessions.get(t.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||r(n.ref)===null)return{};let s=hi(o,n.ref,{fallbackLabel:n.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=N.resolvedTarget,{node:u}=await li({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${n.ref}`,hooks:{offscreen:async(r,a)=>await xi(e,t,r,a,n.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...ci(u,i),node:u,preAction:z(a)}}async function wi(e,t,n,r,i){let a=await Ci(e,t,n,r),o=I(await i(P(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:ei,...a,...o?{backendResult:o}:{}}}async function Ti(e,n,r,i,a){let o=v(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?.(P(e,n),r,c);if(l)return{...r,rect:l};let u=He(r,o);throw new t(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function Ei(e,t){let n=Ie(e.type??`Element`),r=Re(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 Di(e,t,n={}){let r=Ai(ki(e,n),ki(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 Oi(e,t={}){return ki(e,t).length}function ki(e,t){return t.flatten?e.map(e=>({text:Pe(e,0,!1),comparable:Ei(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:Ei(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Ai(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=Mi(a,i,s)?U(a,i+1):U(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 ji(o,e,t,n,r)}}return[]}function ji(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=Mi(i,c,r)?c+1:c-1,u=U(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 Mi(e,t,n){return t===-n||t!==n&&U(e,t-1)<U(e,t+1)}function U(e,t){return e.get(t)??0}async function Ni(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 Pi(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Fi(e.nodes):e.nodes).map(Ri);return n.sort((e,t)=>Bi(e).localeCompare(Bi(t))),{captureBackend:t,nodes:n}}function Fi(e){let t=v(e);return e.filter(e=>h(e)||t.isVisibleOnScreen(e))}function Ii(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 Li(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 Ri(e){return{identity:`${e.type??``}#${zi(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function zi(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Bi(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Vi=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Hi(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=F(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=Qe(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;F(e)<o;){let c=await Yi(e,t,o-F(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Ui(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Pi(c.snapshot);_=Gi({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=Qe(c.snapshot.snapshotQuality);let y=F(e),b=qi({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(b!==void 0){s=!0,o=b,g=y,p=v,m=c.snapshot.nodes.length;let t=Ji({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await On(e,t);continue}if(!Ii(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 ee=Ji({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(ee<=0)break;await On(e,ee)}return{settled:!1,stalled:!1,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Ui(e,t,n){if(!e||!t||!Wi(t.backend,n))return;let r=t.nodes.some(h),i=e.length<=5;if(!(!r&&!i))return Pi({...t,nodes:e})}function Wi(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Gi(e){return e.requestedQuietMs<500||!Li(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Ki(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function qi(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Ki(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Ji(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 Yi(e,t,n,r){let i=await Ni(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 Xi=`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.`,Zi=`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 Qi(e,t,n){return await ea(e,t,{...n,baseline:await ra(e,t,n.resolved),actionPoint:n.resolved.point})}const $i=async(e,t)=>(await ea(e,t,t)).observation;async function ea(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 ta(e,t,n,a,await Hi(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 ta(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?Zi:Xi}};let{stored:o,session:s}=await ga(e,t,i.lastCapture),c=z(i.lastCapture.snapshot),l=c.nodes,u=lr(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?ca(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...ma(i,o,l.length,u)},settledCapture:c}}function na(e,t){if(e)return ur(e,t)}async function ra(e,t,n){let r=await e.sessions.get(t.session??`default`);return ia(n,r)??oa(n.preAction)??aa(r)}function ia(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?oa(z(n)):void 0}function aa(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?z(t):{nodes:[]}}function oa(e){return e?.nodes.length?e:void 0}function sa(e,t,n){let r=Di(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=pa(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 ca(e,t,n,r){let i=sa(e,t,r);return{diff:i,...la(i,t,n,r)}}function la(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)&&!ua(o.get(e),n))?{}:fa(t,i,r)}function ua(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 da=new Set([`application`,`window`]);function fa(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)&&!da.has(Ie(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=Ie(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 pa(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 ma(e,t,n,r){let i=ha(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=dr(r);return{hint:i===void 0?a:`${a} ${i}`}}function ha(e,t,n){return e.stalled?{hint:Zi}:e.settled?t?n<5?{hint:Vi}:{}:{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:Xi}}async function ga(e,t,n){if(nt(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 _a(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function W(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 Qi(e,t,{...r.settle,resolved:n}),a=r.verify?na(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 ur(z((await H(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,n){let r=v(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 t(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Ca(e){return!!(e&&e.width>0&&e.height>0)}async function wa(e,t){return await e.backend.resolveGestureViewport?.(P(e,t))||Sa((await H(e,t,!1)).snapshot.nodes,`gesture`)}const Ta=async(e,n)=>{let r=await V(e,n,{action:`focus`,requireInteractive:!0,pipeline:N.resolvedTarget});if(!e.backend.focus)throw new t(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=I(await e.backend.focus(P(e,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ea=async(e,n)=>{let r=_a(n),i=await V(e,n,{action:`longPress`,requireInteractive:!0,pipeline:N.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.longPress)throw new t(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:hn(n.durationMs,`durationMs`,0,12e4),o=G(i),s=I(await e.backend.longPress(P(e,n),o,{durationMs:a}));return await W(e,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},Da=async(e,n)=>{let r=_a(n),i=r.needsPreActionBaseline?null:await Oa(e,n);if(i)return i;let a=await V(e,n,{action:`hover`,requireInteractive:!1,pipeline:N.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.hover)throw new t(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=I(await e.backend.hover(P(e,n),o));return await W(e,n,a,{...a,...s?{backendResult:s}:{},...w(`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 wi(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const ka=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,`drag`);let r=await wa(e,n),i=await Aa(e,n,`source`),a=await Aa(e,n,`destination`),o=Je({from:G(i),to:G(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=I(await e.backend.performGesture(P(e,n),o)),{start:c,end:l}=Ke(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}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function Aa(e,t,n){let r=t.gesture[n];return await V(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:N.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function ja(e){if(e.kind===`point`||!e.resolution)throw new t(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in e?e.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:e.resolution}}function 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 t(`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,n)=>{if(typeof n.text!=`string`)throw new t(`INVALID_ARGS`,`fill requires text`);let r=_a(n),i=r.needsPreActionBaseline?null:await Va(e,n);if(i)return i;let a=await V(e,n,{action:`fill`,requireInteractive:!0,pipeline:N.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.fill)throw new t(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=za(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&oe(s,e.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=I(await e.backend.fill(P(e,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ua(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await W(e,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function Ra(e,n,r){let i=_a(n),a=i.needsPreActionBaseline?null:await Ba(e,n,r);if(a)return a;let o=await V(e,n,{action:r,requireInteractive:!0,pipeline:N.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.tap)throw new t(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=za(o),c;try{c=await e.backend.tap(P(e,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw Tn(e,o),e}let l=I(c);return await W(e,n,o,{...o,...l?{backendResult:l}:{}},i)}function za(e){if(!e.point)throw new t(`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 wi(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 wi(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=N.wait.poll.defaultTimeoutMs;function Ga(e,t,n,r,i={}){let a=Hn(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 Ni(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,n){let r=io(e);if(r)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:r};let i=Vt(e instanceof t?e.details:void 0);return i?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:i}}:{outcome:`deadline`,deadline:n===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function Ja(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Ya(e,n){return new t(`COMMAND_FAILED`,e,{reason:A.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Xa(e,n){return new t(`COMMAND_FAILED`,e,{reason:A.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...n,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Za(e,n){return new t(`COMMAND_FAILED`,e,{reason:A.readinessExhausted,...n,retriable:!0,hint:`The wait timeout ended during readiness work (${n.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function Qa(e,n){return new t(`COMMAND_FAILED`,e,{reason:A.deadlineExceeded,captureTruncated:!0,...n})}function $a(e,n){return new t(`COMMAND_FAILED`,e,{reason:A.targetAbsent,...n})}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,r){let i=n(e);return new t(i.code,i.message,{reason:A.captureStalled,...i.details,...r},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 t))return;let n=e.details;if(n?.runnerRestarted===!0)return{runnerRestarted:!0,...J(n,`runnerRestartReason`),...J(n,`runnerRestartCommand`),...J(n,`runnerRestartCommandId`),...J(n,`runnerInvalidatedSessionId`),...J(n,`runnerRestartSessionId`),...J(n,`logPath`),...J(n,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function ao(e){return e instanceof t&&e.details?.retriable===!0}function oo(e=Ye){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 L(N.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 lo(e,t,n){let r=await co(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 uo(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Ga(t,n,i,N.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(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Ye(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 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,n,r){let i=n.matches!==1;return new t(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${n.matches} match${i?`es`:``} remain`,{reason:A.targetPresent,selector:e,...r,matches:n.matches,firstMatch:n.firstMatch})}function po(e){if(!(e instanceof t))return!1;let n=e.details;return n?.command===`wait`&&n.predicate===`absent`&&(Ve(n.observation)||n.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,n,r,i,a,o){let s=Ga(n,r,a,N.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let t=await s.capture(async t=>await e.captureSnapshot(n,{...r,signal:t},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(t.timedOut){u=t.deadline;break}let a=t.value;if(a){let e=a.snapshot.nodes,t=mo(await L(N.wait,e,i,{platform:n.backend.platform}));if(t){let n=go(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new t(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Ut,...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=dt(e),a=pt(t.matchedNodes,i,g(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:C(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function _o(e,n,r,i,a){let o=a??Wa,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new t(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:A.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,N.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!!Wt((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 n=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:n,waitForTextCommand:async(e,r)=>{let i=await n(e,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new t(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function Co(e,n,a,o,s){let c=await e.requireSnapshot(n,a.session),l=r(o);if(!l)throw new t(`INVALID_ARGS`,`Invalid ref: ${o}`);let u=i(c.snapshot.nodes,l);if(!u)throw new t(`COMMAND_FAILED`,`Ref ${o} not found`,{reason:T.refNotFound,ref:l,hint:de});let d=j(u,c.snapshot.nodes);if(!d)throw new t(`COMMAND_FAILED`,`Ref ${o} has no label to wait for`,{reason:T.refUnlabeled,ref:l});return await vo(e,n,a,d,s)}async function wo(e,n,r,i,a){let o=Se(i);if(!o.ok)throw new t(o.code,o.message);return await vo(e,n,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:Vi,tinyTreeNodeCount:5,capture:Hi}}),Do=Eo.waitCommand,Oo=Eo.waitForTextCommand,ko=async(e,n)=>{let r=n.locator??`any`;if(!n.query)throw new t(`INVALID_ARGS`,m);if(n.action===`wait`)return await No(e,n,r);if(n.action===`list`)return await Po(e,n,r);let{capture:i,match:a}=await Fo(e,n,r);if(!a)throw new t(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await tr(e,i,a),node:a}},Ao=async(e,t)=>{if(t.target.kind===`ref`){let n=await Qn(e,t.session),r=nr(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`});Wr(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=le(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await tr(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`?N.readText:N.readUnique,hooks:{onResolved:(e,n)=>Wr(e,n,t.expectedResolvedTarget,`get`)}}),r=le(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await tr(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,n)=>{let r=await Ao(e,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new t(`COMMAND_FAILED`,`getText returned non-text result`);return r},Mo=async(e,n)=>{let r=await Ao(e,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new t(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function No(e,t,n){let r=Ga(e,t,t.timeoutMs,N.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=re(n,t.query),i=await R(e,t,{updateSession:!0,...K()});if(nt(i.snapshot.snapshotQuality))throw Zn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Ln(N.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ae(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Fo(e,t,n,r){let i=re(n,t.query),a=await R(e,t,{updateSession:!0,scope:Xn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(nt(a.snapshot.snapshotQuality))throw Zn(a.snapshot.snapshotQuality);if(i){let t=await L(N.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ae(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Io(e,n,r,i){let a=await R(e,{...n,session:r},{updateSession:!0,...K()}),o=await L(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,we(i.selector,[],{unique:!0}),{hint:se([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Lo=async(e,n)=>{let r=xe(n.predicate);if(!r.ok)throw new t(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=Be(n);if(e)throw ze(e)}if(i===`text`&&!n.expectedText)throw new t(`INVALID_ARGS`,ve);let a=n.selector,o=await Ro(e,n,i,a);return i===`exists`?await zo(e,o,a):i===`absent`?await lo(o.snapshot,a,e.backend.platform):await Bo(e,n,o,i,a)};async function Ro(t,n,r,i){try{return await R(t,n,{updateSession:!0,...K(r)})}catch(t){throw r!==`absent`||e(t)?t:Ae(i,t)}}async function zo(e,n,r){let i=await L(N.readAny,n.snapshot.nodes,r,{platform:e.backend.platform});if(i.kind!==`target`)throw new t(`COMMAND_FAILED`,we(r,[],{unique:!1}),{hint:se([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Ce(r)}}async function Bo(e,n,r,i,a){let o=await L(N.readUnique,r.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,t)=>Wr(e,t,n.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,we(a,[],{unique:!0}),{command:`is`,reason:T.selectorNotFound,predicate:i,selector:a,hint:se([])});let s=ye({predicate:i,node:o.node,visibility:v(r.snapshot.nodes),expectedText:n.expectedText,platform:e.backend.platform});if(!s.pass)throw new t(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:T.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,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(e,n,n.gesture.intent);let r=await wa(e,n),i=qe(n.gesture,r,e.backend.platform),a=I(await e.backend.performGesture(P(e,n),i)),o=Go(i.pointers,0),s=Go(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Ko(n.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,n){let r=e.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new t(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function 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:$i};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=$o(n.x,0,e.width-1),i=$o(n.y,0,e.height-1),a=$o(n.right,0,e.width-1),o=$o(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,Yo),Q(e,n,o-t,Yo);for(let n=i;n<=o;n+=1)Q(e,r+t,n,Yo),Q(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 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 $o(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const es=[{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 ts(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(!is(t,a,e))continue;let c=0,l=rs(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=ns({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function ns(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 es){let o=s+e.x,u=c+e.y;if(!as(o,u,i,a))continue;let d=u*i+o;is(t,n,d)&&(l=rs(r,n,l,d))}return l}function rs(e,t,n,r){return t[r]=1,e[n]=r,n+1}function is(e,t,n){return e[n]===1&&t[n]!==1}function as(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function os(e,t){return e.flatMap(e=>ss(e,t.baseline.width,t.baseline.height)?cs(e,t,ms(t.baseline.height)):[e])}function ss(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ps(n)&&r>=t*.35}function cs(e,t,n){let r=fs(e,ds(us(ls(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])=>hs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function ls(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 us(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 ds(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 fs(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 ps(e){return Math.max(48,Math.round(e*.07))}function ms(e){return Math.max(24,Math.round(e*.03))}function hs(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??=gs(t,a),_s(i,e,t,a,r.baseline,r.current))}return i}function gs(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 _s(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 vs=2.5;function ys(e){let t=bs(e);return os(t.length<=2e3?Cs(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)=>Es(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function bs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ts({mask:t,width:i,height:a,hooks:{create:e=>xs(e,i),visit:(e,t)=>Ss(e,t,i,n,r)}})}function xs(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 Ss(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 Cs(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=>ws(e,r,t));if(!e){n.push({...r});continue}Ts(e,r)}return n}function ws(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 Ts(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 Es(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=Ds(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ds(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Kt({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:As(r,n.width,n.height),size:js(s,n.totalPixels),location:Os(i,n.width,n.height),averageBaselineColorHex:Ns(a),averageCurrentColorHex:Ns(o),baselineLuminance:Math.round(Ms(a)),currentLuminance:Math.round(Ms(o)),dominantChange:ks(a,o)}}function Ds(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Os(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 ks(e,t){let n=Ms(t)-Ms(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 As(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*vs?`horizontal-band`:e.height>=e.width*vs?`vertical-band`:`compact`}function js(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Ms(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([k.readFile(e),k.readFile(t)]),[o,s]=await Promise.all([rt(i,`baseline screenshot`),rt(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 it({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?ys({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new ot.PNG({width:o.width,height:o.height});e.data=d,Xo(e,m),await k.mkdir(lt.dirname(r),{recursive:!0}),await k.writeFile(r,await at(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,n){try{await k.access(e)}catch{throw new t(`INVALID_ARGS`,`${n}: ${e}`)}}function Rs(e,n,r,i){if(i==null||i<=0)return;let a=e*n;if(!(a<=i))throw new t(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function zs(e){if(e)try{await k.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=qt(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,r,i){if(r.kind===`path`&&!e.policy.allowLocalInputPaths)throw new t(`INVALID_ARGS`,`Local ${i.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(r,i)}catch(e){throw n(e)}}async function Gs(e,r,i){if(r?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new t(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(r,{...i,visibility:i.visibility??`client-visible`,requestedClientPath:r?.kind===`downloadableArtifact`?r.clientPath??i.requestedClientPath:i.requestedClientPath})}catch(e){throw n(e)}}async function Ks(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const qs=async(e,n)=>{if(!n.baseline)throw new t(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Js(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!nc(i))throw new t(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Ws(e,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let t;nc(i)?(s=await Ys(e,n),t=s.path):(o=await Ws(e,i,{usage:`diff screenshot current`,field:`current`}),t=o.path),c=n.out?await Gs(e,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Is(a.path,t,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});nc(i)&&(u=await Xs(e,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Js(e){if(e==null||e===``)return .1;let n=Number(e);if(Number.isNaN(n)||n<0||n>1)throw new t(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function 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,n,r,i={}){if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??e.signal,metadata:n.metadata},r,i)??{}}function 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=lt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function tc(e){try{await k.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,n)=>{if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);c(n);let r=await Gs(e,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await et(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function ac(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!a(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let i=Ue(t),o=new Set;return i.hiddenCount>0&&o.add(`offscreen-nodes`),i.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),i.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:t.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:o(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,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 d(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:ac({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...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=Oi(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=Di(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,n){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=yc(a,e),s=d(o,cc(o,n)),c=l(a),u=F(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:Cc({result:a,annotations:c,snapshot:s,options:n,session:i,capturedAt:s.createdAt??u,runtimeNow:u})}}function yc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:F(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:ct(e.producer)===`unavailable`&&void 0:e.truncated}function Cc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...$e(e.annotations.quality,e.snapshot.nodes)),t.push(...tt(Sc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Nt(e.snapshot.postGestureOutcome)),t.push(...Oc(e)),e.annotations.quality||(t.push(...Tc(e)),t.push(...Dc(e.snapshot.nodes)));let n=Le(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 kn(Fc,e)}export{Nt as A,tn as C,Ht as D,Wt as E,dt as F,pt as I,Ot as M,Dt as N,Ut as O,ft as P,rn as S,j as T,vn as _,Jo as a,gn as b,Ln as c,kn as d,I as f,_n as g,N as h,Ws as i,It as j,A as k,L as l,En as m,sc as n,qo as o,P as p,Gs as r,sr as s,Ic as t,Rn as u,xn as v,Qt as w,hn as x,Sn as y};
|
|
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};
|