agent-device 0.21.5 → 0.21.7

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