agent-device 0.21.20 → 0.21.21
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.20.apk → agent-device-android-ime-helper-0.21.21.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.21.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.manifest.json → agent-device-android-ime-helper-0.21.21.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.20.manifest.json → agent-device-android-snapshot-helper-0.21.21.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
- package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +121 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +27 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.js +1 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-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/alert.js +1 -1
- package/dist/src/android-adb.d.ts +12 -0
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/app-backend.js +1 -0
- 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 +2 -2
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-log-session-resource.js +1 -0
- 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 +2 -2
- 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 -1
- package/dist/src/capabilities.js +1 -1
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +13 -5
- 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-options.js +3 -0
- package/dist/src/client-types.d.ts +88 -5
- package/dist/src/clipboard-shell-response.js +1 -1
- package/dist/src/cloud-artifacts.d.ts +7 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-artifacts.js +1 -0
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-liveness-probe.js +1 -0
- package/dist/src/daemon-client-transport.js +1 -1
- package/dist/src/daemon-http.js +1 -0
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -0
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- 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 -1
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-release.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 -3
- package/dist/src/device3.js +3 -0
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +3 -3
- package/dist/src/dispatch-resolve.js +4 -1
- package/dist/src/display-inventory.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/durable-capture-resource.js +1 -0
- 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/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- 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/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host-file.js +1 -1
- 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 +2 -2
- package/dist/src/install-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source.d.ts +5 -0
- package/dist/src/install-source2.js +1 -1
- package/dist/src/instance-client.js +1 -0
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-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 +1 -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 +4 -4
- 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-client.js +4 -30
- package/dist/src/ios-settings.js +1 -0
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-registry-scope.js +1 -0
- package/dist/src/lease-scope.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/legacy-xctest-device-set.js +1 -1
- package/dist/src/limrun-download-file.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +28 -2
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/load.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/macos-facade.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/observation.js +1 -1
- package/dist/src/observe-until.js +1 -1
- package/dist/src/overlay.js +2 -2
- package/dist/src/owner-identity.js +3 -3
- package/dist/src/path-resolution.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-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.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 +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.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-output-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/plugins.d.ts +9 -0
- package/dist/src/plugins.js +1 -0
- package/dist/src/plugins2.js +2 -0
- 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/project-runtime.js +1 -1
- package/dist/src/provider-credential-fingerprint.js +1 -0
- package/dist/src/provider-device-admission.js +1 -1
- package/dist/src/provider-device-runtimes.js +1 -0
- package/dist/src/provider-limrun-credentials.js +1 -0
- package/dist/src/provider-profile-fields.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -2
- package/dist/src/provider-webdriver.js +2 -1
- package/dist/src/providers.js +1 -1
- package/dist/src/proxy.js +1 -1
- 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/record-trace.js +1 -1
- package/dist/src/recording.js +1 -1
- package/dist/src/rect-center.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +39 -39
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +5 -5
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-cancellation.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-artifact-manifest.js +1 -1
- package/dist/src/runner-cache-metadata.js +3 -3
- package/dist/src/runner-client.js +1 -1
- 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 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-session-types.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-admission.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-result.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.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +45 -2
- 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/sdk-selectors.d.ts +33 -4
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +2 -2
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-artifact-paths.js +1 -1
- package/dist/src/session-repair-tombstone.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-stream.js +27 -0
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl-settings-facade.js +1 -0
- package/dist/src/simctl-settings.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-diagnostics.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/store.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/surface-snapshot.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/telemetry.js +1 -1
- 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/toolchain-probe.js +2 -2
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.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/update-check.js +1 -1
- package/dist/src/vars.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/version.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 +5 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +0 -1
- package/dist/src/api.js +0 -3
- package/dist/src/daemon-process.js +0 -1
- package/dist/src/multitouch-support.js +0 -1
- package/dist/src/parameterized-recorded-fill.js +0 -1
- package/dist/src/runner-startup-transport.js +0 -1
- package/dist/src/runner-xctestrun.js +0 -1
- package/dist/src/session-store.js +0 -4
package/dist/src/runtime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e,G as t,M as n,N as r,P as i,R as a,S as o,b as s,v as c,x as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{r as d,t as f}from"./snapshot-capture-annotations.js";import{f as p,l as m,n as h}from"./android-input-ownership.js";import{Bn as g,Br as _,Cn as v,Dr as y,En as ee,Fr as te,Gn as ne,Hn as re,Hr as ie,Jn as b,Kn as ae,Lr as x,Mr as oe,Nr as se,On as ce,Pn as le,Pr as ue,Qr as de,Rn as fe,Sn as pe,Sr as me,Tn as he,Vn as ge,Yn as _e,Yr as ve,Zn as ye,dn as be,gr as xe,hr as Se,jn as Ce,jr as we,kn as S,lr as Te,mr as Ee,qn as De,qr as C,zn as Oe,zr as ke}from"./sdk-batch.js";import{r as w}from"./success-text.js";import{a as Ae,c as je,f as Me,g as Ne,h as Pe,i as Fe,m as Ie,n as Le,o as T,p as Re,r as ze,s as Be,u as Ve}from"./overlay.js";import{n as He,t as Ue}from"./mobile-snapshot-semantics.js";import{r as E}from"./diagnostics.js";import"./diagnostics2.js";import{i as D,n as O,t as We}from"./rect-center.js";import{a as Ge,n as Ke,t as qe}from"./gesture-plan.js";import{t as Je}from"./android-snapshot-quality.js";import{n as Ye,r as Xe}from"./android-system-chrome.js";import{t as Ze}from"./observe-until.js";import{n as Qe,t as k}from"./selector-pipeline-policy.js";import{i as $e}from"./ios-system-surface.js";import{c as et,n as tt,o as nt,r as rt,s as A}from"./quality-warnings.js";import{r as it}from"./png.js";import{a as at,n as ot,o as st}from"./png-worker-client.js";import{n as ct}from"./ios-snapshot-acquisition.js";import lt from"node:path";import{promises as j}from"node:fs";import{createHash as ut}from"node:crypto";function dt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function ft(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=b(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function pt(e,t,n,r){return e.filter(e=>{if(!De(b(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&ae(i.chain,r)})}const mt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),ht={strippedIndexes:new Set,refs:new Set};function gt(e){let t=new Set(e.filter(e=>x(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return ht;let n=new Map(e.map(e=>[e.index,e])),r=xt(e,n,t),i=new Set(r),a=kt(e,n,r);for(let t of xt(e,n,a))i.add(t);for(let o of _t(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function _t(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=yt(t,n,r);if(o.size===0)return a;let s=bt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&vt(n,t,o)&&a.add(n.index);return a}function vt(e,t,n){if(!e.rect)return!1;let r=At(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function yt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=At(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function bt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function xt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)jt(i,t,n)&&r.add(i.index);return r}function St(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Xe(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(h).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:wt(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?ht:{strippedIndexes:o,refs:s}}function wt(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&St(e,t)).map(e=>e.index))}function Tt(e,t){let n=gt(e),r=Ct(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Et(e,t){let{strippedIndexes:n}=Tt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Dt(e,t){return Tt(e,t).refs}function Ot(e){return gt(e).refs}function kt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||x(n.type??``)!==`keyboard`)continue;let i=At(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>mt.has(x(e.type??``))&&!n.has(e.index)&&jt(e,t,a))&&r.delete(i)}return r}function At(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(x(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function jt(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Mt={intervalMs:200,budgetMs:1500,minPolls:2},Nt=Mt.budgetMs+2e3;function Pt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Ft(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function It(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Lt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),m=await Ze({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Mt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let m=p(i);if(d=r.signaturesStable(m.signature,f.signature),!d)return{kind:`continue`};let h=a()-o;if(c&&l!==f.backend)return E({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let g=It({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:h,distrustCapMs:Nt,classifyBaselineEvidence:r.classifyBaselineEvidence});return g===`distrust`?{kind:`continue`,budgetMs:Nt}:(Rt(g,t.action,s,h),{kind:`done`,result:zt(g,t,f,r,u)})}});if(m.kind===`done`)return m.result;if(m.kind===`failed`)throw m.error;E({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:m.waitedMs,lastPairAgreed:d}});let h=m.last;return d?{value:h}:{value:h,postGestureOutcome:Ft(`unsettled`,t)}}function Rt(e,t,n,r){if(e===`accept-stale`){E({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}E({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Ft(`no-effect`,t)}:(E({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Bt(e,t,n,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>i)throw new r(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${i}`);return e}function Vt(e,t,n){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new r(`INVALID_ARGS`,t,n);return{x:i,y:a}}function Ht(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ut(),policy:e.policy??qt(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function Ut(e=[]){let t=new Map(e.map(e=>[e.name,Wt(e)]));return{get:e=>Wt(t.get(e)),set:e=>{t.set(e.name,Wt(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>Wt(e))}}function Wt(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Gt(e.metadata)}:{}}}function Gt(e){try{return structuredClone(e)}catch{return{...e}}}function Kt(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function qt(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Jt=new WeakMap;function Yt(e,t){Zt(e)&&Jt.set(e,t)}function Xt(e){return Zt(e)?Jt.get(e):void 0}function Zt(e){return typeof e==`object`&&!!e||typeof e==`function`}function M(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function N(e){return e.clock?.now()??Date.now()}async function Qt(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function $t(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function P(e){return e&&typeof e==`object`?e:void 0}async function F(e,t,n){if(!e.backend.captureSnapshot)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new r(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(M(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:N(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}function en(e){let t=Buffer.alloc(16);for(let n of e)nn(t,tn(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function tn(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function nn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function rn(e){let{digest:t,nodeCount:n}=en(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=an(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function an(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function I(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function on(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:$e(n)}}function sn(e,t){let n=rn(e.nodes),r=on(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==rn(t.nodes).digest;return{...n,changedFromBefore:i}}function cn(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function ln(e,t){let n=l(e.type??`Element`),r=Re(e,n),i=Pe(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function un(e,t,n={}){let r=pn(fn(e,n),fn(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function dn(e,t={}){return fn(e,t).length}function fn(e,t){return t.flatten?e.map(e=>({text:Ie(e,0,!1),comparable:ln(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:ln(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function pn(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=hn(a,i,s)?L(a,i+1):L(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return mn(o,e,t,n,r)}}return[]}function mn(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=hn(i,c,r)?c+1:c-1,u=L(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function hn(e,t,n){return t===-n||t!==n&&L(e,t-1)<L(e,t+1)}function L(e,t){return e.get(t)??0}function gn(e,t){return e.find(e=>ie(e,t))??null}function R(e,t){let n=se(e);return n&&te(n)?n:_n(e,t)}function _n(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=se(e);if(!t||!te(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function vn(e){return e===`text`||e===`label`||e===`any`}function yn(e,t,n,r){if(!(r||e===`web`))return vn(t)?n:void 0}function bn(e){return new r(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function xn(e,t){let n=t??`default`,i=await e.sessions.get(n);if(!i)throw new r(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new r(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:i,snapshot:a}}async function z(e,t,n={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=Sn(await i(M(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!A(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function Sn(e,t){return e.snapshot?Cn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:N(t)}}function Cn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function wn(e,t,n){if(e.backend.readText){let r=await e.backend.readText(M(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Ne(n)}function Tn(t,n,i){let a=e(n);if(!a)throw new r(`INVALID_ARGS`,i.invalidRefMessage);let o=s(t,a)??(i.fallbackLabel.length>0?gn(t,i.fallbackLabel):null);if(!o)throw new r(`COMMAND_FAILED`,i.notFoundMessage,{reason:T.refNotFound,ref:a,hint:v});return{ref:a,node:o}}async function En(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Dn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?On(e.nodes):e.nodes).map(jn);return n.sort((e,t)=>Nn(e).localeCompare(Nn(t))),{captureBackend:t,nodes:n}}function On(e){let t=y(e);return e.filter(e=>we(e)||t.isVisibleOnScreen(e))}function kn(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function An(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function jn(e){return{identity:`${e.type??``}#${Mn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Mn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Nn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Pn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Fn(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=N(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;N(e)<o;){let c=await Hn(e,t,o-N(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=In(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Dn(c.snapshot);_=Rn({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=N(e),ee=Bn({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Qt(e,t);continue}if(!kn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await Qt(e,te)}return{settled:!1,stalled:!1,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h}}function In(e,t,n){if(!e||!t||!Ln(t.backend,n))return;let r=t.nodes.some(we),i=e.length<=5;if(!(!r&&!i))return Dn({...t,nodes:e})}function Ln(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Rn(e){return e.requestedQuietMs<500||!An(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function zn(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Bn(e){if(!(e.resetRequested!==!0||e.alreadyReset||!zn(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Vn(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Hn(e,t,n,r){let i=await En(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Un=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Wn=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Gn(e,t,n){return await qn(e,t,{...n,baseline:await Xn(e,t,n.resolved),actionPoint:n.resolved.point})}const Kn=async(e,t)=>(await qn(e,t,t)).observation;async function qn(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Jn(e,t,n,a,await Fn(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function Jn(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Wn:Un}};let{stored:o,session:s}=await lr(e,t,i.lastCapture),c=I(i.lastCapture.snapshot),l=c.nodes,u=on(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?tr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...sr(i,o,l.length,u)},settledCapture:c}}function Yn(e,t){if(e)return sn(e,t)}async function Xn(e,t,n){let r=await e.sessions.get(t.session??`default`);return Zn(n,r)??$n(n.preAction)??Qn(r)}function Zn(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?$n(I(n)):void 0}function Qn(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?I(t):{nodes:[]}}function $n(e){return e?.nodes.length?e:void 0}function er(e,t,n){let r=un(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=or(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function tr(e,t,n,r){let i=er(e,t,r);return{diff:i,...nr(i,t,n,r)}}function nr(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Dt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!rr(o.get(e),n))?{}:ar(t,i,r)}function rr(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const ir=new Set([`application`,`window`]);function ar(e,t,n){let r=Dt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ir.has(l(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=l(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function or(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function sr(e,t,n,r){let i=cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=cn(r);return{hint:i===void 0?a:`${a} ${i}`}}function cr(e,t,n){return e.stalled?{hint:Wn}:e.settled?t?n<5?{hint:Pn}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Un}}async function lr(e,t,n){if(A(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ur(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function dr(e,t,n,r,i){let a=await fr(e,t,n,i);return mr({...r,...a})}async function fr(e,t,n,r){if(r.settle!==void 0){let i=await Gn(e,t,{...r.settle,resolved:n}),a=r.verify?Yn(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await pr(e,t,n);return i?{evidence:i}:{}}async function pr(e,t,n){try{return sn(I((await F(e,t,!0)).snapshot),n.preAction)}catch{return}}function mr(e){let t=e;if(t.targetHittable!==!1||!hr(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function hr(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function gr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?vr(a):a.matchedNodes.length>1?_r(a):vr(a)}let a=ce(e,t,{...r,...pe({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:_r(a.firstMatch):{kind:`none`}}function _r(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function vr(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function yr(e,t,n){let r=ee(e,me(t),n);return r?{...r,selector:r.selector.raw}:null}function br(e,t,n,r){let i=gr(e,me(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function xr(e){return e}function Sr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Cr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function B(e){return[e.type,e.role,e.subrole].map(e=>x(e??``)).some(e=>e===`tab`||Cr.some(t=>e.includes(t)))}function wr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Vr(e);if(!Tr(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Nr(e,n,r).node;for(let n of t.slice(1))if(Nr(e,n,r).node.index!==i.index){let e=Or(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Tr(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Er(i,a,t)&&!Er(a,i,t))return!1}return!0}function Er(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Dr(e,t){return Or(t,Vr(e))}function Or(e,t){if(e.length<2||!Tr(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!B(n)||!e.every(e=>e===n||!B(e)))return null;let r=O(n.rect);return r&&e.every(e=>kr(O(e.rect),r))?n:null}function kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Ar(e,t){if(!t?.rect||!e.rect||!we(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function jr(e,t){return Nr(e,t)}function Mr(e){let t=Vr(e);return n=>Nr(e,n,t)}function Nr(e,t,n){return m(t)?{node:t,reason:`covered`}:Pr(e,t,n)??Fr(t)??Ir(e,t,n)??{node:t,reason:`original`}}function Pr(e,t,n){let r=Rr(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Fr(e){return B(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function Ir(e,t,n){let r=Lr(e,t,n);return!r?.rect||m(r)||!D(r.rect)?null:zr(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Lr(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?_(e,t,n.nodesByIndex,e=>r(e)?e:null):ke(e,t,r)}function Rr(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||m(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function zr(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(Br(t)&&!We(i,a))return!0;let o=oe(n,i,r?.viewportRootRects);return!o||!Hr(a,o)?!1:!We(i,a)}function Br(e){let t=x(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Vr(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(we(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Hr(e,t){let n=Sr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function V(e,t,n,r,i={}){let a=br(qr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Wr(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Ur(t,a);return o?await Wr(e,t,o,i):a}function Ur(e,t){let n=Dr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Wr(e,t,n,r){let i=await Kr(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Gr(e,t,n,r){let i=qr(e,t);return{candidates:i,list:yr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Kr(e,t,n,r={}){r.onResolved?.(n,t);let i=Jr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||m(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Yr(e,t,i.node,r)}}function qr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!m(e)):t}function Jr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Ar(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Yr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Xr(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const Zr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),Qr=new Set([`keyboard`,`key`]);function $r(e){return Qr.has(x(e.type??``))||h(e)}const ei=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function ti(e){return $r(e)||ei.has(e.role??``)}function ni(e,t,n){return n.has(e.index)||ai(t,n,e.index).length>0}function ri(e){return e!==null&&ve(e)}function H(e){return e.flatMap(e=>ve(e.rect)?[e.rect]:[])}function ii(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of ai(n,r,e.index))i.add(t);return i}function ai(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function oi(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function si(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function ci(e){let t=H(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return oi(t.length>0?t:e.anchorRects)}function li(e){let t=e.filter(ti),n=ii(e,t);return H(t.filter(e=>!n.has(e.index)))}function ui(e,t){let n=e.filter($r),r=H(n);if(r.length===0||!ri(t))return null;let i=e.filter(ti),a=H(i);if(a.length===0)return null;let o=si({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=ii(e,i);return ci({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:H(i.filter(e=>!s.has(e.index)))}:null}function di(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:li(e.nodes)}:ui(e.nodes,e.viewport);if(!t)return e.nodes.some($r)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return fi(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(ti).map(e=>e.index));return ni(e.node,n,r)?{kind:`clear`,surface:t}:C(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function fi(e,t){return t.controlRects.some(t=>C(t,e.x,e.y))?{kind:`clear`,surface:t}:C(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function pi(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function mi(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=di({nodes:e.nodes,viewport:y(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw _i({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function hi(e){let t=di({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return gi(e.point,t.surface)}function gi(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Zr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Zr.hint}function _i(e){return a(new r(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${pi(e.action)} safely`,{...Zr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function vi(e){return a(new r(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${pi(e.action)} safely`,{reason:T.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function yi(e){let t=await Kr(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw vi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return mi({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function bi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${Si(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function xi(t,n,r,i,a,{action:o}){return await Ci(t,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:e(a)},hint:e=>`${Si(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Si(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Ci(e,t,n,i,o){let s=y(i),c=n.rect?s.resolveEffectiveViewport(n):null;if(!n.rect||!c||s.isVisibleOnScreen(n))return n;let l=s.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(M(e,t),n,l);if(u)return{...n,rect:u};let d=He(n,s);throw a(new r(`COMMAND_FAILED`,o.message,{...o.details,rect:n.rect,viewport:c,...d?{scrollDirection:d}:{},hint:o.hint(d)}),`no`)}function wi(e,t,n,i){let{candidates:a,list:o}=Gr(i,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=wr(a,s);if(l.kind===`ambiguous`)throw new r(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ie(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Ti(e,t,n,r){let i=await F(e,t,r.requireInteractive),a=wi(i.snapshot.nodes,n,e.backend.platform,r.pipeline);if((!a||!a.node.rect)&&r.requireInteractive){let s=i.snapshot;i=await F(e,t,!1),o(s,i.snapshot),a=wi(i.snapshot.nodes,n,e.backend.platform,r.pipeline)}return{capture:i,resolved:a}}async function Ei(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await V(k.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return vi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Di(e){let{runtime:t,nodes:n,selectorExpression:i,action:o,resolved:s}=e,c=await Ei({runtime:t,nodes:n,selectorExpression:i,action:o});if(c)return c;let l=s?.diagnostics??[];return a(new r(`COMMAND_FAILED`,he(i,l,{unique:!0}),{reason:T.selectorNotFound,hint:S(l)}),`no`)}async function Oi(e,t,n,i,s){let c=await Ti(e,t,n,i);if(s&&o(s.snapshot,c.capture.snapshot),c.resolved?.node.rect)return c;let l=c.capture.snapshot.snapshotQuality;if(A(l))throw a(new r(`COMMAND_FAILED`,`Selector ${n} was not found in a sparse capture; the tree cannot prove it absent`,{reason:T.captureSparse,snapshotQuality:l,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ei({runtime:e,nodes:c.capture.snapshot.nodes,selectorExpression:n,action:i.action});if(u)throw u;return c}async function ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Di({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function Ai(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Ze({capture:async i=>{let a=await Oi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Je,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?ji(s.error,s):await ki(e,n,r,s)}function ji(e,t){if(!(e instanceof r)||e.details?.reason!==T.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const U={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Mi=[`runner-start`,`target-discovery`];function Ni(e){let t=e?.readinessPhase;return Mi.find(e=>e===t)}const Pi=`replay_target_guard_mismatch`,Fi=U.landmarkIdentityMismatch;function Ii(e,t,n,i,o){if(!n)return;let s=b(e),c=_e(e,t);if(!(ne(s,n.identity)&&ye(c,n.structural)))throw a(new r(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Pi,observed:s,observedStructural:c,expected:n.identity,expectedStructural:n.structural,...o?{targetRole:o}:{}}),`no`)}function Li(e,t,n){Ii(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function Ri(e){return e.hittable===!0||B(e)}function zi(e,t){let n=re(b(e),t);return n.id!==void 0||n.label!==void 0?!1:g(e.value)===null}function Bi(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Vi(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&Bi(t,e,n)).sort((e,t)=>e.index-t.index)}function Hi(e,t){let n=D(e.rect);return!n||!t.rect?!1:C(t.rect,n.x,n.y)}function Ui(e,t){if(!zi(e,t))return e;let n=Vi(e,t);if(n.some(Ri))return e;let r=n.find(e=>b(e).label!==void 0);return!r||!Hi(r,e)?e:r}function Wi(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const Gi={source:`ref`,phase:`pre-action`,kind:`exact`},Ki={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function qi(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Gi:Ki}}const Ji={source:`runtime`,phase:`pre-action`,kind:`unique`};function Yi(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Xi(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Xi(e,t))}:Ji}function Xi(e,t){let n=x(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Wi(n,256)}:{},...r===void 0?{}:{label:Wi(r,256)}}}function Zi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:Oe(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...$i(t,r),preAction:n,resolution:i,...Qi(e,t,a,r)}}function Qi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ui(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Oe(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function $i(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function ea(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=ta(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ra(e,t):null,r),s=o?ia(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function ta(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>na(e,t,r)).filter(B).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=ra(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function na(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function ra(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function ia(e,t,n,r){let i=la(e),a=sa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=sa(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!C(t,s.x,s.y))return[];let c=aa(s,e,n,r,i);return c?[c]:[]})).sort(oa)[0]?.point??null}function aa(e,t,n,r,i){let a=ca(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function oa(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function sa(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function ca(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function la(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function ua(e,t,n){let i=y(t),o=ea(t,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(o.kind===`resolved`)return o.point;throw o.kind===`invalid`?a(new r(`COMMAND_FAILED`,n.invalidMessage,{reason:T.targetBoundsInvalid,...da(n.blockedTargetDetails)}),`no`):a(new r(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:o.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:o.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function da(t){return`ref`in t?{ref:e(t.ref)??t.ref}:t}function fa(t,n){let i=e(t.ref);if(!i)throw new r(`INVALID_ARGS`,`Invalid ref: ${t.ref}`);let a=e(n.ref),o=n.node.ref?e(n.node.ref):null;if(a!==i||o!==i||!n.nodes.includes(n.node))throw new r(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:qi(i,n.node,`exact`)}}async function pa(e,t,n){let r=await ha(e,t,n);return{tree:I(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function ma(t,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?fa(r,i.preresolvedTarget):await pa(t,n,r),c=a.nodes,{node:l,tapPoint:u}=await yi({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>Li(e,t,i),offscreen:async(e,a)=>await xi(t,n,e,a,r.ref,i)},resolveTapPoint:t=>ua(t,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${e(r.ref)??t.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...Zi(t,l,a,i.action,s.resolution)}}async function ha(e,t,n){let{session:r,snapshot:i}=await xn(e,t.session),a=n.fallbackLabel??``,o=_a(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw va(o,n.ref);return ga({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function ga(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=_a(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&ne(b(a.node),b(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function _a(t,n,i){let a=e(n);if(!a)throw new r(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(t,a);if(ya(o))return{kind:`resolved`,resolved:qi(a,o,`exact`)};let c=i.fallbackLabel.length>0?gn(t,i.fallbackLabel):null;if(ya(c))return{kind:`resolved`,resolved:qi(a,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function va(t,n){let i=e(n)??n,o=t.kind===`unusable`?new r(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:T.targetBoundsInvalid,ref:i,hint:v}):new r(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:T.refNotFound,ref:i,hint:v});return a(o,`no`)}function ya(e){return e?D(e.rect)!==null:!1}async function W(e,t,n){return await wa(e,t,n.action),t.target.kind===`point`?await xa(e,t,t.target,n):t.target.kind===`ref`?await ma(e,t,t.target,n):await Ca(e,t,t.target,n)}async function ba(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=y(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!C(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:hi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function xa(e,t,n,r){let i=await ba(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Sa(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Sa(e,t){try{return I((await F(e,t,!0)).snapshot)}catch{return}}async function Ca(e,t,n,r){let i=n.selector,a,o,s,c=Qe(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await Ai(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Ti(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Di({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await yi({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>Li(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,l.selector,r)},resolveTapPoint:e=>ua(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...Zi(e,u,I(a.snapshot),r.action,Yi(o,a.snapshot.nodes))}}async function wa(e,t,n){if(e.backend.platform!==`macos`)return;let i=await Ta(e,t);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||n!==`click`&&n!==`press`))throw new r(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function Ta(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ea(t,n,r,i){let a=(await t.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||e(r.ref)===null)return{};let s=_a(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=k.resolvedTarget,{node:u}=await yi({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(e,a)=>await xi(t,n,e,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...$i(u,i),node:u,preAction:I(a)}}async function Da(e,t,n,r,i){let a=await Ea(e,t,n,r),o=P(await i(M(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Gi,...a,...o?{backendResult:o}:{}}}function Oa(e,t){let n=y(e),i=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(ka),a=i.length>0?i:e.map(e=>e.rect).filter(ka);if(a.length===0)throw new r(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function ka(e){return!!(e&&e.width>0&&e.height>0)}async function Aa(e,t){return await e.backend.resolveGestureViewport?.(M(e,t))||Oa((await F(e,t,!1)).snapshot.nodes,`gesture`)}const ja=async(e,t)=>{let n=await W(e,t,{action:`focus`,requireInteractive:!0,pipeline:k.resolvedTarget});if(!e.backend.focus)throw new r(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(n),a=P(await e.backend.focus(M(e,t),i));return{...n,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ma=async(e,t)=>{let n=ur(t),i=await W(e,t,{action:`longPress`,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new r(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:Bt(t.durationMs,`durationMs`,0,12e4),o=G(i),s=P(await e.backend.longPress(M(e,t),o,{durationMs:a}));return await dr(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},n)},Na=async(e,t)=>{let n=ur(t),i=n.needsPreActionBaseline?null:await Pa(e,t);if(i)return i;let a=await W(e,t,{action:`hover`,requireInteractive:!1,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new r(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=P(await e.backend.hover(M(e,t),o));return await dr(e,t,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},n)};async function Pa(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Da(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Fa=async(e,t)=>{if(!e.backend.performGesture)throw new r(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await wa(e,t,`drag`);let n=await Aa(e,t),i=await Ia(e,t,`source`),a=await Ia(e,t,`destination`),o=qe({from:G(i),to:G(a),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=P(await e.backend.performGesture(M(e,t),o)),{start:c,end:l}=Ge(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:La(i),destination:La(a)},recording:Ra(i,a),...s?{backendResult:s}:{},...w(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Ia(e,t,n){let r=t.gesture[n];return await W(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:k.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function La(e){if(e.kind===`point`||!e.resolution)throw new r(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function Ra(e,t){let n=za(e),r=za(t),i=Ba(e),a=Ba(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function za(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Ba(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(e){if(!e.point)throw new r(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Va=async(e,t)=>await Wa(e,t,`press`),Ha=async(e,t)=>await Wa(e,t,`click`),Ua=async(e,t)=>{if(typeof t.text!=`string`)throw new r(`INVALID_ARGS`,`fill requires text`);let n=ur(t),i=n.needsPreActionBaseline?null:await qa(e,t);if(i)return i;let a=await W(e,t,{action:`fill`,requireInteractive:!0,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new r(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Ga(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&ue(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=P(await e.backend.fill(M(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ya(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await dr(e,t,a,{...a,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function Wa(e,t,n){let i=ur(t),a=i.needsPreActionBaseline?null:await Ka(e,t,n);if(a)return a;let o=await W(e,t,{action:n,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new r(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Ga(o),c;try{c=await e.backend.tap(M(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Yt(e,o),e}let l=P(c);return await dr(e,t,o,{...o,...l?{backendResult:l}:{}},i)}function Ga(e){if(!e.point)throw new r(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ka(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Ja(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Da(e,t,t.target,n,async(e,t)=>await r(e,t))}async function qa(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Da(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Ja(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Ya(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Xa=k.wait.poll.defaultTimeoutMs;function Za(e,t,n,r,i={}){let a=Xr(r),o=n??a.defaultTimeoutMs,s=Y(e),c=po(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await En(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Qa(r,c.lastUnobservedCause())),o;let f=$a(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:eo(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await mo(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Qa(e,t){return e?`readable`:t?.outcome??`unreadable`}function $a(e,t){let n=uo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let i=Ni(e instanceof r?e.details:void 0);return i?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:i}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function eo(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function to(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function no(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function ro(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function io(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.deadlineExceeded,captureTruncated:!0,...t})}function ao(e,t){return new r(`COMMAND_FAILED`,e,{reason:U.targetAbsent,...t})}function oo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw so(r.error,t);if(n)throw r.error}}function so(e,t){let n=i(e);return new r(n.code,n.message,{reason:U.captureStalled,...n.details,...t},n)}function q(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return no(e,r);case`readiness-exhausted`:return oo(t,r,!1),ro(e,r);case`capture-stalled`:return oo(t,r,t.preserveUnreadableOnStall===!0),to(e,r);case`capture-truncated`:return io(e,r);case void 0:return oo(t,r,!0),r.readableCaptures===0?to(e,r):ao(e,r);default:return lo(n)}}function co(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function lo(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function uo(e){if(!(e instanceof r))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...J(t,`runnerRestartReason`),...J(t,`runnerRestartCommand`),...J(t,`runnerRestartCommandId`),...J(t,`runnerInvalidatedSessionId`),...J(t,`runnerRestartSessionId`),...J(t,`logPath`),...J(t,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function fo(e){return e instanceof r&&e.details?.retriable===!0}function po(e=Je){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(fo(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function mo(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function ho(e,t,n){let r=await V(k.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:je(e,i)}}async function go(e,t,n){let r=await ho(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Fe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function _o(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Za(t,n,i,k.wait,{isUnreadableError:yo,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await ho((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Je(e)?Ae(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw co(l)?q(`wait absent timed out for selector: ${r}`,o,l):c?vo(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function vo(e,t,n){let i=t.matches!==1;return new r(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${i?`es`:``} remain`,{reason:U.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function yo(e){if(!(e instanceof r))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Ve(t.observation)||t.observation===`unreadable`)}function bo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function xo(e,t,n,i,a,o){let s=Za(t,n,a,k.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let r=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(r.timedOut){u=r.deadline;break}let a=r.value;if(a){let e=a.snapshot.nodes,n=bo(await V(k.wait,e,i,{platform:t.backend.platform}));if(n){let t=So(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new r(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Fi,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function So(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=dt(e),a=pt(t.matchedNodes,i,ge(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:b(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function Co(e,t,n,i,a){let o=a??Xa,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new r(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:U.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function wo(e,t,n,r,i){let a=Za(t,n,i,k.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await To(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function To(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Do(t,n),r)).found?!0:await Eo(e,t,n,r)}async function Eo(e,t,n,r){return!!gn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Do(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Oo(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await mo(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await ko(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await xo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await _o(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await Co(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await Ao(e,t,n,n.target.text,n.target.timeoutMs);default:return jo(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let i=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(i.kind!==`text`)throw new r(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function ko(t,n,i,a,o){let c=await t.requireSnapshot(n,i.session),l=e(a);if(!l)throw new r(`INVALID_ARGS`,`Invalid ref: ${a}`);let u=s(c.snapshot.nodes,l);if(!u)throw new r(`COMMAND_FAILED`,`Ref ${a} not found`,{reason:T.refNotFound,ref:l,hint:v});let d=R(u,c.snapshot.nodes);if(!d)throw new r(`COMMAND_FAILED`,`Ref ${a} has no label to wait for`,{reason:T.refUnlabeled,ref:l});return await wo(t,n,i,d,o)}async function Ao(e,t,n,i,a){let o=Ee(i);if(!o.ok)throw new r(o.code,o.message);return await wo(e,t,n,o.text,a)}function jo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Mo=Oo({captureSnapshot:z,requireSnapshot:xn,stable:{defaultQuietMs:500,tinyTreeHint:Pn,tinyTreeNodeCount:5,capture:Fn}}),No=Mo.waitCommand,Po=Mo.waitForTextCommand,Fo=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new r(`INVALID_ARGS`,Ce);if(t.action===`wait`)return await zo(e,t,n);if(t.action===`list`)return await Bo(e,t,n);let{capture:i,match:a}=await Vo(e,t,n);if(!a)throw new r(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await wn(e,i,a),node:a}},Io=async(e,t)=>{if(t.target.kind===`ref`){let n=await xn(e,t.session),r=Tn(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});Ii(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=Oe(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await wn(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Ho(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?k.readText:k.readUnique,hooks:{onResolved:(e,n)=>Ii(e,n,t.expectedResolvedTarget,`get`)}}),r=Oe(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await wn(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Lo=async(e,t)=>{let n=await Io(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new r(`COMMAND_FAILED`,`getText returned non-text result`);return n},Ro=async(e,t)=>{let n=await Io(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new r(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function zo(e,t,n){let r=Za(e,t,t.timeoutMs,k.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Vo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Bo(e,t,n){let r=fe(n,t.query),i=await z(e,t,{updateSession:!0,...K()});if(A(i.snapshot.snapshotQuality))throw bn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Gr(k.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:le(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Vo(e,t,n,r){let i=fe(n,t.query),a=await z(e,t,{updateSession:!0,scope:yn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(A(a.snapshot.snapshotQuality))throw bn(a.snapshot.snapshotQuality);if(i){let t=await V(k.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:le(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Ho(e,t,n,i){let a=await z(e,{...t,session:n},{updateSession:!0,...K()}),o=await V(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new r(`COMMAND_FAILED`,he(i.selector,[],{unique:!0}),{hint:S([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Uo=async(e,t)=>{let n=Se(t.predicate);if(!n.ok)throw new r(n.code,n.message,{hint:n.hint});let i=n.predicate;if(i===`absent`){let e=Be(t);if(e)throw ze(e)}if(i===`text`&&!t.expectedText)throw new r(`INVALID_ARGS`,Te);let a=t.selector,o=await Wo(e,t,i,a);return i===`exists`?await Go(e,o,a):i===`absent`?await go(o.snapshot,a,e.backend.platform):await Ko(e,t,o,i,a)};async function Wo(e,n,r,i){try{return await z(e,n,{updateSession:!0,...K(r)})}catch(e){throw r!==`absent`||t(e)?e:Ae(i,e)}}async function Go(e,t,n){let i=await V(k.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(i.kind!==`target`)throw new r(`COMMAND_FAILED`,he(n,[],{unique:!1}),{hint:S([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:be(n)}}async function Ko(e,t,n,i,a){let o=await V(k.readUnique,n.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,n)=>Ii(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new r(`COMMAND_FAILED`,he(a,[],{unique:!0}),{command:`is`,reason:T.selectorNotFound,predicate:i,selector:a,hint:S([])});let s=xe({predicate:i,node:o.node,visibility:y(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new r(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:T.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:be(a),node:o.node,preActionNodes:n.snapshot.nodes}}const qo=async(e,t)=>await Uo(e,{...t,predicate:`visible`,selector:t.target.selector}),Jo=async(e,t)=>await Uo(e,{...t,predicate:`hidden`,selector:t.target.selector}),Yo=async(e,t)=>{if(!e.backend.performGesture)throw new r(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await wa(e,t,t.gesture.intent);let n=await Aa(e,t),i=Ke(t.gesture,n,e.backend.platform),a=P(await e.backend.performGesture(M(e,t),i)),o=Zo(i.pointers,0),s=Zo(i.pointers,-1);return{kind:t.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Qo(t.gesture,o,s))}},Xo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Fa(e,{...t,gesture:n}):await Yo(e,{...t,gesture:n})};function Zo(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new r(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=n;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Qo(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:Fo,get:Io,getText:Lo,getAttrs:Ro,is:Uo,isVisible:qo,isHidden:Jo,wait:No,waitForText:Po},Z={click:Ha,press:Va,fill:Ua,focus:ja,longPress:Ma,hover:Na,gesture:Xo,settleObservation:Kn};function $o(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function es(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const ts=[0,187,255,255];function ns(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||rs(e,n.rect)}function rs(e,t){let n=is(t);if(n==null)return;let r=as(n.x,0,e.width-1),i=as(n.y,0,e.height-1),a=as(n.right,0,e.width-1),o=as(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Q(e,n,i+t,ts),Q(e,n,o-t,ts);for(let n=i;n<=o;n+=1)Q(e,r+t,n,ts),Q(e,a-t,n,ts)}}function is(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Q(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function as(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const os=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ss(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!us(t,a,e))continue;let c=0,l=ls(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=cs({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function cs(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of os){let o=s+e.x,u=c+e.y;if(!ds(o,u,i,a))continue;let d=u*i+o;us(t,n,d)&&(l=ls(r,n,l,d))}return l}function ls(e,t,n,r){return t[r]=1,e[n]=r,n+1}function us(e,t,n){return e[n]===1&&t[n]!==1}function ds(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function fs(e,t){return e.flatMap(e=>ps(e,t.baseline.width,t.baseline.height)?ms(e,t,bs(t.baseline.height)):[e])}function ps(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ys(n)&&r>=t*.35}function ms(e,t,n){let r=vs(e,_s(gs(hs(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>xs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function hs(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function gs(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function _s(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function vs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ys(e){return Math.max(48,Math.round(e*.07))}function bs(e){return Math.max(24,Math.round(e*.03))}function xs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Ss(t,a),Cs(i,e,t,a,r.baseline,r.current))}return i}function Ss(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Cs(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const ws=2.5;function Ts(e){let t=Es(e);return fs(t.length<=2e3?ks(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Ms(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Es(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ss({mask:t,width:i,height:a,hooks:{create:e=>Ds(e,i),visit:(e,t)=>Os(e,t,i,n,r)}})}function Ds(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Os(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function ks(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>As(e,r,t));if(!e){n.push({...r});continue}js(e,r)}return n}function As(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function js(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Ms(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Ns(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ns(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:xr({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Is(r,n.width,n.height),size:Ls(s,n.totalPixels),location:Ps(i,n.width,n.height),averageBaselineColorHex:zs(a),averageCurrentColorHex:zs(o),baselineLuminance:Math.round(Rs(a)),currentLuminance:Math.round(Rs(o)),dominantChange:Fs(a,o)}}function Ns(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Ps(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function Fs(e,t){let n=Rs(t)-Rs(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Is(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ws?`horizontal-band`:e.height>=e.width*ws?`vertical-band`:`compact`}function Ls(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Rs(e){return e.r*.2126+e.g*.7152+e.b*.0722}function zs(e){return`#${Bs(e.r)}${Bs(e.g)}${Bs(e.b)}`}function Bs(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Vs=Math.sqrt(3*255**2);async function Hs(e,t,n={}){await Us(e,`Baseline image not found`),await Us(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([j.readFile(e),j.readFile(t)]),[o,s]=await Promise.all([at(i,`baseline screenshot`),at(a,`current screenshot`)]);Ws(o.width,o.height,`baseline screenshot`,n.maxPixels),Ws(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Gs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Vs,{diffData:d,diffMask:f,differentPixels:p}=await ot({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Ts({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new it.PNG({width:o.width,height:o.height});e.data=d,ns(e,m),await j.mkdir(lt.dirname(r),{recursive:!0}),await j.writeFile(r,await st(e))}else await Gs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Us(e,t){try{await j.access(e)}catch{throw new r(`INVALID_ARGS`,`${t}: ${e}`)}}function Ws(e,t,n,i){if(i==null||i<=0)return;let a=e*t;if(!(a<=i))throw new r(`INVALID_ARGS`,`${n} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Gs(e){if(e)try{await j.unlink(e)}catch(e){if(!Ks(e,`ENOENT`))throw e}}function Ks(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function qs(e,t){return e.map(e=>{let n=Js(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Js(e,t){let n=de(e.rect);return t.map(t=>{let r=t.overlayRect,i=Sr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ys(i/de(r)),regionCoveragePercentage:Ys(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function Ys(e){return Math.round(e*100*100)/100}async function Xs(e,t,n){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new r(`INVALID_ARGS`,`Local ${n.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw i(e)}}async function Zs(e,t,n){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new r(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw i(e)}}async function Qs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw i(e)}}const $s=async(e,t)=>{if(!t.baseline)throw new r(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=ec(t.threshold),i=t.current??{kind:`live`};if(t.overlayRefs&&!cc(i))throw new r(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Xs(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let r;cc(i)?(s=await tc(e,t),r=s.path):(o=await Xs(e,i,{usage:`diff screenshot current`,field:`current`}),r=o.path),c=t.out?await Zs(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Hs(a.path,r,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});cc(i)&&(u=await nc(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function ec(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new r(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function tc(e,t){let n=await Qs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await rc(e,t,n.path,ic(t))}catch(e){throw await n.cleanup(),e}return n}async function nc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await sc(n),r;let a=await Zs(e,ac(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await rc(e,t,a.path,{overlayRefs:!0,...ic(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:qs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function rc(e,t,n,i={}){if(!e.backend.captureScreenshot)throw new r(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,i)??{}}function ic(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function ac(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:oc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:oc(e.out.clientPath)}:{},...e.out.fileName?{fileName:oc(e.out.fileName)}:{}}}function oc(e){let t=lt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function sc(e){try{await j.unlink(oc(e))}catch(e){if(!lc(e,`ENOENT`))throw e}}function cc(e){return e.kind===`live`}function lc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const uc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new r(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await Zs(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i,a;try{a=(await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}))?.displayRotation,t.scale!==void 0&&await nt(n.path,t.scale),i=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...i?{artifacts:[i]}:{},...a?{displayRotation:a}:{},...w(`Saved screenshot: ${n.path}`)}};function dc(e){let{nodes:t,backend:r,snapshotRaw:i}=e;if(i||!n(r))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Ue(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const fc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function pc(e){return e?.systemSurfaceOnly===!0?fc:void 0}function mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function hc(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!gc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!_c(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function gc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function _c(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>yc(e,t.nodes[n]))}const vc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function yc(e,t){return vc.every(n=>e[n]===t[n])&&bc(e.rect,t.rect)&&xc(e.presentationHints,t.presentationHints)&&xc(e.actions,t.actions)}function bc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function xc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Sc=async(e,t)=>{let n=await wc(e,t),r=hc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(Ec(t.session,n));let i=Oc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:dc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...Dc(n)})},Cc=async(e,t)=>{let n=await wc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Ec(t.session,n);if(!i){let t=dn(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=un(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function wc(e,t){if(!e.backend.captureSnapshot)throw new r(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,i=await e.sessions.get(n),a=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=Tc(a,e),s=p(o,mc(o,t)),c=d(a),l=N(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:kc({result:a,annotations:c,snapshot:s,options:t,session:i,capturedAt:s.createdAt??l,runtimeNow:l})}}function Tc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:N(t),...e.keyboard?{keyboard:e.keyboard}:{}}}function Ec(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function Dc(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function Oc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ct(e.producer)===`unavailable`&&void 0:e.truncated}function kc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...rt(Oc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Pt(e.snapshot.postGestureOutcome)),t.push(...Pc(e)),e.annotations.quality||(t.push(...jc(e)),t.push(...Nc(e.snapshot.nodes)));let n=Le(e.snapshot.nodes);n&&t.push(n);let r=Ac(e.annotations);r&&t.push(r);let i=Fc(e);return i&&t.push(i),t.push(...zc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Ac(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return fc}function jc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Mc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Mc(e){return e?x(e.type??``)===`application`:!1}function Nc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function Pc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Fc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ic(t,e.snapshot)&&Lc(t,e.capturedAt,e.runtimeNow)&&Bc(t.nodes.length,e.snapshot.nodes.length))return Rc}function Ic(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Lc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Rc=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function zc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[Rc]:[]}function Bc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Vc={screenshot:uc,diffScreenshot:$s,snapshot:Sc,diffSnapshot:Cc};function Hc(e){return $t(Vc,e)}export{Lt as A,Ht as C,Vt as D,qt as E,pt as F,Dt as M,ft as N,Bt as O,dt as P,Xt as S,Kt as T,gn as _,es as a,P as b,Fi as c,V as d,Kr as f,R as g,Dr as h,Xs as i,Ot as j,Pt as k,U as l,Ar as m,pc as n,$o as o,Mr as p,Zs as r,Pi as s,Hc as t,Gr as u,rn as v,Ut as w,M as x,$t as y};
|
|
1
|
+
import{C as e,D as t,F as n,K as r,N as i,P as a,S as o,x as s,y as c,z as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{r as d,t as f}from"./snapshot-capture-annotations.js";import{f as p,l as m,n as h}from"./android-input-ownership.js";import{r as g}from"./diagnostics.js";import"./diagnostics2.js";import{$r as _,Bn as v,Br as y,Cn as b,Dr as x,En as ee,Fr as te,Gn as ne,Hn as re,Hr as ie,Jn as S,Kn as ae,Lr as C,Mr as oe,Nr as se,On as ce,Pn as le,Pr as ue,Rn as de,Sn as fe,Sr as pe,Tn as me,Vn as he,Yn as ge,Yr as _e,Zn as ve,dn as ye,gr as be,hr as xe,jn as Se,jr as Ce,kn as we,lr as Te,mr as Ee,qn as De,qr as w,zn as Oe,zr as ke}from"./sdk-batch.js";import{r as T}from"./success-text.js";import{a as Ae,c as je,f as Me,g as Ne,h as Pe,i as Fe,m as Ie,n as Le,o as E,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{i as D,n as O,t as We}from"./rect-center.js";import{a as Ge,n as Ke,t as qe}from"./gesture-plan.js";import{t as Je}from"./android-snapshot-quality.js";import{n as Ye,r as Xe}from"./android-system-chrome.js";import{t as Ze}from"./observe-until.js";import{n as Qe,t as k}from"./selector-pipeline-policy.js";import{i as $e}from"./ios-system-surface.js";import{c as et,n as tt,o as nt,r as rt,s as A}from"./quality-warnings.js";import{r as it}from"./png.js";import{a as at,n as ot,o as st}from"./png-worker-client.js";import{n as ct}from"./ios-snapshot-acquisition.js";import{createHash as lt}from"node:crypto";import{promises as j}from"node:fs";import ut from"node:path";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=S(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function pt(e,t,n,r){return e.filter(e=>{if(!De(S(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&ae(i.chain,r)})}const mt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),ht={strippedIndexes:new Set,refs:new Set};function gt(e){let t=new Set(e.filter(e=>C(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return ht;let n=new Map(e.map(e=>[e.index,e])),r=xt(e,n,t),i=new Set(r),a=kt(e,n,r);for(let t of xt(e,n,a))i.add(t);for(let o of _t(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function _t(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=yt(t,n,r);if(o.size===0)return a;let s=bt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&vt(n,t,o)&&a.add(n.index);return a}function vt(e,t,n){if(!e.rect)return!1;let r=At(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function yt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=At(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function bt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function xt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)jt(i,t,n)&&r.add(i.index);return r}function St(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Xe(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(h).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:wt(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?ht:{strippedIndexes:o,refs:s}}function wt(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&St(e,t)).map(e=>e.index))}function Tt(e,t){let n=gt(e),r=Ct(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Et(e,t){let{strippedIndexes:n}=Tt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Dt(e,t){return Tt(e,t).refs}function Ot(e){return gt(e).refs}function kt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||C(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(C(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(C(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function jt(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Mt={intervalMs:200,budgetMs:1500,minPolls:2},Nt=Mt.budgetMs+2e3;function Pt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Ft(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function It(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Lt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),m=await Ze({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Mt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let m=p(i);if(d=r.signaturesStable(m.signature,f.signature),!d)return{kind:`continue`};let h=a()-o;if(c&&l!==f.backend)return g({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let _=It({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:h,distrustCapMs:Nt,classifyBaselineEvidence:r.classifyBaselineEvidence});return _===`distrust`?{kind:`continue`,budgetMs:Nt}:(Rt(_,t.action,s,h),{kind:`done`,result:zt(_,t,f,r,u)})}});if(m.kind===`done`)return m.result;if(m.kind===`failed`)throw m.error;g({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:m.waitedMs,lastPairAgreed:d}});let h=m.last;return d?{value:h}:{value:h,postGestureOutcome:Ft(`unsettled`,t)}}function Rt(e,t,n,r){if(e===`accept-stale`){g({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}g({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Ft(`no-effect`,t)}:(g({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Bt(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new a(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${r}`);return e}function Vt(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new a(`INVALID_ARGS`,t,n);return{x:r,y:i}}function Ht(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ut(),policy:e.policy??qt(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function Ut(e=[]){let t=new Map(e.map(e=>[e.name,Wt(e)]));return{get:e=>Wt(t.get(e)),set:e=>{t.set(e.name,Wt(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>Wt(e))}}function Wt(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Gt(e.metadata)}:{}}}function Gt(e){try{return structuredClone(e)}catch{return{...e}}}function Kt(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function qt(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Jt=new WeakMap;function Yt(e,t){Zt(e)&&Jt.set(e,t)}function Xt(e){return Zt(e)?Jt.get(e):void 0}function Zt(e){return typeof e==`object`&&!!e||typeof e==`function`}function M(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function N(e){return e.clock?.now()??Date.now()}async function Qt(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function $t(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function P(e){return e&&typeof e==`object`?e:void 0}async function F(e,t,n){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r);if(!i)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(M(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:N(e)};return await e.sessions.set({...i,snapshot:s}),{snapshot:s}}function en(e){let t=Buffer.alloc(16);for(let n of e)nn(t,tn(n));return{digest:`ax1:${lt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function tn(e){return lt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function nn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function rn(e){let{digest:t,nodeCount:n}=en(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=an(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function an(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function I(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function on(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:$e(n)}}function sn(e,t){let n=rn(e.nodes),r=on(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==rn(t.nodes).digest;return{...n,changedFromBefore:i}}function cn(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function ln(e,t){let n=o(e.type??`Element`),r=Re(e,n),i=Pe(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function un(e,t,n={}){let r=pn(fn(e,n),fn(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function dn(e,t={}){return fn(e,t).length}function fn(e,t){return t.flatten?e.map(e=>({text:Ie(e,0,!1),comparable:ln(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:ln(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function pn(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=hn(a,i,s)?L(a,i+1):L(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return mn(o,e,t,n,r)}}return[]}function mn(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=hn(i,c,r)?c+1:c-1,u=L(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function hn(e,t,n){return t===-n||t!==n&&L(e,t-1)<L(e,t+1)}function L(e,t){return e.get(t)??0}function gn(e,t){return e.find(e=>ie(e,t))??null}function R(e,t){let n=se(e);return n&&te(n)?n:_n(e,t)}function _n(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=se(e);if(!t||!te(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function vn(e){return e===`text`||e===`label`||e===`any`}function yn(e,t,n,r){if(!(r||e===`web`))return vn(t)?n:void 0}function bn(e){return new a(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function xn(e,t){let n=t??`default`,r=await e.sessions.get(n);if(!r)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let i=r.refFrameSnapshot??r.snapshot;if(!i)throw new a(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:r,snapshot:i}}async function z(e,t,n={updateSession:!0}){let r=e.backend.captureSnapshot;if(!r)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,o=await e.sessions.get(i),s=Sn(await r(M(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!A(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:i,session:o,snapshot:s}}function Sn(e,t){return e.snapshot?Cn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:N(t)}}function Cn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function wn(e,t,n){if(e.backend.readText){let r=await e.backend.readText(M(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Ne(n)}function Tn(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,r.invalidRefMessage);let o=s(e,i)??(r.fallbackLabel.length>0?gn(e,r.fallbackLabel):null);if(!o)throw new a(`COMMAND_FAILED`,r.notFoundMessage,{reason:E.refNotFound,ref:i,hint:b});return{ref:i,node:o}}async function En(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Dn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?On(e.nodes):e.nodes).map(jn);return n.sort((e,t)=>Nn(e).localeCompare(Nn(t))),{captureBackend:t,nodes:n}}function On(e){let t=x(e);return e.filter(e=>Ce(e)||t.isVisibleOnScreen(e))}function kn(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function An(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function jn(e){return{identity:`${e.type??``}#${Mn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Mn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Nn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Pn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Fn(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=N(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;N(e)<o;){let c=await Hn(e,t,o-N(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=In(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Dn(c.snapshot);_=Rn({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=N(e),b=Bn({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=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Qt(e,t);continue}if(!kn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let x=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(x<=0)break;await Qt(e,x)}return{settled:!1,stalled:!1,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h}}function In(e,t,n){if(!e||!t||!Ln(t.backend,n))return;let r=t.nodes.some(Ce),i=e.length<=5;if(!(!r&&!i))return Dn({...t,nodes:e})}function Ln(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Rn(e){return e.requestedQuietMs<500||!An(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function zn(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Bn(e){if(!(e.resetRequested!==!0||e.alreadyReset||!zn(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Vn(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Hn(e,t,n,r){let i=await En(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Un=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Wn=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Gn(e,t,n){return await qn(e,t,{...n,baseline:await Xn(e,t,n.resolved),actionPoint:n.resolved.point})}const Kn=async(e,t)=>(await qn(e,t,t)).observation;async function qn(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Jn(e,t,n,a,await Fn(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function Jn(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Wn:Un}};let{stored:o,session:s}=await lr(e,t,i.lastCapture),c=I(i.lastCapture.snapshot),l=c.nodes,u=on(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?tr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...sr(i,o,l.length,u)},settledCapture:c}}function Yn(e,t){if(e)return sn(e,t)}async function Xn(e,t,n){let r=await e.sessions.get(t.session??`default`);return Zn(n,r)??$n(n.preAction)??Qn(r)}function Zn(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?$n(I(n)):void 0}function Qn(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?I(t):{nodes:[]}}function $n(e){return e?.nodes.length?e:void 0}function er(e,t,n){let r=un(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=or(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function tr(e,t,n,r){let i=er(e,t,r);return{diff:i,...nr(i,t,n,r)}}function nr(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Dt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!rr(o.get(e),n))?{}:ar(t,i,r)}function rr(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const ir=new Set([`application`,`window`]);function ar(e,t,n){let r=Dt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ir.has(o(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=o(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function or(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function sr(e,t,n,r){let i=cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=cn(r);return{hint:i===void 0?a:`${a} ${i}`}}function cr(e,t,n){return e.stalled?{hint:Wn}:e.settled?t?n<5?{hint:Pn}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Un}}async function lr(e,t,n){if(A(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ur(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function dr(e,t,n,r,i){let a=await fr(e,t,n,i);return mr({...r,...a})}async function fr(e,t,n,r){if(r.settle!==void 0){let i=await Gn(e,t,{...r.settle,resolved:n}),a=r.verify?Yn(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await pr(e,t,n);return i?{evidence:i}:{}}async function pr(e,t,n){try{return sn(I((await F(e,t,!0)).snapshot),n.preAction)}catch{return}}function mr(e){let t=e;if(t.targetHittable!==!1||!hr(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function hr(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function gr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?vr(a):a.matchedNodes.length>1?_r(a):vr(a)}let a=ce(e,t,{...r,...fe({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:_r(a.firstMatch):{kind:`none`}}function _r(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function vr(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function yr(e,t,n){let r=ee(e,pe(t),n);return r?{...r,selector:r.selector.raw}:null}function br(e,t,n,r){let i=gr(e,pe(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function xr(e){return e}function Sr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Cr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function B(e){return[e.type,e.role,e.subrole].map(e=>C(e??``)).some(e=>e===`tab`||Cr.some(t=>e.includes(t)))}function wr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Vr(e);if(!Tr(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Nr(e,n,r).node;for(let n of t.slice(1))if(Nr(e,n,r).node.index!==i.index){let e=Or(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Tr(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Er(i,a,t)&&!Er(a,i,t))return!1}return!0}function Er(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Dr(e,t){return Or(t,Vr(e))}function Or(e,t){if(e.length<2||!Tr(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!B(n)||!e.every(e=>e===n||!B(e)))return null;let r=O(n.rect);return r&&e.every(e=>kr(O(e.rect),r))?n:null}function kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Ar(e,t){if(!t?.rect||!e.rect||!Ce(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function jr(e,t){return Nr(e,t)}function Mr(e){let t=Vr(e);return n=>Nr(e,n,t)}function Nr(e,t,n){return m(t)?{node:t,reason:`covered`}:Pr(e,t,n)??Fr(t)??Ir(e,t,n)??{node:t,reason:`original`}}function Pr(e,t,n){let r=Rr(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Fr(e){return B(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function Ir(e,t,n){let r=Lr(e,t,n);return!r?.rect||m(r)||!D(r.rect)?null:zr(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Lr(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?y(e,t,n.nodesByIndex,e=>r(e)?e:null):ke(e,t,r)}function Rr(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||m(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function zr(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(Br(t)&&!We(i,a))return!0;let o=oe(n,i,r?.viewportRootRects);return!o||!Hr(a,o)?!1:!We(i,a)}function Br(e){let t=C(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Vr(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(Ce(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Hr(e,t){let n=Sr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function V(e,t,n,r,i={}){let a=br(qr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Wr(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Ur(t,a);return o?await Wr(e,t,o,i):a}function Ur(e,t){let n=Dr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Wr(e,t,n,r){let i=await Kr(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Gr(e,t,n,r){let i=qr(e,t);return{candidates:i,list:yr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Kr(e,t,n,r={}){r.onResolved?.(n,t);let i=Jr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||m(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Yr(e,t,i.node,r)}}function qr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!m(e)):t}function Jr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Ar(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Yr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Xr(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const Zr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),Qr=new Set([`keyboard`,`key`]);function $r(e){return Qr.has(C(e.type??``))||h(e)}const ei=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function ti(e){return $r(e)||ei.has(e.role??``)}function ni(e,t,n){return n.has(e.index)||ai(t,n,e.index).length>0}function ri(e){return e!==null&&_e(e)}function H(e){return e.flatMap(e=>_e(e.rect)?[e.rect]:[])}function ii(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of ai(n,r,e.index))i.add(t);return i}function ai(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function oi(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function si(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function ci(e){let t=H(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return oi(t.length>0?t:e.anchorRects)}function li(e){let t=e.filter(ti),n=ii(e,t);return H(t.filter(e=>!n.has(e.index)))}function ui(e,t){let n=e.filter($r),r=H(n);if(r.length===0||!ri(t))return null;let i=e.filter(ti),a=H(i);if(a.length===0)return null;let o=si({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=ii(e,i);return ci({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:H(i.filter(e=>!s.has(e.index)))}:null}function di(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:li(e.nodes)}:ui(e.nodes,e.viewport);if(!t)return e.nodes.some($r)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return fi(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(ti).map(e=>e.index));return ni(e.node,n,r)?{kind:`clear`,surface:t}:w(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function fi(e,t){return t.controlRects.some(t=>w(t,e.x,e.y))?{kind:`clear`,surface:t}:w(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function pi(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function mi(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=di({nodes:e.nodes,viewport:x(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw _i({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function hi(e){let t=di({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return gi(e.point,t.surface)}function gi(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Zr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Zr.hint}function _i(e){return l(new a(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${pi(e.action)} safely`,{...Zr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function vi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${pi(e.action)} safely`,{reason:E.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function yi(e){let t=await Kr(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw vi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return mi({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function bi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${Si(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function xi(e,n,r,i,a,{action:o}){return await Ci(e,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:t(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,r,i){let o=x(r),s=n.rect?o.resolveEffectiveViewport(n):null;if(!n.rect||!s||o.isVisibleOnScreen(n))return n;let c=o.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(M(e,t),n,c);if(u)return{...n,rect:u};let d=He(n,o);throw l(new a(`COMMAND_FAILED`,i.message,{...i.details,rect:n.rect,viewport:s,...d?{scrollDirection:d}:{},hint:i.hint(d)}),`no`)}function wi(e,t,n,r){let{candidates:i,list:o}=Gr(r,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=wr(i,s);if(l.kind===`ambiguous`)throw new a(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ie(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Ti(t,n,r,i){let a=await F(t,n,i.requireInteractive),o=wi(a.snapshot.nodes,r,t.backend.platform,i.pipeline);if((!o||!o.node.rect)&&i.requireInteractive){let s=a.snapshot;a=await F(t,n,!1),e(s,a.snapshot),o=wi(a.snapshot.nodes,r,t.backend.platform,i.pipeline)}return{capture:a,resolved:o}}async function Ei(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await V(k.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return vi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Di(e){let{runtime:t,nodes:n,selectorExpression:r,action:i,resolved:o}=e,s=await Ei({runtime:t,nodes:n,selectorExpression:r,action:i});if(s)return s;let c=o?.diagnostics??[];return l(new a(`COMMAND_FAILED`,me(r,c,{unique:!0}),{reason:E.selectorNotFound,hint:we(c)}),`no`)}async function Oi(t,n,r,i,o){let s=await Ti(t,n,r,i);if(o&&e(o.snapshot,s.capture.snapshot),s.resolved?.node.rect)return s;let c=s.capture.snapshot.snapshotQuality;if(A(c))throw l(new a(`COMMAND_FAILED`,`Selector ${r} was not found in a sparse capture; the tree cannot prove it absent`,{reason:E.captureSparse,snapshotQuality:c,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ei({runtime:t,nodes:s.capture.snapshot.nodes,selectorExpression:r,action:i.action});if(u)throw u;return s}async function ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Di({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function Ai(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Ze({capture:async i=>{let a=await Oi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Je,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?ji(s.error,s):await ki(e,n,r,s)}function ji(e,t){if(!(e instanceof a)||e.details?.reason!==E.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const U={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Mi=[`runner-start`,`target-discovery`];function Ni(e){let t=e?.readinessPhase;return Mi.find(e=>e===t)}const Pi=`replay_target_guard_mismatch`,Fi=U.landmarkIdentityMismatch;function W(e,t,n,r,i){if(!n)return;let o=S(e),s=ge(e,t);if(!(ne(o,n.identity)&&ve(s,n.structural)))throw l(new a(`COMMAND_FAILED`,`${r} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Pi,observed:o,observedStructural:s,expected:n.identity,expectedStructural:n.structural,...i?{targetRole:i}:{}}),`no`)}function Ii(e,t,n){W(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function Li(e){return e.hittable===!0||B(e)}function Ri(e,t){let n=re(S(e),t);return n.id!==void 0||n.label!==void 0?!1:v(e.value)===null}function zi(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 Bi(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&zi(t,e,n)).sort((e,t)=>e.index-t.index)}function Vi(e,t){let n=D(e.rect);return!n||!t.rect?!1:w(t.rect,n.x,n.y)}function Hi(e,t){if(!Ri(e,t))return e;let n=Bi(e,t);if(n.some(Li))return e;let r=n.find(e=>S(e).label!==void 0);return!r||!Vi(r,e)?e:r}function Ui(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const Wi={source:`ref`,phase:`pre-action`,kind:`exact`},Gi={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function Ki(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Wi:Gi}}const qi={source:`runtime`,phase:`pre-action`,kind:`unique`};function Ji(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Yi(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Yi(e,t))}:qi}function Yi(e,t){let n=C(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Ui(n,256)}:{},...r===void 0?{}:{label:Ui(r,256)}}}function Xi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:Oe(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...Qi(t,r),preAction:n,resolution:i,...Zi(e,t,a,r)}}function Zi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Hi(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Oe(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function Qi(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function $i(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=ea(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?na(e,t):null,r),s=o?ra(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function ea(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>ta(e,t,r)).filter(B).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=na(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 ta(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 na(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 ra(e,t,n,r){let i=ca(e),a=oa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=oa(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(!w(t,s.x,s.y))return[];let c=ia(s,e,n,r,i);return c?[c]:[]})).sort(aa)[0]?.point??null}function ia(e,t,n,r,i){let a=sa(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 aa(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function oa(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 sa(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 ca(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function la(e,t,n){let r=x(t),i=$i(t,e,{bounds:[r.resolveEffectiveViewport(e),e.rect?r.resolveViewport(e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?l(new a(`COMMAND_FAILED`,n.invalidMessage,{reason:E.targetBoundsInvalid,...ua(n.blockedTargetDetails)}),`no`):l(new a(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:i.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:i.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function ua(e){return`ref`in e?{ref:t(e.ref)??e.ref}:e}function da(e,n){let r=t(e.ref);if(!r)throw new a(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=t(n.ref),o=n.node.ref?t(n.node.ref):null;if(i!==r||o!==r||!n.nodes.includes(n.node))throw new a(`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:Ki(r,n.node,`exact`)}}async function fa(e,t,n){let r=await ma(e,t,n);return{tree:I(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function pa(e,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?da(r,i.preresolvedTarget):await fa(e,n,r),c=a.nodes,{node:l,tapPoint:u}=await yi({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>Ii(e,t,i),offscreen:async(t,a)=>await xi(e,n,t,a,r.ref,i)},resolveTapPoint:e=>la(e,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${t(r.ref)??e.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...Xi(e,l,a,i.action,s.resolution)}}async function ma(e,t,n){let{session:r,snapshot:i}=await xn(e,t.session),a=n.fallbackLabel??``,o=ga(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw _a(o,n.ref);return ha({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function ha(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=ga(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&ne(S(a.node),S(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function ga(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(e,i);if(va(o))return{kind:`resolved`,resolved:Ki(i,o,`exact`)};let c=r.fallbackLabel.length>0?gn(e,r.fallbackLabel):null;if(va(c))return{kind:`resolved`,resolved:Ki(i,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function _a(e,n){let r=t(n)??n,i=e.kind===`unusable`?new a(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:E.targetBoundsInvalid,ref:r,hint:b}):new a(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:E.refNotFound,ref:r,hint:b});return l(i,`no`)}function va(e){return e?D(e.rect)!==null:!1}async function G(e,t,n){return await Ca(e,t,n.action),t.target.kind===`point`?await ba(e,t,t.target,n):t.target.kind===`ref`?await pa(e,t,t.target,n):await Sa(e,t,t.target,n)}async function ya(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=x(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!w(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:hi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function ba(e,t,n,r){let i=await ya(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await xa(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function xa(e,t){try{return I((await F(e,t,!0)).snapshot)}catch{return}}async function Sa(e,t,n,r){let i=n.selector,a,o,s,c=Qe(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await Ai(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Ti(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Di({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await yi({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>Ii(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,l.selector,r)},resolveTapPoint:e=>la(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...Xi(e,u,I(a.snapshot),r.action,Ji(o,a.snapshot.nodes))}}async function Ca(e,t,n){if(e.backend.platform!==`macos`)return;let r=await wa(e,t);if((r===`desktop`||r===`menubar`)&&(r!==`menubar`||n!==`click`&&n!==`press`))throw new a(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function wa(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ta(e,n,r,i){let a=(await e.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||t(r.ref)===null)return{};let s=ga(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=k.resolvedTarget,{node:u}=await yi({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(t,a)=>await xi(e,n,t,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...Qi(u,i),node:u,preAction:I(a)}}async function Ea(e,t,n,r,i){let a=await Ta(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:Wi,...a,...o?{backendResult:o}:{}}}function Da(e,t){let n=x(e),r=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Oa),i=r.length>0?r:e.map(e=>e.rect).filter(Oa);if(i.length===0)throw new a(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...i.map(e=>e.x)),s=Math.min(...i.map(e=>e.y)),c=Math.max(...i.map(e=>e.x+e.width)),l=Math.max(...i.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Oa(e){return!!(e&&e.width>0&&e.height>0)}async function ka(e,t){return await e.backend.resolveGestureViewport?.(M(e,t))||Da((await F(e,t,!1)).snapshot.nodes,`gesture`)}const Aa=async(e,t)=>{let n=await G(e,t,{action:`focus`,requireInteractive:!0,pipeline:k.resolvedTarget});if(!e.backend.focus)throw new a(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let r=K(n),i=P(await e.backend.focus(M(e,t),r));return{...n,...i?{backendResult:i}:{},...T(`Focused (${r.x}, ${r.y})`)}},ja=async(e,t)=>{let n=ur(t),r=await G(e,t,{action:`longPress`,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new a(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let i=t.durationMs===void 0?void 0:Bt(t.durationMs,`durationMs`,0,12e4),o=K(r),s=P(await e.backend.longPress(M(e,t),o,{durationMs:i}));return await dr(e,t,r,{...r,...i===void 0?{}:{durationMs:i},...s?{backendResult:s}:{},...T(`Long pressed (${o.x}, ${o.y})`)},n)},Ma=async(e,t)=>{let n=ur(t),r=n.needsPreActionBaseline?null:await Na(e,t);if(r)return r;let i=await G(e,t,{action:`hover`,requireInteractive:!1,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new a(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=K(i),s=P(await e.backend.hover(M(e,t),o));return await dr(e,t,i,{...i,...s?{backendResult:s}:{},...T(`Hovered (${o.x}, ${o.y})`)},n)};async function Na(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Ea(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Pa=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Ca(e,t,`drag`);let n=await ka(e,t),r=await Fa(e,t,`source`),i=await Fa(e,t,`destination`),o=qe({from:K(r),to:K(i),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=P(await e.backend.performGesture(M(e,t),o)),{start:c,end:l}=Ge(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Ia(r),destination:Ia(i)},recording:La(r,i),...s?{backendResult:s}:{},...T(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Fa(e,t,n){let r=t.gesture[n];return await G(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:k.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Ia(e){if(e.kind===`point`||!e.resolution)throw new a(`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 La(e,t){let n=Ra(e),r=Ra(t),i=za(e),a=za(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Ra(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function za(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function K(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Ba=async(e,t)=>await Ua(e,t,`press`),Va=async(e,t)=>await Ua(e,t,`click`),Ha=async(e,t)=>{if(typeof t.text!=`string`)throw new a(`INVALID_ARGS`,`fill requires text`);let n=ur(t),r=n.needsPreActionBaseline?null:await Ka(e,t);if(r)return r;let i=await G(e,t,{action:`fill`,requireInteractive:!0,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new a(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Wa(i),s=`node`in i?i.node?.type??``:``,c=s!==``&&ue(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.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 ${Ja(i)} resolved to "${s}", attempting fill anyway.`:void 0;return await dr(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function Ua(e,t,n){let r=ur(t),i=r.needsPreActionBaseline?null:await Ga(e,t,n);if(i)return i;let o=await G(e,t,{action:n,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new a(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Wa(o),c;try{c=await e.backend.tap(M(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Yt(e,o),e}let l=P(c);return await dr(e,t,o,{...o,...l?{backendResult:l}:{}},r)}function Wa(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ga(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||qa(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Ea(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Ka(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Ea(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function qa(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 Ja(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function q(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ya=k.wait.poll.defaultTimeoutMs;function Xa(e,t,n,r,i={}){let a=Xr(r),o=n??a.defaultTimeoutMs,s=X(e),c=fo(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(X(e)-s));return{capture:async n=>{let r=!1,i=X(e)-s,a=t=>l.push({startedMs:i,durationMs:X(e)-s-i,outcome:t}),o=await En(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Za(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:$a(l),waitedMs:X(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await po(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>X(e)-s}}function Za(e,t){return e?`readable`:t?.outcome??`unreadable`}function Qa(e,t){let n=lo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let r=Ni(e instanceof a?e.details:void 0);return r?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:r}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function $a(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function eo(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function to(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function no(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function ro(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.deadlineExceeded,captureTruncated:!0,...t})}function io(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.targetAbsent,...t})}function ao(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw oo(r.error,t);if(n)throw r.error}}function oo(e,t){let r=n(e);return new a(r.code,r.message,{reason:U.captureStalled,...r.details,...t},r)}function J(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return to(e,r);case`readiness-exhausted`:return ao(t,r,!1),no(e,r);case`capture-stalled`:return ao(t,r,t.preserveUnreadableOnStall===!0),eo(e,r);case`capture-truncated`:return ro(e,r);case void 0:return ao(t,r,!0),r.readableCaptures===0?eo(e,r):io(e,r);default:return co(n)}}function so(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function co(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function lo(e){if(!(e instanceof a))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...Y(t,`runnerRestartReason`),...Y(t,`runnerRestartCommand`),...Y(t,`runnerRestartCommandId`),...Y(t,`runnerInvalidatedSessionId`),...Y(t,`runnerRestartSessionId`),...Y(t,`logPath`),...Y(t,`diagnosticId`)}}function Y(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function uo(e){return e instanceof a&&e.details?.retriable===!0}function fo(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(uo(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function X(e){return e.clock?.now()??Date.now()}async function po(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 mo(e,t,n){let r=await V(k.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:je(e,i)}}async function ho(e,t,n){let r=await mo(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 go(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Xa(t,n,i,k.wait,{isUnreadableError:vo,preserveUnreadableOnStall:!0}),s=q(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await mo((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Je(e)?Ae(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw so(l)?J(`wait absent timed out for selector: ${r}`,o,l):c?_o(r,c,o.failureEvidence()):J(`wait absent timed out for selector: ${r}`,o,l)}function _o(e,t,n){let r=t.matches!==1;return new a(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${r?`es`:``} remain`,{reason:U.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function vo(e){if(!(e instanceof a))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Ve(t.observation)||t.observation===`unreadable`)}function yo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function bo(e,t,n,r,i,o){let s=Xa(t,n,i,k.wait),c=q(),l,u;for(;s.hasTimeRemaining();){let i=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(i.timedOut){u=i.deadline;break}let a=i.value;if(a){let e=a.snapshot.nodes,n=yo(await V(k.wait,e,r,{platform:t.backend.platform}));if(n){let t=xo(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 a(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Fi,...s.failureEvidence(),...l}):J(`wait timed out for selector: ${r}`,s,u)}function xo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=dt(e),a=pt(t.matchedNodes,i,he(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:S(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function So(e,t,n,r,i){let o=i??Ya,s=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new a(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:U.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function Co(e,t,n,r,i){let a=Xa(t,n,i,k.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await wo(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 J(`wait timed out for text: ${r}`,a,o)}async function wo(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Eo(t,n),r)).found?!0:await To(e,t,n,r)}async function To(e,t,n,r){return!!gn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Eo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Do(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await po(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Oo(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await bo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await go(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await So(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await ko(e,t,n,n.target.text,n.target.timeoutMs);default:return Ao(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new a(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function Oo(e,n,r,i,o){let c=await e.requireSnapshot(n,r.session),l=t(i);if(!l)throw new a(`INVALID_ARGS`,`Invalid ref: ${i}`);let u=s(c.snapshot.nodes,l);if(!u)throw new a(`COMMAND_FAILED`,`Ref ${i} not found`,{reason:E.refNotFound,ref:l,hint:b});let d=R(u,c.snapshot.nodes);if(!d)throw new a(`COMMAND_FAILED`,`Ref ${i} has no label to wait for`,{reason:E.refUnlabeled,ref:l});return await Co(e,n,r,d,o)}async function ko(e,t,n,r,i){let o=Ee(r);if(!o.ok)throw new a(o.code,o.message);return await Co(e,t,n,o.text,i)}function Ao(e){throw Error(`Unsupported wait target: ${String(e)}`)}const jo=Do({captureSnapshot:z,requireSnapshot:xn,stable:{defaultQuietMs:500,tinyTreeHint:Pn,tinyTreeNodeCount:5,capture:Fn}}),Mo=jo.waitCommand,No=jo.waitForTextCommand,Po=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new a(`INVALID_ARGS`,Se);if(t.action===`wait`)return await Ro(e,t,n);if(t.action===`list`)return await zo(e,t,n);let{capture:r,match:i}=await Bo(e,t,n);if(!i)throw new a(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:i}:{kind:`text`,ref:o,text:await wn(e,r,i),node:i}},Fo=async(e,t)=>{if(t.target.kind===`ref`){let n=await xn(e,t.session),r=Tn(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});W(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=Oe(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await wn(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Vo(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?k.readText:k.readUnique,hooks:{onResolved:(e,n)=>W(e,n,t.expectedResolvedTarget,`get`)}}),r=Oe(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await wn(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Io=async(e,t)=>{let n=await Fo(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new a(`COMMAND_FAILED`,`getText returned non-text result`);return n},Lo=async(e,t)=>{let n=await Fo(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new a(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function Ro(e,t,n){let r=Xa(e,t,t.timeoutMs,k.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Bo(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 J(`find wait timed out`,r,i)}async function zo(e,t,n){let r=de(n,t.query),i=await z(e,t,{updateSession:!0,...q()});if(A(i.snapshot.snapshotQuality))throw bn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Gr(k.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:le(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Bo(e,t,n,r){let i=de(n,t.query),a=await z(e,t,{updateSession:!0,scope:yn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...q()});if(A(a.snapshot.snapshotQuality))throw bn(a.snapshot.snapshotQuality);if(i){let t=await V(k.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:le(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Vo(e,t,n,r){let i=await z(e,{...t,session:n},{updateSession:!0,...q()}),o=await V(r.policy,i.snapshot.nodes,r.selector,{platform:e.backend.platform},r.hooks);if(o.kind!==`target`)throw new a(`COMMAND_FAILED`,me(r.selector,[],{unique:!0}),{hint:we([])});return{capture:i,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Ho=async(e,t)=>{let n=xe(t.predicate);if(!n.ok)throw new a(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`absent`){let e=Be(t);if(e)throw ze(e)}if(r===`text`&&!t.expectedText)throw new a(`INVALID_ARGS`,Te);let i=t.selector,o=await Uo(e,t,r,i);return r===`exists`?await Wo(e,o,i):r===`absent`?await ho(o.snapshot,i,e.backend.platform):await Go(e,t,o,r,i)};async function Uo(e,t,n,i){try{return await z(e,t,{updateSession:!0,...q(n)})}catch(e){throw n!==`absent`||r(e)?e:Ae(i,e)}}async function Wo(e,t,n){let r=await V(k.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(r.kind!==`target`)throw new a(`COMMAND_FAILED`,me(n,[],{unique:!1}),{hint:we([])});return{predicate:`exists`,pass:!0,selector:r.selector,matches:r.matches,selectorChain:ye(n)}}async function Go(e,t,n,r,i){let o=await V(k.readUnique,n.snapshot.nodes,i,{platform:e.backend.platform},{onResolved:(e,n)=>W(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new a(`COMMAND_FAILED`,me(i,[],{unique:!0}),{command:`is`,reason:E.selectorNotFound,predicate:r,selector:i,hint:we([])});let s=be({predicate:r,node:o.node,visibility:x(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new a(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:E.predicateFailed,predicate:r,selector:o.selector,predicateDetails:s.details});return{predicate:r,pass:!0,selector:o.selector,...r===`text`?{text:s.actualText}:{},selectorChain:ye(i),node:o.node,preActionNodes:n.snapshot.nodes}}const Ko=async(e,t)=>await Ho(e,{...t,predicate:`visible`,selector:t.target.selector}),qo=async(e,t)=>await Ho(e,{...t,predicate:`hidden`,selector:t.target.selector}),Jo=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Ca(e,t,t.gesture.intent);let n=await ka(e,t),r=Ke(t.gesture,n,e.backend.platform),i=P(await e.backend.performGesture(M(e,t),r)),o=Xo(r.pointers,0),s=Xo(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:o,to:s,...i?{backendResult:i}:{},...T(Zo(t.gesture,o,s))}},Yo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Pa(e,{...t,gesture:n}):await Jo(e,{...t,gesture:n})};function Xo(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new a(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function Zo(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 Z={find:Po,get:Fo,getText:Io,getAttrs:Lo,is:Ho,isVisible:Ko,isHidden:qo,wait:Mo,waitForText:No},Q={click:Va,press:Ba,fill:Ha,focus:Aa,longPress:ja,hover:Ma,gesture:Yo,settleObservation:Kn};function Qo(e){return{find:t=>Z.find(e,t),get:t=>Z.get(e,t),getText:(t,n={})=>Z.getText(e,{...n,target:t}),getAttrs:(t,n={})=>Z.getAttrs(e,{...n,target:t}),is:t=>Z.is(e,t),isVisible:(t,n={})=>Z.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>Z.isHidden(e,{...n,target:t}),wait:t=>Z.wait(e,t),waitForText:(t,n={})=>Z.waitForText(e,{...n,text:t})}}function $o(e){return{click:(t,n={})=>Q.click(e,{...n,target:t}),press:(t,n={})=>Q.press(e,{...n,target:t}),fill:(t,n,r={})=>Q.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Q.focus(e,{...n,target:t}),longPress:(t,n={})=>Q.longPress(e,{...n,target:t}),hover:(t,n={})=>Q.hover(e,{...n,target:t}),gesture:t=>Q.gesture(e,t),settleObservation:t=>Q.settleObservation(e,t)}}const es=[0,187,255,255];function ts(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||ns(e,n.rect)}function ns(e,t){let n=rs(t);if(n==null)return;let r=as(n.x,0,e.width-1),i=as(n.y,0,e.height-1),a=as(n.right,0,e.width-1),o=as(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)is(e,n,i+t,es),is(e,n,o-t,es);for(let n=i;n<=o;n+=1)is(e,r+t,n,es),is(e,a-t,n,es)}}function rs(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 is(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function as(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const os=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ss(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!us(t,a,e))continue;let c=0,l=ls(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=cs({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function cs(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of os){let o=s+e.x,u=c+e.y;if(!ds(o,u,i,a))continue;let d=u*i+o;us(t,n,d)&&(l=ls(r,n,l,d))}return l}function ls(e,t,n,r){return t[r]=1,e[n]=r,n+1}function us(e,t,n){return e[n]===1&&t[n]!==1}function ds(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function fs(e,t){return e.flatMap(e=>ps(e,t.baseline.width,t.baseline.height)?ms(e,t,bs(t.baseline.height)):[e])}function ps(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ys(n)&&r>=t*.35}function ms(e,t,n){let r=vs(e,_s(gs(hs(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>xs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function hs(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function gs(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function _s(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function vs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ys(e){return Math.max(48,Math.round(e*.07))}function bs(e){return Math.max(24,Math.round(e*.03))}function xs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Ss(t,a),Cs(i,e,t,a,r.baseline,r.current))}return i}function Ss(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Cs(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const ws=2.5;function Ts(e){let t=Es(e);return fs(t.length<=2e3?ks(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Ms(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Es(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ss({mask:t,width:i,height:a,hooks:{create:e=>Ds(e,i),visit:(e,t)=>Os(e,t,i,n,r)}})}function Ds(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Os(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function ks(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>As(e,r,t));if(!e){n.push({...r});continue}js(e,r)}return n}function As(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function js(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Ms(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Ns(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ns(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:xr({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Is(r,n.width,n.height),size:Ls(s,n.totalPixels),location:Ps(i,n.width,n.height),averageBaselineColorHex:zs(a),averageCurrentColorHex:zs(o),baselineLuminance:Math.round(Rs(a)),currentLuminance:Math.round(Rs(o)),dominantChange:Fs(a,o)}}function Ns(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Ps(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function Fs(e,t){let n=Rs(t)-Rs(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Is(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ws?`horizontal-band`:e.height>=e.width*ws?`vertical-band`:`compact`}function Ls(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Rs(e){return e.r*.2126+e.g*.7152+e.b*.0722}function zs(e){return`#${Bs(e.r)}${Bs(e.g)}${Bs(e.b)}`}function Bs(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Vs=Math.sqrt(3*255**2);async function Hs(e,t,n={}){await Us(e,`Baseline image not found`),await Us(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([j.readFile(e),j.readFile(t)]),[o,s]=await Promise.all([at(i,`baseline screenshot`),at(a,`current screenshot`)]);Ws(o.width,o.height,`baseline screenshot`,n.maxPixels),Ws(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Gs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Vs,{diffData:d,diffMask:f,differentPixels:p}=await ot({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Ts({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new it.PNG({width:o.width,height:o.height});e.data=d,ts(e,m),await j.mkdir(ut.dirname(r),{recursive:!0}),await j.writeFile(r,await st(e))}else await Gs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Us(e,t){try{await j.access(e)}catch{throw new a(`INVALID_ARGS`,`${t}: ${e}`)}}function Ws(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new a(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function Gs(e){if(e)try{await j.unlink(e)}catch(e){if(!Ks(e,`ENOENT`))throw e}}function Ks(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function qs(e,t){return e.map(e=>{let n=Js(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Js(e,t){let n=_(e.rect);return t.map(t=>{let r=t.overlayRect,i=Sr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ys(i/_(r)),regionCoveragePercentage:Ys(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function Ys(e){return Math.round(e*100*100)/100}async function Xs(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new a(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw n(e)}}async function Zs(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new a(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw n(e)}}async function Qs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const $s=async(e,t)=>{if(!t.baseline)throw new a(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=ec(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!cc(r))throw new a(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await Xs(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let a;cc(r)?(s=await tc(e,t),a=s.path):(o=await Xs(e,r,{usage:`diff screenshot current`,field:`current`}),a=o.path),c=t.out?await Zs(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Hs(i.path,a,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});cc(r)&&(u=await nc(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await i.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function ec(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new a(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function tc(e,t){let n=await Qs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await rc(e,t,n.path,ic(t))}catch(e){throw await n.cleanup(),e}return n}async function nc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await sc(n),r;let a=await Zs(e,ac(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await rc(e,t,a.path,{overlayRefs:!0,...ic(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:qs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function rc(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function ic(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function ac(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:oc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:oc(e.out.clientPath)}:{},...e.out.fileName?{fileName:oc(e.out.fileName)}:{}}}function oc(e){let t=ut.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function sc(e){try{await j.unlink(oc(e))}catch(e){if(!lc(e,`ENOENT`))throw e}}function cc(e){return e.kind===`live`}function lc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const uc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await Zs(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r,i;try{i=(await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}))?.displayRotation,t.scale!==void 0&&await nt(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...i?{displayRotation:i}:{},...T(`Saved screenshot: ${n.path}`)}};function dc(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!i(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Ue(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const fc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function pc(e){return e?.systemSurfaceOnly===!0?fc:void 0}function mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function hc(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!gc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!_c(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function gc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function _c(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>yc(e,t.nodes[n]))}const vc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function yc(e,t){return vc.every(n=>e[n]===t[n])&&bc(e.rect,t.rect)&&xc(e.presentationHints,t.presentationHints)&&xc(e.actions,t.actions)}function bc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function xc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Sc=async(e,t)=>{let n=await wc(e,t),r=hc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(Ec(t.session,n));let i=Oc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:dc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...n.snapshot.viewport?{viewport:n.snapshot.viewport}:{},...Dc(n)})},Cc=async(e,t)=>{let n=await wc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Ec(t.session,n);if(!i){let t=dn(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=un(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function wc(e,t){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=Tc(i,e),s=p(o,mc(o,t)),c=d(i),l=N(e);return{snapshot:s,result:i,session:r,annotations:c,warnings:kc({result:i,annotations:c,snapshot:s,options:t,session:r,capturedAt:s.createdAt??l,runtimeNow:l})}}function Tc(e,t){return e.snapshot?p(e.snapshot,{...e.snapshot,...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:N(t),...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}}function Ec(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function Dc(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function Oc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ct(e.producer)===`unavailable`&&void 0:e.truncated}function kc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...rt(Oc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Pt(e.snapshot.postGestureOutcome)),t.push(...Pc(e)),e.annotations.quality||(t.push(...jc(e)),t.push(...Nc(e.snapshot.nodes)));let n=Le(e.snapshot.nodes);n&&t.push(n);let r=Ac(e.annotations);r&&t.push(r);let i=Fc(e);return i&&t.push(i),t.push(...zc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Ac(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return fc}function jc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Mc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Mc(e){return e?C(e.type??``)===`application`:!1}function Nc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function Pc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Fc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ic(t,e.snapshot)&&Lc(t,e.capturedAt,e.runtimeNow)&&Bc(t.nodes.length,e.snapshot.nodes.length))return Rc}function Ic(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Lc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Rc=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function zc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[Rc]:[]}function Bc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Vc={screenshot:uc,diffScreenshot:$s,snapshot:Sc,diffSnapshot:Cc};function Hc(e){return $t(Vc,e)}export{Lt as A,Ht as C,Vt as D,qt as E,pt as F,Dt as M,ft as N,Bt as O,dt as P,Xt as S,Kt as T,gn as _,$o as a,P as b,Fi as c,V as d,Kr as f,R as g,Dr as h,Xs as i,Ot as j,Pt as k,U as l,Ar as m,pc as n,Qo as o,Mr as p,Zs as r,Pi as s,Hc as t,Gr as u,rn as v,Ut as w,M as x,$t as y};
|