agent-device 0.21.13 → 0.21.15

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.
Files changed (298) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.apk → agent-device-android-ime-helper-0.21.15.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.15.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.manifest.json → agent-device-android-ime-helper-0.21.15.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.13.manifest.json → agent-device-android-snapshot-helper-0.21.15.manifest.json} +6 -6
  7. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +11 -1
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +110 -2
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +4 -2
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerMainOwnedState.swift +27 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +8 -2
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +26 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +12 -19
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +59 -20
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +179 -91
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +21 -24
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +9 -13
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +36 -49
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+MainThreadWork.swift +11 -15
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +136 -29
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +20 -21
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +3 -0
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +6 -5
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +12 -24
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +22 -42
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +15 -18
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +73 -31
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +20 -11
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +9 -7
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +5 -4
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +2 -2
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +51 -19
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +5 -2
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +78 -10
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +32 -2
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +7 -4
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +23 -0
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +17 -10
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +8 -9
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +9 -15
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +12 -11
  44. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
  45. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +24 -9
  46. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +66 -10
  47. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
  48. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +1 -0
  49. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +27 -5
  50. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -0
  51. package/dist/src/adapter.js +1 -1
  52. package/dist/src/adb-executor.js +1 -1
  53. package/dist/src/adb-failure.js +1 -1
  54. package/dist/src/adb-transport.js +1 -1
  55. package/dist/src/agent-browser-provider.js +1 -1
  56. package/dist/src/agent-browser-tool.js +1 -1
  57. package/dist/src/agent-device-client.js +2 -2
  58. package/dist/src/ai-sdk.js +1 -1
  59. package/dist/src/alert-runtime.js +1 -1
  60. package/dist/src/android-adb.d.ts +1 -8
  61. package/dist/src/android-input-ownership.js +1 -1
  62. package/dist/src/android-snapshot-quality.js +1 -0
  63. package/dist/src/android-system-chrome.js +1 -1
  64. package/dist/src/android.js +1 -1
  65. package/dist/src/app-catalog.js +1 -1
  66. package/dist/src/app-deployment-resolution.js +1 -1
  67. package/dist/src/app-inventory.js +1 -1
  68. package/dist/src/app-launch.js +1 -1
  69. package/dist/src/app-lifecycle.js +1 -1
  70. package/dist/src/app-lifecycle2.js +1 -1
  71. package/dist/src/app-log-files.js +1 -1
  72. package/dist/src/app-log-runtime2.js +1 -1
  73. package/dist/src/app-resolution.js +2 -2
  74. package/dist/src/apple-runner-platform.js +1 -1
  75. package/dist/src/application-lifecycle-interaction.js +1 -1
  76. package/dist/src/archive.js +1 -1
  77. package/dist/src/artifact-download.js +1 -1
  78. package/dist/src/auth-session.js +1 -1
  79. package/dist/src/auth.js +1 -1
  80. package/dist/src/backend-snapshot-options.js +1 -1
  81. package/dist/src/boot-diagnostics.js +1 -1
  82. package/dist/src/capture-disclosure.js +1 -1
  83. package/dist/src/capture.js +1 -1
  84. package/dist/src/cli-config.js +1 -1
  85. package/dist/src/cli-help.js +2 -2
  86. package/dist/src/cli.js +4 -4
  87. package/dist/src/click-button.js +1 -1
  88. package/dist/src/client-metro.js +1 -1
  89. package/dist/src/client-types.d.ts +102 -95
  90. package/dist/src/clipboard-shell-response.js +1 -1
  91. package/dist/src/command-schema.js +1 -1
  92. package/dist/src/command-tools.js +3 -3
  93. package/dist/src/connection-runtime.js +1 -1
  94. package/dist/src/connection.js +1 -1
  95. package/dist/src/contracts.d.ts +1 -1
  96. package/dist/src/contracts.js +1 -1
  97. package/dist/src/daemon-client-lifecycle.js +1 -1
  98. package/dist/src/daemon.js +1 -1
  99. package/dist/src/debug-symbols-facade.js +1 -1
  100. package/dist/src/device-claim-rule.js +2 -2
  101. package/dist/src/device-input-state.d.ts +15 -2
  102. package/dist/src/device-inventory-context.js +1 -1
  103. package/dist/src/device-rotation.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-session.js +1 -1
  106. package/dist/src/device-shell.js +1 -1
  107. package/dist/src/device2.js +1 -1
  108. package/dist/src/devicectl.js +1 -1
  109. package/dist/src/diagnostics.js +1 -1
  110. package/dist/src/dispatch-resolve.js +1 -1
  111. package/dist/src/doctor2.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/file.js +1 -1
  116. package/dist/src/find.js +1 -1
  117. package/dist/src/format.js +1 -1
  118. package/dist/src/gesture-plan-types.d.ts +1 -1
  119. package/dist/src/gesture-plan.js +1 -1
  120. package/dist/src/gesture-runtime.js +1 -1
  121. package/dist/src/harmonyos.js +1 -1
  122. package/dist/src/helper.js +2 -2
  123. package/dist/src/human-control-contract.js +1 -1
  124. package/dist/src/human-control.js +1 -1
  125. package/dist/src/index.d.ts +7 -3
  126. package/dist/src/index.js +1 -1
  127. package/dist/src/input-actions.js +1 -1
  128. package/dist/src/input-actions2.js +1 -1
  129. package/dist/src/install-artifact-facade.js +1 -1
  130. package/dist/src/install-source-network-transport.js +1 -1
  131. package/dist/src/install-source2.js +1 -1
  132. package/dist/src/interaction-positionals.js +1 -1
  133. package/dist/src/interaction-ref-policy.js +1 -1
  134. package/dist/src/interaction2.js +1 -1
  135. package/dist/src/interactor-operation-binding.js +1 -1
  136. package/dist/src/interactor.js +4 -4
  137. package/dist/src/interactor2.js +1 -1
  138. package/dist/src/interactors.js +1 -1
  139. package/dist/src/internal/bin.js +1 -1
  140. package/dist/src/internal/daemon.js +2 -2
  141. package/dist/src/internal/png-worker.js +1 -1
  142. package/dist/src/internal/run-script-http-child.js +1 -1
  143. package/dist/src/inventory.js +1 -1
  144. package/dist/src/inventory2.js +1 -1
  145. package/dist/src/inventory3.js +1 -1
  146. package/dist/src/inventory5.js +1 -1
  147. package/dist/src/ios-snapshot-acquisition.js +1 -1
  148. package/dist/src/ios-snapshot-engine.js +1 -0
  149. package/dist/src/ios-snapshot-runtime.js +1 -1
  150. package/dist/src/lease.js +1 -1
  151. package/dist/src/limrun-download-file.js +1 -1
  152. package/dist/src/limrun-runtime-dependencies.js +1 -1
  153. package/dist/src/limrun.d.ts +16 -3
  154. package/dist/src/linux.js +1 -1
  155. package/dist/src/location-coordinates.js +1 -1
  156. package/dist/src/managed-device-scope.js +1 -1
  157. package/dist/src/mechanics.js +17 -17
  158. package/dist/src/mobile-snapshot-semantics.js +1 -1
  159. package/dist/src/multitouch-support.js +1 -1
  160. package/dist/src/native-build-cache.js +1 -0
  161. package/dist/src/observation.js +1 -1
  162. package/dist/src/overlay.js +3 -0
  163. package/dist/src/parameterized-recorded-fill.js +1 -1
  164. package/dist/src/perf-facade.js +1 -1
  165. package/dist/src/perf-runtime-operation-builder.js +1 -1
  166. package/dist/src/perf-runtime-plan.js +1 -1
  167. package/dist/src/perf-target.js +2 -2
  168. package/dist/src/perf.js +1 -1
  169. package/dist/src/physical-device-control.js +1 -1
  170. package/dist/src/platform-runtime-host.js +1 -1
  171. package/dist/src/platform-runtime-managed-owner.js +1 -1
  172. package/dist/src/platform-runtime-open-target.js +1 -1
  173. package/dist/src/platform-runtime-operation-host.js +4 -4
  174. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  175. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  176. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  177. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  178. package/dist/src/platform-runtime.js +1 -1
  179. package/dist/src/platform-runtime2.js +1 -1
  180. package/dist/src/png-crop-bytes.js +1 -1
  181. package/dist/src/png-size.js +1 -1
  182. package/dist/src/png-worker-client.js +1 -1
  183. package/dist/src/png.js +1 -1
  184. package/dist/src/prepare-kind.js +1 -1
  185. package/dist/src/provider-session-ownership.js +1 -1
  186. package/dist/src/provider-webdriver.js +1 -1
  187. package/dist/src/proxy.js +1 -1
  188. package/dist/src/quality-warnings.js +1 -1
  189. package/dist/src/react-native.js +1 -1
  190. package/dist/src/record-runtime.js +1 -1
  191. package/dist/src/recording.js +1 -1
  192. package/dist/src/rect-center.js +1 -1
  193. package/dist/src/register-builtins.js +1 -1
  194. package/dist/src/registry.js +36 -36
  195. package/dist/src/remote-config2.js +1 -1
  196. package/dist/src/replay-divergence.js +1 -1
  197. package/dist/src/replay.js +1 -1
  198. package/dist/src/reporting.js +1 -1
  199. package/dist/src/request-admission.js +1 -1
  200. package/dist/src/request-cancel.js +1 -1
  201. package/dist/src/request-runtime-binding.js +1 -1
  202. package/dist/src/retry.js +1 -1
  203. package/dist/src/runner-cache-metadata.js +1 -1
  204. package/dist/src/runner-client.js +1 -1
  205. package/dist/src/runner-dev-tools-security.js +1 -1
  206. package/dist/src/runner-device-readiness.js +1 -1
  207. package/dist/src/runner-disposal.js +1 -1
  208. package/dist/src/runner-error-classification.js +1 -1
  209. package/dist/src/runner.js +1 -1
  210. package/dist/src/runtime-transport-hints.js +1 -1
  211. package/dist/src/runtime.js +1 -3
  212. package/dist/src/runtime10.js +2 -2
  213. package/dist/src/runtime2.js +4 -4
  214. package/dist/src/runtime3.js +1 -1
  215. package/dist/src/runtime4.js +5 -5
  216. package/dist/src/runtime5.js +1 -1
  217. package/dist/src/runtime6.js +1 -1
  218. package/dist/src/runtime7.js +1 -1
  219. package/dist/src/runtime8.js +1 -1
  220. package/dist/src/runtime9.js +1 -1
  221. package/dist/src/screen-recording-admission-ledger.js +1 -1
  222. package/dist/src/screen-recording-completion.js +1 -1
  223. package/dist/src/screen-recording-options.js +1 -1
  224. package/dist/src/screen-recording-resource-recovery.js +1 -1
  225. package/dist/src/screenshot-density.js +1 -1
  226. package/dist/src/screenshot-image.js +1 -1
  227. package/dist/src/screenshot-overlay-draw.js +1 -1
  228. package/dist/src/screenshot-runtime.js +1 -1
  229. package/dist/src/screenshot.js +1 -1
  230. package/dist/src/screenshot3.js +1 -1
  231. package/dist/src/script.js +1 -1
  232. package/dist/src/scroll-command.d.ts +13 -6
  233. package/dist/src/scroll-command.js +1 -1
  234. package/dist/src/scroll-gesture.js +1 -1
  235. package/dist/src/sdk-batch-runner.js +2 -2
  236. package/dist/src/sdk-batch.js +2 -2
  237. package/dist/src/sdk-contracts.d.ts +59 -12
  238. package/dist/src/sdk-contracts.js +2 -2
  239. package/dist/src/sdk-device.js +1 -1
  240. package/dist/src/sdk-finders.d.ts +1 -1
  241. package/dist/src/sdk-io.js +1 -1
  242. package/dist/src/sdk-remote-config.js +1 -1
  243. package/dist/src/sdk-selectors.d.ts +1 -1
  244. package/dist/src/selection.js +0 -0
  245. package/dist/src/selector-runtime.js +1 -1
  246. package/dist/src/server.js +1 -1
  247. package/dist/src/session-allocation.js +1 -1
  248. package/dist/src/session-routing.js +1 -1
  249. package/dist/src/session-runtime-admission.js +1 -1
  250. package/dist/src/session-snapshot.js +1 -1
  251. package/dist/src/session-store.js +1 -1
  252. package/dist/src/session.js +1 -1
  253. package/dist/src/session2.js +4 -4
  254. package/dist/src/settings.js +1 -1
  255. package/dist/src/settings2.js +1 -0
  256. package/dist/src/simctl.js +1 -1
  257. package/dist/src/simulator-state.js +1 -1
  258. package/dist/src/simulator.js +1 -1
  259. package/dist/src/snapshot-capture-annotations.js +1 -1
  260. package/dist/src/snapshot-desktop-projection.js +1 -1
  261. package/dist/src/snapshot-runtime-binding.js +1 -1
  262. package/dist/src/snapshot-runtime.js +1 -1
  263. package/dist/src/snapshot-state.js +1 -1
  264. package/dist/src/snapshot2.js +1 -1
  265. package/dist/src/snapshot3.js +1 -1
  266. package/dist/src/snapshot4.js +1 -1
  267. package/dist/src/src.js +1 -1
  268. package/dist/src/src4.js +1 -1
  269. package/dist/src/src7.js +1 -1
  270. package/dist/src/src8.js +1 -1
  271. package/dist/src/string-enum.js +1 -1
  272. package/dist/src/surface-snapshot.js +1 -1
  273. package/dist/src/takeover.js +1 -1
  274. package/dist/src/text-entry-focus.js +1 -1
  275. package/dist/src/tool-provider-facade.js +1 -1
  276. package/dist/src/tool-provider.js +2 -2
  277. package/dist/src/tool-provider2.js +1 -1
  278. package/dist/src/touch-runtime.js +1 -1
  279. package/dist/src/transport.js +1 -1
  280. package/dist/src/tree.js +1 -1
  281. package/dist/src/tv-remote.js +1 -1
  282. package/dist/src/type-text-runtime.js +1 -1
  283. package/dist/src/verified-file.js +1 -1
  284. package/dist/src/video.js +1 -1
  285. package/dist/src/viewport.js +1 -1
  286. package/dist/src/web.js +1 -1
  287. package/dist/src/web2.js +1 -1
  288. package/dist/src/webdriver-source.js +1 -1
  289. package/package.json +1 -1
  290. package/server.json +2 -2
  291. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.13.apk.sha256 +0 -1
  292. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk +0 -0
  293. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk.sha256 +0 -1
  294. package/dist/src/absence-observation-errors.js +0 -1
  295. package/dist/src/runner-presentation.js +0 -1
  296. package/dist/src/semantic-index.js +0 -1
  297. package/dist/src/snapshot-process.js +0 -1
  298. package/dist/src/snapshot-scope.js +0 -1
@@ -1,3 +1 @@
1
- import{D as e,E as t,F as n,O as r,_ as i,b as a,g as o,h as s}from"./sdk-contracts.js";import{m as c}from"./capture.js";import{r as l,t as u}from"./snapshot-capture-annotations.js";import{f as d,l as f,n as p}from"./android-input-ownership.js";import{An as m,Ar as h,Bn as g,Dn as _,Er as v,Gn as y,Hr as b,Ir as x,Jn as ee,Kn as te,Ln as ne,Mr as re,Nn as ie,Nr as ae,On as oe,Pr as se,Rn as ce,Rr as le,Sn as ue,Tn as de,Vn as fe,Wn as pe,Wr as me,Xn as he,bn as S,cr as ge,hr as _e,jr as ve,mr as ye,pr as be,qn as C,qr as xe,un as Se,wn as Ce,xn as we,xr as Te,zn as Ee,zr as De}from"./sdk-batch.js";import{n as Oe}from"./snapshot-scope.js";import{r as w}from"./success-text.js";import{a as ke,c as Ae,d as je,f as Me,i as Ne,m as Pe,n as Fe,o as Ie,p as Le,r as Re,t as ze,u as Be}from"./absence-observation-errors.js";import{n as Ve,t as He}from"./mobile-snapshot-semantics.js";import{a as Ue,n as We,o as Ge,t as Ke}from"./react-native-overlay.js";import{r as T}from"./diagnostics.js";import{t as qe}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as E,n as D,t as Je}from"./rect-center.js";import{a as Ye,n as Xe,t as Ze}from"./gesture-plan.js";import{n as Qe,o as $e,r as et}from"./android-system-chrome.js";import{c as tt,n as nt,o as rt,r as it,s as at}from"./quality-warnings.js";import{a as ot,n as st,o as ct}from"./png-worker-client.js";import{r as lt}from"./png.js";import{i as ut}from"./ios-system-surface.js";import{n as dt}from"./ios-snapshot-acquisition.js";import ft from"node:path";import{promises as O}from"node:fs";import{createHash as pt}from"node:crypto";function mt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function ht(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=C(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function gt(e,t,n,r){return e.filter(e=>{if(!te(C(e),n))return!1;let i=ht(e,t,Math.max(r.length,1));return!i.broken&&y(i.chain,r)})}const _t=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,vt=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],yt=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function bt(e){if(xt(e).detected)return[`Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.`,`Run: agent-device react-native dismiss-overlay`,`The command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action.`].join(`
2
- `)}function xt(e){let t=St(e),n=t.detected?Ct(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function St(e){let t=e.map(wt).join(`
3
- `).toLowerCase(),n=Lt(e,jt),r=Lt(e,Ge),i=Lt(e,We,Ft),a=Lt(e,At),o=Et(t),s=Dt(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:kt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:Ot(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function Ct(e){let t=Rt(e.dismissNodes);if(t)return Vt(t,Ht(t));let n=Ut(e.collapsedNodes.filter(It));return n?.rect?{action:`close-collapsed-banner`,point:Jt(n),rect:n.rect,ref:n.ref,label:Xt(n)}:null}function wt(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function Tt(e){return _t.test(e)}function Et(e){return vt.some(t=>t.test(e))}function Dt(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function Ot(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function kt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(Tt(e.text)||e.hasReactNativeStackFrame)}function At(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function jt(e){return Ue(e)||Mt(e)||Nt(e)}function Mt(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function Nt(e){return yt.has(e)}function Pt(e){return/^!,\s+/.test(e)}function Ft(e){return!e.rect||e.rect.height<=180}function It(e){let t=Xt(e)?.trim().toLowerCase()??``;return(At(t)||Pt(t))&&Ke(e)}function Lt(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function Rt(e){return Wt(e,Bt)}function zt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Bt(e){return[Kt(zt(e)),Kt(e.hittable),-(e.rect?xe(e.rect):1/0)]}function Vt(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:o(e.rect),rect:e.rect,ref:e.ref,label:Xt(e)}}function Ht(e){let t=Xt(e)?.trim().toLowerCase();return t&&Ue(t)?`dismiss`:`close`}function Ut(e){return Wt(e,Gt)}function Wt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>qt(t(n),t(e)))[0]??null}function Gt(e){return[Kt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Kt(e){return+(e===!0)}function qt(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function Jt(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round(Yt(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function Yt(e,t,n){return Math.min(n,Math.max(t,e))}function Xt(e){return e.label??e.value??e.identifier}const Zt=3500;function Qt(e){return[e.action,...e.positionals].join(` `).trim()}function $t(e,t){return`${Qt({action:e,positionals:t})} 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 en(e){return`The surface was still changing after ${Qt(e)} when this was read, so an element missing from it may still be on screen. Read again before treating it as absent.`}function tn(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 nn(e){let{pending:t,needsBaselineDistrust:n,hooks:r}=e,i=Date.now(),a=1,o=await rn(r,e.initial),s=t.baselineSignature,c=t.baselineBackend,l=!1,u=1500,d=!1;for(;a<2||Date.now()-i<u;){await qe(200),a+=1;let e=await rn(r);if(d=r.signaturesStable(o.signature,e.signature),d){let d=Date.now()-i;if(s&&c!==e.backend){T({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:c,to:e.backend,attempts:a}}),s=e.signature,c=e.backend,l=!0,o=e;continue}let f=tn({needsBaselineDistrust:n,baselineSignature:s,quietSignature:e.signature,elapsedMs:d,distrustCapMs:Zt,classifyBaselineEvidence:r.classifyBaselineEvidence});if(f===`distrust`){u=Zt,o=e;continue}return an(f,t.action,a,d),on(f,t,e,r,l)}o=e}return T({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:a,durationMs:Date.now()-i,lastPairAgreed:d}}),d?{value:o.value}:{value:o.value,unsettledGesture:{action:t.action,positionals:t.positionals}}}async function rn(e,t){let n=t??await e.capture();return{value:n,...e.readSurface(n)}}function an(e,t,n,r){if(e===`accept-stale`){T({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}T({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function on(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,gestureNoEffect:{action:t.action,positionals:t.positionals}}:(T({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}const sn=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),cn={strippedIndexes:new Set,refs:new Set};function ln(e){let t=new Set(e.filter(e=>x(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return cn;let n=new Map(e.map(e=>[e.index,e])),r=mn(e,n,t),i=new Set(r),a=Sn(e,n,r);for(let t of mn(e,n,a))i.add(t);for(let o of un(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 un(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=fn(t,n,r);if(o.size===0)return a;let s=pn(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&dn(n,t,o)&&a.add(n.index);return a}function dn(e,t,n){if(!e.rect)return!1;let r=Cn(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function fn(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=Cn(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function pn(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 mn(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)wn(i,t,n)&&r.add(i.index);return r}function hn(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Qe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(et(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function gn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(p).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:_n(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?cn:{strippedIndexes:o,refs:s}}function _n(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&hn(e,t)).map(e=>e.index))}function vn(e,t){let n=ln(e),r=gn(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 yn(e,t){let{strippedIndexes:n}=vn(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function bn(e,t){return vn(e,t).refs}function xn(e){return ln(e).refs}function Sn(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=Cn(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>sn.has(x(e.type??``))&&!n.has(e.index)&&wn(e,t,a))&&r.delete(i)}return r}function Cn(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(x(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function wn(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 k={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Tn=`replay_target_guard_mismatch`,En=k.landmarkIdentityMismatch;function Dn(e,t){return e.find(e=>Oe(e,t))??null}function A(e,t){let n=re(e);return n&&se(n)?n:On(e,t)}function On(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=re(e);if(!t||!se(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 kn(e){return e}function An(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const jn=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function j(e){return[e.type,e.role,e.subrole].map(e=>x(e??``)).some(e=>e===`tab`||jn.some(t=>e.includes(t)))}function Mn(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Yn(e);if(!Nn(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Vn(e,n,r).node;for(let n of t.slice(1))if(Vn(e,n,r).node.index!==i.index){let e=In(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Nn(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Pn(i,a,t)&&!Pn(a,i,t))return!1}return!0}function Pn(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Fn(e,t){return In(t,Yn(e))}function In(e,t){if(e.length<2||!Nn(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!j(n)||!e.every(e=>e===n||!j(e)))return null;let r=D(n.rect);return r&&e.every(e=>Ln(D(e.rect),r))?n:null}function Ln(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Rn(e,t){if(!t?.rect||!e.rect||!h(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function zn(e,t){return Vn(e,t)}function Bn(e){let t=Yn(e);return n=>Vn(e,n,t)}function Vn(e,t,n){return f(t)?{node:t,reason:`covered`}:Hn(e,t,n)??Un(t)??Wn(e,t,n)??{node:t,reason:`original`}}function Hn(e,t,n){let r=Kn(e,t,n);return r?.rect&&E(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Un(e){return j(e)&&e.rect&&E(e.rect)?{node:e,reason:`semantic-target`}:null}function Wn(e,t,n){let r=Gn(e,t,n);return!r?.rect||f(r)||!E(r.rect)?null:qn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Gn(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?De(e,t,n.nodesByIndex,e=>r(e)?e:null):le(e,t,r)}function Kn(e,t,n){let r=D(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||f(e))return!1;let t=D(e.rect);return t?Je(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function qn(e,t,n,r){let i=D(e.rect),a=D(t.rect);if(!i||!a)return!1;if(Jn(t)&&!Je(i,a))return!0;let o=ve(n,i,r?.viewportRootRects);return!o||!Xn(a,o)?!1:!Je(i,a)}function Jn(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 Yn(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(h(i)){let e=D(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Xn(e,t){let n=An(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Zn(t,n,r,i){if(!Number.isFinite(t)||!Number.isInteger(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return t}function Qn(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}function $n(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??er(),policy:e.policy??ir(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function er(e=[]){let t=new Map(e.map(e=>[e.name,tr(e)]));return{get:e=>tr(t.get(e)),set:e=>{t.set(e.name,tr(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>tr(e))}}function tr(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:nr(e.metadata)}:{}}}function nr(e){try{return structuredClone(e)}catch{return{...e}}}function rr(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function ir(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const ar={defaultTimeoutMs:1e4,intervalMs:300},M={promotedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:S.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:S.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:S.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:ar},wait:{resolution:S.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:ar},readList:{resolution:S.readList,occlusion:`ignore`},findAct:{resolution:S.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:S.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},or=new WeakMap;function sr(e,t){lr(e)&&or.set(e,t)}function cr(e){return lr(e)?or.get(e):void 0}function lr(e){return typeof e==`object`&&!!e||typeof e==`function`}function N(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function P(e){return e.clock?.now()??Date.now()}async function ur(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function dr(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function F(e){return e&&typeof e==`object`?e:void 0}function fr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=de(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?mr(a):a.matchedNodes.length>1?pr(a):mr(a)}let a=_(e,t,{...r,...we({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:pr(a.firstMatch):{kind:`none`}}function pr(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function mr(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 hr(e,t,n){let r=de(e,Te(t),n);return r?{...r,selector:r.selector.raw}:null}function gr(e,t,n,r){let i=fr(e,Te(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}async function I(e,t,n,r,i={}){let a=gr(xr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await vr(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=_r(t,a);return o?await vr(e,t,o,i):a}function _r(e,t){let n=Fn(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function vr(e,t,n,r){let i=await br(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function yr(e,t,n,r){let i=xr(e,t);return{candidates:i,list:hr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function br(e,t,n,r={}){r.onResolved?.(n,t);let i=Sr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||f(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Cr(e,t,i.node,r)}}function xr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!f(e)):t}function Sr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=zn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Rn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Cr(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 wr(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function Tr(e){return e.hittable===!0||j(e)}function Er(e,t){let n=fe(C(e),t);return n.id!==void 0||n.label!==void 0?!1:Ee(e.value)===null}function Dr(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 Or(e,t){let n=mt(t);return t.filter(t=>t.index!==e.index&&Dr(t,e,n)).sort((e,t)=>e.index-t.index)}function kr(e,t){let n=E(e.rect);return!n||!t.rect?!1:b(t.rect,n.x,n.y)}function Ar(e,t){if(!Er(e,t))return e;let n=Or(e,t);if(n.some(Tr))return e;let r=n.find(e=>C(e).label!==void 0);return!r||!kr(r,e)?e:r}function jr(e){return e===`text`||e===`label`||e===`any`}function Mr(e,t,n,r){if(!(r||e===`web`))return jr(t)?n:void 0}function Nr(t){return new e(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:t.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 Pr(t,n){let r=n??`default`,i=await t.sessions.get(r);if(!i)throw new e(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new e(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function L(t,n,r={updateSession:!0}){let i=t.backend.captureSnapshot;if(!i)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await t.sessions.get(a),s=Fr(await i(N(t,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),t);return(n.signal??t.signal)?.throwIfAborted(),r.updateSession&&o&&!at(s.snapshotQuality)&&await t.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function Fr(e,t){return e.snapshot?Ir(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function Ir(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 Lr(e,t,n){if(e.backend.readText){let r=await e.backend.readText(N(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Pe(n)}function Rr(t,n,r){let o=a(n);if(!o)throw new e(`INVALID_ARGS`,r.invalidRefMessage);let s=i(t,o)??(r.fallbackLabel.length>0?Dn(t,r.fallbackLabel):null);if(!s)throw new e(`COMMAND_FAILED`,r.notFoundMessage);return{ref:o,node:s}}function zr(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Br(e){let t=Buffer.alloc(16);for(let n of e)Hr(t,Vr(n));return{digest:`ax1:${pt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Vr(e){return pt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Hr(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function Ur(e){let{digest:t,nodeCount:n}=Br(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Wr(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Wr(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function R(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function Gr(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:ut(n)}}function Kr(e,t){let n=Ur(e.nodes),r=Gr(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==Ur(t.nodes).digest;return{...n,changedFromBefore:i}}function qr(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 Jr(e,t,n={}){let r=D(t.rect),i=E(r??void 0);if(!r||!i)return{kind:`invalid`};let a=Yr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?Zr(e,t):null,r),s=o?Qr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function Yr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>Xr(e,t,r)).filter(j).flatMap(e=>{let t=D(e.rect);if(!t||Je(t,n))return[];let r=Zr(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 Xr(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 Zr(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 Qr(e,t,n,r){let i=ri(e),a=ti(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=ti(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(!b(t,s.x,s.y))return[];let c=$r(s,e,n,r,i);return c?[c]:[]})).sort(ei)[0]?.point??null}function $r(e,t,n,r,i){let a=ni(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 ei(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function ti(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 ni(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 ri(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function ii(t,n,r,i){let{candidates:a,list:o}=yr(i,t,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Mn(a,s);if(l.kind===`ambiguous`)throw new e(`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=>Le(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}const ai=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."}),oi=new Set([`keyboard`,`key`]);function si(e){return oi.has(x(e.type??``))||p(e)}const ci=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function li(e){return si(e)||ci.has(e.role??``)}function ui(e,t,n){return n.has(e.index)||pi(t,n,e.index).length>0}function di(e){return e!==null&&me(e)}function z(e){return e.flatMap(e=>me(e.rect)?[e.rect]:[])}function fi(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 pi(n,r,e.index))i.add(t);return i}function pi(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 mi(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 hi(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 gi(e){let t=z(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return mi(t.length>0?t:e.anchorRects)}function _i(e){let t=e.filter(li),n=fi(e,t);return z(t.filter(e=>!n.has(e.index)))}function vi(e,t){let n=e.filter(si),r=z(n);if(r.length===0||!di(t))return null;let i=e.filter(li),a=z(i);if(a.length===0)return null;let o=hi({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=fi(e,i);return gi({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:z(i.filter(e=>!s.has(e.index)))}:null}function yi(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:_i(e.nodes)}:vi(e.nodes,e.viewport);if(!t)return e.nodes.some(si)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return bi(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(li).map(e=>e.index));return ui(e.node,n,r)?{kind:`clear`,surface:t}:b(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function bi(e,t){return t.controlRects.some(t=>b(t,e.x,e.y))?{kind:`clear`,surface:t}:b(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function xi(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 Si(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=yi({nodes:e.nodes,viewport:v(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Ti({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Ci(e){let t=yi({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return wi(e.point,t.surface)}function wi(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${ai.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+ai.hint}function Ti(t){return new e(`COMMAND_FAILED`,`${t.label} is behind the visible keyboard and cannot ${xi(t.action)} safely`,{...ai,ref:`@${t.ref}`,rect:t.targetRect,keyboardFrame:t.surface.frame})}function Ei(t,n,r,i,a){if(!r)return;let o=C(t),s=ee(t,n);if(!(pe(o,r.identity)&&he(s,r.structural)))throw new e(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Tn,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function B(e,t,n){return await qi(e,t,n.action),t.target.kind===`point`?await Oi(e,t,t.target,n):t.target.kind===`ref`?await Mi(e,t,t.target,n):await Ni(e,t,t.target,n)}async function Di(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=v(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!b(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.`:Ci({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Oi(e,t,n,r){let i=await Di(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await ki(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function ki(e,t){try{return R((await V(e,t,!0)).snapshot)}catch{return}}function Ai(t,n){let r=a(t.ref);if(!r)throw new e(`INVALID_ARGS`,`Invalid ref: ${t.ref}`);let i=a(n.ref),o=n.node.ref?a(n.node.ref):null;if(i!==r||o!==r||!n.nodes.includes(n.node))throw new e(`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:Ri(r,n.node,`exact`)}}async function ji(e,t,n){let r=await Yi(e,t,n);return{tree:R(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function Mi(e,t,n,r){let{tree:i,keyboard:o,resolved:s}=r.preresolvedTarget?Ai(n,r.preresolvedTarget):await ji(e,t,n),c=i.nodes,{node:l,tapPoint:u}=await Gi({policy:r.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Fi(e,t,r),offscreen:async(i,a)=>await ta(e,t,i,a,n.ref,r)},resolveTapPoint:e=>Qi(e,c,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${a(n.ref)??e.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...Hi(e,l,i,r.action,s.resolution)}}async function Ni(e,t,n,r){let i=n.selector,a=await V(e,t,r.requireInteractive),o=ii(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await V(e,t,!1),o=ii(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Pi({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,{node:c,tapPoint:l}=await Gi({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Fi(e,t,r),offscreen:async(n,i)=>await ea(e,t,n,i,s.selector,r)},resolveTapPoint:e=>Qi(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:l,target:{kind:`selector`,selector:o.selector},...Hi(e,c,R(a.snapshot),r.action,Bi(o,a.snapshot.nodes))}}async function Pi(t){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=t,s=await I(M.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return Ki({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new e(`COMMAND_FAILED`,Ce(i,c,{unique:!0}),{reason:Ne.selectorNotFound,hint:oe(c)})}function Fi(e,t,n){Ei(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const Ii={source:`ref`,phase:`pre-action`,kind:`exact`},Li={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function Ri(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Ii:Li}}const zi={source:`runtime`,phase:`pre-action`,kind:`unique`};function Bi(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Vi(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Vi(e,t))}:zi}function Vi(e,t){let n=x(e.type??``),r=A(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:zr(n,256)}:{},...r===void 0?{}:{label:zr(r,256)}}}function Hi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:ce(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:A(t,a),...Wi(t,r),preAction:n,resolution:i,...Ui(e,t,a,r)}}function Ui(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ar(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:ce(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:A(i,n)}}}function Wi(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function Gi(e){let t=await br(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw Ki({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return Si({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}function Ki(t){return new e(`COMMAND_FAILED`,`${t.label} is covered by another visible element and cannot ${xi(t.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...t.selector?{selector:t.selector}:{},ref:`@${t.node.ref}`,interactionBlocked:t.node.interactionBlocked})}async function V(t,n,r){if(!t.backend.captureSnapshot)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await t.sessions.get(i);if(!a)throw new e(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await t.backend.captureSnapshot(N(t,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(t)};return await t.sessions.set({...a,snapshot:s}),{snapshot:s}}async function qi(t,n,r){if(t.backend.platform!==`macos`)return;let i=await Ji(t,n);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new e(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function Ji(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Yi(t,n,r){let{session:i,snapshot:a}=await Pr(t,n.session),o=r.fallbackLabel??``,s=Zi(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new e(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:ue});return Xi({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function Xi(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=Zi(o.nodes,r.ref,{fallbackLabel:i});return s&&pe(C(a.node),C(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function Zi(t,n,r){let o=a(n);if(!o)throw new e(`INVALID_ARGS`,`Invalid ref: ${n}`);let s=i(t,o);if($i(s))return Ri(o,s,`exact`);let c=r.fallbackLabel.length>0?Dn(t,r.fallbackLabel):null;return $i(c)?Ri(o,c,`label-fallback`):null}function Qi(t,n,r){let i=v(n),a=Jr(n,t,{bounds:[i.resolveEffectiveViewport(t),t.rect?i.resolveViewport(t.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new e(`COMMAND_FAILED`,r.invalidMessage):new e(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function $i(e){return e?E(e.rect)!==null:!1}async function ea(e,t,n,r,i,{action:a}){return await aa(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=>`${na(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 ta(e,t,n,r,i,{action:o}){return await aa(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:a(i)},hint:e=>`${na(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 na(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function ra(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot,o=i?.nodes;if(!i||!o||a(n.ref)===null)return{};let s=Zi(o,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!s)return{};let c=M.resolvedTarget,{node:l}=await Gi({policy:c,nodes:o,node:s.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await ta(e,t,i,a,n.ref,{action:r,pipeline:c})},resolveTapPoint:e=>E(e.rect)});return{...Wi(l,r),node:l,preAction:R(i)}}async function ia(e,t,n,r,i){let a=await ra(e,t,n,r),o=F(await i(N(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Ii,...a,...o?{backendResult:o}:{}}}async function aa(t,n,r,i,a){let o=v(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await t.backend.confirmOffscreenTargetVisible?.(N(t,n),r,c);if(l)return{...r,rect:l};let u=Ve(r,o);throw new e(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function oa(e,t){let n=Me(e.type??`Element`),r=je(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o,e.actions?JSON.stringify(e.actions):``].join(`|`)}function sa(e,t,n={}){let r=ua(la(e,n),la(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 ca(e,t={}){return la(e,t).length}function la(e,t){return t.flatten?e.map(e=>({text:Le(e,0,!1),comparable:oa(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Be(e).map(e=>({text:e.text,comparable:oa(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function ua(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=fa(a,i,s)?H(a,i+1):H(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 da(o,e,t,n,r)}}return[]}function da(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=fa(i,c,r)?c+1:c-1,u=H(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 fa(e,t,n){return t===-n||t!==n&&H(e,t-1)<H(e,t+1)}function H(e,t){return e.get(t)??0}async function pa(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 ma(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?ha(e.nodes):e.nodes).map(va);return n.sort((e,t)=>ba(e).localeCompare(ba(t))),{captureBackend:t,nodes:n}}function ha(e){let t=v(e);return e.filter(e=>h(e)||t.isVisibleOnScreen(e))}function ga(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 _a(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 va(e){return{identity:`${e.type??``}#${ya(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function ya(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function ba(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const xa=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Sa(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=P(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=tt(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;P(e)<o;){let c=await ka(e,t,o-P(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Ca(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=ma(c.snapshot);_=Ta({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=tt(c.snapshot.snapshotQuality);let y=P(e),b=Da({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=Oa({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await ur(e,t);continue}if(!ga(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=Oa({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(x<=0)break;await ur(e,x)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Ca(e,t,n){if(!e||!t||!wa(t.backend,n))return;let r=t.nodes.some(h),i=e.length<=5;if(!(!r&&!i))return ma({...t,nodes:e})}function wa(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Ta(e){return e.requestedQuietMs<500||!_a(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Ea(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Da(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Ea(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Oa(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 ka(e,t,n,r){let i=await pa(e,t,n,async n=>await L(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Aa=`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.`,ja=`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 Ma(e,t,n){return await Pa(e,t,{...n,baseline:await La(e,t,n.resolved),actionPoint:n.resolved.point})}const Na=async(e,t)=>(await Pa(e,t,t)).observation;async function Pa(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 Fa(e,t,n,a,await Sa(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 Fa(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?ja:Aa}};let{stored:o,session:s}=await Xa(e,t,i.lastCapture),c=R(i.lastCapture.snapshot),l=c.nodes,u=Gr(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?Ha(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...Ja(i,o,l.length,u)},settledCapture:c}}function Ia(e,t){if(e)return Kr(e,t)}async function La(e,t,n){let r=await e.sessions.get(t.session??`default`);return Ra(n,r)??Ba(n.preAction)??za(r)}function Ra(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?Ba(R(n)):void 0}function za(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?R(t):{nodes:[]}}function Ba(e){return e?.nodes.length?e:void 0}function Va(e,t,n){let r=sa(yn(e,n),yn(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=qa(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 Ha(e,t,n,r){let i=Va(e,t,r);return{diff:i,...Ua(i,t,n,r)}}function Ua(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=bn(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)&&!Wa(o.get(e),n))?{}:Ka(t,i,r)}function Wa(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 Ga=new Set([`application`,`window`]);function Ka(e,t,n){let r=bn(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!Ga.has(Me(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=Me(e.type??`Element`),n=je(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function qa(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 Ja(e,t,n,r){let i=Ya(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=qr(r);return{hint:i===void 0?a:`${a} ${i}`}}function Ya(e,t,n){return e.stalled?{hint:ja}:e.settled?t?n<5?{hint:xa}:{}:{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:Aa}}async function Xa(e,t,n){if(at(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 U(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function W(e,t,n,r,i){let a=await Za(e,t,n,i);return $a({...r,...a})}async function Za(e,t,n,r){if(r.settle!==void 0){let i=await Ma(e,t,{...r.settle,resolved:n}),a=r.verify?Ia(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await Qa(e,t,n);return i?{evidence:i}:{}}async function Qa(e,t,n){try{return Kr(R((await V(e,t,!0)).snapshot),n.preAction)}catch{return}}function $a(e){let t=e;if(t.targetHittable!==!1||!eo(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function eo(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 to(t,n){let r=v(t),i=t.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(no),a=i.length>0?i:t.map(e=>e.rect).filter(no);if(a.length===0)throw new e(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function no(e){return!!(e&&e.width>0&&e.height>0)}async function ro(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||to((await V(e,t,!1)).snapshot.nodes,`gesture`)}const io=async(t,n)=>{let r=await B(t,n,{action:`focus`,requireInteractive:!0,pipeline:M.resolvedTarget});if(!t.backend.focus)throw new e(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=F(await t.backend.focus(N(t,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},ao=async(t,n)=>{let r=U(n),i=await B(t,n,{action:`longPress`,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!t.backend.longPress)throw new e(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:Zn(n.durationMs,`durationMs`,0,12e4),o=G(i),s=F(await t.backend.longPress(N(t,n),o,{durationMs:a}));return await W(t,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},oo=async(t,n)=>{let r=U(n),i=r.needsPreActionBaseline?null:await so(t,n);if(i)return i;let a=await B(t,n,{action:`hover`,requireInteractive:!1,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!t.backend.hover)throw new e(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=F(await t.backend.hover(N(t,n),o));return await W(t,n,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},r)};async function so(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await ia(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const co=async(t,n)=>{if(!t.backend.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await qi(t,n,`drag`);let r=await ro(t,n),i=await lo(t,n,`source`),a=await lo(t,n,`destination`),o=Ze({from:G(i),to:G(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=F(await t.backend.performGesture(N(t,n),o)),{start:c,end:l}=Ye(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:uo(i),destination:uo(a)},recording:fo(i,a),...s?{backendResult:s}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function lo(e,t,n){let r=t.gesture[n];return await B(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:M.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function uo(t){if(t.kind===`point`||!t.resolution)throw new e(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in t?t.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:t.resolution}}function fo(e,t){let n=po(e),r=po(t),i=mo(e),a=mo(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function po(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function mo(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(t){if(!t.point)throw new e(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return t.point}const ho=async(e,t)=>await vo(e,t,`press`),go=async(e,t)=>await vo(e,t,`click`),_o=async(t,n)=>{if(typeof n.text!=`string`)throw new e(`INVALID_ARGS`,`fill requires text`);let r=U(n),i=r.needsPreActionBaseline?null:await xo(t,n);if(i)return i;let a=await B(t,n,{action:`fill`,requireInteractive:!0,pipeline:M.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!t.backend.fill)throw new e(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=yo(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&ae(s,t.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=F(await t.backend.fill(N(t,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Co(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await W(t,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function vo(t,n,r){let i=U(n),a=i.needsPreActionBaseline?null:await bo(t,n,r);if(a)return a;let o=await B(t,n,{action:r,requireInteractive:!0,pipeline:M.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!t.backend.tap)throw new e(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=yo(o),c;try{c=await t.backend.tap(N(t,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw sr(e,o),e}let l=F(c);return await W(t,n,o,{...o,...l?{backendResult:l}:{}},i)}function yo(t){if(!t.point)throw new e(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return t.point}async function bo(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||So(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await ia(e,t,t.target,n,async(e,t)=>await r(e,t))}async function xo(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await ia(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function So(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 Co(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 wo=M.wait.poll.defaultTimeoutMs;function To(e,t,n,r,i={}){let a=wr(r),o=n??a.defaultTimeoutMs,s=Y(e),c=Lo(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 pa(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(Eo(r,c.lastUnobservedCause())),o;let f=Fo(o.error);return a(f?`runner-restart`:`deadline`),u=f??{},{timedOut:!0,deadline:Do(f!==void 0,c.readableCaptures())}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:Oo(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await Ro(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Eo(e,t){return e?`readable`:t?.outcome??`unreadable`}function Do(e,t){return e?`runner-restart-exhausted`:t===0?`capture-stalled`:`capture-truncated`}function Oo(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function ko(t,n){return new e(`COMMAND_FAILED`,t,{reason:k.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Ao(t,n){return new e(`COMMAND_FAILED`,t,{reason:k.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...n,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function jo(t,n){return new e(`COMMAND_FAILED`,t,{reason:k.deadlineExceeded,captureTruncated:!0,...n})}function Mo(t,n){return new e(`COMMAND_FAILED`,t,{reason:k.targetAbsent,...n})}function No(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw Po(r.error,t);if(n)throw r.error}}function Po(t,n){let i=r(t);return new e(i.code,i.message,{reason:k.captureStalled,...i.details,...n},i)}function q(e,t,n){let r=t.failureEvidence();return n===`runner-restart-exhausted`?Ao(e,r):n===`capture-stalled`?(No(t,r,t.preserveUnreadableOnStall===!0),ko(e,r)):n===`capture-truncated`?jo(e,r):(No(t,r,!0),r.readableCaptures===0?ko(e,r):Mo(e,r))}function Fo(t){if(!(t instanceof e))return;let n=t.details;if(n?.runnerRestarted===!0)return{runnerRestarted:!0,...J(n,`runnerRestartReason`),...J(n,`runnerRestartCommand`),...J(n,`runnerRestartCommandId`),...J(n,`runnerInvalidatedSessionId`),...J(n,`runnerRestartSessionId`),...J(n,`logPath`),...J(n,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function Io(t){return t instanceof e&&t.details?.retriable===!0}function Lo(e=$e){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(Io(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function Ro(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function zo(e,t,n){let r=await I(M.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Ie(e,i)}}async function Bo(e,t,n){let r=await zo(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 Vo(e,t,n,r,i){let a=ke(n);if(a)throw ze(a,`wait`);let o=To(t,n,i,M.wait,{isUnreadableError:Uo,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await zo((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ae(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw $e(e)?Re(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw l===`runner-restart-exhausted`?q(`wait absent timed out for selector: ${r}`,o,l):c?Ho(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function Ho(t,n,r){let i=n.matches!==1;return new e(`COMMAND_FAILED`,`wait absent timed out for selector ${t}: ${n.matches} match${i?`es`:``} remain`,{reason:k.targetPresent,selector:t,...r,matches:n.matches,firstMatch:n.firstMatch})}function Uo(t){if(!(t instanceof e))return!1;let n=t.details;return n?.command===`wait`&&n.predicate===`absent`&&(Ae(n.observation)||n.observation===`unreadable`)}function Wo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function Go(t,n,r,i,a,o){let s=To(n,r,a,M.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let e=await s.capture(async e=>await t.captureSnapshot(n,{...r,signal:e},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(e.timedOut){u=e.deadline;break}let a=e.value;if(a){let e=a.snapshot.nodes,t=Wo(await I(M.wait,e,i,{platform:n.backend.platform}));if(t){let n=Ko(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new e(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:En,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function Ko(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=mt(e),a=gt(t.matchedNodes,i,g(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:C(r),observedAncestry:ht(r,i,Math.max(n.ancestry.length,1)).chain}}}async function qo(t,n,r,i,a){let o=a??wo,s=i??t.stable.defaultQuietMs,c=await t.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new e(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:k.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<t.stable.tinyTreeNodeCount?{hint:t.stable.tinyTreeHint}:{}}}async function Jo(e,t,n,r,i){let a=To(t,n,i,M.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await Yo(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function Yo(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Zo(t,n),r)).found?!0:await Xo(e,t,n,r)}async function Xo(e,t,n,r){return!!Dn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Zo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Qo(t){let n=async(e,n)=>{switch(n.target.kind){case`sleep`:return await Ro(e,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await $o(t,e,n,n.target.ref,n.target.timeoutMs);case`selector`:return await Go(t,e,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await Vo(t,e,n,n.target.selector,n.target.timeoutMs);case`stable`:return await qo(t,e,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await es(t,e,n,n.target.text,n.target.timeoutMs);default:return ts(n.target)}};return{waitCommand:n,waitForTextCommand:async(t,r)=>{let i=await n(t,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new e(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function $o(t,n,r,o,s){let c=await t.requireSnapshot(n,r.session),l=a(o);if(!l)throw new e(`INVALID_ARGS`,`Invalid ref: ${o}`);let u=i(c.snapshot.nodes,l),d=u?A(u,c.snapshot.nodes):void 0;if(!d)throw new e(`COMMAND_FAILED`,`Ref ${o} not found or has no label`);return await Jo(t,n,r,d,s)}async function es(t,n,r,i,a){let o=be(i);if(!o.ok)throw new e(o.code,o.message);return await Jo(t,n,r,o.text,a)}function ts(e){throw Error(`Unsupported wait target: ${String(e)}`)}const ns=Qo({captureSnapshot:L,requireSnapshot:Pr,stable:{defaultQuietMs:500,tinyTreeHint:xa,tinyTreeNodeCount:5,capture:Sa}}),rs=ns.waitCommand,is=ns.waitForTextCommand,as=async(t,n)=>{let r=n.locator??`any`;if(!n.query)throw new e(`INVALID_ARGS`,m);if(n.action===`wait`)return await ls(t,n,r);if(n.action===`list`)return await us(t,n,r);let{capture:i,match:a}=await ds(t,n,r);if(!a)throw new e(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await Lr(t,i,a),node:a}},os=async(e,t)=>{if(t.target.kind===`ref`){let n=await Pr(e,t.session),r=Rr(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`});Ei(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=ce(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 Lr(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await fs(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?M.readText:M.readUnique,hooks:{onResolved:(e,n)=>Ei(e,n,t.expectedResolvedTarget,`get`)}}),r=ce(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 Lr(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}},ss=async(t,n)=>{let r=await os(t,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new e(`COMMAND_FAILED`,`getText returned non-text result`);return r},cs=async(t,n)=>{let r=await os(t,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new e(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function ls(e,t,n){let r=To(e,t,t.timeoutMs,M.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await ds(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 us(e,t,n){let r=ne(n,t.query),i=await L(e,t,{updateSession:!0,...K()});if(at(i.snapshot.snapshotQuality))throw Nr(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?yr(M.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ie(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function ds(e,t,n,r){let i=ne(n,t.query),a=await L(e,t,{updateSession:!0,scope:Mr(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(at(a.snapshot.snapshotQuality))throw Nr(a.snapshot.snapshotQuality);if(i){let t=await I(M.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ie(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function fs(t,n,r,i){let a=await L(t,{...n,session:r},{updateSession:!0,...K()}),o=await I(i.policy,a.snapshot.nodes,i.selector,{platform:t.backend.platform},i.hooks);if(o.kind!==`target`)throw new e(`COMMAND_FAILED`,Ce(i.selector,[],{unique:!0}),{hint:oe([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const ps=async(t,n)=>{let r=ye(n.predicate);if(!r.ok)throw new e(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=ke(n);if(e)throw ze(e)}if(i===`text`&&!n.expectedText)throw new e(`INVALID_ARGS`,ge);let a=n.selector,o=await ms(t,n,i,a);return i===`exists`?await hs(t,o,a):i===`absent`?await Bo(o.snapshot,a,t.backend.platform):await gs(t,n,o,i,a)};async function ms(e,t,r,i){try{return await L(e,t,{updateSession:!0,...K(r)})}catch(e){throw r!==`absent`||n(e)?e:Re(i,e)}}async function hs(t,n,r){let i=await I(M.readAny,n.snapshot.nodes,r,{platform:t.backend.platform});if(i.kind!==`target`)throw new e(`COMMAND_FAILED`,Ce(r,[],{unique:!1}),{hint:oe([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Se(r)}}async function gs(t,n,r,i,a){let o=await I(M.readUnique,r.snapshot.nodes,a,{platform:t.backend.platform},{onResolved:(e,t)=>Ei(e,t,n.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new e(`COMMAND_FAILED`,Ce(a,[],{unique:!0}),{command:`is`,reason:Ne.selectorNotFound,predicate:i,selector:a,hint:oe([])});let s=_e({predicate:i,node:o.node,visibility:v(r.snapshot.nodes),expectedText:n.expectedText,platform:t.backend.platform});if(!s.pass)throw new e(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:Ne.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:Se(a),node:o.node,preActionNodes:r.snapshot.nodes}}const _s=async(e,t)=>await ps(e,{...t,predicate:`visible`,selector:t.target.selector}),vs=async(e,t)=>await ps(e,{...t,predicate:`hidden`,selector:t.target.selector}),ys=async(t,n)=>{if(!t.backend.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await qi(t,n,n.gesture.intent);let r=await ro(t,n),i=Xe(n.gesture,r,t.backend.platform),a=F(await t.backend.performGesture(N(t,n),i)),o=xs(i.pointers,0),s=xs(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Ss(n.gesture,o,s))}},bs=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await co(e,{...t,gesture:n}):await ys(e,{...t,gesture:n})};function xs(t,n){let r=t.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new e(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ss(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:as,get:os,getText:ss,getAttrs:cs,is:ps,isVisible:_s,isHidden:vs,wait:rs,waitForText:is},Z={click:go,press:ho,fill:_o,focus:io,longPress:ao,hover:oo,gesture:bs,settleObservation:Na};function Cs(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 ws(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 Q=[0,187,255,255];function Ts(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Es(e,n.rect)}function Es(e,t){let n=Ds(t);if(n==null)return;let r=ks(n.x,0,e.width-1),i=ks(n.y,0,e.height-1),a=ks(n.right,0,e.width-1),o=ks(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Os(e,n,i+t,Q),Os(e,n,o-t,Q);for(let n=i;n<=o;n+=1)Os(e,r+t,n,Q),Os(e,a-t,n,Q)}}function Ds(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 Os(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 ks(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const As=[{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 js(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(!Ps(t,a,e))continue;let c=0,l=Ns(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Ms({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Ms(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 As){let o=s+e.x,u=c+e.y;if(!Fs(o,u,i,a))continue;let d=u*i+o;Ps(t,n,d)&&(l=Ns(r,n,l,d))}return l}function Ns(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Ps(e,t,n){return e[n]===1&&t[n]!==1}function Fs(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function Is(e,t){return e.flatMap(e=>Ls(e,t.baseline.width,t.baseline.height)?Rs(e,t,Ws(t.baseline.height)):[e])}function Ls(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Us(n)&&r>=t*.35}function Rs(e,t,n){let r=Hs(e,Vs(Bs(zs(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>Gs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function zs(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 Bs(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 Vs(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 Hs(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 Us(e){return Math.max(48,Math.round(e*.07))}function Ws(e){return Math.max(24,Math.round(e*.03))}function Gs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Ks(t,a),qs(i,e,t,a,r.baseline,r.current))}return i}function Ks(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 qs(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 Js=2.5;function Ys(e){let t=Xs(e);return Is(t.length<=2e3?$s(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)=>nc(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Xs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return js({mask:t,width:i,height:a,hooks:{create:e=>Zs(e,i),visit:(e,t)=>Qs(e,t,i,n,r)}})}function Zs(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 Qs(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 $s(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=>ec(e,r,t));if(!e){n.push({...r});continue}tc(e,r)}return n}function ec(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 tc(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 nc(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=rc(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=rc(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:kn({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:oc(r,n.width,n.height),size:sc(s,n.totalPixels),location:ic(i,n.width,n.height),averageBaselineColorHex:lc(a),averageCurrentColorHex:lc(o),baselineLuminance:Math.round(cc(a)),currentLuminance:Math.round(cc(o)),dominantChange:ac(a,o)}}function rc(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function ic(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 ac(e,t){let n=cc(t)-cc(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 oc(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*Js?`horizontal-band`:e.height>=e.width*Js?`vertical-band`:`compact`}function sc(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function cc(e){return e.r*.2126+e.g*.7152+e.b*.0722}function lc(e){return`#${uc(e.r)}${uc(e.g)}${uc(e.b)}`}function uc(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const dc=Math.sqrt(3*255**2);async function fc(e,t,n={}){await pc(e,`Baseline image not found`),await pc(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([O.readFile(e),O.readFile(t)]),[o,s]=await Promise.all([ot(i,`baseline screenshot`),ot(a,`current screenshot`)]);mc(o.width,o.height,`baseline screenshot`,n.maxPixels),mc(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 hc(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*dc,{diffData:d,diffMask:f,differentPixels:p}=await st({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Ys({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new lt.PNG({width:o.width,height:o.height});e.data=d,Ts(e,m),await O.mkdir(ft.dirname(r),{recursive:!0}),await O.writeFile(r,await ct(e))}else await hc(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 pc(t,n){try{await O.access(t)}catch{throw new e(`INVALID_ARGS`,`${n}: ${t}`)}}function mc(t,n,r,i){if(i==null||i<=0)return;let a=t*n;if(!(a<=i))throw new e(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function hc(e){if(e)try{await O.unlink(e)}catch(e){if(!gc(e,`ENOENT`))throw e}}function gc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function _c(e,t){return e.map(e=>{let n=vc(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function vc(e,t){let n=xe(e.rect);return t.map(t=>{let r=t.overlayRect,i=An(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:yc(i/xe(r)),regionCoveragePercentage:yc(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 yc(e){return Math.round(e*100*100)/100}async function bc(t,n,i){if(n.kind===`path`&&!t.policy.allowLocalInputPaths)throw new e(`INVALID_ARGS`,`Local ${i.field??`input`} paths are not allowed by command policy`);try{return await t.artifacts.resolveInput(n,i)}catch(e){throw r(e)}}async function xc(t,n,i){if(n?.kind===`path`&&!t.policy.allowLocalOutputPaths)throw new e(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await t.artifacts.reserveOutput(n,{...i,visibility:i.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??i.requestedClientPath:i.requestedClientPath})}catch(e){throw r(e)}}async function Sc(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw r(e)}}const Cc=async(t,n)=>{if(!n.baseline)throw new e(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=wc(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!Mc(i))throw new e(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await bc(t,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let e;Mc(i)?(s=await Tc(t,n),e=s.path):(o=await bc(t,i,{usage:`diff screenshot current`,field:`current`}),e=o.path),c=n.out?await xc(t,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await fc(a.path,e,{threshold:r,outputPath:c?.path,maxPixels:t.policy.maxImagePixels});Mc(i)&&(u=await Ec(t,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function wc(t){if(t==null||t===``)return .1;let n=Number(t);if(Number.isNaN(n)||n<0||n>1)throw new e(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Tc(e,t){let n=await Sc(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Dc(e,t,n.path,Oc(t))}catch(e){throw await n.cleanup(),e}return n}async function Ec(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await jc(n),r;let a=await xc(e,kc(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Dc(e,t,a.path,{overlayRefs:!0,...Oc(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:_c(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Dc(t,n,r,i={}){if(!t.backend.captureScreenshot)throw new e(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await t.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??t.signal,metadata:n.metadata},r,i)??{}}function Oc(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function kc(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:Ac(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:Ac(e.out.clientPath)}:{},...e.out.fileName?{fileName:Ac(e.out.fileName)}:{}}}function Ac(e){let t=ft.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function jc(e){try{await O.unlink(Ac(e))}catch(e){if(!Nc(e,`ENOENT`))throw e}}function Mc(e){return e.kind===`live`}function Nc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Pc=async(t,n)=>{if(!t.backend.captureScreenshot)throw new e(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);c(n);let r=await xc(t,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await t.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??t.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await rt(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function Fc(e){let{nodes:n,backend:r,snapshotRaw:i}=e;if(i||!t(r))return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let a=He(n),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:n.length,reasons:[...o]}}const Ic=`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 Lc(e){return e?.systemSurfaceOnly===!0?Ic:void 0}function Rc(e,t){return e.presentationKey?e:{...e,presentationKey:s(t)}}function zc(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||!Bc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Vc(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 Bc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Vc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>Uc(e,t.nodes[n]))}const Hc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,role:!0,subrole:!0,label:!0,value:!0,identifier:!0,enabled:!0,selected:!0,focused:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function Uc(e,t){return Hc.every(n=>e[n]===t[n])&&Wc(e.rect,t.rect)&&Gc(e.presentationHints,t.presentationHints)&&Gc(e.actions,t.actions)}function Wc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function Gc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Kc=async(e,t)=>{let n=await Jc(e,t),r=zc({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(Xc(t.session,n));let i=Qc(n.snapshot);return d(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:Fc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...Zc(n)})},qc=async(e,t)=>{let n=await Jc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Xc(t.session,n);if(!i){let t=ca(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=sa(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 Jc(t,n){if(!t.backend.captureSnapshot)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await t.sessions.get(r),a=await t.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??t.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=Yc(a,t),s=d(o,Rc(o,n)),c=l(a),u=P(t);return{snapshot:s,result:a,session:i,annotations:c,warnings:$c({result:a,annotations:c,snapshot:s,options:n,session:i,capturedAt:s.createdAt??u,runtimeNow:u})}}function Yc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t),...e.keyboard?{keyboard:e.keyboard}:{}}}function Xc(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 Zc(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 Qc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:dt(e.producer)===`unavailable`&&void 0:e.truncated}function $c(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...nt(e.annotations.quality,e.snapshot.nodes)),t.push(...it(Qc(e.snapshot))),e.snapshot.unsettledGesture&&t.push(en(e.snapshot.unsettledGesture)),t.push(...il(e)),e.annotations.quality||(t.push(...tl(e)),t.push(...rl(e.snapshot.nodes)));let n=bt(e.snapshot.nodes);n&&t.push(n);let r=el(e.annotations);r&&t.push(r);let i=al(e);return i&&t.push(i),t.push(...ll(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function el(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Ic}function tl(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return nl(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 nl(e){return e?x(e.type??``)===`application`:!1}function rl(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 il(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 al(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&ol(t,e.snapshot)&&sl(t,e.capturedAt,e.runtimeNow)&&ul(t.nodes.length,e.snapshot.nodes.length))return cl}function ol(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function sl(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const cl=`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 ll(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`?[cl]:[]}function ul(e,t){return e<12?!1:t<=Math.floor(e*.2)}const dl={screenshot:Pc,diffScreenshot:Cc,snapshot:Kc,diffSnapshot:qc};function fl(e){return dr(dl,e)}export{xn as A,Rn as C,Tn as D,Dn as E,xt as F,ht as I,mt as L,$t as M,en as N,En as O,nn as P,gt as R,Bn as S,A as T,er as _,ws as a,Qn as b,yr as c,dr as d,F as f,$n as g,M as h,bc as i,bn as j,k,I as l,cr as m,Lc as n,Cs as o,N as p,xc as r,Ur as s,fl as t,br as u,rr as v,Fn as w,Zn as x,ir as y};
1
+ import{A as e,C as t,R as n,g as r,j as i,k as a,v as o,y as s}from"./sdk-contracts.js";import{m as c}from"./capture.js";import{r as l,t as u}from"./snapshot-capture-annotations.js";import{f as d,l as f,n as p}from"./android-input-ownership.js";import{An as m,Ar as h,Bn as g,Dn as _,Er as v,Gn as y,Ir as b,Jn as ee,Jr as te,Kn as ne,Kr as x,Ln as re,Mr as ie,Nn as ae,Nr as oe,On as se,Pr as ce,Rn as le,Rr as ue,Sn as de,Tn as fe,Vn as pe,Vr as me,Wn as he,Xn as ge,Zr as _e,bn as S,cr as ve,hr as ye,jr as be,mr as xe,pr as Se,qn as C,un as Ce,wn as we,xn as Te,xr as Ee,zn as De,zr as Oe}from"./sdk-batch.js";import{r as w}from"./success-text.js";import{_ as ke,a as Ae,c as je,f as Me,g as Ne,h as Pe,i as Fe,m as Ie,n as Le,o as T,p as Re,r as ze,s as Be,u as Ve}from"./overlay.js";import{n as He,t as Ue}from"./mobile-snapshot-semantics.js";import{r as E}from"./diagnostics.js";import{t as We}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as D,n as O,t as Ge}from"./rect-center.js";import{a as Ke,n as qe,t as Je}from"./gesture-plan.js";import{t as Ye}from"./android-snapshot-quality.js";import{n as Xe,r as Ze}from"./android-system-chrome.js";import{c as Qe,n as $e,o as et,r as tt,s as nt}from"./quality-warnings.js";import{a as rt,n as it,o as at}from"./png-worker-client.js";import{r as ot}from"./png.js";import{i as st}from"./ios-system-surface.js";import{n as ct}from"./ios-snapshot-acquisition.js";import lt from"node:path";import{promises as k}from"node:fs";import{createHash as ut}from"node:crypto";function dt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function ft(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=C(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function pt(e,t,n,r){return e.filter(e=>{if(!ne(C(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&y(i.chain,r)})}const mt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),ht={strippedIndexes:new Set,refs:new Set};function gt(e){let t=new Set(e.filter(e=>b(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return ht;let n=new Map(e.map(e=>[e.index,e])),r=xt(e,n,t),i=new Set(r),a=kt(e,n,r);for(let t of xt(e,n,a))i.add(t);for(let o of _t(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function _t(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=yt(t,n,r);if(o.size===0)return a;let s=bt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&vt(n,t,o)&&a.add(n.index);return a}function vt(e,t,n){if(!e.rect)return!1;let r=At(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function yt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=At(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function bt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function xt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)jt(i,t,n)&&r.add(i.index);return r}function St(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Xe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ze(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(p).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:wt(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?ht:{strippedIndexes:o,refs:s}}function wt(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&St(e,t)).map(e=>e.index))}function Tt(e,t){let n=gt(e),r=Ct(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Et(e,t){let{strippedIndexes:n}=Tt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Dt(e,t){return Tt(e,t).refs}function Ot(e){return gt(e).refs}function kt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||b(n.type??``)!==`keyboard`)continue;let i=At(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>mt.has(b(e.type??``))&&!n.has(e.index)&&jt(e,t,a))&&r.delete(i)}return r}function At(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(b(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function jt(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Mt=3500;function Nt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Pt(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function Ft(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function It(e){let{pending:t,needsBaselineDistrust:n,hooks:r}=e,i=Date.now(),a=1,o=await Lt(r,e.initial),s=t.baselineSignature,c=t.baselineBackend,l=!1,u=1500,d=!1;for(;a<2||Date.now()-i<u;){await We(200),a+=1;let e=await Lt(r);if(d=r.signaturesStable(o.signature,e.signature),d){let d=Date.now()-i;if(s&&c!==e.backend){E({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:c,to:e.backend,attempts:a}}),s=e.signature,c=e.backend,l=!0,o=e;continue}let f=Ft({needsBaselineDistrust:n,baselineSignature:s,quietSignature:e.signature,elapsedMs:d,distrustCapMs:Mt,classifyBaselineEvidence:r.classifyBaselineEvidence});if(f===`distrust`){u=Mt,o=e;continue}return Rt(f,t.action,a,d),zt(f,t,e,r,l)}o=e}return E({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:a,durationMs:Date.now()-i,lastPairAgreed:d}}),d?{value:o.value}:{value:o.value,postGestureOutcome:Pt(`unsettled`,t)}}async function Lt(e,t){let n=t??await e.capture();return{value:n,...e.readSurface(n)}}function Rt(e,t,n,r){if(e===`accept-stale`){E({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}E({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Pt(`no-effect`,t)}:(E({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}const A={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Bt=[`runner-start`,`target-discovery`];function Vt(e){let t=e?.readinessPhase;return Bt.find(e=>e===t)}const Ht=`replay_target_guard_mismatch`,Ut=A.landmarkIdentityMismatch;function Wt(e,t){return e.find(e=>me(e,t))??null}function j(e,t){let n=ie(e);return n&&ce(n)?n:Gt(e,t)}function Gt(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=ie(e);if(!t||!ce(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Kt(e){return e}function qt(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Jt=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function M(e){return[e.type,e.role,e.subrole].map(e=>b(e??``)).some(e=>e===`tab`||Jt.some(t=>e.includes(t)))}function Yt(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=pn(e);if(!Xt(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=an(e,n,r).node;for(let n of t.slice(1))if(an(e,n,r).node.index!==i.index){let e=$t(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Xt(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Zt(i,a,t)&&!Zt(a,i,t))return!1}return!0}function Zt(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Qt(e,t){return $t(t,pn(e))}function $t(e,t){if(e.length<2||!Xt(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!M(n)||!e.every(e=>e===n||!M(e)))return null;let r=O(n.rect);return r&&e.every(e=>en(O(e.rect),r))?n:null}function en(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function tn(e,t){if(!t?.rect||!e.rect||!h(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function nn(e,t){return an(e,t)}function rn(e){let t=pn(e);return n=>an(e,n,t)}function an(e,t,n){return f(t)?{node:t,reason:`covered`}:on(e,t,n)??sn(t)??cn(e,t,n)??{node:t,reason:`original`}}function on(e,t,n){let r=un(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function sn(e){return M(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function cn(e,t,n){let r=ln(e,t,n);return!r?.rect||f(r)||!D(r.rect)?null:dn(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function ln(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?Oe(e,t,n.nodesByIndex,e=>r(e)?e:null):ue(e,t,r)}function un(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||f(e))return!1;let t=O(e.rect);return t?Ge(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function dn(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(fn(t)&&!Ge(i,a))return!0;let o=be(n,i,r?.viewportRootRects);return!o||!mn(a,o)?!1:!Ge(i,a)}function fn(e){let t=b(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function pn(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(h(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function mn(e,t){let n=qt(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function hn(t,n,r,i){if(!Number.isFinite(t)||!Number.isInteger(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return t}function gn(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}function _n(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??vn(),policy:e.policy??Sn(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function vn(e=[]){let t=new Map(e.map(e=>[e.name,yn(e)]));return{get:e=>yn(t.get(e)),set:e=>{t.set(e.name,yn(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>yn(e))}}function yn(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:bn(e.metadata)}:{}}}function bn(e){try{return structuredClone(e)}catch{return{...e}}}function xn(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Sn(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Cn={defaultTimeoutMs:1e4,intervalMs:300},N={promotedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:S.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:S.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:S.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Cn},wait:{resolution:S.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Cn},readList:{resolution:S.readList,occlusion:`ignore`},findAct:{resolution:S.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:S.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},wn=new WeakMap;function Tn(e,t){Dn(e)&&wn.set(e,t)}function En(e){return Dn(e)?wn.get(e):void 0}function Dn(e){return typeof e==`object`&&!!e||typeof e==`function`}function P(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function F(e){return e.clock?.now()??Date.now()}async function On(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function kn(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function I(e){return e&&typeof e==`object`?e:void 0}function An(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=fe(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?Mn(a):a.matchedNodes.length>1?jn(a):Mn(a)}let a=_(e,t,{...r,...Te({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:jn(a.firstMatch):{kind:`none`}}function jn(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Mn(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function Nn(e,t,n){let r=fe(e,Ee(t),n);return r?{...r,selector:r.selector.raw}:null}function Pn(e,t,n,r){let i=An(e,Ee(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}async function L(e,t,n,r,i={}){let a=Pn(zn(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await In(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Fn(t,a);return o?await In(e,t,o,i):a}function Fn(e,t){let n=Qt(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function In(e,t,n,r){let i=await Rn(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Ln(e,t,n,r){let i=zn(e,t);return{candidates:i,list:Nn(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Rn(e,t,n,r={}){r.onResolved?.(n,t);let i=Bn(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||f(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Vn(e,t,i.node,r)}}function zn(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!f(e)):t}function Bn(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=nn(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&tn(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Vn(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Hn(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function Un(e){return e.hittable===!0||M(e)}function Wn(e,t){let n=pe(C(e),t);return n.id!==void 0||n.label!==void 0?!1:De(e.value)===null}function Gn(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Kn(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&Gn(t,e,n)).sort((e,t)=>e.index-t.index)}function qn(e,t){let n=D(e.rect);return!n||!t.rect?!1:x(t.rect,n.x,n.y)}function Jn(e,t){if(!Wn(e,t))return e;let n=Kn(e,t);if(n.some(Un))return e;let r=n.find(e=>C(e).label!==void 0);return!r||!qn(r,e)?e:r}function Yn(e){return e===`text`||e===`label`||e===`any`}function Xn(e,t,n,r){if(!(r||e===`web`))return Yn(t)?n:void 0}function Zn(t){return new e(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:t.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function Qn(t,n){let r=n??`default`,i=await t.sessions.get(r);if(!i)throw new e(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new e(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function R(t,n,r={updateSession:!0}){let i=t.backend.captureSnapshot;if(!i)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await t.sessions.get(a),s=$n(await i(P(t,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),t);return(n.signal??t.signal)?.throwIfAborted(),r.updateSession&&o&&!nt(s.snapshotQuality)&&await t.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function $n(e,t){return e.snapshot?er(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:F(t)}}function er(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function tr(e,t,n){if(e.backend.readText){let r=await e.backend.readText(P(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return ke(n)}function nr(n,r,i){let a=t(r);if(!a)throw new e(`INVALID_ARGS`,i.invalidRefMessage);let s=o(n,a)??(i.fallbackLabel.length>0?Wt(n,i.fallbackLabel):null);if(!s)throw new e(`COMMAND_FAILED`,i.notFoundMessage,{reason:T.refNotFound,ref:a,hint:de});return{ref:a,node:s}}function rr(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function ir(e){let t=Buffer.alloc(16);for(let n of e)or(t,ar(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function ar(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function or(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function sr(e){let{digest:t,nodeCount:n}=ir(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=cr(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function cr(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function z(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function lr(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:st(n)}}function ur(e,t){let n=sr(e.nodes),r=lr(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==sr(t.nodes).digest;return{...n,changedFromBefore:i}}function dr(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function fr(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=pr(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?hr(e,t):null,r),s=o?gr(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function pr(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>mr(e,t,r)).filter(M).flatMap(e=>{let t=O(e.rect);if(!t||Ge(t,n))return[];let r=hr(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function mr(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function hr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function gr(e,t,n,r){let i=xr(e),a=yr(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=yr(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!x(t,s.x,s.y))return[];let c=_r(s,e,n,r,i);return c?[c]:[]})).sort(vr)[0]?.point??null}function _r(e,t,n,r,i){let a=br(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function vr(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function yr(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function br(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function xr(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function Sr(t,n,r,i){let{candidates:a,list:o}=Ln(i,t,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Yt(a,s);if(l.kind===`ambiguous`)throw new e(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Pe(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}const Cr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),wr=new Set([`keyboard`,`key`]);function Tr(e){return wr.has(b(e.type??``))||p(e)}const Er=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function Dr(e){return Tr(e)||Er.has(e.role??``)}function Or(e,t,n){return n.has(e.index)||jr(t,n,e.index).length>0}function kr(e){return e!==null&&te(e)}function B(e){return e.flatMap(e=>te(e.rect)?[e.rect]:[])}function Ar(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of jr(n,r,e.index))i.add(t);return i}function jr(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function Mr(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function Nr(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function Pr(e){let t=B(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return Mr(t.length>0?t:e.anchorRects)}function Fr(e){let t=e.filter(Dr),n=Ar(e,t);return B(t.filter(e=>!n.has(e.index)))}function Ir(e,t){let n=e.filter(Tr),r=B(n);if(r.length===0||!kr(t))return null;let i=e.filter(Dr),a=B(i);if(a.length===0)return null;let o=Nr({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=Ar(e,i);return Pr({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:B(i.filter(e=>!s.has(e.index)))}:null}function Lr(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:Fr(e.nodes)}:Ir(e.nodes,e.viewport);if(!t)return e.nodes.some(Tr)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return Rr(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(Dr).map(e=>e.index));return Or(e.node,n,r)?{kind:`clear`,surface:t}:x(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function Rr(e,t){return t.controlRects.some(t=>x(t,e.x,e.y))?{kind:`clear`,surface:t}:x(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function zr(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function Br(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=Lr({nodes:e.nodes,viewport:v(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Ur({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Vr(e){let t=Lr({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return Hr(e.point,t.surface)}function Hr(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Cr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Cr.hint}function Ur(t){return new e(`COMMAND_FAILED`,`${t.label} is behind the visible keyboard and cannot ${zr(t.action)} safely`,{...Cr,ref:`@${t.ref}`,rect:t.targetRect,keyboardFrame:t.surface.frame})}function Wr(t,n,r,i,a){if(!r)return;let o=C(t),s=ee(t,n);if(!(he(o,r.identity)&&ge(s,r.structural)))throw new e(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Ht,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function V(e,t,n){return await di(e,t,n.action),t.target.kind===`point`?await Kr(e,t,t.target,n):t.target.kind===`ref`?await Xr(e,t,t.target,n):await Zr(e,t,t.target,n)}async function Gr(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=v(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!x(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:Vr({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Kr(e,t,n,r){let i=await Gr(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await qr(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function qr(e,t){try{return z((await H(e,t,!0)).snapshot)}catch{return}}function Jr(n,r){let i=t(n.ref);if(!i)throw new e(`INVALID_ARGS`,`Invalid ref: ${n.ref}`);let a=t(r.ref),o=r.node.ref?t(r.node.ref):null;if(a!==i||o!==i||!r.nodes.includes(r.node))throw new e(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:r.nodes,...r.iosSystemSurfaceBundleId?{surfaceBundleId:r.iosSystemSurfaceBundleId}:{}},...r.keyboard?{keyboard:r.keyboard}:{},resolved:ni(i,r.node,`exact`)}}async function Yr(e,t,n){let r=await pi(e,t,n);return{tree:z(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function Xr(e,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?Jr(r,i.preresolvedTarget):await Yr(e,n,r),c=a.nodes,{node:l,tapPoint:u}=await li({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>$r(e,t,i),offscreen:async(t,a)=>await xi(e,n,t,a,r.ref,i)},resolveTapPoint:e=>_i(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}`},...oi(e,l,a,i.action,s.resolution)}}async function Zr(e,t,n,r){let i=n.selector,a=await H(e,t,r.requireInteractive),o=Sr(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive){let n=a.snapshot;a=await H(e,t,!1),s(n,a.snapshot),o=Sr(a.snapshot.nodes,i,e.backend.platform,r.pipeline)}if(!o||!o.node.rect)throw await Qr({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let c=o,{node:l,tapPoint:u}=await li({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:c.node,action:r.action,label:`Selector ${c.selector}`,hooks:{onResolved:(e,t)=>$r(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,c.selector,r)},resolveTapPoint:e=>_i(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:u,target:{kind:`selector`,selector:o.selector},...oi(e,l,z(a.snapshot),r.action,ii(o,a.snapshot.nodes))}}async function Qr(t){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=t,s=await L(N.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return ui({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new e(`COMMAND_FAILED`,we(i,c,{unique:!0}),{reason:T.selectorNotFound,hint:se(c)})}function $r(e,t,n){Wr(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const ei={source:`ref`,phase:`pre-action`,kind:`exact`},ti={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ni(e,t,n){return{ref:e,node:t,resolution:n===`exact`?ei:ti}}const ri={source:`runtime`,phase:`pre-action`,kind:`unique`};function ii(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ai(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ai(e,t))}:ri}function ai(e,t){let n=b(e.type??``),r=j(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:rr(n,256)}:{},...r===void 0?{}:{label:rr(r,256)}}}function oi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:le(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:j(t,a),...ci(t,r),preAction:n,resolution:i,...si(e,t,a,r)}}function si(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Jn(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:le(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:j(i,n)}}}function ci(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function li(e){let t=await Rn(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw ui({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return Br({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}function ui(t){return new e(`COMMAND_FAILED`,`${t.label} is covered by another visible element and cannot ${zr(t.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...t.selector?{selector:t.selector}:{},ref:`@${t.node.ref}`,interactionBlocked:t.node.interactionBlocked})}async function H(t,n,r){if(!t.backend.captureSnapshot)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await t.sessions.get(i);if(!a)throw new e(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await t.backend.captureSnapshot(P(t,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:F(t)};return await t.sessions.set({...a,snapshot:s}),{snapshot:s}}async function di(t,n,r){if(t.backend.platform!==`macos`)return;let i=await fi(t,n);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new e(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function fi(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function pi(e,t,n){let{session:r,snapshot:i}=await Qn(e,t.session),a=n.fallbackLabel??``,o=hi(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw gi(o,n.ref);return mi({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function mi(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=hi(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&he(C(a.node),C(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function hi(n,r,i){let a=t(r);if(!a)throw new e(`INVALID_ARGS`,`Invalid ref: ${r}`);let s=o(n,a);if(yi(s))return{kind:`resolved`,resolved:ni(a,s,`exact`)};let c=i.fallbackLabel.length>0?Wt(n,i.fallbackLabel):null;if(yi(c))return{kind:`resolved`,resolved:ni(a,c,`label-fallback`)};let l=s??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function gi(n,r){let i=t(r)??r;return n.kind===`unusable`?new e(`COMMAND_FAILED`,`Ref ${r} has no usable bounds`,{reason:T.targetBoundsInvalid,ref:i,hint:de}):new e(`COMMAND_FAILED`,`Ref ${r} not found`,{reason:T.refNotFound,ref:i,hint:de})}function _i(t,n,r){let i=v(n),a=fr(n,t,{bounds:[i.resolveEffectiveViewport(t),t.rect?i.resolveViewport(t.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new e(`COMMAND_FAILED`,r.invalidMessage,{reason:T.targetBoundsInvalid,...vi(r.blockedTargetDetails)}):new e(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function vi(e){return`ref`in e?{ref:t(e.ref)??e.ref}:e}function yi(e){return e?D(e.rect)!==null:!1}async function bi(e,t,n,r,i,{action:a}){return await Ti(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${Si(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function xi(e,n,r,i,a,{action:o}){return await Ti(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,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=hi(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=N.resolvedTarget,{node:u}=await li({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${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{...ci(u,i),node:u,preAction:z(a)}}async function wi(e,t,n,r,i){let a=await Ci(e,t,n,r),o=I(await i(P(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:ei,...a,...o?{backendResult:o}:{}}}async function Ti(t,n,r,i,a){let o=v(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await t.backend.confirmOffscreenTargetVisible?.(P(t,n),r,c);if(l)return{...r,rect:l};let u=He(r,o);throw new e(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}function Ei(e,t){let n=Ie(e.type??`Element`),r=Re(e,n),i=Ne(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Di(e,t,n={}){let r=Ai(ki(e,n),ki(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Oi(e,t={}){return ki(e,t).length}function ki(e,t){return t.flatten?e.map(e=>({text:Pe(e,0,!1),comparable:Ei(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:Ei(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Ai(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Mi(a,i,s)?U(a,i+1):U(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return ji(o,e,t,n,r)}}return[]}function ji(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Mi(i,c,r)?c+1:c-1,u=U(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Mi(e,t,n){return t===-n||t!==n&&U(e,t-1)<U(e,t+1)}function U(e,t){return e.get(t)??0}async function Ni(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Pi(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Fi(e.nodes):e.nodes).map(Ri);return n.sort((e,t)=>Bi(e).localeCompare(Bi(t))),{captureBackend:t,nodes:n}}function Fi(e){let t=v(e);return e.filter(e=>h(e)||t.isVisibleOnScreen(e))}function Ii(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Li(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function Ri(e){return{identity:`${e.type??``}#${zi(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function zi(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Bi(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Vi=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Hi(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=F(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=Qe(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;F(e)<o;){let c=await Yi(e,t,o-F(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Ui(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Pi(c.snapshot);_=Gi({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=Qe(c.snapshot.snapshotQuality);let y=F(e),b=qi({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(b!==void 0){s=!0,o=b,g=y,p=v,m=c.snapshot.nodes.length;let t=Ji({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await On(e,t);continue}if(!Ii(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let ee=Ji({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(ee<=0)break;await On(e,ee)}return{settled:!1,stalled:!1,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Ui(e,t,n){if(!e||!t||!Wi(t.backend,n))return;let r=t.nodes.some(h),i=e.length<=5;if(!(!r&&!i))return Pi({...t,nodes:e})}function Wi(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Gi(e){return e.requestedQuietMs<500||!Li(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Ki(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function qi(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Ki(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Ji(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Yi(e,t,n,r){let i=await Ni(e,t,n,async n=>await R(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Xi=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Zi=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Qi(e,t,n){return await ea(e,t,{...n,baseline:await ra(e,t,n.resolved),actionPoint:n.resolved.point})}const $i=async(e,t)=>(await ea(e,t,t)).observation;async function ea(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await ta(e,t,n,a,await Hi(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function ta(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Zi:Xi}};let{stored:o,session:s}=await ga(e,t,i.lastCapture),c=z(i.lastCapture.snapshot),l=c.nodes,u=lr(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?ca(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...ma(i,o,l.length,u)},settledCapture:c}}function na(e,t){if(e)return ur(e,t)}async function ra(e,t,n){let r=await e.sessions.get(t.session??`default`);return ia(n,r)??oa(n.preAction)??aa(r)}function ia(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?oa(z(n)):void 0}function aa(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?z(t):{nodes:[]}}function oa(e){return e?.nodes.length?e:void 0}function sa(e,t,n){let r=Di(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=pa(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function ca(e,t,n,r){let i=sa(e,t,r);return{diff:i,...la(i,t,n,r)}}function la(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Dt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!ua(o.get(e),n))?{}:fa(t,i,r)}function ua(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const da=new Set([`application`,`window`]);function fa(e,t,n){let r=Dt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!da.has(Ie(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=Ie(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function pa(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function ma(e,t,n,r){let i=ha(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=dr(r);return{hint:i===void 0?a:`${a} ${i}`}}function ha(e,t,n){return e.stalled?{hint:Zi}:e.settled?t?n<5?{hint:Vi}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Xi}}async function ga(e,t,n){if(nt(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function _a(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function W(e,t,n,r,i){let a=await va(e,t,n,i);return ba({...r,...a})}async function va(e,t,n,r){if(r.settle!==void 0){let i=await Qi(e,t,{...r.settle,resolved:n}),a=r.verify?na(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ya(e,t,n);return i?{evidence:i}:{}}async function ya(e,t,n){try{return ur(z((await H(e,t,!0)).snapshot),n.preAction)}catch{return}}function ba(e){let t=e;if(t.targetHittable!==!1||!xa(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function xa(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function Sa(t,n){let r=v(t),i=t.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Ca),a=i.length>0?i:t.map(e=>e.rect).filter(Ca);if(a.length===0)throw new e(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Ca(e){return!!(e&&e.width>0&&e.height>0)}async function wa(e,t){return await e.backend.resolveGestureViewport?.(P(e,t))||Sa((await H(e,t,!1)).snapshot.nodes,`gesture`)}const Ta=async(t,n)=>{let r=await V(t,n,{action:`focus`,requireInteractive:!0,pipeline:N.resolvedTarget});if(!t.backend.focus)throw new e(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=G(r),a=I(await t.backend.focus(P(t,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Ea=async(t,n)=>{let r=_a(n),i=await V(t,n,{action:`longPress`,requireInteractive:!0,pipeline:N.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!t.backend.longPress)throw new e(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:hn(n.durationMs,`durationMs`,0,12e4),o=G(i),s=I(await t.backend.longPress(P(t,n),o,{durationMs:a}));return await W(t,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},Da=async(t,n)=>{let r=_a(n),i=r.needsPreActionBaseline?null:await Oa(t,n);if(i)return i;let a=await V(t,n,{action:`hover`,requireInteractive:!1,pipeline:N.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!t.backend.hover)throw new e(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=G(a),s=I(await t.backend.hover(P(t,n),o));return await W(t,n,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},r)};async function Oa(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await wi(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const ka=async(t,n)=>{if(!t.backend.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(t,n,`drag`);let r=await wa(t,n),i=await Aa(t,n,`source`),a=await Aa(t,n,`destination`),o=Je({from:G(i),to:G(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=I(await t.backend.performGesture(P(t,n),o)),{start:c,end:l}=Ke(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:ja(i),destination:ja(a)},recording:Ma(i,a),...s?{backendResult:s}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function Aa(e,t,n){let r=t.gesture[n];return await V(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:N.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function ja(t){if(t.kind===`point`||!t.resolution)throw new e(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in t?t.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:t.resolution}}function Ma(e,t){let n=Na(e),r=Na(t),i=Pa(e),a=Pa(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Na(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Pa(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function G(t){if(!t.point)throw new e(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return t.point}const Fa=async(e,t)=>await Ra(e,t,`press`),Ia=async(e,t)=>await Ra(e,t,`click`),La=async(t,n)=>{if(typeof n.text!=`string`)throw new e(`INVALID_ARGS`,`fill requires text`);let r=_a(n),i=r.needsPreActionBaseline?null:await Va(t,n);if(i)return i;let a=await V(t,n,{action:`fill`,requireInteractive:!0,pipeline:N.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!t.backend.fill)throw new e(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=za(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&oe(s,t.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=I(await t.backend.fill(P(t,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ua(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await W(t,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function Ra(t,n,r){let i=_a(n),a=i.needsPreActionBaseline?null:await Ba(t,n,r);if(a)return a;let o=await V(t,n,{action:r,requireInteractive:!0,pipeline:N.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!t.backend.tap)throw new e(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=za(o),c;try{c=await t.backend.tap(P(t,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw Tn(e,o),e}let l=I(c);return await W(t,n,o,{...o,...l?{backendResult:l}:{}},i)}function za(t){if(!t.point)throw new e(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return t.point}async function Ba(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Ha(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await wi(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Va(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await wi(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Ha(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Ua(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function K(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Wa=N.wait.poll.defaultTimeoutMs;function Ga(e,t,n,r,i={}){let a=Hn(r),o=n??a.defaultTimeoutMs,s=Y(e),c=oo(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(Y(e)-s));return{capture:async n=>{let r=!1,i=Y(e)-s,a=t=>l.push({startedMs:i,durationMs:Y(e)-s-i,outcome:t}),o=await Ni(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Ka(r,c.lastUnobservedCause())),o;let f=qa(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:Ja(l),waitedMs:Y(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await so(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>Y(e)-s}}function Ka(e,t){return e?`readable`:t?.outcome??`unreadable`}function qa(t,n){let r=io(t);if(r)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:r};let i=Vt(t instanceof e?t.details:void 0);return i?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:i}}:{outcome:`deadline`,deadline:n===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function Ja(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Ya(t,n){return new e(`COMMAND_FAILED`,t,{reason:A.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Xa(t,n){return new e(`COMMAND_FAILED`,t,{reason:A.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...n,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Za(t,n){return new e(`COMMAND_FAILED`,t,{reason:A.readinessExhausted,...n,retriable:!0,hint:`The wait timeout ended during readiness work (${n.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function Qa(t,n){return new e(`COMMAND_FAILED`,t,{reason:A.deadlineExceeded,captureTruncated:!0,...n})}function $a(t,n){return new e(`COMMAND_FAILED`,t,{reason:A.targetAbsent,...n})}function eo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw to(r.error,t);if(n)throw r.error}}function to(t,n){let r=i(t);return new e(r.code,r.message,{reason:A.captureStalled,...r.details,...n},r)}function q(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return Xa(e,r);case`readiness-exhausted`:return eo(t,r,!1),Za(e,r);case`capture-stalled`:return eo(t,r,t.preserveUnreadableOnStall===!0),Ya(e,r);case`capture-truncated`:return Qa(e,r);case void 0:return eo(t,r,!0),r.readableCaptures===0?Ya(e,r):$a(e,r);default:return ro(n)}}function no(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function ro(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function io(t){if(!(t instanceof e))return;let n=t.details;if(n?.runnerRestarted===!0)return{runnerRestarted:!0,...J(n,`runnerRestartReason`),...J(n,`runnerRestartCommand`),...J(n,`runnerRestartCommandId`),...J(n,`runnerInvalidatedSessionId`),...J(n,`runnerRestartSessionId`),...J(n,`logPath`),...J(n,`diagnosticId`)}}function J(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function ao(t){return t instanceof e&&t.details?.retriable===!0}function oo(e=Ye){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(ao(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function Y(e){return e.clock?.now()??Date.now()}async function so(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function co(e,t,n){let r=await L(N.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:je(e,i)}}async function lo(e,t,n){let r=await co(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Fe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function uo(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Ga(t,n,i,N.wait,{isUnreadableError:po,preserveUnreadableOnStall:!0}),s=K(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await co((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Ye(e)?Ae(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw no(l)?q(`wait absent timed out for selector: ${r}`,o,l):c?fo(r,c,o.failureEvidence()):q(`wait absent timed out for selector: ${r}`,o,l)}function fo(t,n,r){let i=n.matches!==1;return new e(`COMMAND_FAILED`,`wait absent timed out for selector ${t}: ${n.matches} match${i?`es`:``} remain`,{reason:A.targetPresent,selector:t,...r,matches:n.matches,firstMatch:n.firstMatch})}function po(t){if(!(t instanceof e))return!1;let n=t.details;return n?.command===`wait`&&n.predicate===`absent`&&(Ve(n.observation)||n.observation===`unreadable`)}function mo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function ho(t,n,r,i,a,o){let s=Ga(n,r,a,N.wait),c=K(),l,u;for(;s.hasTimeRemaining();){let e=await s.capture(async e=>await t.captureSnapshot(n,{...r,signal:e},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(e.timedOut){u=e.deadline;break}let a=e.value;if(a){let e=a.snapshot.nodes,t=mo(await L(N.wait,e,i,{platform:n.backend.platform}));if(t){let n=go(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new e(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Ut,...s.failureEvidence(),...l}):q(`wait timed out for selector: ${i}`,s,u)}function go(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=dt(e),a=pt(t.matchedNodes,i,g(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:C(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function _o(t,n,r,i,a){let o=a??Wa,s=i??t.stable.defaultQuietMs,c=await t.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new e(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:A.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<t.stable.tinyTreeNodeCount?{hint:t.stable.tinyTreeHint}:{}}}async function vo(e,t,n,r,i){let a=Ga(t,n,i,N.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await yo(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw q(`wait timed out for text: ${r}`,a,o)}async function yo(e,t,n,r){return t.backend.findText&&(await t.backend.findText(xo(t,n),r)).found?!0:await bo(e,t,n,r)}async function bo(e,t,n,r){return!!Wt((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function xo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function So(t){let n=async(e,n)=>{switch(n.target.kind){case`sleep`:return await so(e,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Co(t,e,n,n.target.ref,n.target.timeoutMs);case`selector`:return await ho(t,e,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await uo(t,e,n,n.target.selector,n.target.timeoutMs);case`stable`:return await _o(t,e,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await wo(t,e,n,n.target.text,n.target.timeoutMs);default:return To(n.target)}};return{waitCommand:n,waitForTextCommand:async(t,r)=>{let i=await n(t,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new e(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function Co(n,r,i,a,s){let c=await n.requireSnapshot(r,i.session),l=t(a);if(!l)throw new e(`INVALID_ARGS`,`Invalid ref: ${a}`);let u=o(c.snapshot.nodes,l);if(!u)throw new e(`COMMAND_FAILED`,`Ref ${a} not found`,{reason:T.refNotFound,ref:l,hint:de});let d=j(u,c.snapshot.nodes);if(!d)throw new e(`COMMAND_FAILED`,`Ref ${a} has no label to wait for`,{reason:T.refUnlabeled,ref:l});return await vo(n,r,i,d,s)}async function wo(t,n,r,i,a){let o=Se(i);if(!o.ok)throw new e(o.code,o.message);return await vo(t,n,r,o.text,a)}function To(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Eo=So({captureSnapshot:R,requireSnapshot:Qn,stable:{defaultQuietMs:500,tinyTreeHint:Vi,tinyTreeNodeCount:5,capture:Hi}}),Do=Eo.waitCommand,Oo=Eo.waitForTextCommand,ko=async(t,n)=>{let r=n.locator??`any`;if(!n.query)throw new e(`INVALID_ARGS`,m);if(n.action===`wait`)return await No(t,n,r);if(n.action===`list`)return await Po(t,n,r);let{capture:i,match:a}=await Fo(t,n,r);if(!a)throw new e(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await tr(t,i,a),node:a}},Ao=async(e,t)=>{if(t.target.kind===`ref`){let n=await Qn(e,t.session),r=nr(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});Wr(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=le(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await tr(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Io(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?N.readText:N.readUnique,hooks:{onResolved:(e,n)=>Wr(e,n,t.expectedResolvedTarget,`get`)}}),r=le(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await tr(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},jo=async(t,n)=>{let r=await Ao(t,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new e(`COMMAND_FAILED`,`getText returned non-text result`);return r},Mo=async(t,n)=>{let r=await Ao(t,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new e(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function No(e,t,n){let r=Ga(e,t,t.timeoutMs,N.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Fo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw q(`find wait timed out`,r,i)}async function Po(e,t,n){let r=re(n,t.query),i=await R(e,t,{updateSession:!0,...K()});if(nt(i.snapshot.snapshotQuality))throw Zn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Ln(N.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ae(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Fo(e,t,n,r){let i=re(n,t.query),a=await R(e,t,{updateSession:!0,scope:Xn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...K()});if(nt(a.snapshot.snapshotQuality))throw Zn(a.snapshot.snapshotQuality);if(i){let t=await L(N.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ae(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Io(t,n,r,i){let a=await R(t,{...n,session:r},{updateSession:!0,...K()}),o=await L(i.policy,a.snapshot.nodes,i.selector,{platform:t.backend.platform},i.hooks);if(o.kind!==`target`)throw new e(`COMMAND_FAILED`,we(i.selector,[],{unique:!0}),{hint:se([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Lo=async(t,n)=>{let r=xe(n.predicate);if(!r.ok)throw new e(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=Be(n);if(e)throw ze(e)}if(i===`text`&&!n.expectedText)throw new e(`INVALID_ARGS`,ve);let a=n.selector,o=await Ro(t,n,i,a);return i===`exists`?await zo(t,o,a):i===`absent`?await lo(o.snapshot,a,t.backend.platform):await Bo(t,n,o,i,a)};async function Ro(e,t,r,i){try{return await R(e,t,{updateSession:!0,...K(r)})}catch(e){throw r!==`absent`||n(e)?e:Ae(i,e)}}async function zo(t,n,r){let i=await L(N.readAny,n.snapshot.nodes,r,{platform:t.backend.platform});if(i.kind!==`target`)throw new e(`COMMAND_FAILED`,we(r,[],{unique:!1}),{hint:se([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:Ce(r)}}async function Bo(t,n,r,i,a){let o=await L(N.readUnique,r.snapshot.nodes,a,{platform:t.backend.platform},{onResolved:(e,t)=>Wr(e,t,n.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new e(`COMMAND_FAILED`,we(a,[],{unique:!0}),{command:`is`,reason:T.selectorNotFound,predicate:i,selector:a,hint:se([])});let s=ye({predicate:i,node:o.node,visibility:v(r.snapshot.nodes),expectedText:n.expectedText,platform:t.backend.platform});if(!s.pass)throw new e(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:T.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:Ce(a),node:o.node,preActionNodes:r.snapshot.nodes}}const Vo=async(e,t)=>await Lo(e,{...t,predicate:`visible`,selector:t.target.selector}),Ho=async(e,t)=>await Lo(e,{...t,predicate:`hidden`,selector:t.target.selector}),Uo=async(t,n)=>{if(!t.backend.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await di(t,n,n.gesture.intent);let r=await wa(t,n),i=qe(n.gesture,r,t.backend.platform),a=I(await t.backend.performGesture(P(t,n),i)),o=Go(i.pointers,0),s=Go(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(Ko(n.gesture,o,s))}},Wo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await ka(e,{...t,gesture:n}):await Uo(e,{...t,gesture:n})};function Go(t,n){let r=t.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new e(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ko(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const X={find:ko,get:Ao,getText:jo,getAttrs:Mo,is:Lo,isVisible:Vo,isHidden:Ho,wait:Do,waitForText:Oo},Z={click:Ia,press:Fa,fill:La,focus:Ta,longPress:Ea,hover:Da,gesture:Wo,settleObservation:$i};function qo(e){return{find:t=>X.find(e,t),get:t=>X.get(e,t),getText:(t,n={})=>X.getText(e,{...n,target:t}),getAttrs:(t,n={})=>X.getAttrs(e,{...n,target:t}),is:t=>X.is(e,t),isVisible:(t,n={})=>X.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>X.isHidden(e,{...n,target:t}),wait:t=>X.wait(e,t),waitForText:(t,n={})=>X.waitForText(e,{...n,text:t})}}function Jo(e){return{click:(t,n={})=>Z.click(e,{...n,target:t}),press:(t,n={})=>Z.press(e,{...n,target:t}),fill:(t,n,r={})=>Z.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Z.focus(e,{...n,target:t}),longPress:(t,n={})=>Z.longPress(e,{...n,target:t}),hover:(t,n={})=>Z.hover(e,{...n,target:t}),gesture:t=>Z.gesture(e,t),settleObservation:t=>Z.settleObservation(e,t)}}const Yo=[0,187,255,255];function Xo(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Zo(e,n.rect)}function Zo(e,t){let n=Qo(t);if(n==null)return;let r=$o(n.x,0,e.width-1),i=$o(n.y,0,e.height-1),a=$o(n.right,0,e.width-1),o=$o(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Q(e,n,i+t,Yo),Q(e,n,o-t,Yo);for(let n=i;n<=o;n+=1)Q(e,r+t,n,Yo),Q(e,a-t,n,Yo)}}function Qo(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Q(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function $o(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const es=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ts(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!is(t,a,e))continue;let c=0,l=rs(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=ns({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function ns(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of es){let o=s+e.x,u=c+e.y;if(!as(o,u,i,a))continue;let d=u*i+o;is(t,n,d)&&(l=rs(r,n,l,d))}return l}function rs(e,t,n,r){return t[r]=1,e[n]=r,n+1}function is(e,t,n){return e[n]===1&&t[n]!==1}function as(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function os(e,t){return e.flatMap(e=>ss(e,t.baseline.width,t.baseline.height)?cs(e,t,ms(t.baseline.height)):[e])}function ss(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ps(n)&&r>=t*.35}function cs(e,t,n){let r=fs(e,ds(us(ls(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>hs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function ls(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function us(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function ds(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function fs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ps(e){return Math.max(48,Math.round(e*.07))}function ms(e){return Math.max(24,Math.round(e*.03))}function hs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=gs(t,a),_s(i,e,t,a,r.baseline,r.current))}return i}function gs(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function _s(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const vs=2.5;function ys(e){let t=bs(e);return os(t.length<=2e3?Cs(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Es(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function bs(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ts({mask:t,width:i,height:a,hooks:{create:e=>xs(e,i),visit:(e,t)=>Ss(e,t,i,n,r)}})}function xs(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Ss(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function Cs(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>ws(e,r,t));if(!e){n.push({...r});continue}Ts(e,r)}return n}function ws(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function Ts(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Es(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Ds(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ds(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Kt({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:As(r,n.width,n.height),size:js(s,n.totalPixels),location:Os(i,n.width,n.height),averageBaselineColorHex:Ns(a),averageCurrentColorHex:Ns(o),baselineLuminance:Math.round(Ms(a)),currentLuminance:Math.round(Ms(o)),dominantChange:ks(a,o)}}function Ds(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Os(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function ks(e,t){let n=Ms(t)-Ms(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function As(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*vs?`horizontal-band`:e.height>=e.width*vs?`vertical-band`:`compact`}function js(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Ms(e){return e.r*.2126+e.g*.7152+e.b*.0722}function Ns(e){return`#${Ps(e.r)}${Ps(e.g)}${Ps(e.b)}`}function Ps(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Fs=Math.sqrt(3*255**2);async function Is(e,t,n={}){await Ls(e,`Baseline image not found`),await Ls(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([k.readFile(e),k.readFile(t)]),[o,s]=await Promise.all([rt(i,`baseline screenshot`),rt(a,`current screenshot`)]);Rs(o.width,o.height,`baseline screenshot`,n.maxPixels),Rs(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await zs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Fs,{diffData:d,diffMask:f,differentPixels:p}=await it({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?ys({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new ot.PNG({width:o.width,height:o.height});e.data=d,Xo(e,m),await k.mkdir(lt.dirname(r),{recursive:!0}),await k.writeFile(r,await at(e))}else await zs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Ls(t,n){try{await k.access(t)}catch{throw new e(`INVALID_ARGS`,`${n}: ${t}`)}}function Rs(t,n,r,i){if(i==null||i<=0)return;let a=t*n;if(!(a<=i))throw new e(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function zs(e){if(e)try{await k.unlink(e)}catch(e){if(!Bs(e,`ENOENT`))throw e}}function Bs(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Vs(e,t){return e.map(e=>{let n=Hs(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Hs(e,t){let n=_e(e.rect);return t.map(t=>{let r=t.overlayRect,i=qt(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Us(i/_e(r)),regionCoveragePercentage:Us(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function Us(e){return Math.round(e*100*100)/100}async function Ws(t,n,r){if(n.kind===`path`&&!t.policy.allowLocalInputPaths)throw new e(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await t.artifacts.resolveInput(n,r)}catch(e){throw i(e)}}async function Gs(t,n,r){if(n?.kind===`path`&&!t.policy.allowLocalOutputPaths)throw new e(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await t.artifacts.reserveOutput(n,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw i(e)}}async function Ks(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw i(e)}}const qs=async(t,n)=>{if(!n.baseline)throw new e(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Js(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!nc(i))throw new e(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await Ws(t,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let e;nc(i)?(s=await Ys(t,n),e=s.path):(o=await Ws(t,i,{usage:`diff screenshot current`,field:`current`}),e=o.path),c=n.out?await Gs(t,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Is(a.path,e,{threshold:r,outputPath:c?.path,maxPixels:t.policy.maxImagePixels});nc(i)&&(u=await Xs(t,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Js(t){if(t==null||t===``)return .1;let n=Number(t);if(Number.isNaN(n)||n<0||n>1)throw new e(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Ys(e,t){let n=await Ks(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Zs(e,t,n.path,Qs(t))}catch(e){throw await n.cleanup(),e}return n}async function Xs(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await tc(n),r;let a=await Gs(e,$s(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Zs(e,t,a.path,{overlayRefs:!0,...Qs(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:Vs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Zs(t,n,r,i={}){if(!t.backend.captureScreenshot)throw new e(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await t.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??t.signal,metadata:n.metadata},r,i)??{}}function Qs(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function $s(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:ec(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:ec(e.out.clientPath)}:{},...e.out.fileName?{fileName:ec(e.out.fileName)}:{}}}function ec(e){let t=lt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function tc(e){try{await k.unlink(ec(e))}catch(e){if(!rc(e,`ENOENT`))throw e}}function nc(e){return e.kind===`live`}function rc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const ic=async(t,n)=>{if(!t.backend.captureScreenshot)throw new e(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);c(n);let r=await Gs(t,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await t.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??t.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await et(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function ac(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!a(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let i=Ue(t),o=new Set;return i.hiddenCount>0&&o.add(`offscreen-nodes`),i.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),i.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const oc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function sc(e){return e?.systemSurfaceOnly===!0?oc:void 0}function cc(e,t){return e.presentationKey?e:{...e,presentationKey:r(t)}}function lc(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!uc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!dc(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function uc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function dc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>pc(e,t.nodes[n]))}const fc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function pc(e,t){return fc.every(n=>e[n]===t[n])&&mc(e.rect,t.rect)&&hc(e.presentationHints,t.presentationHints)&&hc(e.actions,t.actions)}function mc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function hc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const gc=async(e,t)=>{let n=await vc(e,t),r=lc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(bc(t.session,n));let i=Sc(n.snapshot);return d(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:ac({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...xc(n)})},_c=async(e,t)=>{let n=await vc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=bc(t.session,n);if(!i){let t=Oi(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=Di(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function vc(t,n){if(!t.backend.captureSnapshot)throw new e(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await t.sessions.get(r),a=await t.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??t.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=yc(a,t),s=d(o,cc(o,n)),c=l(a),u=F(t);return{snapshot:s,result:a,session:i,annotations:c,warnings:Cc({result:a,annotations:c,snapshot:s,options:n,session:i,capturedAt:s.createdAt??u,runtimeNow:u})}}function yc(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:F(t),...e.keyboard?{keyboard:e.keyboard}:{}}}function bc(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function xc(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function Sc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ct(e.producer)===`unavailable`&&void 0:e.truncated}function Cc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...$e(e.annotations.quality,e.snapshot.nodes)),t.push(...tt(Sc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Nt(e.snapshot.postGestureOutcome)),t.push(...Oc(e)),e.annotations.quality||(t.push(...Tc(e)),t.push(...Dc(e.snapshot.nodes)));let n=Le(e.snapshot.nodes);n&&t.push(n);let r=wc(e.annotations);r&&t.push(r);let i=kc(e);return i&&t.push(i),t.push(...Nc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function wc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return oc}function Tc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Ec(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Ec(e){return e?b(e.type??``)===`application`:!1}function Dc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function Oc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function kc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ac(t,e.snapshot)&&jc(t,e.capturedAt,e.runtimeNow)&&Pc(t.nodes.length,e.snapshot.nodes.length))return Mc}function Ac(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function jc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Mc=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function Nc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[Mc]:[]}function Pc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Fc={screenshot:ic,diffScreenshot:qs,snapshot:gc,diffSnapshot:_c};function Ic(e){return kn(Fc,e)}export{Nt as A,tn as C,Ht as D,Wt as E,dt as F,pt as I,Ot as M,Dt as N,Ut as O,ft as P,rn as S,j as T,vn as _,Jo as a,gn as b,Ln as c,kn as d,I as f,_n as g,N as h,Ws as i,It as j,A as k,L as l,En as m,sc as n,qo as o,P as p,Gs as r,sr as s,Ic as t,Rn as u,xn as v,Qt as w,hn as x,Sn as y};