agent-device 0.21.23 → 0.21.24

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 (258) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.24.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.24.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.apk → agent-device-android-snapshot-helper-0.21.24.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.manifest.json → agent-device-android-snapshot-helper-0.21.24.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +34 -10
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +3 -3
  20. package/dist/src/adapter.js +1 -1
  21. package/dist/src/adb.js +1 -1
  22. package/dist/src/agent-browser-lifecycle.js +1 -1
  23. package/dist/src/agent-browser-process-record.js +1 -1
  24. package/dist/src/agent-browser-provider.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/alert-runtime.js +1 -1
  27. package/dist/src/alert.js +1 -1
  28. package/dist/src/android-adb.d.ts +3 -2
  29. package/dist/src/android-input-ownership.js +1 -1
  30. package/dist/src/app-backend.js +1 -1
  31. package/dist/src/app-inventory.d.ts +4 -0
  32. package/dist/src/app-launch.js +1 -1
  33. package/dist/src/app-lifecycle.js +1 -1
  34. package/dist/src/app-log-runtime2.js +3 -3
  35. package/dist/src/app-resolution.js +2 -2
  36. package/dist/src/app-state-runtime.d.ts +15 -0
  37. package/dist/src/apple-runner-platform.js +1 -1
  38. package/dist/src/application-lifecycle-interaction.js +1 -1
  39. package/dist/src/aws-device-farm-connection.js +1 -0
  40. package/dist/src/back-mode.js +1 -1
  41. package/dist/src/backend-snapshot-options.js +1 -1
  42. package/dist/src/browserstack-connection.js +1 -0
  43. package/dist/src/browserstack-device-features.js +1 -0
  44. package/dist/src/browserstack.js +1 -0
  45. package/dist/src/cache.js +1 -1
  46. package/dist/src/cli-config.js +1 -1
  47. package/dist/src/cli-help.js +35 -19
  48. package/dist/src/cli-runner.js +1 -1
  49. package/dist/src/cli.js +3 -4
  50. package/dist/src/client-companion-tunnel.js +1 -0
  51. package/dist/src/client-metro-companion.js +1 -1
  52. package/dist/src/client-metro.js +1 -1
  53. package/dist/src/client-types.d.ts +7 -5
  54. package/dist/src/cloud-artifacts.d.ts +3 -2
  55. package/dist/src/command-metadata.js +1 -1
  56. package/dist/src/command-schema.js +1 -1
  57. package/dist/src/command-tools.js +2 -2
  58. package/dist/src/connection-runtime.js +1 -1
  59. package/dist/src/connection-verification.js +1 -0
  60. package/dist/src/connection.js +5 -5
  61. package/dist/src/contracts.d.ts +1 -1
  62. package/dist/src/daemon-client-lease-beat.js +1 -1
  63. package/dist/src/daemon-client-lifecycle.js +1 -1
  64. package/dist/src/daemon-client-transport.js +1 -1
  65. package/dist/src/daemon-http.js +1 -1
  66. package/dist/src/daemon-policy-file.js +1 -1
  67. package/dist/src/daemon-registration-owner.js +1 -1
  68. package/dist/src/device-claim-inspection.js +1 -1
  69. package/dist/src/device-input-state.d.ts +2 -15
  70. package/dist/src/device-readiness-runtime.js +1 -1
  71. package/dist/src/device-selection-resolver.js +1 -1
  72. package/dist/src/device.js +1 -1
  73. package/dist/src/device2.js +1 -1
  74. package/dist/src/device3.js +1 -1
  75. package/dist/src/dispatch-resolve.js +3 -3
  76. package/dist/src/doctor-facade.js +1 -1
  77. package/dist/src/durable-capture-resource.js +1 -1
  78. package/dist/src/durable-resource.js +1 -1
  79. package/dist/src/exec.js +1 -1
  80. package/dist/src/file.js +1 -1
  81. package/dist/src/find.js +1 -1
  82. package/dist/src/finders.js +1 -1
  83. package/dist/src/format.js +2 -1
  84. package/dist/src/gesture-admission.js +1 -1
  85. package/dist/src/gesture-plan-types.d.ts +2 -5
  86. package/dist/src/gesture-runtime.js +1 -1
  87. package/dist/src/human-control.js +1 -1
  88. package/dist/src/ime-rebind.js +1 -1
  89. package/dist/src/ime-settings-record.js +1 -0
  90. package/dist/src/ime-state.js +1 -1
  91. package/dist/src/index.d.ts +3 -3
  92. package/dist/src/input-actions.js +1 -1
  93. package/dist/src/input-actions2.js +1 -1
  94. package/dist/src/install-source2.js +1 -1
  95. package/dist/src/interaction-positionals.js +1 -1
  96. package/dist/src/interaction-ref-policy.js +1 -1
  97. package/dist/src/interaction.js +1 -1
  98. package/dist/src/interaction2.js +1 -1
  99. package/dist/src/interactor.js +5 -5
  100. package/dist/src/interactors.js +1 -1
  101. package/dist/src/internal/bin.js +1 -1
  102. package/dist/src/internal/daemon.js +1 -1
  103. package/dist/src/inventory2.js +1 -1
  104. package/dist/src/ios-snapshot-acquisition.js +1 -1
  105. package/dist/src/ios-snapshot-engine.js +1 -1
  106. package/dist/src/ios-snapshot-runtime.js +1 -1
  107. package/dist/src/launch-confirmation.js +1 -1
  108. package/dist/src/lease-scope.js +1 -1
  109. package/dist/src/lease.js +1 -1
  110. package/dist/src/limrun.d.ts +4 -555
  111. package/dist/src/load.js +1 -1
  112. package/dist/src/local-interactor-operation-set.js +1 -1
  113. package/dist/src/managed-device-scope.js +1 -1
  114. package/dist/src/manifest.js +1 -0
  115. package/dist/src/mechanics.js +16 -16
  116. package/dist/src/mobile-snapshot-semantics.js +1 -1
  117. package/dist/src/observation.js +1 -2
  118. package/dist/src/overlay.js +3 -3
  119. package/dist/src/owner-identity.js +3 -3
  120. package/dist/src/perf-facade.js +1 -1
  121. package/dist/src/perf-runtime-plan.js +1 -1
  122. package/dist/src/perf-target.js +1 -1
  123. package/dist/src/physical-device-control.js +1 -1
  124. package/dist/src/platform-request-scope.js +1 -1
  125. package/dist/src/platform-runtime-open-target.js +1 -1
  126. package/dist/src/platform-runtime-operation-host.js +4 -4
  127. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  128. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  129. package/dist/src/platform-runtime-unavailable.js +1 -1
  130. package/dist/src/platform-runtime.js +1 -1
  131. package/dist/src/platform-runtime2.js +1 -1
  132. package/dist/src/plugin.js +1 -0
  133. package/dist/src/plugins/webdriver.d.ts +111 -0
  134. package/dist/src/plugins/webdriver.js +1 -0
  135. package/dist/src/plugins.d.ts +2 -1
  136. package/dist/src/plugins2.js +1 -1
  137. package/dist/src/process-exit.js +1 -1
  138. package/dist/src/process.js +1 -1
  139. package/dist/src/provider-credential-fingerprint.js +1 -1
  140. package/dist/src/provider-device-admission.js +1 -1
  141. package/dist/src/provider-device-runtime.d.ts +556 -0
  142. package/dist/src/provider-policy.js +1 -0
  143. package/dist/src/provider-profile-fields.js +1 -1
  144. package/dist/src/provider-webdriver.js +1 -2
  145. package/dist/src/providers.js +1 -1
  146. package/dist/src/react-devtools.js +2 -0
  147. package/dist/src/react-native.js +1 -1
  148. package/dist/src/record-runtime.js +1 -1
  149. package/dist/src/record-trace.js +1 -1
  150. package/dist/src/recording.js +1 -1
  151. package/dist/src/registry.js +24 -24
  152. package/dist/src/remote-bridge.js +1 -0
  153. package/dist/src/remote-config-core.js +1 -0
  154. package/dist/src/remote-config.js +1 -1
  155. package/dist/src/remote-config2.js +1 -1
  156. package/dist/src/remote-connection-state.js +1 -0
  157. package/dist/src/replay.js +2 -2
  158. package/dist/src/request-admission.js +1 -1
  159. package/dist/src/request-runtime-binding.js +1 -1
  160. package/dist/src/result-serialization.js +1 -1
  161. package/dist/src/retry.js +1 -1
  162. package/dist/src/retry2.js +1 -0
  163. package/dist/src/runner-artifact-manifest.js +1 -1
  164. package/dist/src/runner-cache-metadata.js +2 -3
  165. package/dist/src/runner-cache-retention.js +1 -0
  166. package/dist/src/runner-cache-trim.js +1 -0
  167. package/dist/src/runner-client.js +1 -1
  168. package/dist/src/runner-dev-tools-security.js +1 -1
  169. package/dist/src/runner-device-readiness.js +1 -1
  170. package/dist/src/runner-device-set.js +1 -0
  171. package/dist/src/runner-disposal.js +1 -1
  172. package/dist/src/runner-error-classification.js +1 -1
  173. package/dist/src/runner-exchange.js +1 -1
  174. package/dist/src/runner-lease.js +1 -0
  175. package/dist/src/runner-operations-facade.js +1 -1
  176. package/dist/src/runner-session-types.js +1 -1
  177. package/dist/src/runner-start-budget.js +1 -1
  178. package/dist/src/runner-toolchain-probe.js +2 -0
  179. package/dist/src/runner.js +1 -1
  180. package/dist/src/runtime-deployment.js +1 -0
  181. package/dist/src/runtime.js +1 -1
  182. package/dist/src/runtime10.js +1 -2
  183. package/dist/src/runtime11.js +2 -0
  184. package/dist/src/runtime2.js +2 -5
  185. package/dist/src/runtime3.js +5 -1
  186. package/dist/src/runtime4.js +1 -5
  187. package/dist/src/runtime5.js +5 -1
  188. package/dist/src/runtime6.js +1 -1
  189. package/dist/src/runtime7.js +1 -1
  190. package/dist/src/runtime8.js +1 -1
  191. package/dist/src/runtime9.js +1 -1
  192. package/dist/src/screen-recording-transport.js +1 -1
  193. package/dist/src/screenshot-density.js +1 -1
  194. package/dist/src/screenshot3.js +2 -2
  195. package/dist/src/script.js +1 -1
  196. package/dist/src/scroll-gesture.js +1 -1
  197. package/dist/src/sdk-batch.js +2 -2
  198. package/dist/src/sdk-contracts.d.ts +20 -29
  199. package/dist/src/sdk-contracts.js +2 -2
  200. package/dist/src/sdk-device.js +1 -1
  201. package/dist/src/sdk-finders.d.ts +1 -1
  202. package/dist/src/sdk-finders.js +1 -1
  203. package/dist/src/sdk-remote-config.d.ts +4 -0
  204. package/dist/src/sdk-remote-config.js +1 -1
  205. package/dist/src/sdk-selectors.d.ts +1 -1
  206. package/dist/src/sdk-selectors.js +1 -1
  207. package/dist/src/selection.js +0 -0
  208. package/dist/src/selector-pipeline-policy.js +1 -1
  209. package/dist/src/selector-runtime.js +1 -1
  210. package/dist/src/selectors.js +1 -1
  211. package/dist/src/server.js +2 -2
  212. package/dist/src/session-snapshot.js +1 -1
  213. package/dist/src/session2.js +5 -5
  214. package/dist/src/simctl.js +1 -1
  215. package/dist/src/simulator-boot.js +1 -1
  216. package/dist/src/simulator-state.js +1 -1
  217. package/dist/src/simulator.js +1 -1
  218. package/dist/src/snapshot-capture-annotations.js +1 -1
  219. package/dist/src/snapshot-desktop-projection.js +1 -1
  220. package/dist/src/snapshot-private-evidence.js +1 -0
  221. package/dist/src/snapshot-runtime-binding.js +1 -1
  222. package/dist/src/snapshot-runtime.js +1 -1
  223. package/dist/src/snapshot-state.js +1 -1
  224. package/dist/src/snapshot4.js +1 -1
  225. package/dist/src/src2.js +1 -1
  226. package/dist/src/src3.js +1 -1
  227. package/dist/src/src4.js +1 -1
  228. package/dist/src/src5.js +1 -1
  229. package/dist/src/src6.js +1 -1
  230. package/dist/src/src7.js +1 -1
  231. package/dist/src/src8.js +20 -20
  232. package/dist/src/store.js +1 -1
  233. package/dist/src/target-evidence.js +1 -1
  234. package/dist/src/text-entry-focus.js +1 -1
  235. package/dist/src/tool-provider2.js +1 -1
  236. package/dist/src/touch-runtime2.js +1 -1
  237. package/dist/src/tree.js +1 -1
  238. package/dist/src/type-text-runtime.js +1 -1
  239. package/dist/src/video.js +1 -1
  240. package/package.json +15 -10
  241. package/server.json +2 -2
  242. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  243. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  244. package/dist/src/capabilities.js +0 -1
  245. package/dist/src/compatibility-policy.js +0 -1
  246. package/dist/src/daemon-artifacts.js +0 -1
  247. package/dist/src/device-claim-rule.js +0 -1
  248. package/dist/src/human-control-contract.js +0 -1
  249. package/dist/src/prepare-kind.js +0 -1
  250. package/dist/src/provider-device-runtimes.js +0 -1
  251. package/dist/src/screen-recording-admission-ledger.js +0 -1
  252. package/dist/src/screenshot-runtime.js +0 -1
  253. package/dist/src/session-routing.js +0 -1
  254. package/dist/src/session-runtime-admission.js +0 -1
  255. package/dist/src/timeouts.js +0 -1
  256. package/dist/src/touch-reference-frame.js +0 -1
  257. package/dist/src/vars.js +0 -2
  258. package/dist/src/viewport.js +0 -1
@@ -1 +1 @@
1
- import{C as e,D as t,F as n,K as r,N as i,P as a,S as o,x as s,y as c,z as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{r as d,t as f}from"./snapshot-capture-annotations.js";import{f as p,l as m,n as h}from"./android-input-ownership.js";import{r as g}from"./diagnostics.js";import"./diagnostics2.js";import{$r as _,Bn as v,Br as y,Cn as b,Dr as x,En as ee,Fr as te,Gn as ne,Hn as re,Hr as ie,Jn as S,Kn as ae,Lr as C,Mr as oe,Nr as se,On as ce,Pn as le,Pr as ue,Rn as de,Sn as fe,Sr as pe,Tn as me,Vn as he,Yn as ge,Yr as _e,Zn as ve,dn as ye,gr as be,hr as xe,jn as Se,jr as Ce,kn as we,lr as Te,mr as Ee,qn as De,qr as w,zn as Oe,zr as ke}from"./sdk-batch.js";import{r as T}from"./success-text.js";import{a as Ae,c as je,f as Me,g as Ne,h as Pe,i as Fe,m as Ie,n as Le,o as E,p as Re,r as ze,s as Be,u as Ve}from"./overlay.js";import{n as He,t as Ue}from"./mobile-snapshot-semantics.js";import{i as D,n as O,t as We}from"./rect-center.js";import{a as Ge,n as Ke,t as qe}from"./gesture-plan.js";import{t as Je}from"./android-snapshot-quality.js";import{n as Ye,r as Xe}from"./android-system-chrome.js";import{t as Ze}from"./observe-until.js";import{n as Qe,t as k}from"./selector-pipeline-policy.js";import{i as $e}from"./ios-system-surface.js";import{c as et,n as tt,o as nt,r as rt,s as A}from"./quality-warnings.js";import{r as it}from"./png.js";import{a as at,n as ot,o as st}from"./png-worker-client.js";import{n as ct}from"./ios-snapshot-acquisition.js";import{createHash as lt}from"node:crypto";import{promises as j}from"node:fs";import ut from"node:path";function dt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function ft(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=S(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function pt(e,t,n,r){return e.filter(e=>{if(!De(S(e),n))return!1;let i=ft(e,t,Math.max(r.length,1));return!i.broken&&ae(i.chain,r)})}const mt=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),ht={strippedIndexes:new Set,refs:new Set};function gt(e){let t=new Set(e.filter(e=>C(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return ht;let n=new Map(e.map(e=>[e.index,e])),r=xt(e,n,t),i=new Set(r),a=kt(e,n,r);for(let t of xt(e,n,a))i.add(t);for(let o of _t(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function _t(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=yt(t,n,r);if(o.size===0)return a;let s=bt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&vt(n,t,o)&&a.add(n.index);return a}function vt(e,t,n){if(!e.rect)return!1;let r=At(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function yt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=At(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function bt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function xt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)jt(i,t,n)&&r.add(i.index);return r}function St(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ye(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Xe(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ct(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(h).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:wt(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?ht:{strippedIndexes:o,refs:s}}function wt(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&St(e,t)).map(e=>e.index))}function Tt(e,t){let n=gt(e),r=Ct(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Et(e,t){let{strippedIndexes:n}=Tt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Dt(e,t){return Tt(e,t).refs}function Ot(e){return gt(e).refs}function kt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||C(n.type??``)!==`keyboard`)continue;let i=At(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>mt.has(C(e.type??``))&&!n.has(e.index)&&jt(e,t,a))&&r.delete(i)}return r}function At(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(C(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function jt(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Mt={intervalMs:200,budgetMs:1500,minPolls:2},Nt=Mt.budgetMs+2e3;function Pt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function Ft(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function It(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Lt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),m=await Ze({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Mt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let m=p(i);if(d=r.signaturesStable(m.signature,f.signature),!d)return{kind:`continue`};let h=a()-o;if(c&&l!==f.backend)return g({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let _=It({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:h,distrustCapMs:Nt,classifyBaselineEvidence:r.classifyBaselineEvidence});return _===`distrust`?{kind:`continue`,budgetMs:Nt}:(Rt(_,t.action,s,h),{kind:`done`,result:zt(_,t,f,r,u)})}});if(m.kind===`done`)return m.result;if(m.kind===`failed`)throw m.error;g({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:m.waitedMs,lastPairAgreed:d}});let h=m.last;return d?{value:h}:{value:h,postGestureOutcome:Ft(`unsettled`,t)}}function Rt(e,t,n,r){if(e===`accept-stale`){g({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}g({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:Ft(`no-effect`,t)}:(g({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Bt(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new a(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${r}`);return e}function Vt(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new a(`INVALID_ARGS`,t,n);return{x:r,y:i}}function Ht(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ut(),policy:e.policy??qt(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function Ut(e=[]){let t=new Map(e.map(e=>[e.name,Wt(e)]));return{get:e=>Wt(t.get(e)),set:e=>{t.set(e.name,Wt(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>Wt(e))}}function Wt(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Gt(e.metadata)}:{}}}function Gt(e){try{return structuredClone(e)}catch{return{...e}}}function Kt(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function qt(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const Jt=new WeakMap;function Yt(e,t){Zt(e)&&Jt.set(e,t)}function Xt(e){return Zt(e)?Jt.get(e):void 0}function Zt(e){return typeof e==`object`&&!!e||typeof e==`function`}function M(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function N(e){return e.clock?.now()??Date.now()}async function Qt(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function $t(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function P(e){return e&&typeof e==`object`?e:void 0}async function F(e,t,n){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r);if(!i)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(M(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:N(e)};return await e.sessions.set({...i,snapshot:s}),{snapshot:s}}function en(e){let t=Buffer.alloc(16);for(let n of e)nn(t,tn(n));return{digest:`ax1:${lt(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function tn(e){return lt(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function nn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function rn(e){let{digest:t,nodeCount:n}=en(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=an(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function an(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function I(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function on(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:$e(n)}}function sn(e,t){let n=rn(e.nodes),r=on(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==rn(t.nodes).digest;return{...n,changedFromBefore:i}}function cn(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function ln(e,t){let n=o(e.type??`Element`),r=Re(e,n),i=Pe(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function un(e,t,n={}){let r=pn(fn(e,n),fn(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function dn(e,t={}){return fn(e,t).length}function fn(e,t){return t.flatten?e.map(e=>({text:Ie(e,0,!1),comparable:ln(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Me(e).map(e=>({text:e.text,comparable:ln(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function pn(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=hn(a,i,s)?L(a,i+1):L(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return mn(o,e,t,n,r)}}return[]}function mn(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=hn(i,c,r)?c+1:c-1,u=L(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function hn(e,t,n){return t===-n||t!==n&&L(e,t-1)<L(e,t+1)}function L(e,t){return e.get(t)??0}function gn(e,t){return e.find(e=>ie(e,t))??null}function R(e,t){let n=se(e);return n&&te(n)?n:_n(e,t)}function _n(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=se(e);if(!t||!te(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function vn(e){return e===`text`||e===`label`||e===`any`}function yn(e,t,n,r){if(!(r||e===`web`))return vn(t)?n:void 0}function bn(e){return new a(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function xn(e,t){let n=t??`default`,r=await e.sessions.get(n);if(!r)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let i=r.refFrameSnapshot??r.snapshot;if(!i)throw new a(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:r,snapshot:i}}async function z(e,t,n={updateSession:!0}){let r=e.backend.captureSnapshot;if(!r)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,o=await e.sessions.get(i),s=Sn(await r(M(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!A(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:i,session:o,snapshot:s}}function Sn(e,t){return e.snapshot?Cn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:N(t)}}function Cn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function wn(e,t,n){if(e.backend.readText){let r=await e.backend.readText(M(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Ne(n)}function Tn(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,r.invalidRefMessage);let o=s(e,i)??(r.fallbackLabel.length>0?gn(e,r.fallbackLabel):null);if(!o)throw new a(`COMMAND_FAILED`,r.notFoundMessage,{reason:E.refNotFound,ref:i,hint:b});return{ref:i,node:o}}async function En(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Dn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?On(e.nodes):e.nodes).map(jn);return n.sort((e,t)=>Nn(e).localeCompare(Nn(t))),{captureBackend:t,nodes:n}}function On(e){let t=x(e);return e.filter(e=>Ce(e)||t.isVisibleOnScreen(e))}function kn(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function An(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function jn(e){return{identity:`${e.type??``}#${Mn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Mn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Nn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Pn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Fn(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=N(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=et(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;N(e)<o;){let c=await Hn(e,t,o-N(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=In(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Dn(c.snapshot);_=Rn({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=et(c.snapshot.snapshotQuality);let y=N(e),b=Bn({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(b!==void 0){s=!0,o=b,g=y,p=v,m=c.snapshot.nodes.length;let t=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Qt(e,t);continue}if(!kn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let x=Vn({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(x<=0)break;await Qt(e,x)}return{settled:!1,stalled:!1,waitedMs:N(e)-a,captures:f,nodeCount:m,lastCapture:h}}function In(e,t,n){if(!e||!t||!Ln(t.backend,n))return;let r=t.nodes.some(Ce),i=e.length<=5;if(!(!r&&!i))return Dn({...t,nodes:e})}function Ln(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Rn(e){return e.requestedQuietMs<500||!An(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function zn(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Bn(e){if(!(e.resetRequested!==!0||e.alreadyReset||!zn(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Vn(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Hn(e,t,n,r){let i=await En(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Un=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Wn=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Gn(e,t,n){return await qn(e,t,{...n,baseline:await Xn(e,t,n.resolved),actionPoint:n.resolved.point})}const Kn=async(e,t)=>(await qn(e,t,t)).observation;async function qn(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Jn(e,t,n,a,await Fn(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function Jn(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Wn:Un}};let{stored:o,session:s}=await lr(e,t,i.lastCapture),c=I(i.lastCapture.snapshot),l=c.nodes,u=on(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?tr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...sr(i,o,l.length,u)},settledCapture:c}}function Yn(e,t){if(e)return sn(e,t)}async function Xn(e,t,n){let r=await e.sessions.get(t.session??`default`);return Zn(n,r)??$n(n.preAction)??Qn(r)}function Zn(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?$n(I(n)):void 0}function Qn(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?I(t):{nodes:[]}}function $n(e){return e?.nodes.length?e:void 0}function er(e,t,n){let r=un(Et(e,n),Et(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=or(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function tr(e,t,n,r){let i=er(e,t,r);return{diff:i,...nr(i,t,n,r)}}function nr(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Dt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!rr(o.get(e),n))?{}:ar(t,i,r)}function rr(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const ir=new Set([`application`,`window`]);function ar(e,t,n){let r=Dt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ir.has(o(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=o(e.type??`Element`),n=Re(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function or(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function sr(e,t,n,r){let i=cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=cn(r);return{hint:i===void 0?a:`${a} ${i}`}}function cr(e,t,n){return e.stalled?{hint:Wn}:e.settled?t?n<5?{hint:Pn}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Un}}async function lr(e,t,n){if(A(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function ur(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function dr(e,t,n,r,i){let a=await fr(e,t,n,i);return mr({...r,...a})}async function fr(e,t,n,r){if(r.settle!==void 0){let i=await Gn(e,t,{...r.settle,resolved:n}),a=r.verify?Yn(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await pr(e,t,n);return i?{evidence:i}:{}}async function pr(e,t,n){try{return sn(I((await F(e,t,!0)).snapshot),n.preAction)}catch{return}}function mr(e){let t=e;if(t.targetHittable!==!1||!hr(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function hr(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function gr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?vr(a):a.matchedNodes.length>1?_r(a):vr(a)}let a=ce(e,t,{...r,...fe({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:_r(a.firstMatch):{kind:`none`}}function _r(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function vr(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function yr(e,t,n){let r=ee(e,pe(t),n);return r?{...r,selector:r.selector.raw}:null}function br(e,t,n,r){let i=gr(e,pe(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function xr(e){return e}function Sr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Cr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function B(e){return[e.type,e.role,e.subrole].map(e=>C(e??``)).some(e=>e===`tab`||Cr.some(t=>e.includes(t)))}function wr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Vr(e);if(!Tr(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Nr(e,n,r).node;for(let n of t.slice(1))if(Nr(e,n,r).node.index!==i.index){let e=Or(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Tr(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Er(i,a,t)&&!Er(a,i,t))return!1}return!0}function Er(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Dr(e,t){return Or(t,Vr(e))}function Or(e,t){if(e.length<2||!Tr(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!B(n)||!e.every(e=>e===n||!B(e)))return null;let r=O(n.rect);return r&&e.every(e=>kr(O(e.rect),r))?n:null}function kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function Ar(e,t){if(!t?.rect||!e.rect||!Ce(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function jr(e,t){return Nr(e,t)}function Mr(e){let t=Vr(e);return n=>Nr(e,n,t)}function Nr(e,t,n){return m(t)?{node:t,reason:`covered`}:Pr(e,t,n)??Fr(t)??Ir(e,t,n)??{node:t,reason:`original`}}function Pr(e,t,n){let r=Rr(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Fr(e){return B(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function Ir(e,t,n){let r=Lr(e,t,n);return!r?.rect||m(r)||!D(r.rect)?null:zr(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Lr(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?y(e,t,n.nodesByIndex,e=>r(e)?e:null):ke(e,t,r)}function Rr(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||m(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function zr(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(Br(t)&&!We(i,a))return!0;let o=oe(n,i,r?.viewportRootRects);return!o||!Hr(a,o)?!1:!We(i,a)}function Br(e){let t=C(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Vr(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(Ce(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Hr(e,t){let n=Sr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function V(e,t,n,r,i={}){let a=br(qr(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await Wr(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=Ur(t,a);return o?await Wr(e,t,o,i):a}function Ur(e,t){let n=Dr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function Wr(e,t,n,r){let i=await Kr(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function Gr(e,t,n,r){let i=qr(e,t);return{candidates:i,list:yr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function Kr(e,t,n,r={}){r.onResolved?.(n,t);let i=Jr(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||m(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Yr(e,t,i.node,r)}}function qr(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!m(e)):t}function Jr(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Ar(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Yr(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function Xr(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const Zr=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),Qr=new Set([`keyboard`,`key`]);function $r(e){return Qr.has(C(e.type??``))||h(e)}const ei=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function ti(e){return $r(e)||ei.has(e.role??``)}function ni(e,t,n){return n.has(e.index)||ai(t,n,e.index).length>0}function ri(e){return e!==null&&_e(e)}function H(e){return e.flatMap(e=>_e(e.rect)?[e.rect]:[])}function ii(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of ai(n,r,e.index))i.add(t);return i}function ai(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function oi(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function si(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function ci(e){let t=H(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return oi(t.length>0?t:e.anchorRects)}function li(e){let t=e.filter(ti),n=ii(e,t);return H(t.filter(e=>!n.has(e.index)))}function ui(e,t){let n=e.filter($r),r=H(n);if(r.length===0||!ri(t))return null;let i=e.filter(ti),a=H(i);if(a.length===0)return null;let o=si({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=ii(e,i);return ci({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:H(i.filter(e=>!s.has(e.index)))}:null}function di(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:li(e.nodes)}:ui(e.nodes,e.viewport);if(!t)return e.nodes.some($r)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return fi(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(ti).map(e=>e.index));return ni(e.node,n,r)?{kind:`clear`,surface:t}:w(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function fi(e,t){return t.controlRects.some(t=>w(t,e.x,e.y))?{kind:`clear`,surface:t}:w(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function pi(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function mi(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=di({nodes:e.nodes,viewport:x(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw _i({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function hi(e){let t=di({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return gi(e.point,t.surface)}function gi(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${Zr.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+Zr.hint}function _i(e){return l(new a(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${pi(e.action)} safely`,{...Zr,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function vi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${pi(e.action)} safely`,{reason:E.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function yi(e){let t=await Kr(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw vi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return mi({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function bi(e,t,n,r,i,{action:a}){return await Ci(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${Si(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function xi(e,n,r,i,a,{action:o}){return await Ci(e,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:t(a)},hint:e=>`${Si(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Si(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Ci(e,t,n,r,i){let o=x(r),s=n.rect?o.resolveEffectiveViewport(n):null;if(!n.rect||!s||o.isVisibleOnScreen(n))return n;let c=o.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(M(e,t),n,c);if(u)return{...n,rect:u};let d=He(n,o);throw l(new a(`COMMAND_FAILED`,i.message,{...i.details,rect:n.rect,viewport:s,...d?{scrollDirection:d}:{},hint:i.hint(d)}),`no`)}function wi(e,t,n,r){let{candidates:i,list:o}=Gr(r,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=wr(i,s);if(l.kind===`ambiguous`)throw new a(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ie(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Ti(t,n,r,i){let a=await F(t,n,i.requireInteractive),o=wi(a.snapshot.nodes,r,t.backend.platform,i.pipeline);if((!o||!o.node.rect)&&i.requireInteractive){let s=a.snapshot;a=await F(t,n,!1),e(s,a.snapshot),o=wi(a.snapshot.nodes,r,t.backend.platform,i.pipeline)}return{capture:a,resolved:o}}async function Ei(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await V(k.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return vi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Di(e){let{runtime:t,nodes:n,selectorExpression:r,action:i,resolved:o}=e,s=await Ei({runtime:t,nodes:n,selectorExpression:r,action:i});if(s)return s;let c=o?.diagnostics??[];return l(new a(`COMMAND_FAILED`,me(r,c,{unique:!0}),{reason:E.selectorNotFound,hint:we(c)}),`no`)}async function Oi(t,n,r,i,o){let s=await Ti(t,n,r,i);if(o&&e(o.snapshot,s.capture.snapshot),s.resolved?.node.rect)return s;let c=s.capture.snapshot.snapshotQuality;if(A(c))throw l(new a(`COMMAND_FAILED`,`Selector ${r} was not found in a sparse capture; the tree cannot prove it absent`,{reason:E.captureSparse,snapshotQuality:c,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ei({runtime:t,nodes:s.capture.snapshot.nodes,selectorExpression:r,action:i.action});if(u)throw u;return s}async function ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Di({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function Ai(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Ze({capture:async i=>{let a=await Oi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Je,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?ji(s.error,s):await ki(e,n,r,s)}function ji(e,t){if(!(e instanceof a)||e.details?.reason!==E.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const U={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Mi=[`runner-start`,`target-discovery`];function Ni(e){let t=e?.readinessPhase;return Mi.find(e=>e===t)}const Pi=`replay_target_guard_mismatch`,Fi=U.landmarkIdentityMismatch;function W(e,t,n,r,i){if(!n)return;let o=S(e),s=ge(e,t);if(!(ne(o,n.identity)&&ve(s,n.structural)))throw l(new a(`COMMAND_FAILED`,`${r} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Pi,observed:o,observedStructural:s,expected:n.identity,expectedStructural:n.structural,...i?{targetRole:i}:{}}),`no`)}function Ii(e,t,n){W(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function Li(e){return e.hittable===!0||B(e)}function Ri(e,t){let n=re(S(e),t);return n.id!==void 0||n.label!==void 0?!1:v(e.value)===null}function zi(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Bi(e,t){let n=dt(t);return t.filter(t=>t.index!==e.index&&zi(t,e,n)).sort((e,t)=>e.index-t.index)}function Vi(e,t){let n=D(e.rect);return!n||!t.rect?!1:w(t.rect,n.x,n.y)}function Hi(e,t){if(!Ri(e,t))return e;let n=Bi(e,t);if(n.some(Li))return e;let r=n.find(e=>S(e).label!==void 0);return!r||!Vi(r,e)?e:r}function Ui(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const Wi={source:`ref`,phase:`pre-action`,kind:`exact`},Gi={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function Ki(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Wi:Gi}}const qi={source:`runtime`,phase:`pre-action`,kind:`unique`};function Ji(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Yi(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Yi(e,t))}:qi}function Yi(e,t){let n=C(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Ui(n,256)}:{},...r===void 0?{}:{label:Ui(r,256)}}}function Xi(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:Oe(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...Qi(t,r),preAction:n,resolution:i,...Zi(e,t,a,r)}}function Zi(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Hi(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Oe(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function Qi(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function $i(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=ea(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?na(e,t):null,r),s=o?ra(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function ea(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>ta(e,t,r)).filter(B).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=na(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function ta(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function na(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function ra(e,t,n,r){let i=ca(e),a=oa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=oa(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!w(t,s.x,s.y))return[];let c=ia(s,e,n,r,i);return c?[c]:[]})).sort(aa)[0]?.point??null}function ia(e,t,n,r,i){let a=sa(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function aa(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function oa(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function sa(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function ca(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function la(e,t,n){let r=x(t),i=$i(t,e,{bounds:[r.resolveEffectiveViewport(e),e.rect?r.resolveViewport(e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?l(new a(`COMMAND_FAILED`,n.invalidMessage,{reason:E.targetBoundsInvalid,...ua(n.blockedTargetDetails)}),`no`):l(new a(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:i.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:i.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function ua(e){return`ref`in e?{ref:t(e.ref)??e.ref}:e}function da(e,n){let r=t(e.ref);if(!r)throw new a(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=t(n.ref),o=n.node.ref?t(n.node.ref):null;if(i!==r||o!==r||!n.nodes.includes(n.node))throw new a(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:Ki(r,n.node,`exact`)}}async function fa(e,t,n){let r=await ma(e,t,n);return{tree:I(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function pa(e,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?da(r,i.preresolvedTarget):await fa(e,n,r),c=a.nodes,{node:l,tapPoint:u}=await yi({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>Ii(e,t,i),offscreen:async(t,a)=>await xi(e,n,t,a,r.ref,i)},resolveTapPoint:e=>la(e,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${t(r.ref)??e.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...Xi(e,l,a,i.action,s.resolution)}}async function ma(e,t,n){let{session:r,snapshot:i}=await xn(e,t.session),a=n.fallbackLabel??``,o=ga(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw _a(o,n.ref);return ha({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function ha(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=ga(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&ne(S(a.node),S(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function ga(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(e,i);if(va(o))return{kind:`resolved`,resolved:Ki(i,o,`exact`)};let c=r.fallbackLabel.length>0?gn(e,r.fallbackLabel):null;if(va(c))return{kind:`resolved`,resolved:Ki(i,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function _a(e,n){let r=t(n)??n,i=e.kind===`unusable`?new a(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:E.targetBoundsInvalid,ref:r,hint:b}):new a(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:E.refNotFound,ref:r,hint:b});return l(i,`no`)}function va(e){return e?D(e.rect)!==null:!1}async function G(e,t,n){return await Ca(e,t,n.action),t.target.kind===`point`?await ba(e,t,t.target,n):t.target.kind===`ref`?await pa(e,t,t.target,n):await Sa(e,t,t.target,n)}async function ya(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=x(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!w(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:hi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function ba(e,t,n,r){let i=await ya(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await xa(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function xa(e,t){try{return I((await F(e,t,!0)).snapshot)}catch{return}}async function Sa(e,t,n,r){let i=n.selector,a,o,s,c=Qe(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await Ai(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Ti(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Di({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await yi({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>Ii(e,t,r),offscreen:async(n,i)=>await bi(e,t,n,i,l.selector,r)},resolveTapPoint:e=>la(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...Xi(e,u,I(a.snapshot),r.action,Ji(o,a.snapshot.nodes))}}async function Ca(e,t,n){if(e.backend.platform!==`macos`)return;let r=await wa(e,t);if((r===`desktop`||r===`menubar`)&&(r!==`menubar`||n!==`click`&&n!==`press`))throw new a(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function wa(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ta(e,n,r,i){let a=(await e.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||t(r.ref)===null)return{};let s=ga(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=k.resolvedTarget,{node:u}=await yi({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(t,a)=>await xi(e,n,t,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...Qi(u,i),node:u,preAction:I(a)}}async function Ea(e,t,n,r,i){let a=await Ta(e,t,n,r),o=P(await i(M(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Wi,...a,...o?{backendResult:o}:{}}}function Da(e,t){let n=x(e),r=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Oa),i=r.length>0?r:e.map(e=>e.rect).filter(Oa);if(i.length===0)throw new a(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...i.map(e=>e.x)),s=Math.min(...i.map(e=>e.y)),c=Math.max(...i.map(e=>e.x+e.width)),l=Math.max(...i.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Oa(e){return!!(e&&e.width>0&&e.height>0)}async function ka(e,t){return await e.backend.resolveGestureViewport?.(M(e,t))||Da((await F(e,t,!1)).snapshot.nodes,`gesture`)}const Aa=async(e,t)=>{let n=await G(e,t,{action:`focus`,requireInteractive:!0,pipeline:k.resolvedTarget});if(!e.backend.focus)throw new a(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let r=K(n),i=P(await e.backend.focus(M(e,t),r));return{...n,...i?{backendResult:i}:{},...T(`Focused (${r.x}, ${r.y})`)}},ja=async(e,t)=>{let n=ur(t),r=await G(e,t,{action:`longPress`,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new a(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let i=t.durationMs===void 0?void 0:Bt(t.durationMs,`durationMs`,0,12e4),o=K(r),s=P(await e.backend.longPress(M(e,t),o,{durationMs:i}));return await dr(e,t,r,{...r,...i===void 0?{}:{durationMs:i},...s?{backendResult:s}:{},...T(`Long pressed (${o.x}, ${o.y})`)},n)},Ma=async(e,t)=>{let n=ur(t),r=n.needsPreActionBaseline?null:await Na(e,t);if(r)return r;let i=await G(e,t,{action:`hover`,requireInteractive:!1,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new a(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=K(i),s=P(await e.backend.hover(M(e,t),o));return await dr(e,t,i,{...i,...s?{backendResult:s}:{},...T(`Hovered (${o.x}, ${o.y})`)},n)};async function Na(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Ea(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Pa=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Ca(e,t,`drag`);let n=await ka(e,t),r=await Fa(e,t,`source`),i=await Fa(e,t,`destination`),o=qe({from:K(r),to:K(i),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=P(await e.backend.performGesture(M(e,t),o)),{start:c,end:l}=Ge(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Ia(r),destination:Ia(i)},recording:La(r,i),...s?{backendResult:s}:{},...T(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Fa(e,t,n){let r=t.gesture[n];return await G(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:k.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Ia(e){if(e.kind===`point`||!e.resolution)throw new a(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function La(e,t){let n=Ra(e),r=Ra(t),i=za(e),a=za(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Ra(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function za(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function K(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Ba=async(e,t)=>await Ua(e,t,`press`),Va=async(e,t)=>await Ua(e,t,`click`),Ha=async(e,t)=>{if(typeof t.text!=`string`)throw new a(`INVALID_ARGS`,`fill requires text`);let n=ur(t),r=n.needsPreActionBaseline?null:await Ka(e,t);if(r)return r;let i=await G(e,t,{action:`fill`,requireInteractive:!0,pipeline:k.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new a(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Wa(i),s=`node`in i?i.node?.type??``:``,c=s!==``&&ue(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.node?.hittable===!1,u=P(await e.backend.fill(M(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Ja(i)} resolved to "${s}", attempting fill anyway.`:void 0;return await dr(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function Ua(e,t,n){let r=ur(t),i=r.needsPreActionBaseline?null:await Ga(e,t,n);if(i)return i;let o=await G(e,t,{action:n,requireInteractive:!0,pipeline:k.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new a(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Wa(o),c;try{c=await e.backend.tap(M(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Yt(e,o),e}let l=P(c);return await dr(e,t,o,{...o,...l?{backendResult:l}:{}},r)}function Wa(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ga(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||qa(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Ea(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Ka(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Ea(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function qa(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Ja(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function q(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ya=k.wait.poll.defaultTimeoutMs;function Xa(e,t,n,r,i={}){let a=Xr(r),o=n??a.defaultTimeoutMs,s=X(e),c=fo(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(X(e)-s));return{capture:async n=>{let r=!1,i=X(e)-s,a=t=>l.push({startedMs:i,durationMs:X(e)-s-i,outcome:t}),o=await En(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(Za(r,c.lastUnobservedCause())),o;let f=Qa(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:$a(l),waitedMs:X(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await po(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>X(e)-s}}function Za(e,t){return e?`readable`:t?.outcome??`unreadable`}function Qa(e,t){let n=lo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let r=Ni(e instanceof a?e.details:void 0);return r?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:r}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function $a(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function eo(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function to(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function no(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function ro(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.deadlineExceeded,captureTruncated:!0,...t})}function io(e,t){return new a(`COMMAND_FAILED`,e,{reason:U.targetAbsent,...t})}function ao(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw oo(r.error,t);if(n)throw r.error}}function oo(e,t){let r=n(e);return new a(r.code,r.message,{reason:U.captureStalled,...r.details,...t},r)}function J(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return to(e,r);case`readiness-exhausted`:return ao(t,r,!1),no(e,r);case`capture-stalled`:return ao(t,r,t.preserveUnreadableOnStall===!0),eo(e,r);case`capture-truncated`:return ro(e,r);case void 0:return ao(t,r,!0),r.readableCaptures===0?eo(e,r):io(e,r);default:return co(n)}}function so(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function co(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function lo(e){if(!(e instanceof a))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...Y(t,`runnerRestartReason`),...Y(t,`runnerRestartCommand`),...Y(t,`runnerRestartCommandId`),...Y(t,`runnerInvalidatedSessionId`),...Y(t,`runnerRestartSessionId`),...Y(t,`logPath`),...Y(t,`diagnosticId`)}}function Y(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function uo(e){return e instanceof a&&e.details?.retriable===!0}function fo(e=Je){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(uo(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function X(e){return e.clock?.now()??Date.now()}async function po(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function mo(e,t,n){let r=await V(k.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:je(e,i)}}async function ho(e,t,n){let r=await mo(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Fe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function go(e,t,n,r,i){let a=Be(n);if(a)throw ze(a,`wait`);let o=Xa(t,n,i,k.wait,{isUnreadableError:vo,preserveUnreadableOnStall:!0}),s=q(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await mo((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Ve(a.kind))throw Fe(r,a,`wait`);return a}catch(e){throw Je(e)?Ae(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw so(l)?J(`wait absent timed out for selector: ${r}`,o,l):c?_o(r,c,o.failureEvidence()):J(`wait absent timed out for selector: ${r}`,o,l)}function _o(e,t,n){let r=t.matches!==1;return new a(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${r?`es`:``} remain`,{reason:U.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function vo(e){if(!(e instanceof a))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Ve(t.observation)||t.observation===`unreadable`)}function yo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function bo(e,t,n,r,i,o){let s=Xa(t,n,i,k.wait),c=q(),l,u;for(;s.hasTimeRemaining();){let i=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(i.timedOut){u=i.deadline;break}let a=i.value;if(a){let e=a.snapshot.nodes,n=yo(await V(k.wait,e,r,{platform:t.backend.platform}));if(n){let t=xo(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new a(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Fi,...s.failureEvidence(),...l}):J(`wait timed out for selector: ${r}`,s,u)}function xo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=dt(e),a=pt(t.matchedNodes,i,he(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:S(r),observedAncestry:ft(r,i,Math.max(n.ancestry.length,1)).chain}}}async function So(e,t,n,r,i){let o=i??Ya,s=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new a(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:U.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function Co(e,t,n,r,i){let a=Xa(t,n,i,k.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await wo(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw J(`wait timed out for text: ${r}`,a,o)}async function wo(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Eo(t,n),r)).found?!0:await To(e,t,n,r)}async function To(e,t,n,r){return!!gn((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Eo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Do(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await po(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Oo(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await bo(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await go(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await So(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await ko(e,t,n,n.target.text,n.target.timeoutMs);default:return Ao(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new a(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function Oo(e,n,r,i,o){let c=await e.requireSnapshot(n,r.session),l=t(i);if(!l)throw new a(`INVALID_ARGS`,`Invalid ref: ${i}`);let u=s(c.snapshot.nodes,l);if(!u)throw new a(`COMMAND_FAILED`,`Ref ${i} not found`,{reason:E.refNotFound,ref:l,hint:b});let d=R(u,c.snapshot.nodes);if(!d)throw new a(`COMMAND_FAILED`,`Ref ${i} has no label to wait for`,{reason:E.refUnlabeled,ref:l});return await Co(e,n,r,d,o)}async function ko(e,t,n,r,i){let o=Ee(r);if(!o.ok)throw new a(o.code,o.message);return await Co(e,t,n,o.text,i)}function Ao(e){throw Error(`Unsupported wait target: ${String(e)}`)}const jo=Do({captureSnapshot:z,requireSnapshot:xn,stable:{defaultQuietMs:500,tinyTreeHint:Pn,tinyTreeNodeCount:5,capture:Fn}}),Mo=jo.waitCommand,No=jo.waitForTextCommand,Po=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new a(`INVALID_ARGS`,Se);if(t.action===`wait`)return await Ro(e,t,n);if(t.action===`list`)return await zo(e,t,n);let{capture:r,match:i}=await Bo(e,t,n);if(!i)throw new a(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:i}:{kind:`text`,ref:o,text:await wn(e,r,i),node:i}},Fo=async(e,t)=>{if(t.target.kind===`ref`){let n=await xn(e,t.session),r=Tn(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});W(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=Oe(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await wn(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Vo(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?k.readText:k.readUnique,hooks:{onResolved:(e,n)=>W(e,n,t.expectedResolvedTarget,`get`)}}),r=Oe(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await wn(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Io=async(e,t)=>{let n=await Fo(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new a(`COMMAND_FAILED`,`getText returned non-text result`);return n},Lo=async(e,t)=>{let n=await Fo(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new a(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function Ro(e,t,n){let r=Xa(e,t,t.timeoutMs,k.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Bo(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw J(`find wait timed out`,r,i)}async function zo(e,t,n){let r=de(n,t.query),i=await z(e,t,{updateSession:!0,...q()});if(A(i.snapshot.snapshotQuality))throw bn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Gr(k.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:le(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Bo(e,t,n,r){let i=de(n,t.query),a=await z(e,t,{updateSession:!0,scope:yn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...q()});if(A(a.snapshot.snapshotQuality))throw bn(a.snapshot.snapshotQuality);if(i){let t=await V(k.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:le(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Vo(e,t,n,r){let i=await z(e,{...t,session:n},{updateSession:!0,...q()}),o=await V(r.policy,i.snapshot.nodes,r.selector,{platform:e.backend.platform},r.hooks);if(o.kind!==`target`)throw new a(`COMMAND_FAILED`,me(r.selector,[],{unique:!0}),{hint:we([])});return{capture:i,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Ho=async(e,t)=>{let n=xe(t.predicate);if(!n.ok)throw new a(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`absent`){let e=Be(t);if(e)throw ze(e)}if(r===`text`&&!t.expectedText)throw new a(`INVALID_ARGS`,Te);let i=t.selector,o=await Uo(e,t,r,i);return r===`exists`?await Wo(e,o,i):r===`absent`?await ho(o.snapshot,i,e.backend.platform):await Go(e,t,o,r,i)};async function Uo(e,t,n,i){try{return await z(e,t,{updateSession:!0,...q(n)})}catch(e){throw n!==`absent`||r(e)?e:Ae(i,e)}}async function Wo(e,t,n){let r=await V(k.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(r.kind!==`target`)throw new a(`COMMAND_FAILED`,me(n,[],{unique:!1}),{hint:we([])});return{predicate:`exists`,pass:!0,selector:r.selector,matches:r.matches,selectorChain:ye(n)}}async function Go(e,t,n,r,i){let o=await V(k.readUnique,n.snapshot.nodes,i,{platform:e.backend.platform},{onResolved:(e,n)=>W(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new a(`COMMAND_FAILED`,me(i,[],{unique:!0}),{command:`is`,reason:E.selectorNotFound,predicate:r,selector:i,hint:we([])});let s=be({predicate:r,node:o.node,visibility:x(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new a(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:E.predicateFailed,predicate:r,selector:o.selector,predicateDetails:s.details});return{predicate:r,pass:!0,selector:o.selector,...r===`text`?{text:s.actualText}:{},selectorChain:ye(i),node:o.node,preActionNodes:n.snapshot.nodes}}const Ko=async(e,t)=>await Ho(e,{...t,predicate:`visible`,selector:t.target.selector}),qo=async(e,t)=>await Ho(e,{...t,predicate:`hidden`,selector:t.target.selector}),Jo=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Ca(e,t,t.gesture.intent);let n=await ka(e,t),r=Ke(t.gesture,n,e.backend.platform),i=P(await e.backend.performGesture(M(e,t),r)),o=Xo(r.pointers,0),s=Xo(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:o,to:s,...i?{backendResult:i}:{},...T(Zo(t.gesture,o,s))}},Yo=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Pa(e,{...t,gesture:n}):await Jo(e,{...t,gesture:n})};function Xo(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new a(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function Zo(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const Z={find:Po,get:Fo,getText:Io,getAttrs:Lo,is:Ho,isVisible:Ko,isHidden:qo,wait:Mo,waitForText:No},Q={click:Va,press:Ba,fill:Ha,focus:Aa,longPress:ja,hover:Ma,gesture:Yo,settleObservation:Kn};function Qo(e){return{find:t=>Z.find(e,t),get:t=>Z.get(e,t),getText:(t,n={})=>Z.getText(e,{...n,target:t}),getAttrs:(t,n={})=>Z.getAttrs(e,{...n,target:t}),is:t=>Z.is(e,t),isVisible:(t,n={})=>Z.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>Z.isHidden(e,{...n,target:t}),wait:t=>Z.wait(e,t),waitForText:(t,n={})=>Z.waitForText(e,{...n,text:t})}}function $o(e){return{click:(t,n={})=>Q.click(e,{...n,target:t}),press:(t,n={})=>Q.press(e,{...n,target:t}),fill:(t,n,r={})=>Q.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Q.focus(e,{...n,target:t}),longPress:(t,n={})=>Q.longPress(e,{...n,target:t}),hover:(t,n={})=>Q.hover(e,{...n,target:t}),gesture:t=>Q.gesture(e,t),settleObservation:t=>Q.settleObservation(e,t)}}const es=[0,187,255,255];function ts(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||ns(e,n.rect)}function ns(e,t){let n=rs(t);if(n==null)return;let r=as(n.x,0,e.width-1),i=as(n.y,0,e.height-1),a=as(n.right,0,e.width-1),o=as(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)is(e,n,i+t,es),is(e,n,o-t,es);for(let n=i;n<=o;n+=1)is(e,r+t,n,es),is(e,a-t,n,es)}}function rs(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function is(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function as(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const os=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ss(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!us(t,a,e))continue;let c=0,l=ls(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=cs({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function cs(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of os){let o=s+e.x,u=c+e.y;if(!ds(o,u,i,a))continue;let d=u*i+o;us(t,n,d)&&(l=ls(r,n,l,d))}return l}function ls(e,t,n,r){return t[r]=1,e[n]=r,n+1}function us(e,t,n){return e[n]===1&&t[n]!==1}function ds(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function fs(e,t){return e.flatMap(e=>ps(e,t.baseline.width,t.baseline.height)?ms(e,t,bs(t.baseline.height)):[e])}function ps(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=ys(n)&&r>=t*.35}function ms(e,t,n){let r=vs(e,_s(gs(hs(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>xs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function hs(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function gs(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function _s(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function vs(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function ys(e){return Math.max(48,Math.round(e*.07))}function bs(e){return Math.max(24,Math.round(e*.03))}function xs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Ss(t,a),Cs(i,e,t,a,r.baseline,r.current))}return i}function Ss(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Cs(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const ws=2.5;function Ts(e){let t=Es(e);return fs(t.length<=2e3?ks(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Ms(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Es(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return ss({mask:t,width:i,height:a,hooks:{create:e=>Ds(e,i),visit:(e,t)=>Os(e,t,i,n,r)}})}function Ds(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Os(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function ks(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>As(e,r,t));if(!e){n.push({...r});continue}js(e,r)}return n}function As(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function js(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Ms(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Ns(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Ns(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:xr({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:Is(r,n.width,n.height),size:Ls(s,n.totalPixels),location:Ps(i,n.width,n.height),averageBaselineColorHex:zs(a),averageCurrentColorHex:zs(o),baselineLuminance:Math.round(Rs(a)),currentLuminance:Math.round(Rs(o)),dominantChange:Fs(a,o)}}function Ns(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Ps(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function Fs(e,t){let n=Rs(t)-Rs(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Is(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*ws?`horizontal-band`:e.height>=e.width*ws?`vertical-band`:`compact`}function Ls(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function Rs(e){return e.r*.2126+e.g*.7152+e.b*.0722}function zs(e){return`#${Bs(e.r)}${Bs(e.g)}${Bs(e.b)}`}function Bs(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const Vs=Math.sqrt(3*255**2);async function Hs(e,t,n={}){await Us(e,`Baseline image not found`),await Us(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([j.readFile(e),j.readFile(t)]),[o,s]=await Promise.all([at(i,`baseline screenshot`),at(a,`current screenshot`)]);Ws(o.width,o.height,`baseline screenshot`,n.maxPixels),Ws(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Gs(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*Vs,{diffData:d,diffMask:f,differentPixels:p}=await ot({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Ts({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new it.PNG({width:o.width,height:o.height});e.data=d,ts(e,m),await j.mkdir(ut.dirname(r),{recursive:!0}),await j.writeFile(r,await st(e))}else await Gs(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function Us(e,t){try{await j.access(e)}catch{throw new a(`INVALID_ARGS`,`${t}: ${e}`)}}function Ws(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new a(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function Gs(e){if(e)try{await j.unlink(e)}catch(e){if(!Ks(e,`ENOENT`))throw e}}function Ks(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function qs(e,t){return e.map(e=>{let n=Js(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Js(e,t){let n=_(e.rect);return t.map(t=>{let r=t.overlayRect,i=Sr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ys(i/_(r)),regionCoveragePercentage:Ys(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function Ys(e){return Math.round(e*100*100)/100}async function Xs(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new a(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw n(e)}}async function Zs(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new a(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw n(e)}}async function Qs(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const $s=async(e,t)=>{if(!t.baseline)throw new a(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=ec(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!cc(r))throw new a(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await Xs(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let a;cc(r)?(s=await tc(e,t),a=s.path):(o=await Xs(e,r,{usage:`diff screenshot current`,field:`current`}),a=o.path),c=t.out?await Zs(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await Hs(i.path,a,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});cc(r)&&(u=await nc(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await i.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function ec(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new a(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function tc(e,t){let n=await Qs(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await rc(e,t,n.path,ic(t))}catch(e){throw await n.cleanup(),e}return n}async function nc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await sc(n),r;let a=await Zs(e,ac(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await rc(e,t,a.path,{overlayRefs:!0,...ic(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:qs(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function rc(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function ic(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function ac(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:oc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:oc(e.out.clientPath)}:{},...e.out.fileName?{fileName:oc(e.out.fileName)}:{}}}function oc(e){let t=ut.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function sc(e){try{await j.unlink(oc(e))}catch(e){if(!lc(e,`ENOENT`))throw e}}function cc(e){return e.kind===`live`}function lc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const uc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await Zs(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r,i;try{i=(await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}))?.displayRotation,t.scale!==void 0&&await nt(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...i?{displayRotation:i}:{},...T(`Saved screenshot: ${n.path}`)}};function dc(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!i(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Ue(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const fc=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function pc(e){return e?.systemSurfaceOnly===!0?fc:void 0}function mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function hc(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!gc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!_c(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function gc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function _c(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>yc(e,t.nodes[n]))}const vc=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function yc(e,t){return vc.every(n=>e[n]===t[n])&&bc(e.rect,t.rect)&&xc(e.presentationHints,t.presentationHints)&&xc(e.actions,t.actions)}function bc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function xc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Sc=async(e,t)=>{let n=await wc(e,t),r=hc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(Ec(t.session,n));let i=Oc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:dc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...n.snapshot.viewport?{viewport:n.snapshot.viewport}:{},...Dc(n)})},Cc=async(e,t)=>{let n=await wc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=Ec(t.session,n);if(!i){let t=dn(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=un(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function wc(e,t){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=Tc(i,e),s=p(o,mc(o,t)),c=d(i),l=N(e);return{snapshot:s,result:i,session:r,annotations:c,warnings:kc({result:i,annotations:c,snapshot:s,options:t,session:r,capturedAt:s.createdAt??l,runtimeNow:l})}}function Tc(e,t){return e.snapshot?p(e.snapshot,{...e.snapshot,...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:N(t),...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}}function Ec(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function Dc(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function Oc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ct(e.producer)===`unavailable`&&void 0:e.truncated}function kc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...tt(e.annotations.quality,e.snapshot.nodes)),t.push(...rt(Oc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Pt(e.snapshot.postGestureOutcome)),t.push(...Pc(e)),e.annotations.quality||(t.push(...jc(e)),t.push(...Nc(e.snapshot.nodes)));let n=Le(e.snapshot.nodes);n&&t.push(n);let r=Ac(e.annotations);r&&t.push(r);let i=Fc(e);return i&&t.push(i),t.push(...zc(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Ac(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return fc}function jc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Mc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Mc(e){return e?C(e.type??``)===`application`:!1}function Nc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function Pc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Fc(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Ic(t,e.snapshot)&&Lc(t,e.capturedAt,e.runtimeNow)&&Bc(t.nodes.length,e.snapshot.nodes.length))return Rc}function Ic(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function Lc(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Rc=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function zc(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[Rc]:[]}function Bc(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Vc={screenshot:uc,diffScreenshot:$s,snapshot:Sc,diffSnapshot:Cc};function Hc(e){return $t(Vc,e)}export{Lt as A,Ht as C,Vt as D,qt as E,pt as F,Dt as M,ft as N,Bt as O,dt as P,Xt as S,Kt as T,gn as _,$o as a,P as b,Fi as c,V as d,Kr as f,R as g,Dr as h,Xs as i,Ot as j,Pt as k,U as l,Ar as m,pc as n,Qo as o,Mr as p,Zs as r,Pi as s,Hc as t,Gr as u,rn as v,Ut as w,M as x,$t as y};
1
+ import{C as e,D as t,F as n,K as r,N as i,P as a,S as o,x as s,y as c,z as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{i as d,t as f}from"./snapshot-capture-annotations.js";import{r as p}from"./snapshot-private-evidence.js";import{r as m}from"./diagnostics.js";import"./diagnostics2.js";import{An as h,Bn as g,Br as _,Cn as v,Cr as y,Dn as ee,En as te,Fn as ne,Fr as re,Hn as ie,Ir as ae,Jn as oe,Jr as b,Kn as se,Mn as ce,Mr as le,Nr as ue,Or as x,Pr as de,Qn as fe,Rr as S,Un as pe,Ur as me,Vn as he,Vr as ge,Xn as _e,Xr as ve,Yn as C,_r as ye,ei as be,fn as xe,gr as Se,hr as Ce,kn as we,qn as Te,ur as Ee,wn as w,zn as De}from"./sdk-batch.js";import{r as T}from"./success-text.js";import{_ as Oe,a as ke,c as Ae,f as je,g as Me,h as Ne,i as Pe,m as Fe,n as Ie,o as E,p as Le,r as Re,s as ze,u as Be}from"./overlay.js";import{n as Ve,t as He}from"./mobile-snapshot-semantics.js";import{i as Ue}from"./retry.js";import"./retry2.js";import{i as D,n as O,t as We}from"./rect-center.js";import{l as k,n as Ge}from"./android-input-ownership.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{t as Qe}from"./observe-until.js";import{n as $e,t as A}from"./selector-pipeline-policy.js";import{i as et}from"./ios-system-surface.js";import{c as tt,n as nt,o as rt,r as it,s as j}from"./quality-warnings.js";import{r as at}from"./png.js";import{a as ot,n as st,o as ct}from"./png-worker-client.js";import{n as lt}from"./ios-snapshot-acquisition.js";import{createHash as ut}from"node:crypto";import{promises as M}from"node:fs";import dt from"node:path";function ft(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function pt(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 mt(e,t,n,r){return e.filter(e=>{if(!oe(C(e),n))return!1;let i=pt(e,t,Math.max(r.length,1));return!i.broken&&Te(i.chain,r)})}const ht=2500,gt=5e3,_t=1500,vt=[250,400,600];function yt(e){return e===`press`||e===`click`||e===`back`||e===`open`}function bt(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function xt(e,t){return e<12?!1:t<=Math.floor(e*.2)}function St(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:xt(t.baselineCount,e.snapshot.nodes.length)?Ct(e.snapshot)?null:`sharp-drop`:t.routeComparable&&yt(t.action)&&wt(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Ct(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function wt(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=bt(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function Tt(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await Ue(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...d({freshness:a})}}}const Et=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Dt={strippedIndexes:new Set,refs:new Set};function Ot(e){let t=new Set(e.filter(e=>S(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Dt;let n=new Map(e.map(e=>[e.index,e])),r=Nt(e,n,t),i=new Set(r),a=Vt(e,n,r);for(let t of Nt(e,n,a))i.add(t);for(let o of kt(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 kt(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=jt(t,n,r);if(o.size===0)return a;let s=Mt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&At(n,t,o)&&a.add(n.index);return a}function At(e,t,n){if(!e.rect)return!1;let r=Ht(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 jt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=Ht(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 Mt(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 Nt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)Ut(i,t,n)&&r.add(i.index);return r}function Pt(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 Ft(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(Ge).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:It(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?Dt:{strippedIndexes:o,refs:s}}function It(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Pt(e,t)).map(e=>e.index))}function Lt(e,t){let n=Ot(e),r=Ft(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 Rt(e,t){let{strippedIndexes:n}=Lt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function zt(e,t){return Lt(e,t).refs}function Bt(e){return Ot(e).refs}function Vt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||S(n.type??``)!==`keyboard`)continue;let i=Ht(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Et.has(S(e.type??``))&&!n.has(e.index)&&Ut(e,t,a))&&r.delete(i)}return r}function Ht(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(S(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function Ut(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 Wt={intervalMs:200,budgetMs:1500,minPolls:2},Gt=Wt.budgetMs+2e3;function Kt({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 qt(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function Jt(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 Yt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),h=await Qe({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Wt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let h=p(i);if(d=r.signaturesStable(h.signature,f.signature),!d)return{kind:`continue`};let g=a()-o;if(c&&l!==f.backend)return m({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let _=Jt({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:g,distrustCapMs:Gt,classifyBaselineEvidence:r.classifyBaselineEvidence});return _===`distrust`?{kind:`continue`,budgetMs:Gt}:(Xt(_,t.action,s,g),{kind:`done`,result:Zt(_,t,f,r,u)})}});if(h.kind===`done`)return h.result;if(h.kind===`failed`)throw h.error;m({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:h.waitedMs,lastPairAgreed:d}});let g=h.last;return d?{value:g}:{value:g,postGestureOutcome:qt(`unsettled`,t)}}function Xt(e,t,n,r){if(e===`accept-stale`){m({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}m({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:qt(`no-effect`,t)}:(m({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Qt(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new a(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${r}`);return e}function $t(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new a(`INVALID_ARGS`,t,n);return{x:r,y:i}}function en(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??tn(),policy:e.policy??on(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function tn(e=[]){let t=new Map(e.map(e=>[e.name,nn(e)]));return{get:e=>nn(t.get(e)),set:e=>{t.set(e.name,nn(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>nn(e))}}function nn(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:rn(e.metadata)}:{}}}function rn(e){try{return structuredClone(e)}catch{return{...e}}}function an(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function on(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const sn=new WeakMap;function cn(e,t){un(e)&&sn.set(e,t)}function ln(e){return un(e)?sn.get(e):void 0}function un(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 dn(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function fn(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}async function I(e,t,n){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r);if(!i)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(N(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(e)};return await e.sessions.set({...i,snapshot:s}),{snapshot:s}}function pn(e){let t=Buffer.alloc(16);for(let n of e)hn(t,mn(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function mn(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function hn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function gn(e){let{digest:t,nodeCount:n}=pn(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=_n(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function _n(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function L(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function vn(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:et(n)}}function yn(e,t){let n=gn(e.nodes),r=vn(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==gn(t.nodes).digest;return{...n,changedFromBefore:i}}function bn(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 xn(e,t){let n=o(e.type??`Element`),r=Le(e,n),i=Me(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 Sn(e,t,n={}){let r=Tn(wn(e,n),wn(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 Cn(e,t={}){return wn(e,t).length}function wn(e,t){return t.flatten?e.map(e=>({text:Ne(e,0,!1),comparable:xn(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):je(e).map(e=>({text:e.text,comparable:xn(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Tn(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=Dn(a,i,s)?R(a,i+1):R(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 En(o,e,t,n,r)}}return[]}function En(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=Dn(i,c,r)?c+1:c-1,u=R(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 Dn(e,t,n){return t===-n||t!==n&&R(e,t-1)<R(e,t+1)}function R(e,t){return e.get(t)??0}function On(e,t){return e.find(e=>me(e,t))??null}function z(e,t){let n=de(e);return n&&ae(n)?n:kn(e,t)}function kn(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=de(e);if(!t||!ae(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 An(e){return e===`text`||e===`label`||e===`any`}function jn(e,t,n,r){if(!(r||e===`web`))return An(t)?n:void 0}function Mn(e){return new a(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function Nn(e,t){let n=t??`default`,r=await e.sessions.get(n);if(!r)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let i=r.refFrameSnapshot??r.snapshot;if(!i)throw new a(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:r,snapshot:i}}async function B(e,t,n={updateSession:!0}){let r=e.backend.captureSnapshot;if(!r)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,o=await e.sessions.get(i),s=Pn(await r(N(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!j(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:i,session:o,snapshot:s}}function Pn(e,t){return e.snapshot?Fn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function Fn(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 In(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 Oe(n)}function Ln(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,r.invalidRefMessage);let o=s(e,i)??(r.fallbackLabel.length>0?On(e,r.fallbackLabel):null);if(!o)throw new a(`COMMAND_FAILED`,r.notFoundMessage,{reason:E.refNotFound,ref:i,hint:w});return{ref:i,node:o}}function Rn(e,t){let{diagnostics:n=[],unique:r=!0,dispatched:i,...o}=t,s=new a(`COMMAND_FAILED`,te(e,n,{unique:r}),{...o,reason:E.selectorNotFound,hint:h(n)});return i===void 0?s:l(s,i)}function zn(e,t,n){let{command:r,...i}=n;return new a(`AMBIGUOUS_MATCH`,`Selector matched ${t.length} elements: ${e}`,{...i,...Fe(t),command:r,selector:e,hint:`Narrow the selector with role/id/longer text, or act on a printed candidate with a command that takes refs, such as press.`})}function Bn(e){let{outcome:t,selectorExpression:n,command:r,details:i}=e;return t.kind===`ambiguous`?zn(t.selector,t.matchedNodes,{command:r,...i}):Rn(n,{command:r,unique:!0,...i})}async function Vn(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 Hn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Un(e.nodes):e.nodes).map(Kn);return n.sort((e,t)=>Jn(e).localeCompare(Jn(t))),{captureBackend:t,nodes:n}}function Un(e){let t=x(e);return e.filter(e=>le(e)||t.isVisibleOnScreen(e))}function Wn(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 Gn(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 Kn(e){return{identity:`${e.type??``}#${qn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function qn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Jn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Yn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Xn(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 rr(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??=Zn(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Hn(c.snapshot);_=$n({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=tt(c.snapshot.snapshotQuality);let y=P(e),ee=tr({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=nr({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await dn(e,t);continue}if(!Wn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=nr({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await dn(e,te)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Zn(e,t,n){if(!e||!t||!Qn(t.backend,n))return;let r=t.nodes.some(le),i=e.length<=5;if(!(!r&&!i))return Hn({...t,nodes:e})}function Qn(e,t){return e===`xctest`||e===void 0&&t===`ios`}function $n(e){return e.requestedQuietMs<500||!Gn(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function er(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function tr(e){if(!(e.resetRequested!==!0||e.alreadyReset||!er(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function nr(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 rr(e,t,n,r){let i=await Vn(e,t,n,async n=>await B(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const ir=`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.`,ar=`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 or(e,t,n){return await cr(e,t,{...n,baseline:await dr(e,t,n.resolved),actionPoint:n.resolved.point})}const sr=async(e,t)=>(await cr(e,t,t)).observation;async function cr(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 lr(e,t,n,a,await Xn(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 lr(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?ar:ir}};let{stored:o,session:s}=await wr(e,t,i.lastCapture),c=L(i.lastCapture.snapshot),l=c.nodes,u=vn(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?gr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...Sr(i,o,l.length,u)},settledCapture:c}}function ur(e,t){if(e)return yn(e,t)}async function dr(e,t,n){let r=await e.sessions.get(t.session??`default`);return fr(n,r)??mr(n.preAction)??pr(r)}function fr(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?mr(L(n)):void 0}function pr(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?L(t):{nodes:[]}}function mr(e){return e?.nodes.length?e:void 0}function hr(e,t,n){let r=Sn(Rt(e,n),Rt(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=xr(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 gr(e,t,n,r){let i=hr(e,t,r);return{diff:i,..._r(i,t,n,r)}}function _r(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=zt(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)&&!vr(o.get(e),n))?{}:br(t,i,r)}function vr(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 yr=new Set([`application`,`window`]);function br(e,t,n){let r=zt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!yr.has(o(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=o(e.type??`Element`),n=Le(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function xr(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function Sr(e,t,n,r){let i=Cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=bn(r);return{hint:i===void 0?a:`${a} ${i}`}}function Cr(e,t,n){return e.stalled?{hint:ar}:e.settled?t?n<5?{hint:Yn}:{}:{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:ir}}async function wr(e,t,n){if(j(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 Tr(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Er(e,t,n,r,i){let a=await Dr(e,t,n,i);return kr({...r,...a})}async function Dr(e,t,n,r){if(r.settle!==void 0){let i=await or(e,t,{...r.settle,resolved:n}),a=r.verify?ur(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await Or(e,t,n);return i?{evidence:i}:{}}async function Or(e,t,n){try{return yn(L((await I(e,t,!0)).snapshot),n.preAction)}catch{return}}function kr(e){let t=e;if(t.targetHittable!==!1||!Ar(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Ar(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 jr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?Nr(a):a.matchedNodes.length>1?Mr(a):Nr(a)}let a=we(e,t,{...r,...v({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:Mr(a.firstMatch):{kind:`none`}}function Mr(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Nr(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 Pr(e,t,n){let r=ee(e,y(t),n);return r?{...r,selector:r.selector.raw}:null}function Fr(e,t,n,r){let i=jr(e,y(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function Ir(e){return e}function Lr(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 Rr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function V(e){return[e.type,e.role,e.subrole].map(e=>S(e??``)).some(e=>e===`tab`||Rr.some(t=>e.includes(t)))}function zr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=ii(e);if(!Br(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Xr(e,n,r).node;for(let n of t.slice(1))if(Xr(e,n,r).node.index!==i.index){let e=Hr(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Br(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(!Vr(i,a,t)&&!Vr(a,i,t))return!1}return!0}function Vr(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 Hr(e,t){if(e.length<2||!Br(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(!V(n)||!e.every(e=>e===n||!V(e)))return null;let r=O(n.rect);return r&&e.every(e=>Kr(O(e.rect),r))?n:null}function Ur(e){return[e.type,e.role,e.subrole].map(e=>S(e??``)).some(e=>e.includes(`accessibilityelement`))}function Wr(e,t){if(e.length<2||!Br(e,t.nodesByIndex)||e.some(e=>V(e)))return null;let n=e.reduce((e,t)=>(t.depth??0)<(e.depth??0)?t:e),r=n.label?.trim();if(!r)return null;let i=O(n.rect);return i&&e.every(e=>(e===n||Ur(e))&&e.label?.trim()===r&&Kr(O(e.rect),i))?n:null}function Gr(e,t){let n=ii(e);return Hr(t,n)??Wr(t,n)}function Kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function qr(e,t){if(!t?.rect||!e.rect||!le(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function Jr(e,t){return Xr(e,t)}function Yr(e){let t=ii(e);return n=>Xr(e,n,t)}function Xr(e,t,n){return k(t)?{node:t,reason:`covered`}:Zr(e,t,n)??Qr(t)??$r(e,t,n)??{node:t,reason:`original`}}function Zr(e,t,n){let r=ti(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Qr(e){return V(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function $r(e,t,n){let r=ei(e,t,n);return!r?.rect||k(r)||!D(r.rect)?null:ni(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function ei(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?ge(e,t,n.nodesByIndex,e=>r(e)?e:null):_(e,t,r)}function ti(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||k(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function ni(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(ri(t)&&!We(i,a))return!0;let o=ue(n,i,r?.viewportRootRects);return!o||!ai(a,o)?!1:!We(i,a)}function ri(e){let t=S(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 ii(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(le(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function ai(e,t){let n=Lr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function H(e,t,n,r,i={}){let a=Fr(ui(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await si(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=oi(t,a);return o?await si(e,t,o,i):a}function oi(e,t){let n=Gr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function si(e,t,n,r){let i=await li(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function ci(e,t,n,r){let i=ui(e,t);return{candidates:i,list:Pr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function li(e,t,n,r={}){r.onResolved?.(n,t);let i=di(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||k(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await fi(e,t,i.node,r)}}function ui(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!k(e)):t}function di(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=Jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&qr(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function fi(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 pi(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const mi=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."}),hi=new Set([`keyboard`,`key`]);function gi(e){return hi.has(S(e.type??``))||Ge(e)}const _i=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function vi(e){return gi(e)||_i.has(e.role??``)}function yi(e,t,n){return n.has(e.index)||Si(t,n,e.index).length>0}function bi(e){return e!==null&&ve(e)}function U(e){return e.flatMap(e=>ve(e.rect)?[e.rect]:[])}function xi(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 Si(n,r,e.index))i.add(t);return i}function Si(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 Ci(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 wi(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 Ti(e){let t=U(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return Ci(t.length>0?t:e.anchorRects)}function Ei(e){let t=e.filter(vi),n=xi(e,t);return U(t.filter(e=>!n.has(e.index)))}function Di(e,t){let n=e.filter(gi),r=U(n);if(r.length===0||!bi(t))return null;let i=e.filter(vi),a=U(i);if(a.length===0)return null;let o=wi({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=xi(e,i);return Ti({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:U(i.filter(e=>!s.has(e.index)))}:null}function Oi(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:Ei(e.nodes)}:Di(e.nodes,e.viewport);if(!t)return e.nodes.some(gi)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return ki(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(vi).map(e=>e.index));return yi(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 ki(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 Ai(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 ji(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=Oi({nodes:e.nodes,viewport:x(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Pi({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Mi(e){let t=Oi({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return Ni(e.point,t.surface)}function Ni(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${mi.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+mi.hint}function Pi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${Ai(e.action)} safely`,{...mi,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function Fi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${Ai(e.action)} safely`,{reason:E.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function Ii(e){let t=await li(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw Fi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return ji({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function Li(e,t,n,r,i,{action:a}){return await Bi(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=>`${zi(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 Ri(e,n,r,i,a,{action:o}){return await Bi(e,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:t(a)},hint:e=>`${zi(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 zi(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Bi(e,t,n,r,i){let o=x(r),s=n.rect?o.resolveEffectiveViewport(n):null;if(!n.rect||!s||o.isVisibleOnScreen(n))return n;let c=o.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(N(e,t),n,c);if(u)return{...n,rect:u};let d=Ve(n,o);throw l(new a(`COMMAND_FAILED`,i.message,{...i.details,rect:n.rect,viewport:s,...d?{scrollDirection:d}:{},hint:i.hint(d)}),`no`)}function Vi(e,t,n,r){let{candidates:i,list:o}=ci(r,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=zr(i,s);if(l.kind===`ambiguous`)throw new a(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,...Fe(l.candidates)});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Hi(t,n,r,i){let a=await I(t,n,i.requireInteractive),o=Vi(a.snapshot.nodes,r,t.backend.platform,i.pipeline);if((!o||!o.node.rect)&&i.requireInteractive){let s=a.snapshot;a=await I(t,n,!1),e(s,a.snapshot),o=Vi(a.snapshot.nodes,r,t.backend.platform,i.pipeline)}return{capture:a,resolved:o}}async function Ui(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await H(A.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return Fi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Wi(e){let{runtime:t,nodes:n,selectorExpression:r,action:i,resolved:a}=e;return await Ui({runtime:t,nodes:n,selectorExpression:r,action:i})||Rn(r,{diagnostics:a?.diagnostics??[],unique:!0,dispatched:`no`})}async function Gi(t,n,r,i,o){let s=await Hi(t,n,r,i);if(o&&e(o.snapshot,s.capture.snapshot),s.resolved?.node.rect)return s;let c=s.capture.snapshot.snapshotQuality;if(j(c))throw l(new a(`COMMAND_FAILED`,`Selector ${r} was not found in a sparse capture; the tree cannot prove it absent`,{reason:E.captureSparse,snapshotQuality:c,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ui({runtime:t,nodes:s.capture.snapshot.nodes,selectorExpression:r,action:i.action});if(u)throw u;return s}async function Ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Wi({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function qi(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Qe({capture:async i=>{let a=await Gi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Ye,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?Ji(s.error,s):await Ki(e,n,r,s)}function Ji(e,t){if(!(e instanceof a)||e.details?.reason!==E.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const W={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`},Yi=[`runner-start`,`target-discovery`];function Xi(e){let t=e?.readinessPhase;return Yi.find(e=>e===t)}const Zi=`replay_target_guard_mismatch`,Qi=W.landmarkIdentityMismatch;function $i(e,t,n,r,i){if(!n)return;let o=C(e),s=_e(e,t);if(!(se(o,n.identity)&&fe(s,n.structural)))throw l(new a(`COMMAND_FAILED`,`${r} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Zi,observed:o,observedStructural:s,expected:n.identity,expectedStructural:n.structural,...i?{targetRole:i}:{}}),`no`)}function ea(e,t,n){$i(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function ta(e){return e.hittable===!0||V(e)}function na(e,t){let n=pe(C(e),t);return n.id!==void 0||n.label!==void 0?!1:he(e.value)===null}function ra(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 ia(e,t){let n=ft(t);return t.filter(t=>t.index!==e.index&&ra(t,e,n)).sort((e,t)=>e.index-t.index)}function aa(e,t){let n=D(e.rect);return!n||!t.rect?!1:b(t.rect,n.x,n.y)}function oa(e,t){if(!na(e,t))return e;let n=ia(e,t);if(n.some(ta))return e;let r=n.find(e=>C(e).label!==void 0);return!r||!aa(r,e)?e:r}function sa(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const ca={source:`ref`,phase:`pre-action`,kind:`exact`},la={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ua(e,t,n){return{ref:e,node:t,resolution:n===`exact`?ca:la}}const da={source:`runtime`,phase:`pre-action`,kind:`unique`};function fa(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:pa(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>pa(e,t))}:da}function pa(e,t){let n=S(e.type??``),r=z(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:sa(n,256)}:{},...r===void 0?{}:{label:sa(r,256)}}}function ma(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:g(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:z(t,a),...ga(t,r),preAction:n,resolution:i,...ha(e,t,a,r)}}function ha(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=oa(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:g(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:z(i,n)}}}function ga(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function _a(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=va(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ba(e,t):null,r),s=o?xa(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function va(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>ya(e,t,r)).filter(V).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=ba(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 ya(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 ba(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 xa(e,t,n,r){let i=Ea(e),a=wa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=wa(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=Sa(s,e,n,r,i);return c?[c]:[]})).sort(Ca)[0]?.point??null}function Sa(e,t,n,r,i){let a=Ta(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 Ca(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function wa(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 Ta(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 Ea(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function Da(e,t,n){let r=x(t),i=_a(t,e,{bounds:[r.resolveEffectiveViewport(e),e.rect?r.resolveViewport(e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?l(new a(`COMMAND_FAILED`,n.invalidMessage,{reason:E.targetBoundsInvalid,...Oa(n.blockedTargetDetails)}),`no`):l(new a(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:i.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:i.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function Oa(e){return`ref`in e?{ref:t(e.ref)??e.ref}:e}function ka(e,n){let r=t(e.ref);if(!r)throw new a(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=t(n.ref),o=n.node.ref?t(n.node.ref):null;if(i!==r||o!==r||!n.nodes.includes(n.node))throw new a(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:ua(r,n.node,`exact`)}}async function Aa(e,t,n){let r=await Ma(e,t,n);return{tree:L(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function ja(e,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?ka(r,i.preresolvedTarget):await Aa(e,n,r),c=a.nodes,{node:l,tapPoint:u}=await Ii({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>ea(e,t,i),offscreen:async(t,a)=>await Ri(e,n,t,a,r.ref,i)},resolveTapPoint:e=>Da(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}`},...ma(e,l,a,i.action,s.resolution)}}async function Ma(e,t,n){let{session:r,snapshot:i}=await Nn(e,t.session),a=n.fallbackLabel??``,o=Pa(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw Fa(o,n.ref);return Na({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function Na(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=Pa(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&se(C(a.node),C(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function Pa(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(e,i);if(Ia(o))return{kind:`resolved`,resolved:ua(i,o,`exact`)};let c=r.fallbackLabel.length>0?On(e,r.fallbackLabel):null;if(Ia(c))return{kind:`resolved`,resolved:ua(i,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function Fa(e,n){let r=t(n)??n,i=e.kind===`unusable`?new a(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:E.targetBoundsInvalid,ref:r,hint:w}):new a(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:E.refNotFound,ref:r,hint:w});return l(i,`no`)}function Ia(e){return e?D(e.rect)!==null:!1}async function G(e,t,n){return await Va(e,t,n.action),t.target.kind===`point`?await Ra(e,t,t.target,n):t.target.kind===`ref`?await ja(e,t,t.target,n):await Ba(e,t,t.target,n)}async function La(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=x(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!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.`:Mi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Ra(e,t,n,r){let i=await La(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await za(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function za(e,t){try{return L((await I(e,t,!0)).snapshot)}catch{return}}async function Ba(e,t,n,r){let i=n.selector,a,o,s,c=$e(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await qi(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Hi(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Wi({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await Ii({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>ea(e,t,r),offscreen:async(n,i)=>await Li(e,t,n,i,l.selector,r)},resolveTapPoint:e=>Da(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...ma(e,u,L(a.snapshot),r.action,fa(o,a.snapshot.nodes))}}async function Va(e,t,n){if(e.backend.platform!==`macos`)return;let r=await Ha(e,t);if((r===`desktop`||r===`menubar`)&&(r!==`menubar`||n!==`click`&&n!==`press`))throw new a(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function Ha(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ua(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=Pa(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=A.resolvedTarget,{node:u}=await Ii({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(t,a)=>await Ri(e,n,t,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...ga(u,i),node:u,preAction:L(a)}}async function Wa(e,t,n,r,i){let a=await Ua(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:ca,...a,...o?{backendResult:o}:{}}}function Ga(e,t){let n=x(e),r=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Ka),i=r.length>0?r:e.map(e=>e.rect).filter(Ka);if(i.length===0)throw new a(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...i.map(e=>e.x)),s=Math.min(...i.map(e=>e.y)),c=Math.max(...i.map(e=>e.x+e.width)),l=Math.max(...i.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Ka(e){return!!(e&&e.width>0&&e.height>0)}async function qa(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||Ga((await I(e,t,!1)).snapshot.nodes,`gesture`)}const Ja=async(e,t)=>{let n=await G(e,t,{action:`focus`,requireInteractive:!0,pipeline:A.resolvedTarget});if(!e.backend.focus)throw new a(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let r=K(n),i=F(await e.backend.focus(N(e,t),r));return{...n,...i?{backendResult:i}:{},...T(`Focused (${r.x}, ${r.y})`)}},Ya=async(e,t)=>{let n=Tr(t),r=await G(e,t,{action:`longPress`,requireInteractive:!0,pipeline:A.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new a(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let i=t.durationMs===void 0?void 0:Qt(t.durationMs,`durationMs`,0,12e4),o=K(r),s=F(await e.backend.longPress(N(e,t),o,{durationMs:i}));return await Er(e,t,r,{...r,...i===void 0?{}:{durationMs:i},...s?{backendResult:s}:{},...T(`Long pressed (${o.x}, ${o.y})`)},n)},Xa=async(e,t)=>{let n=Tr(t),r=n.needsPreActionBaseline?null:await Za(e,t);if(r)return r;let i=await G(e,t,{action:`hover`,requireInteractive:!1,pipeline:A.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new a(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=K(i),s=F(await e.backend.hover(N(e,t),o));return await Er(e,t,i,{...i,...s?{backendResult:s}:{},...T(`Hovered (${o.x}, ${o.y})`)},n)};async function Za(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Wa(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Qa=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Va(e,t,`drag`);let n=await qa(e,t),r=await $a(e,t,`source`),i=await $a(e,t,`destination`),o=Je({from:K(r),to:K(i),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=F(await e.backend.performGesture(N(e,t),o)),{start:c,end:l}=Ke(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:eo(r),destination:eo(i)},recording:to(r,i),...s?{backendResult:s}:{},...T(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function $a(e,t,n){let r=t.gesture[n];return await G(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:A.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function eo(e){if(e.kind===`point`||!e.resolution)throw new a(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function to(e,t){let n=no(e),r=no(t),i=ro(e),a=ro(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function no(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function ro(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function K(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const io=async(e,t)=>await so(e,t,`press`),ao=async(e,t)=>await so(e,t,`click`),oo=async(e,t)=>{if(typeof t.text!=`string`)throw new a(`INVALID_ARGS`,`fill requires text`);let n=Tr(t),r=n.needsPreActionBaseline?null:await uo(e,t);if(r)return r;let i=await G(e,t,{action:`fill`,requireInteractive:!0,pipeline:A.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new a(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=co(i),s=`node`in i?i.node?.type??``:``,c=s!==``&&re(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.node?.hittable===!1,u=F(await e.backend.fill(N(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${po(i)} resolved to "${s}", attempting fill anyway.`:void 0;return await Er(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function so(e,t,n){let r=Tr(t),i=r.needsPreActionBaseline?null:await lo(e,t,n);if(i)return i;let o=await G(e,t,{action:n,requireInteractive:!0,pipeline:A.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new a(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=co(o),c;try{c=await e.backend.tap(N(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw cn(e,o),e}let l=F(c);return await Er(e,t,o,{...o,...l?{backendResult:l}:{}},r)}function co(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function lo(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||fo(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Wa(e,t,t.target,n,async(e,t)=>await r(e,t))}async function uo(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Wa(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function fo(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 po(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function q(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const mo=A.wait.poll.defaultTimeoutMs;function ho(e,t,n,r,i={}){let a=pi(r),o=n??a.defaultTimeoutMs,s=X(e),c=Ao(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(X(e)-s));return{capture:async n=>{let r=!1,i=X(e)-s,a=t=>l.push({startedMs:i,durationMs:X(e)-s-i,outcome:t}),o=await Vn(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(go(r,c.lastUnobservedCause())),o;let f=_o(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:vo(l),waitedMs:X(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await jo(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>X(e)-s}}function go(e,t){return e?`readable`:t?.outcome??`unreadable`}function _o(e,t){let n=Oo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let r=Xi(e instanceof a?e.details:void 0);return r?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:r}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function vo(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function yo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function bo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function xo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function So(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.deadlineExceeded,captureTruncated:!0,...t})}function Co(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.targetAbsent,...t})}function wo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw To(r.error,t);if(n)throw r.error}}function To(e,t){let r=n(e);return new a(r.code,r.message,{reason:W.captureStalled,...r.details,...t},r)}function J(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return bo(e,r);case`readiness-exhausted`:return wo(t,r,!1),xo(e,r);case`capture-stalled`:return wo(t,r,t.preserveUnreadableOnStall===!0),yo(e,r);case`capture-truncated`:return So(e,r);case void 0:return wo(t,r,!0),r.readableCaptures===0?yo(e,r):Co(e,r);default:return Do(n)}}function Eo(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function Do(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function Oo(e){if(!(e instanceof a))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...Y(t,`runnerRestartReason`),...Y(t,`runnerRestartCommand`),...Y(t,`runnerRestartCommandId`),...Y(t,`runnerInvalidatedSessionId`),...Y(t,`runnerRestartSessionId`),...Y(t,`logPath`),...Y(t,`diagnosticId`)}}function Y(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function ko(e){return e instanceof a&&e.details?.retriable===!0}function Ao(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(ko(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function X(e){return e.clock?.now()??Date.now()}async function jo(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function Mo(e,t,n){let r=await H(A.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Ae(e,i)}}async function No(e,t,n){let r=await Mo(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Pe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function Po(e,t,n,r,i){let a=ze(n);if(a)throw Re(a,`wait`);let o=ho(t,n,i,A.wait,{isUnreadableError:Io,preserveUnreadableOnStall:!0}),s=q(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await Mo((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Be(a.kind))throw Pe(r,a,`wait`);return a}catch(e){throw Ye(e)?ke(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw Eo(l)?J(`wait absent timed out for selector: ${r}`,o,l):c?Fo(r,c,o.failureEvidence()):J(`wait absent timed out for selector: ${r}`,o,l)}function Fo(e,t,n){let r=t.matches!==1;return new a(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${r?`es`:``} remain`,{reason:W.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function Io(e){if(!(e instanceof a))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Be(t.observation)||t.observation===`unreadable`)}function Lo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function Ro(e,t,n,r,i,o){let s=ho(t,n,i,A.wait),c=q(),l,u;for(;s.hasTimeRemaining();){let i=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(i.timedOut){u=i.deadline;break}let a=i.value;if(a){let e=a.snapshot.nodes,n=Lo(await H(A.wait,e,r,{platform:t.backend.platform}));if(n){let t=zo(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new a(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Qi,...s.failureEvidence(),...l}):J(`wait timed out for selector: ${r}`,s,u)}function zo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=ft(e),a=mt(t.matchedNodes,i,ie(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:C(r),observedAncestry:pt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function Bo(e,t,n,r,i){let o=i??mo,s=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new a(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:W.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function Vo(e,t,n,r,i){let a=ho(t,n,i,A.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await Ho(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw J(`wait timed out for text: ${r}`,a,o)}async function Ho(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Wo(t,n),r)).found?!0:await Uo(e,t,n,r)}async function Uo(e,t,n,r){return!!On((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Wo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Go(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await jo(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Ko(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await Ro(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await Po(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await Bo(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await qo(e,t,n,n.target.text,n.target.timeoutMs);default:return Jo(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new a(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function Ko(e,n,r,i,o){let c=await e.requireSnapshot(n,r.session),l=t(i);if(!l)throw new a(`INVALID_ARGS`,`Invalid ref: ${i}`);let u=s(c.snapshot.nodes,l);if(!u)throw new a(`COMMAND_FAILED`,`Ref ${i} not found`,{reason:E.refNotFound,ref:l,hint:w});let d=z(u,c.snapshot.nodes);if(!d)throw new a(`COMMAND_FAILED`,`Ref ${i} has no label to wait for`,{reason:E.refUnlabeled,ref:l});return await Vo(e,n,r,d,o)}async function qo(e,t,n,r,i){let o=Ce(r);if(!o.ok)throw new a(o.code,o.message);return await Vo(e,t,n,o.text,i)}function Jo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Yo=Go({captureSnapshot:B,requireSnapshot:Nn,stable:{defaultQuietMs:500,tinyTreeHint:Yn,tinyTreeNodeCount:5,capture:Xn}}),Xo=Yo.waitCommand,Zo=Yo.waitForTextCommand,Qo=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new a(`INVALID_ARGS`,ce);if(t.action===`wait`)return await ns(e,t,n);if(t.action===`list`)return await rs(e,t,n);let{capture:r,match:i}=await is(e,t,n);if(!i)throw new a(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:i}:{kind:`text`,ref:o,text:await In(e,r,i),node:i}},$o=async(e,t)=>{if(t.target.kind===`ref`){let n=await Nn(e,t.session),r=Ln(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`});$i(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=g(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 In(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await as(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?A.readText:A.readUnique,hooks:{onResolved:(e,n)=>$i(e,n,t.expectedResolvedTarget,`get`)}}),r=g(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 In(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}},es=async(e,t)=>{let n=await $o(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new a(`COMMAND_FAILED`,`getText returned non-text result`);return n},ts=async(e,t)=>{let n=await $o(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new a(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function ns(e,t,n){let r=ho(e,t,t.timeoutMs,A.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await is(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw J(`find wait timed out`,r,i)}async function rs(e,t,n){let r=De(n,t.query),i=await B(e,t,{updateSession:!0,...q()});if(j(i.snapshot.snapshotQuality))throw Mn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?ci(A.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ne(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function is(e,t,n,r){let i=De(n,t.query),a=await B(e,t,{updateSession:!0,scope:jn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...q()});if(j(a.snapshot.snapshotQuality))throw Mn(a.snapshot.snapshotQuality);if(i){let t=await H(A.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ne(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function as(e,t,n,r){let i=await B(e,{...t,session:n},{updateSession:!0,...q()}),a=await H(r.policy,i.snapshot.nodes,r.selector,{platform:e.backend.platform},r.hooks);if(a.kind!==`target`)throw Bn({outcome:a,selectorExpression:r.selector,command:`get`});return{capture:i,node:a.node,selector:a.selector,ref:`@${a.node.ref}`}}const os=async(e,t)=>{let n=Se(t.predicate);if(!n.ok)throw new a(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`absent`){let e=ze(t);if(e)throw Re(e)}if(r===`text`&&!t.expectedText)throw new a(`INVALID_ARGS`,Ee);let i=t.selector,o=await ss(e,t,r,i);return r===`exists`?await cs(e,o,i):r===`absent`?await No(o.snapshot,i,e.backend.platform):await ls(e,t,o,r,i)};async function ss(e,t,n,i){try{return await B(e,t,{updateSession:!0,...q(n)})}catch(e){throw n!==`absent`||r(e)?e:ke(i,e)}}async function cs(e,t,n){let r=await H(A.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(r.kind!==`target`)throw new a(`COMMAND_FAILED`,te(n,[],{unique:!1}),{hint:h([])});return{predicate:`exists`,pass:!0,selector:r.selector,matches:r.matches,selectorChain:xe(n)}}async function ls(e,t,n,r,i){let o=await H(A.readUnique,n.snapshot.nodes,i,{platform:e.backend.platform},{onResolved:(e,n)=>$i(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw Bn({outcome:o,selectorExpression:i,command:`is`,details:{predicate:r,selector:i}});let s=ye({predicate:r,node:o.node,visibility:x(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new a(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:E.predicateFailed,predicate:r,selector:o.selector,predicateDetails:s.details});return{predicate:r,pass:!0,selector:o.selector,...r===`text`?{text:s.actualText}:{},selectorChain:xe(i),node:o.node,preActionNodes:n.snapshot.nodes}}const us=async(e,t)=>await os(e,{...t,predicate:`visible`,selector:t.target.selector}),ds=async(e,t)=>await os(e,{...t,predicate:`hidden`,selector:t.target.selector}),fs=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Va(e,t,t.gesture.intent);let n=await qa(e,t),r=qe(t.gesture,n,e.backend.platform),i=F(await e.backend.performGesture(N(e,t),r)),o=ms(r.pointers,0),s=ms(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:o,to:s,...i?{backendResult:i}:{},...T(hs(t.gesture,o,s))}},ps=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Qa(e,{...t,gesture:n}):await fs(e,{...t,gesture:n})};function ms(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new a(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function hs(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const Z={find:Qo,get:$o,getText:es,getAttrs:ts,is:os,isVisible:us,isHidden:ds,wait:Xo,waitForText:Zo},Q={click:ao,press:io,fill:oo,focus:Ja,longPress:Ya,hover:Xa,gesture:ps,settleObservation:sr};function gs(e){return{find:t=>Z.find(e,t),get:t=>Z.get(e,t),getText:(t,n={})=>Z.getText(e,{...n,target:t}),getAttrs:(t,n={})=>Z.getAttrs(e,{...n,target:t}),is:t=>Z.is(e,t),isVisible:(t,n={})=>Z.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>Z.isHidden(e,{...n,target:t}),wait:t=>Z.wait(e,t),waitForText:(t,n={})=>Z.waitForText(e,{...n,text:t})}}function _s(e){return{click:(t,n={})=>Q.click(e,{...n,target:t}),press:(t,n={})=>Q.press(e,{...n,target:t}),fill:(t,n,r={})=>Q.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Q.focus(e,{...n,target:t}),longPress:(t,n={})=>Q.longPress(e,{...n,target:t}),hover:(t,n={})=>Q.hover(e,{...n,target:t}),gesture:t=>Q.gesture(e,t),settleObservation:t=>Q.settleObservation(e,t)}}const vs=[0,187,255,255];function ys(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||bs(e,n.rect)}function bs(e,t){let n=xs(t);if(n==null)return;let r=Cs(n.x,0,e.width-1),i=Cs(n.y,0,e.height-1),a=Cs(n.right,0,e.width-1),o=Cs(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Ss(e,n,i+t,vs),Ss(e,n,o-t,vs);for(let n=i;n<=o;n+=1)Ss(e,r+t,n,vs),Ss(e,a-t,n,vs)}}function xs(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 Ss(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 Cs(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const ws=[{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(!Os(t,a,e))continue;let c=0,l=Ds(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Es({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Es(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 ws){let o=s+e.x,u=c+e.y;if(!ks(o,u,i,a))continue;let d=u*i+o;Os(t,n,d)&&(l=Ds(r,n,l,d))}return l}function Ds(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Os(e,t,n){return e[n]===1&&t[n]!==1}function ks(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function As(e,t){return e.flatMap(e=>js(e,t.baseline.width,t.baseline.height)?Ms(e,t,Rs(t.baseline.height)):[e])}function js(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Ls(n)&&r>=t*.35}function Ms(e,t,n){let r=Is(e,Fs(Ps(Ns(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])=>zs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function Ns(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 Ps(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function Fs(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function Is(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 Ls(e){return Math.max(48,Math.round(e*.07))}function Rs(e){return Math.max(24,Math.round(e*.03))}function zs(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??=Bs(t,a),Vs(i,e,t,a,r.baseline,r.current))}return i}function Bs(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Vs(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const Hs=2.5;function Us(e){let t=Ws(e);return As(t.length<=2e3?qs(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)=>Xs(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Ws(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=>Gs(e,i),visit:(e,t)=>Ks(e,t,i,n,r)}})}function Gs(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 Ks(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 qs(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=>Js(e,r,t));if(!e){n.push({...r});continue}Ys(e,r)}return n}function Js(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 Ys(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 Xs(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=Zs(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Zs(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Ir({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:ec(r,n.width,n.height),size:tc(s,n.totalPixels),location:Qs(i,n.width,n.height),averageBaselineColorHex:rc(a),averageCurrentColorHex:rc(o),baselineLuminance:Math.round(nc(a)),currentLuminance:Math.round(nc(o)),dominantChange:$s(a,o)}}function Zs(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Qs(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 $s(e,t){let n=nc(t)-nc(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 ec(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*Hs?`horizontal-band`:e.height>=e.width*Hs?`vertical-band`:`compact`}function tc(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function nc(e){return e.r*.2126+e.g*.7152+e.b*.0722}function rc(e){return`#${ic(e.r)}${ic(e.g)}${ic(e.b)}`}function ic(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const ac=Math.sqrt(3*255**2);async function oc(e,t,n={}){await sc(e,`Baseline image not found`),await sc(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([M.readFile(e),M.readFile(t)]),[o,s]=await Promise.all([ot(i,`baseline screenshot`),ot(a,`current screenshot`)]);cc(o.width,o.height,`baseline screenshot`,n.maxPixels),cc(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 lc(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*ac,{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?Us({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new at.PNG({width:o.width,height:o.height});e.data=d,ys(e,m),await M.mkdir(dt.dirname(r),{recursive:!0}),await M.writeFile(r,await ct(e))}else await lc(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 sc(e,t){try{await M.access(e)}catch{throw new a(`INVALID_ARGS`,`${t}: ${e}`)}}function cc(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new a(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function lc(e){if(e)try{await M.unlink(e)}catch(e){if(!uc(e,`ENOENT`))throw e}}function uc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function dc(e,t){return e.map(e=>{let n=fc(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function fc(e,t){let n=be(e.rect);return t.map(t=>{let r=t.overlayRect,i=Lr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:pc(i/be(r)),regionCoveragePercentage:pc(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 pc(e){return Math.round(e*100*100)/100}async function mc(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new a(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw n(e)}}async function hc(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new a(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw n(e)}}async function gc(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const _c=async(e,t)=>{if(!t.baseline)throw new a(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=vc(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!Ec(r))throw new a(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await mc(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let a;Ec(r)?(s=await yc(e,t),a=s.path):(o=await mc(e,r,{usage:`diff screenshot current`,field:`current`}),a=o.path),c=t.out?await hc(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await oc(i.path,a,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});Ec(r)&&(u=await bc(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await i.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function vc(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new a(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function yc(e,t){let n=await gc(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await xc(e,t,n.path,Sc(t))}catch(e){throw await n.cleanup(),e}return n}async function bc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Tc(n),r;let a=await hc(e,Cc(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await xc(e,t,a.path,{overlayRefs:!0,...Sc(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:dc(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function xc(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function Sc(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Cc(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:wc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:wc(e.out.clientPath)}:{},...e.out.fileName?{fileName:wc(e.out.fileName)}:{}}}function wc(e){let t=dt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Tc(e){try{await M.unlink(wc(e))}catch(e){if(!Dc(e,`ENOENT`))throw e}}function Ec(e){return e.kind===`live`}function Dc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Oc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await hc(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r,i;try{i=(await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}))?.displayRotation,t.scale!==void 0&&await rt(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...i?{displayRotation:i}:{},...T(`Saved screenshot: ${n.path}`)}};function kc(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!i(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=He(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const Ac=`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 jc(e){return e?.systemSurfaceOnly===!0?Ac:void 0}function Mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function Nc(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||!Pc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Fc(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 Pc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Fc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>Lc(e,t.nodes[n]))}const Ic=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function Lc(e,t){return Ic.every(n=>e[n]===t[n])&&Rc(e.rect,t.rect)&&zc(e.presentationHints,t.presentationHints)&&zc(e.actions,t.actions)}function Rc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function zc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Bc=async(e,t)=>{let n=await Hc(e,t),r=Nc({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(Wc(t.session,n));let i=Kc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:kc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...n.snapshot.viewport?{viewport:n.snapshot.viewport}:{},...Gc(n)})},Vc=async(e,t)=>{if(t.observeOnly===!0)throw new a(`INVALID_ARGS`,`observeOnly is supported by snapshot, not diff.`);let n=await Hc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,o=Wc(t.session,n);if(!i){let t=Cn(n.snapshot.nodes,{flatten:r});return await e.sessions.set(o),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=Sn(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(o),{mode:`snapshot`,baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function Hc(e,t){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions,...t.observeOnly===void 0?{}:{observeOnly:t.observeOnly}}),o=Uc(i,e),s=p(o,Mc(o,t)),c=d(i),l=P(e);return{snapshot:s,result:i,session:r,annotations:c,warnings:qc({result:i,annotations:c,snapshot:s,options:t,session:r,capturedAt:s.createdAt??l,runtimeNow:l})}}function Uc(e,t){return e.snapshot?p(e.snapshot,{...e.snapshot,...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t),...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}}function Wc(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 Gc(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 Kc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:lt(e.producer)===`unavailable`&&void 0:e.truncated}function qc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...nt(e.annotations.quality,e.snapshot.nodes)),t.push(...it(Kc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Kt(e.snapshot.postGestureOutcome)),t.push(...Qc(e)),e.annotations.quality||(t.push(...Yc(e)),t.push(...Zc(e.snapshot.nodes)));let n=Ie(e.snapshot.nodes);n&&t.push(n);let r=Jc(e.annotations);r&&t.push(r);let i=$c(e);return i&&t.push(i),t.push(...rl(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Jc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Ac}function Yc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Xc(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 Xc(e){return e?S(e.type??``)===`application`:!1}function Zc(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 Qc(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 $c(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&el(t,e.snapshot)&&tl(t,e.capturedAt,e.runtimeNow)&&xt(t.nodes.length,e.snapshot.nodes.length))return nl}function el(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function tl(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const nl=`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 rl(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`?[nl]:[]}const il={screenshot:Oc,diffScreenshot:_c,snapshot:Bc,diffSnapshot:Vc};function al(e){return fn(il,e)}export{Yt as A,yt as B,en as C,$t as D,on as E,_t as F,ft as H,vt as I,ht as L,zt as M,Tt as N,Qt as O,gt as P,St as R,ln as S,an as T,mt as U,pt as V,On as _,_s as a,F as b,Qi as c,H as d,li as f,z as g,Gr as h,mc as i,Bt as j,Kt as k,W as l,qr as m,jc as n,gs as o,Yr as p,hc as r,Zi as s,al as t,ci as u,gn as v,tn as w,N as x,fn as y,bt as z};
@@ -1,2 +1 @@
1
- import{H as e,I as t,K as n,P as r}from"./sdk-contracts.js";import{i}from"./recording-export-quality.js";import{C as a,E as o,O as s,T as c,a as l,b as u,i as d,o as f,r as p,t as ee,w as te,x as m,y as h}from"./runtime.js";import{r as g}from"./success-text.js";import{n as ne,t as re}from"./app-inventory.js";import"./app-inventory-contract.js";import{j as ie}from"./owner-identity.js";import{l as ae}from"./exec.js";import"./file.js";import{r as oe}from"./tv-remote.js";import"./command.js";import{r as se}from"./version.js";import{t as ce}from"./keyboard-actions.js";import{i as le}from"./quality-warnings.js";import{r as _}from"./png.js";import{i as ue}from"./png-worker-client.js";import{t as de}from"./png-size.js";import{i as v,n as fe,r as pe}from"./screenshot-overlay-draw.js";import{t as me}from"./png-encode.js";import{r as y}from"./artifact-paths.js";import{t as he}from"./mp4-duration.js";import{c as b,o as ge,r as _e,s as ve}from"./video.js";import x from"node:fs";import ye from"node:os";import S from"node:path";function C(e,t){if(e!==void 0)return w(e,t)}function w(e,t){let n=e?.trim();if(!n)throw new r(`INVALID_ARGS`,`${t} must be a non-empty string`);return n}const be=async(e,t={})=>{if(!e.backend.listDevices)throw new r(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(m(e,t),t.filter)}},xe=async(e,t={})=>{if(!e.backend.bootDevice)throw new r(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let n=ke(t.target),i=await e.backend.bootDevice(m(e,t),n),a=u(i);return{kind:`deviceBooted`,...n?{target:n}:{},...a?{backendResult:a}:{},...g(`Booted device`)}},Se=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new r(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let n=ke(t.target),i=await e.backend.shutdownDevice(m(e,t),n),a=u(i);return{kind:`deviceShutdown`,...n?{target:n}:{},...a?{backendResult:a}:{},...g(`Shutdown device`)}},Ce=async(e,t)=>await T(e,t,`install`),we=async(e,t)=>await T(e,t,`reinstall`),Te=async(e,t)=>await T(e,t,`installFromSource`);async function T(e,t,n){let i=n===`reinstall`?`reinstallApp`:`installApp`,a=e.backend[i];if(!a)throw new r(`UNSUPPORTED_OPERATION`,`admin.${n} is not supported by this backend`);let o=`app`in t&&t.app!==void 0?w(t.app,`app`):void 0;if(n!==`installFromSource`&&!o)throw new r(`INVALID_ARGS`,`admin.${n} requires app`);let s=m(e,t),c=await Ee(e,s,t.source);try{let t=await a.call(e.backend,s,{...o?{app:o}:{},source:c.source});return Ae(n,o,c.source,t)}finally{await c.cleanup?.()}}async function Ee(e,t,n){let r=await De(e,E(n));try{return{source:E(e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function De(e,t){if(t.kind===`url`)return{source:t};let n=await d(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function E(e){if(!e||typeof e!=`object`)throw new r(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:w(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:w(e.id,`source.id`)};if(e.kind===`url`){let t=w(e.url,`source.url`);return Oe(t),{kind:`url`,url:t}}throw new r(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function Oe(e){let t;try{t=new URL(e)}catch{throw new r(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new r(`INVALID_ARGS`,`Install source URL must use http or https`)}function ke(e){if(!e)return;let t=C(e.id,`target.id`),n=C(e.name,`target.name`),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...e.headless===void 0?{}:{headless:e.headless}};return Object.keys(r).length>0?r:void 0}function Ae(e,t,n,r){let i=u(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=D(r,`appName`),s=D(r,`appId`),c=D(r,`bundleId`),l=D(r,`packageName`),d=D(r,`launchTarget`),f=D(r,`installablePath`),p=D(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...d?{launchTarget:d}:{},...f?{installablePath:f}:{},...p?{archivePath:p}:{},...i?{backendResult:i}:{},...g(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??d??t??je(n)}`)}}function D(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function je(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const Me=/^[A-Za-z0-9_.:-]{1,64}$/,Ne=async(e,t)=>{if(!e.backend.openApp)throw new r(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let n=ze(t),i=await e.backend.openApp(k(e,t),n,{launchArgs:t.launchArgs,relaunch:t.relaunch}),a=u(i);return{kind:`appOpened`,target:n,relaunch:t.relaunch===!0,...a?{backendResult:a}:{},...g(`Opened: ${Ve(n)}`)}},Pe=async(e,t={})=>{if(!e.backend.closeApp)throw new r(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let n=C(t.app,`app`),i=await e.backend.closeApp(k(e,t),n),a=u(i);return{kind:`appClosed`,...n?{app:n}:{},...a?{backendResult:a}:{},...g(n?`Closed: ${n}`:`Closed app`)}},Fe=async(e,t={})=>{if(!e.backend.listApps)throw new r(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(k(e,t),re(t.filter))}},Ie=async(e,t)=>{if(!e.backend.getAppState)throw new r(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let n=w(t.app,`app`);return{kind:`appState`,app:n,state:await e.backend.getAppState(k(e,t),n)}},Le=async(e,t)=>{if(!e.backend.pushFile)throw new r(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let n=w(t.app,`app`),i=await He(e,t.input);try{let r=await e.backend.pushFile(k(e,t),i.backendInput,n),a=u(r);return{kind:`appPushed`,app:n,inputKind:i.inputKind,...a?{backendResult:a}:{},...g(`Pushed to ${n}`)}}finally{await i.cleanup?.()}},Re=async(e,t)=>{if(!e.backend.triggerAppEvent)throw new r(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let n=Ue(t.name);We(t.payload,`apps.triggerEvent payload for "${n}"`);let i=await e.backend.triggerAppEvent(k(e,t),{name:n,...t.payload?{payload:t.payload}:{}}),a=u(i);return{kind:`appEventTriggered`,name:n,...t.payload?{payload:t.payload}:{},...a?{backendResult:a}:{},...g(`Triggered app event: ${n}`)}};function ze(e){let t=C(e.app,`app`),n=C(e.appId,`appId`),i=C(e.bundleId,`bundleId`),a=C(e.packageName,`packageName`),o=C(e.url,`url`),s=C(e.activity,`activity`),c={...t?{app:t}:{},...n?{appId:n}:{},...i?{bundleId:i}:{},...a?{packageName:a}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!Be(c))throw new r(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function Be(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function Ve(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function He(e,t){if(!t||typeof t!=`object`)throw new r(`INVALID_ARGS`,`apps.push requires an input`);if(t.kind===`json`)return O(t.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:t.payload},inputKind:`json`};let n=await d(e,t,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:n.path},inputKind:`file`,...n.cleanup?{cleanup:n.cleanup}:{}}}function Ue(e){let t=w(e,`name`);if(!Me.test(t))throw new r(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return t}function We(e,t){e!==void 0&&O(e,t,8192)}function O(e,t,n){if(Ge(e,t),Buffer.byteLength(Ke(e,t),`utf8`)>n)throw new r(`INVALID_ARGS`,`${t} exceeds ${n} bytes`)}function Ge(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`${t} must be a JSON object`)}function Ke(e,t){try{let n=JSON.stringify(e);if(typeof n!=`string`)throw new r(`INVALID_ARGS`,`${t} must be JSON-serializable`);return n}catch{throw new r(`INVALID_ARGS`,`${t} must be JSON-serializable`)}}function k(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const A={open:Ne,close:Pe,list:Fe,state:Ie,push:Le,triggerEvent:Re},qe={devices:be,boot:xe,shutdown:Se,install:Ce,reinstall:we,installFromSource:Te};function Je(e){return{...h(A,e),list:(t={})=>A.list(e,{...t,filter:ne(t.filter)})}}const Ye=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,Xe=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function j(e){let t=!1,n=e;return n=n.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`)),n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,r,i)=>(t=!0,`${String(n)}[REDACTED]${String(i)}`)),n=n.replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(Xe,()=>(t=!0,`[REDACTED]`)),n=Qe(n,()=>{t=!0}),{value:n,redacted:t}}function Ze(e){try{let t=new URL(e),n=$e(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function Qe(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=Ze(e);return n?(n.redacted&&t(),n.value):e}):e}function $e(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))Ye.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const M=2048,N=4096,P=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function et(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=z(e.message,N),r=L(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function tt(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?rt(e.url):void 0,i=t===`headers`||t===`all`?F(e.requestHeaders):void 0,a=t===`headers`||t===`all`?F(e.responseHeaders):void 0,o=t===`body`||t===`all`?I(e.requestBody):void 0,s=t===`body`||t===`all`?I(e.responseBody):void 0,c=L(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function nt(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=z(e.message,N),r=L(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function F(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(P.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=z(i,M);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function rt(e){return Ze(e)??z(e,M)}function I(e){return e===void 0?{redacted:!1}:it(e)??z(e,M)}function it(e){try{let t=R(JSON.parse(e),j);return B(JSON.stringify(t.value),M,t.redacted)}catch{return}}function L(e){return R(e,e=>z(e,M))}function R(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=R(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(P.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=R(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function z(e,t){if(e===void 0)return{redacted:!1};let n=j(e);return B(n.value,t,n.redacted)}function B(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const at=async(e,t={})=>{if(!e.backend.readLogs)throw new r(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return et(await e.backend.readLogs(await V(e,t),ct(t)))},ot=async(e,t={})=>{if(!e.backend.dumpNetwork)throw new r(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let n=lt(t);return tt(await e.backend.dumpNetwork(await V(e,t),n),n.include??`summary`)},st=async(e,t={})=>{if(!e.backend.measurePerf)throw new r(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return nt(await e.backend.measurePerf(await V(e,t),ut(t)))};async function V(e,t){let n=m(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function ct(e){return{...H(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:W(e.levels,`levels`)},...e.search===void 0?{}:{search:w(e.search,`search`)},...e.source===void 0?{}:{source:w(e.source,`source`)}}}function lt(e){return{...H(e,25,200,`network limit`),include:dt(e.include)}}function ut(e){return{...U(e),...e.sampleMs===void 0?{}:{sampleMs:s(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:W(e.metrics,`metrics`,20)}}}function H(e,t,n,r){return{...U(e),...e.cursor===void 0?{}:{cursor:w(e.cursor,`cursor`)},limit:e.limit===void 0?t:s(e.limit,r,1,n)}}function U(e){return{...e.since===void 0?{}:{since:w(e.since,`since`)},...e.until===void 0?{}:{until:w(e.until,`until`)}}}function dt(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new r(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function W(e,t,n=50){if(!Array.isArray(e))throw new r(`INVALID_ARGS`,`${t} must be an array of strings`);if(e.length>n)throw new r(`INVALID_ARGS`,`${t} must contain at most ${n} entries`);return e.map((e,n)=>w(e,`${t}[${n}]`))}const ft={logs:at,network:ot,perf:st},G=`contact_sheet_frame_extraction_failed`,K=`contact_sheet_no_frames`;function q(e=process.platform){if(e!==`darwin`)throw new r(`UNSUPPORTED_OPERATION`,`Contact sheets can only be built on macOS hosts, which is where the frame decoder runs`,{reason:`contact_sheet_unsupported_host`,hostPlatform:e,hint:`Run this command on the macOS host that recorded the clip, or read the video artifact itself.`})}async function pt(e){if(q(e.hostPlatform??process.platform),e.timesMs.length===0)throw new r(`COMMAND_FAILED`,`Contact sheet sampling requested no frames`,{reason:K,videoPath:e.videoPath});Q(e.signal);let t=await vt(e);Q(e.signal);let n;try{n=await ae(t,[`--input`,e.videoPath,`--output-dir`,e.scratchDir,`--times`,e.timesMs.join(`,`),`--max-width`,String(e.maxWidth)],{timeoutMs:9e4,env:ge(),allowFailure:!0,...e.signal===void 0?{}:{signal:e.signal}})}catch(t){X(t,e.videoPath,`Failed to run the frame decoder`)}if(n.exitCode!==0)throw new r(`COMMAND_FAILED`,`Failed to extract frames from the recording: ${_t(n.stderr)||`exit ${n.exitCode}`}`,{reason:G,videoPath:e.videoPath,exitCode:n.exitCode});let i=mt(n.stdout,e.videoPath,e.scratchDir,e.timesMs.length);if(i.frames.length===0)throw new r(`COMMAND_FAILED`,`The recording returned no decodable frames for a contact sheet`,{reason:K,videoPath:e.videoPath,skippedSampleCount:i.skippedSampleCount});return i}function mt(e,t,n,r){let i;try{i=JSON.parse(e)}catch(e){throw Y(t,`invalid manifest: ${String(e)}`)}let a=Z(i).frames;if(!Array.isArray(a))throw Y(t,`manifest has no frames array`);let o=Z(i).skipped;if(a.length>r)throw Y(t,`returned ${a.length} frames for ${r} requested samples`);let s=a.flatMap(e=>{let r=Z(e),i=ht(r.path),a=gt(r.actualTimeMs);if(i===void 0||a===void 0||a<0)throw Y(t,`frame entry is missing a path or presentation time`);let o=S.resolve(n,S.basename(i));return x.existsSync(o)?[{requestedTimeMs:gt(r.requestedTimeMs)??a,actualTimeMs:a,path:o}]:[]});return{frames:s.sort((e,t)=>e.actualTimeMs-t.actualTimeMs),skippedSampleCount:Math.max(Array.isArray(o)?o.length:0,r-s.length)}}function J(e,t,n){return new r(`COMMAND_FAILED`,e,{reason:G,videoPath:t},n)}function Y(e,t){return J(`Frame extraction returned an unreadable manifest: ${t}`,e)}function X(t,i,a){throw n(t)||t instanceof r&&t.code===`COMMAND_FAILED`&&t.details?.reason?t:J(`${a} for ${i}: ${e(t)}`,i,t)}function Z(e){return typeof e==`object`&&e?e:{}}function ht(e){return typeof e==`string`&&e!==``?e:void 0}function gt(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function _t(e){return(e.trim().split(`
2
- `).pop()??``).trim()}async function vt(e){try{return await ve({sourcePath:b(`recording-frames.swift`,se()),extraSourcePaths:[b(`RecordingExportSupport.swift`,se())],cacheName:`recording-frames`,timeoutMs:12e4})}catch(t){X(t,e.videoPath,`Could not build the frame decoder`)}}function Q(e){if(e?.aborted)throw t()}function yt(e,t){if(e===void 0||!Number.isFinite(e)||e<0)throw new r(`COMMAND_FAILED`,`Cannot plan a contact sheet: the video timeline of ${t} could not be read`,{reason:`contact_sheet_duration_unknown`,videoPath:t,hint:`Retry once the recording finished finalizing; a clip whose container is still being written has no readable duration.`});if(e<=250)return{durationMs:e,timesMs:e>0?[0,Math.round(e)]:[0]};let n=Math.min(48,Math.floor(e/250)+1),i=e/(n-1);return{durationMs:e,timesMs:Array.from({length:n},(e,t)=>Math.round(t*i))}}const bt=[360,320,280,240,200,160],xt=[255,255,255,255],St=[17,24,39,255],$=pe(2)+8;function Ct(e){let{cells:t}=e;if(t.length===0)throw new r(`COMMAND_FAILED`,`Contact sheet has no cells to render`);let n=Tt(t[0].image.height/Math.max(1,t[0].image.width),t.length,e),i=Ot(n.width,n.height,St);return t.forEach((e,t)=>{let r=t%n.columns,a=Math.floor(t/n.columns);wt(i,8+r*(n.cellWidth+8),8+a*($+n.cellHeight+8),e,n.cellWidth,n.cellHeight)}),{bytes:me(i.data,n.width,n.height,4),width:n.width,height:n.height,cellWidth:n.cellWidth}}function wt(e,t,n,r,i,a){fe(e,{x:t+4,y:n+4,text:jt(r.timeMs),color:xt,scale:2}),kt(e,le(At(r.image),i,a),t,n+$)}function Tt(e,t,n){let i=Et(e,t,n.maxPixels);if(i)return i;let a=Dt(e,t,160);throw new r(`COMMAND_FAILED`,`Contact sheet would be ${a.width*a.height} pixels, above the configured maxImagePixels limit of ${n.maxPixels}`,{reason:`contact_sheet_pixel_budget_exceeded`,cellCount:n.cells.length,maxPixels:n.maxPixels,hint:`Shorten the recording or raise the command policy maxImagePixels limit.`})}function Et(e,t,n){for(let r of bt){let i=Dt(e,t,r);if(i.width*i.height<=n)return i}}function Dt(e,t,n){let r=Math.min(4,t),i=Math.ceil(t/r),a=Math.max(1,Math.round(n*e));return{columns:r,cellWidth:n,cellHeight:a,width:16+r*n+(r-1)*8,height:16+i*($+a)+(i-1)*8}}function Ot(e,t,n){let r=new _.PNG({width:e,height:t});for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1)v(r,t,i,n);return r}function kt(e,t,n,r){for(let i=0;i<t.height;i+=1)for(let a=0;a<t.width;a+=1){let o=(i*t.width+a)*4;v(e,n+a,r+i,[t.data[o],t.data[o+1],t.data[o+2],t.data[o+3]])}}function At(e){let t=new _.PNG({width:e.width,height:e.height});return Buffer.from(e.data.buffer,e.data.byteOffset,e.data.byteLength).copy(t.data),t}function jt(e){let t=Math.floor(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=Math.floor(e%1e3);return`${[n,r,i].map(e=>String(e).padStart(2,`0`)).join(`:`)}.${String(a).padStart(3,`0`)}`}function Mt(e,t){if(e.width!==t.width||e.height!==t.height)return{status:`dimension_mismatch`};let n=e.width*e.height;if(n===0)return{status:`compared`,changedPixelRatio:0};if(e.data.length!==t.data.length)return{status:`dimension_mismatch`};let r=0;for(let n=0;n+3<e.data.length;n+=4)(e.data[n]!==t.data[n]||e.data[n+1]!==t.data[n+1]||e.data[n+2]!==t.data[n+2])&&(r+=1);return{status:`compared`,changedPixelRatio:r/n}}function Nt(e,t=.02,n=24){let r=[],i;for(let n of e){let e=i?Ft(i,n.image):1;e<t||(r.push({timeMs:n.timeMs,changedPixelRatio:e,image:n.image}),i=n.image)}Pt(r,e);let a=r.length>n?It(r,n):r;return{cells:a,keptCellCount:r.length,thinned:a.length<r.length}}function Pt(e,t){let n=t.at(-1);if(!n)return;let r=e.at(-1);!r||r.timeMs===n.timeMs||e.push({timeMs:n.timeMs,changedPixelRatio:Ft(r.image,n.image),image:n.image})}function Ft(e,t){let n=Mt(e,t);return n.status===`compared`?n.changedPixelRatio:1}function It(e,t){if(t<=1)return[e.at(-1)];let n=(e.length-1)/(t-1);return Array.from({length:t},(t,r)=>e[Math.round(r*n)])}async function Lt(e){q(e.hostPlatform??process.platform);let t=S.resolve(e.videoPath),n=S.resolve(e.outputPath??y(t));Bt(t,n);let i=await _e(t);if(i!==`mp4`)throw new r(`INVALID_ARGS`,i===`webm`?`Contact sheets need an MP4 recording; ${t} is WebM, whose frames this decoder does not read`:`Contact sheets need an MP4 recording; ${t} is not a readable MP4`,{reason:`contact_sheet_container_unsupported`,videoPath:t,container:i??`unknown`,hint:`Re-record on a backend that exports MP4, or pass the MP4 artifact the recording produced.`});let a=yt(he(t),t),o=x.mkdtempSync(S.join(ye.tmpdir(),`agent-device-contact-sheet-`));try{let r=await pt({videoPath:t,scratchDir:o,timesMs:a.timesMs,maxWidth:360,hostPlatform:e.hostPlatform??process.platform,...e.signal===void 0?{}:{signal:e.signal}}),i=await Rt(r.frames,e.maxPixels);zt(e.signal);let s=Nt(i,e.changedPixelThreshold??.02),c=Ct({cells:s.cells,maxPixels:e.maxPixels});return Gt(n,c.bytes),{path:n,videoPath:t,durationMs:a.durationMs,width:c.width,height:c.height,sampledFrameCount:a.timesMs.length,decodedFrameCount:r.frames.length,skippedSampleCount:r.skippedSampleCount,changedPixelThreshold:e.changedPixelThreshold??.02,cells:s.cells.map(Ut),...Wt(s,r)}}finally{x.rmSync(o,{recursive:!0,force:!0})}}async function Rt(e,t){let n=[];for(let i of e){let e=await de(i.path);if(e.width>360)throw new r(`COMMAND_FAILED`,`Frame extraction returned a ${e.width}px-wide frame when the sheet asked for 360px cells`,{reason:G,framePath:i.path,frameWidth:e.width,frameWidthLimit:360});if(e.width*e.height>t)throw new r(`COMMAND_FAILED`,`Frame extraction returned a ${e.width}x${e.height} frame, above the ${t}-pixel budget for the whole sheet`,{reason:G,framePath:i.path,framePixels:e.width*e.height,maxPixels:t});let a=await ue(x.readFileSync(i.path),`recording frame`);n.push({timeMs:i.actualTimeMs,image:a})}return n}function zt(e){if(e?.aborted)throw t()}function Bt(e,t){if(Vt(e,t)??t===e)throw new r(`INVALID_ARGS`,`A contact sheet cannot be written over the recording it describes: ${t}`,{reason:`contact_sheet_output_collides_with_input`,videoPath:e,outputPath:t,hint:`Choose a different --out path, or omit it to write beside the recording.`})}function Vt(e,t){let n=Ht(e),r=Ht(t);if(n!==void 0&&r!==void 0)return n.dev===r.dev&&n.ino===r.ino}function Ht(e){try{return x.statSync(e)}catch{return}}function Ut(e){return{timeMs:e.timeMs,changedPixelRatio:e.changedPixelRatio}}function Wt(e,t){let n=[];return t.skippedSampleCount>0&&n.push(`${t.skippedSampleCount} sample times returned no frame, so the sheet covers less of the recording than it asked for`),e.thinned&&n.push(`${e.keptCellCount} changes were found and 24 cells are printed, so the sheet thins evenly across the recording instead of showing every change`),n.length===0?{}:{warning:n.join(`; `)}}function Gt(e,t){try{x.mkdirSync(S.dirname(e),{recursive:!0}),ie({destination:e,contents:t})}catch(t){throw new r(`COMMAND_FAILED`,`Failed to write the contact sheet to ${e}: ${t instanceof Error?t.message:String(t)}`,{reason:`contact_sheet_output_write_failed`,outputPath:e})}}const Kt=async(e,t)=>{if(!t.video)throw new r(`INVALID_ARGS`,`record contact-sheet requires a recording to read`);Jt(t.changedPixelThreshold);let n=await d(e,t.video,{usage:`record contact-sheet`,field:`video`}),i;try{let r=qt(t,t.video,n.path);i=await p(e,r,{field:`path`,ext:`.png`,artifactType:`screen-recording-contact-sheet`});let a=await Lt({videoPath:n.path,outputPath:i.path,maxPixels:e.policy.maxImagePixels,...t.changedPixelThreshold===void 0?{}:{changedPixelThreshold:t.changedPixelThreshold},signal:t.signal??e.signal}),o=await i.publish();return{...a,path:Yt(a.path,o),...o?{artifact:o}:{}}}catch(e){throw await i?.cleanup?.(),e}finally{await n.cleanup?.()}};function qt(e,t,n){if(e.out)return e.out;if(t.kind===`path`)return{kind:`path`,path:S.resolve(y(t.path||n))};throw new r(`INVALID_ARGS`,`record contact-sheet needs an output path when the recording is an uploaded artifact`,{hint:"Pass --out <sheet.png> (CLI) or `out` (Node) to name where the sheet is written."})}function Jt(e){if(e!==void 0&&(!Number.isFinite(e)||e<0||e>1))throw new r(`INVALID_ARGS`,`record contact-sheet needs a changedPixelThreshold between 0 and 1, got ${e}`,{reason:`contact_sheet_threshold_invalid`,changedPixelThreshold:e,hint:`Omit it to use the calibrated default, or pass a share of the frame between 0 and 1.`})}function Yt(e,t){return t?t.kind===`localPath`?t.path:t.clientPath??e:e}const Xt=async(e,t)=>{let n=tn(t.action,`record`),i=n===`start`?e.backend.startRecording:e.backend.stopRecording;if(!i)throw new r(`UNSUPPORTED_OPERATION`,`record ${n} is not supported by this backend`);let a=t.out?await p(e,t.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let r=Qt(t,a?.path);return nn(n,await i.call(e.backend,m(e,t),r),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}},Zt=async(e,t)=>{let n=tn(t.action,`trace`),i=n===`start`?e.backend.startTrace:e.backend.stopTrace;if(!i)throw new r(`UNSUPPORTED_OPERATION`,`trace ${n} is not supported by this backend`);let a=t.out?await p(e,t.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let r=a?.path?{outPath:a.path}:{};return rn(n,await i.call(e.backend,m(e,t),r),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}};function Qt(e,t){let n={};t&&(n.outPath=t);let r=$t(e.fps);r!==void 0&&(n.fps=r);let i=en(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function $t(e){return e===void 0?void 0:s(e,`fps`,1,60)}function en(e){if(e===void 0)return;let t=i(e);if(t===void 0)throw new r(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return t}function tn(e,t){if(e===`start`||e===`stop`)return e;throw new r(`INVALID_ARGS`,`${t} action must be start or stop`)}function nn(e,t,n){return{...typeof t.path==`string`?{path:t.path}:{},...typeof t.telemetryPath==`string`?{telemetryPath:t.telemetryPath}:{},...typeof t.warning==`string`?{warning:t.warning}:{},...an(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function rn(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...an(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function an(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...g(e===`start`?r.startMessage:r.stopMessage)}}const on={record:Xt,trace:Zt,contactSheet:Kt},sn=async(e,t={})=>{if(!e.backend.pressBack)throw new r(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let n=t.mode??`in-app`;if(n!==`in-app`&&n!==`system`)throw new r(`INVALID_ARGS`,`system.back mode must be in-app or system`);let i=await e.backend.pressBack(m(e,t),{mode:n}),a=u(i);return{kind:`systemBack`,mode:n,...a?{backendResult:a}:{},...g(`Back`)}},cn=async(e,t={})=>{if(!e.backend.pressHome)throw new r(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let n=await e.backend.pressHome(m(e,t)),i=u(n);return{kind:`systemHome`,...i?{backendResult:i}:{},...g(`Home`)}},ln=async(e,t)=>{if(!e.backend.pressTvRemote)throw new r(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let n=oe(t.button),i=t.durationMs===void 0?void 0:s(t.durationMs,`durationMs`,0,1e4),a=await e.backend.pressTvRemote(m(e,t),{button:n,...i===void 0?{}:{durationMs:i}}),o=u(a);return{kind:`tvRemotePressed`,button:n,...i===void 0?{}:{durationMs:i},...o?{backendResult:o}:{},...g(`Pressed TV remote ${n}`)}},un=async(e,t)=>{if(!e.backend.setOrientation)throw new r(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let n=gn(t.orientation),i=await e.backend.setOrientation(m(e,t),n),a=u(i);return{kind:`systemOrientationSet`,orientation:n,...a?{backendResult:a}:{},...g(`Rotated to ${n}`)}},dn=async(e,t={})=>{if(!e.backend.setKeyboard)throw new r(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let n=t.action??`status`;if(!ce(n))throw new r(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let i=await e.backend.setKeyboard(m(e,t),{action:n}),a=u(i),o=Tn(i)?i:{};return n===`enter`||n===`return`?vn(o,a):n===`dismiss`?yn(n,o,a):xn(n,o,a)},fn=async(e,t)=>{if(t.action===`read`){if(!e.backend.getClipboard)throw new r(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let n=await e.backend.getClipboard(m(e,t));return{kind:`clipboardText`,action:`read`,text:typeof n==`string`?n:n.text}}if(t.action!==`write`)throw new r(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new r(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof t.text!=`string`)throw new r(`INVALID_ARGS`,`system.clipboard write requires text`);let n=await e.backend.setClipboard(m(e,t),t.text),i=u(n);return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(t.text).length,...i?{backendResult:i}:{},...g(`Clipboard updated`)}},pn=async(e,t={})=>{if(!e.backend.openSettings)throw new r(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let n=C(t.target,`target`),i=await e.backend.openSettings(m(e,t),n),a=u(i);return{kind:`settingsOpened`,...n?{target:n}:{},...a?{backendResult:a}:{},...g(n?`Opened settings: ${n}`:`Opened settings`)}},mn=async(e,t={})=>{if(!e.backend.handleAlert)throw new r(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let n=t.action??`get`;if(n!==`get`&&n!==`accept`&&n!==`dismiss`&&n!==`wait`)throw new r(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let i=t.timeoutMs===void 0?void 0:s(t.timeoutMs,`timeoutMs`,0,12e4);return _n(n,await e.backend.handleAlert(m(e,t),n,{timeoutMs:i}))},hn=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new r(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let n=await e.backend.openAppSwitcher(m(e,t)),i=u(n);return{kind:`appSwitcherOpened`,...i?{backendResult:i}:{},...g(`Opened app switcher`)}};function gn(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new r(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function _n(e,t){return e===`get`?Sn(t):e===`wait`?Cn(t):wn(e,t)}function vn(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...g(`Keyboard enter pressed`)}}function yn(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...g(bn(t))}}function bn(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function xn(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function Sn(e){if(e.kind!==`alertStatus`)throw new r(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function Cn(e){if(e.kind!==`alertWait`)throw new r(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...g(e.alert?`Alert visible`:`Alert wait timed out`)}}function wn(e,t){if(t.kind!==`alertHandled`)throw new r(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...g(t.handled?`Alert ${e}ed`:`No alert handled`)}}function Tn(e){return!!(e&&typeof e==`object`)}const En={back:sn,home:cn,orientation:un,keyboard:dn,clipboard:fn,settings:pn,alert:mn,appSwitcher:hn,tvRemote:ln};function Dn(e){return{capture:ee(e),selectors:f(e),interactions:l(e),system:h(En,e),apps:Je(e),admin:h(qe,e),recording:h(on,e),observability:h(ft,e)}}function On(e){let t=a(e);return{...t,...Dn(t)}}export{On as createAgentDevice,te as createMemorySessionStore,c as localCommandPolicy,o as restrictedCommandPolicy};
1
+ import{P as e}from"./sdk-contracts.js";import{Xt as t,nn as n,rn as r,tn as i}from"./sdk-batch.js";import{n as a,t as o}from"./application-lifecycle-runtime.js";import{A as s,B as c,C as l,D as u,G as d,H as f,I as p,J as m,K as h,L as g,N as _,O as ee,V as te,d as ne,h as re,j as ie,n as v,o as y,s as b,v as x,w as S,x as C,z as w}from"./alert-runtime.js";import{n as T}from"./audio-probe-runtime.js";import{n as E}from"./perf-runtime.js";import{i as D,t as O}from"./touch-runtime.js";import{i as k}from"./gesture-admission.js";import{r as A}from"./application-lifecycle-interaction.js";import{n as j,r as M,t as N}from"./screen-recording-transport.js";async function P(e){let{host:t,device:n,owner:r,signal:i}=e,a=await t.screenRecording.web.resolve(n);return a?{available:!0,operations:{screenRecordingStart:async e=>(F(e),await N({host:t,device:n,owner:r,input:e,signal:i,transport:{backend:`agent-browser`,targetLabel:`web recording`,start:async t=>await a.start(e.outputPath,t),stop:async()=>await a.stop()},support:{scopes:[`app`],fps:!1,exportQuality:!1,hideTouches:!1},unsupported:e=>`web recordings do not support ${e.join(`, `)}; agent-browser records WebM directly`})),screenRecordingReattach:async()=>M(`Web recordings cannot be reattached after daemon restart.`),screenRecordingCleanup:async()=>j(`Web recordings cannot be cleaned after daemon restart.`)}}:{available:!1,operations:{}}}function F(t){if(t.recordOnlySession)throw new e(`INVALID_ARGS`,`record on web requires an active browser session; run open <url> --platform web first`);if(!t.outputPath.toLowerCase().endsWith(`.webm`))throw new e(`INVALID_ARGS`,`web recordings require a .webm output path; agent-browser records WebM directly`)}const I=t(`web`),L=Object.freeze({available:!0}),ae=n(`unsupported-platform-leaf`,`Web targets read element text from the captured tree only.`),R=n(`unsupported-platform-leaf`),z=n(`owner-capability-missing`,`record is not supported by this web provider`),B=n(`unsupported-platform-leaf`,`Re-run without --actions, or target an iOS simulator.`),V=n(`unsupported-platform-leaf`),H=n(`unsupported-platform-leaf`,`apps is not supported on web targets.`),U=n(`unsupported-platform-leaf`),W=n(`unsupported-platform-leaf`),G=n(`unsupported-platform-leaf`,`Apple runner preparation is supported only for Apple targets.`),K=n(`owner-capability-missing`),q=n(`unsupported-platform-leaf`,`A web click is one immediate pointer press; the browser backend has no timed hold.`),J=n(`unsupported-platform-leaf`,`audio on web sessions is the stateless page probe; host capture is a macOS-host operation.`);function Y(e,t){return typeof e==`function`?t:K}function X(e,t){return e?L:t}const oe=n(`unsupported-platform-leaf`),se=n(`unsupported-platform-leaf`,k),Z=n(`unsupported-device-kind`,`open is supported only for web browser devices.`),ce=n(`unsupported-device-kind`,`close is supported only for web browser devices.`),le=n(`unsupported-provider-mode`,`Port reverse is supported only by an owning provider runtime.`);function ue(e){let t=Q(e),n=de(e);return o({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:V,clearRuntimeHints:V,closeApplication:n,finalizeApplicationClose:n,prepareAppleRunner:G,configureProviderPortReverse:le})}function Q(e){return e.kind===`device`?L:Z}function de(e){return e.kind===`device`?L:ce}function fe(t){return Object.freeze({owner:I,ownsDevice:e=>e.platform===`web`,inspectFacts:async e=>{let n=await t.networkTransports.resolve(e),r=await P({host:t,device:e,owner:I,signal:new AbortController().signal}),i=e.kind===`device`?await t.localInteractors.resolve(e,{}):void 0;return $(e,n,r.available,i)},bind:async n=>{if(n.intent.kind===`exact-owner`&&!i(n.intent.owner,I))throw new e(`UNSUPPORTED_OPERATION`,`Web runtime owner identity does not match`);if(n.device.platform!==`web`)throw new e(`UNSUPPORTED_PLATFORM`,`Web runtime owner cannot bind ${n.device.platform}`);let r=await t.networkTransports.resolve(n.device),a=await P({host:t,device:n.device,owner:I,signal:n.scope.signal}),o=n.device.kind===`device`?await t.localInteractors.resolve(n.device,{signal:n.scope.signal}):void 0;return pe(t,n.device,n.scope.signal,r,a,$(n.device,r,a.available,o))},shutdown:async()=>void 0})}function pe(t,n,i,o,s,c){let l=o.dump,u={...l?{networkDump:async e=>{let t=await l({maxEntries:e.maxEntries,include:e.include},i);return Object.freeze({source:`provider`,...t})}}:{},...s.operations,...c.operations.captureSnapshot.available?f({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.captureScreenshot.available?h({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.focusPoint.available?g({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.typeText.available?ee({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...r(c.operations.tapPoint,()=>O({device:n,signal:i,resolveInteractor:t.localInteractors.resolve,facts:c.operations,pause:async e=>await t.clock.sleep(e,i)})),...c.operations.scrollDirection.available?ie({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.setViewport.available?{setViewport:async r=>{i.throwIfAborted();let a=await t.localInteractors.resolve(n,{signal:i});if(!a.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by the bound web interactor`);await a.setViewport(r.width,r.height),i.throwIfAborted()}}:{},...r(c.operations.audioProbeQuery,()=>({audioProbeQuery:async r=>{let i=await t.audioProbe.web.resolve(n);if(i===void 0)throw new e(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);return await i.probe(r)}})),...a(A({owner:`web`,openTargetIdentity:`app-name`,host:t.localInteractors,device:n,signal:i}),c.operations)};return Object.freeze({device:n,owner:I,facts:c,operations:Object.freeze(u),[Symbol.asyncDispose]:async()=>void 0})}function $(e,t,r,i){let a=n(`owner-capability-missing`,`network is not supported by this web provider`),o=X(e.kind===`device`,Z);return Object.freeze({device:{family:`web`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:R,appLogDoctor:R,appLogStart:R,appLogReattach:R,appLogCleanup:R,appState:U,networkDump:X(!!t.dump,a),screenRecordingStart:X(r,z),screenRecordingReattach:X(r,z),screenRecordingCleanup:X(r,z),...d({capture:o,customActions:B,withoutActiveApp:o}),...te({findText:Z}),...m({capture:o}),...w({focus:o}),...s({type:o}),...D({unsupported:V,tap:o,tapRef:Y(i?.tapRef,o),longPress:q,hover:Y(i?.hover,o),hoverRef:Y(i?.hoverRef,o),fill:o,fillRef:Y(i?.fillRef,o)}),..._({scroll:o}),...p({unsupported:oe,targetAuthoredDrag:se}),...c({setViewport:o}),...u({readTextAtPoint:ae}),...S({back:W}),...l({orientation:W}),...C({tvRemote:W}),...x({unsupported:W}),...re({unsupported:W}),...T({capture:J,query:L}),...E({frames:W,memorySample:W,memorySnapshot:W,nativeCapture:W,profileReport:W}),...ne({unsupported:W}),setFoldPose:W,...b({triggerAppEvent:W}),...y({setSetting:W,readSetting:W}),...v({read:W,wait:W,accept:W,dismiss:W}),ensureReady:V,bootTarget:V,bootTargetHeadless:V,listApps:H,deployApp:V,materializeAppSource:V,deployMaterializedApp:V,sendPushNotification:V,shutdownTarget:V,...ue(e)}})}export{fe as createWebPlatformRuntime};