agent-device 0.20.10 → 0.21.1

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 (510) hide show
  1. package/README.md +2 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
  10. package/apple/snapshot-bridge/LICENSE.idb +23 -0
  11. package/apple/snapshot-bridge/README.md +106 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
  15. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
  16. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  52. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
  53. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
  54. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
  55. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
  56. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  57. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  58. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
  59. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
  60. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
  61. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
  62. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
  63. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
  64. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  65. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
  66. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
  67. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  68. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  69. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  70. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  71. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  72. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  73. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  74. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  75. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  76. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  77. package/dist/src/adapter.js +1 -0
  78. package/dist/src/adb-executor.js +2 -0
  79. package/dist/src/adb-failure.js +1 -0
  80. package/dist/src/adb-host.js +1 -0
  81. package/dist/src/adb.js +1 -0
  82. package/dist/src/agent-browser-lifecycle.js +1 -0
  83. package/dist/src/agent-browser-process-record.js +1 -0
  84. package/dist/src/agent-browser-provider.js +1 -0
  85. package/dist/src/agent-browser-tool.js +1 -1
  86. package/dist/src/agent-device-client.js +2 -2
  87. package/dist/src/ai-sdk.d.ts +2 -2
  88. package/dist/src/ai-sdk.js +1 -1
  89. package/dist/src/alert-contract.js +1 -0
  90. package/dist/src/alert-runtime.js +1 -0
  91. package/dist/src/android-adb.d.ts +27 -19
  92. package/dist/src/android-adb.js +1 -1
  93. package/dist/src/android-input-ownership.js +1 -0
  94. package/dist/src/android-system-chrome.js +1 -0
  95. package/dist/src/android.js +1 -1
  96. package/dist/src/api.js +11 -0
  97. package/dist/src/app-catalog.js +1 -0
  98. package/dist/src/app-deployment-resolution.js +2 -0
  99. package/dist/src/app-helpers.js +1 -1
  100. package/dist/src/app-inventory-contract.js +1 -0
  101. package/dist/src/app-inventory.js +1 -0
  102. package/dist/src/app-launch.js +2 -0
  103. package/dist/src/app-lifecycle-facade.js +1 -0
  104. package/dist/src/app-lifecycle.js +3 -6
  105. package/dist/src/app-lifecycle2.js +2 -2
  106. package/dist/src/app-lifecycle3.js +1 -0
  107. package/dist/src/app-log-files.js +1 -1
  108. package/dist/src/app-log-reconnect.js +1 -1
  109. package/dist/src/app-log-runtime.js +1 -4
  110. package/dist/src/app-log-runtime2.js +4 -0
  111. package/dist/src/app-parsers.js +4 -0
  112. package/dist/src/app-resolution-cache.js +1 -0
  113. package/dist/src/app-resolution-facade.js +1 -0
  114. package/dist/src/app-resolution.js +2 -2
  115. package/dist/src/app-state.js +1 -2
  116. package/dist/src/apple-runner-platform.js +1 -0
  117. package/dist/src/application-lifecycle-interaction.js +1 -0
  118. package/dist/src/application-lifecycle-runtime.js +1 -0
  119. package/dist/src/apps-simctl.js +1 -0
  120. package/dist/src/archive.js +4 -0
  121. package/dist/src/artifact-download.js +1 -0
  122. package/dist/src/artifacts.d.ts +6 -2
  123. package/dist/src/artifacts.js +1 -1
  124. package/dist/src/async-lifecycle.js +1 -0
  125. package/dist/src/audio-probe-result.js +1 -0
  126. package/dist/src/audio-probe-runtime.js +1 -0
  127. package/dist/src/audio-probe-support.js +1 -0
  128. package/dist/src/auth-session.js +1 -1
  129. package/dist/src/auth.js +1 -1
  130. package/dist/src/backend-snapshot-options.js +1 -1
  131. package/dist/src/{url.js → base-url.js} +1 -1
  132. package/dist/src/boot-diagnostics.js +2 -2
  133. package/dist/src/byte-limit-stream.js +1 -1
  134. package/dist/src/capabilities.js +1 -0
  135. package/dist/src/capture.js +1 -0
  136. package/dist/src/catalog.js +1 -0
  137. package/dist/src/cli-command-aliases.js +1 -0
  138. package/dist/src/cli-config.js +1 -1
  139. package/dist/src/cli-help.js +74 -51
  140. package/dist/src/cli-output.js +1 -1
  141. package/dist/src/cli-runner.js +1 -1
  142. package/dist/src/cli.js +4 -6
  143. package/dist/src/click-button.js +1 -0
  144. package/dist/src/client-metro-companion.js +1 -0
  145. package/dist/src/client-metro.js +1 -1
  146. package/dist/src/client-types.d.ts +280 -242
  147. package/dist/src/clipboard.js +1 -0
  148. package/dist/src/code-signature-cache.js +1 -0
  149. package/dist/src/code-signature.js +1 -0
  150. package/dist/src/color.js +1 -0
  151. package/dist/src/command-metadata.js +1 -1
  152. package/dist/src/command-schema.js +3 -3
  153. package/dist/src/command-surface.js +1 -1
  154. package/dist/src/command-tools.js +2 -2
  155. package/dist/src/command.js +1 -0
  156. package/dist/src/compatibility-policy.js +1 -0
  157. package/dist/src/config.js +1 -1
  158. package/dist/src/config2.js +1 -0
  159. package/dist/src/connection-runtime.js +1 -1
  160. package/dist/src/connection.js +5 -5
  161. package/dist/src/contracts.d.ts +1 -1
  162. package/dist/src/contracts.js +1 -1
  163. package/dist/src/daemon-client-lifecycle.js +1 -0
  164. package/dist/src/daemon-process.js +1 -0
  165. package/dist/src/daemon-registration.js +1 -0
  166. package/dist/src/daemon-shutdown-report.js +1 -1
  167. package/dist/src/daemon.js +2 -2
  168. package/dist/src/debug-symbols-facade.js +5 -0
  169. package/dist/src/deploy-result-target.js +1 -0
  170. package/dist/src/device-claim-inspection.js +1 -1
  171. package/dist/src/device-claim-rule.js +1 -0
  172. package/dist/src/device-input-state.d.ts +190 -3
  173. package/dist/src/device-inventory-context.js +1 -0
  174. package/dist/src/device-isolation.js +1 -0
  175. package/dist/src/device-release.js +1 -0
  176. package/dist/src/device-rotation.js +1 -0
  177. package/dist/src/device-selection-resolver.js +1 -0
  178. package/dist/src/device-session.js +1 -0
  179. package/dist/src/device.js +1 -1
  180. package/dist/src/device2.js +3 -2
  181. package/dist/src/diagnostics.js +3 -0
  182. package/dist/src/diagnostics2.js +1 -0
  183. package/dist/src/dispatch-resolve.js +1 -0
  184. package/dist/src/doctor-facade.js +1 -0
  185. package/dist/src/doctor-output.js +1 -0
  186. package/dist/src/doctor.js +1 -0
  187. package/dist/src/doctor2.js +1 -0
  188. package/dist/src/doctor3.js +1 -0
  189. package/dist/src/durable-resource.js +1 -0
  190. package/dist/src/entities.js +1 -1
  191. package/dist/src/error.js +2 -0
  192. package/dist/src/exec.js +1 -0
  193. package/dist/src/file.js +1 -0
  194. package/dist/src/find.js +1 -1
  195. package/dist/src/finders.js +1 -1
  196. package/dist/src/generic-settle.js +1 -1
  197. package/dist/src/generic.js +1 -1
  198. package/dist/src/gesture-admission.js +1 -0
  199. package/dist/src/gesture-plan-types.js +1 -0
  200. package/dist/src/gesture-plan.js +1 -0
  201. package/dist/src/gesture-runtime.js +1 -0
  202. package/dist/src/harmonyos.js +1 -1
  203. package/dist/src/hdc.js +1 -1
  204. package/dist/src/helper.js +2 -2
  205. package/dist/src/host-file.js +1 -0
  206. package/dist/src/human-control-contract.js +1 -0
  207. package/dist/src/human-control.js +1 -0
  208. package/dist/src/index.d.ts +1 -1
  209. package/dist/src/index.js +1 -1
  210. package/dist/src/input-actions.js +1 -4
  211. package/dist/src/input-actions2.js +2 -1
  212. package/dist/src/install-artifact-facade.js +1 -0
  213. package/dist/src/install-source-network-transport.js +1 -0
  214. package/dist/src/install-source.d.ts +3 -10
  215. package/dist/src/install-source2.js +1 -1
  216. package/dist/src/interaction-positionals.js +1 -0
  217. package/dist/src/interaction-ref-policy.js +1 -0
  218. package/dist/src/interaction.js +1 -1
  219. package/dist/src/interaction2.js +1 -1
  220. package/dist/src/interactor-operation-catalog.js +1 -0
  221. package/dist/src/interactor-types.js +1 -0
  222. package/dist/src/interactor.js +6 -2
  223. package/dist/src/interactor2.js +1 -1
  224. package/dist/src/interactors.js +1 -1
  225. package/dist/src/internal/bin.d.ts +1 -1
  226. package/dist/src/internal/bin.js +1 -2
  227. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  228. package/dist/src/internal/companion-tunnel.js +1 -1
  229. package/dist/src/internal/daemon.d.ts +1 -1
  230. package/dist/src/internal/daemon.js +2 -4
  231. package/dist/src/internal/png-worker.d.ts +4 -4
  232. package/dist/src/internal/png-worker.js +1 -1
  233. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  234. package/dist/src/internal/run-script-http-child.js +1 -0
  235. package/dist/src/internal/update-check-entry.d.ts +1 -1
  236. package/dist/src/inventory.js +4 -4
  237. package/dist/src/inventory2.js +1 -1
  238. package/dist/src/inventory3.js +1 -1
  239. package/dist/src/inventory5.js +1 -1
  240. package/dist/src/inventory6.js +1 -1
  241. package/dist/src/ios-client.js +16 -0
  242. package/dist/src/ios-snapshot-acquisition.js +1 -0
  243. package/dist/src/ios-snapshot-adapter.js +1 -0
  244. package/dist/src/ios-snapshot-planning.js +1 -0
  245. package/dist/src/ios-snapshot-runtime.js +1 -0
  246. package/dist/src/ios-system-surface.js +1 -0
  247. package/dist/src/json.js +1 -0
  248. package/dist/src/keyboard-actions.js +1 -0
  249. package/dist/src/launch-console.js +1 -0
  250. package/dist/src/lease-context.js +1 -1
  251. package/dist/src/lease-scope.js +1 -0
  252. package/dist/src/lease.js +1 -1
  253. package/dist/src/limrun-runtime-dependencies.js +1 -1
  254. package/dist/src/limrun.d.ts +1610 -7
  255. package/dist/src/limrun.js +1 -1
  256. package/dist/src/linux.js +1 -1
  257. package/dist/src/local-interactor-operation-set.js +1 -0
  258. package/dist/src/location-coordinates.js +1 -1
  259. package/dist/src/logcat.js +1 -1
  260. package/dist/src/macos-facade.js +1 -0
  261. package/dist/src/managed-device-scope.js +1 -0
  262. package/dist/src/mechanics.js +19 -0
  263. package/dist/src/metro.d.ts +4 -2
  264. package/dist/src/metro.js +1 -1
  265. package/dist/src/metro2.js +1 -1
  266. package/dist/src/mobile-snapshot-semantics.js +1 -1
  267. package/dist/src/multitouch-support.js +1 -0
  268. package/dist/src/numeric.js +1 -0
  269. package/dist/src/observability.js +1 -1
  270. package/dist/src/observation.js +2 -0
  271. package/dist/src/open-target-resolution.js +1 -0
  272. package/dist/src/output-path.js +1 -1
  273. package/dist/src/owner-identity.js +3 -1
  274. package/dist/src/parameterized-recorded-fill.js +1 -0
  275. package/dist/src/parser.js +1 -1
  276. package/dist/src/perf-facade.js +2 -0
  277. package/dist/src/perf-process-identity.js +1 -0
  278. package/dist/src/perf-runtime-operation-builder.js +1 -0
  279. package/dist/src/perf-runtime-plan.js +1 -0
  280. package/dist/src/perf-runtime.js +1 -0
  281. package/dist/src/perf.js +1 -4
  282. package/dist/src/physical-device-control.js +1 -1
  283. package/dist/src/physical-device-facade.js +1 -0
  284. package/dist/src/platform-request-scope.js +1 -0
  285. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  286. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  287. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  288. package/dist/src/platform-runtime-app-log-process.js +1 -1
  289. package/dist/src/platform-runtime-host.js +1 -1
  290. package/dist/src/platform-runtime-managed-owner.js +1 -0
  291. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  292. package/dist/src/platform-runtime-open-target.js +1 -1
  293. package/dist/src/platform-runtime-operation-host.js +4 -4
  294. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  295. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  296. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  297. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  298. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  299. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  300. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  301. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  302. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  303. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  304. package/dist/src/platform-runtime-unavailable.js +1 -0
  305. package/dist/src/platform-runtime.js +1 -1
  306. package/dist/src/platform-runtime2.js +1 -1
  307. package/dist/src/plist.js +1 -1
  308. package/dist/src/png-worker-contract.js +1 -1
  309. package/dist/src/prepare-kind.js +1 -0
  310. package/dist/src/process-exit.js +1 -1
  311. package/dist/src/process.js +1 -0
  312. package/dist/src/provider-device-runtime.js +1 -0
  313. package/dist/src/provider-session-ownership.js +2 -0
  314. package/dist/src/provider-webdriver.js +1 -1
  315. package/dist/src/provider.js +1 -1
  316. package/dist/src/providers.js +1 -0
  317. package/dist/src/proxy.js +2 -2
  318. package/dist/src/react-native-overlay.js +1 -0
  319. package/dist/src/react-native.js +1 -1
  320. package/dist/src/record-runtime.js +1 -1
  321. package/dist/src/record-trace.js +1 -1
  322. package/dist/src/rect-center.js +1 -0
  323. package/dist/src/register-builtins.js +1 -0
  324. package/dist/src/registry.js +40 -28
  325. package/dist/src/remote-config2.js +1 -1
  326. package/dist/src/replay-divergence.js +2 -0
  327. package/dist/src/replay.js +2 -2
  328. package/dist/src/reporting.js +8 -7
  329. package/dist/src/request-admission.js +1 -0
  330. package/dist/src/request-cancel.js +1 -0
  331. package/dist/src/request-cancellation.js +1 -0
  332. package/dist/src/request-progress-protocol.js +1 -0
  333. package/dist/src/request-providers.js +1 -0
  334. package/dist/src/request-runtime-binding.js +1 -0
  335. package/dist/src/request.js +1 -0
  336. package/dist/src/result-serialization.js +1 -0
  337. package/dist/src/retry.js +1 -0
  338. package/dist/src/rolldown-runtime.js +1 -1
  339. package/dist/src/runner-cache-metadata.js +2 -0
  340. package/dist/src/runner-client.js +1 -1
  341. package/dist/src/runner-disposal.js +1 -1
  342. package/dist/src/runner-operations-facade.js +1 -0
  343. package/dist/src/runner-owner-facade.js +1 -0
  344. package/dist/src/runner-owner-state.js +1 -0
  345. package/dist/src/runner-presentation.js +1 -0
  346. package/dist/src/runner.js +1 -0
  347. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  348. package/dist/src/runtime.js +3 -3
  349. package/dist/src/runtime2.js +4 -4
  350. package/dist/src/runtime3.js +1 -1
  351. package/dist/src/runtime4.js +5 -3
  352. package/dist/src/runtime5.js +1 -1
  353. package/dist/src/runtime6.js +1 -1
  354. package/dist/src/runtime7.js +1 -1
  355. package/dist/src/runtime8.js +1 -1
  356. package/dist/src/runtime9.js +1 -1
  357. package/dist/src/scoped-provider.js +1 -1
  358. package/dist/src/screen-recording-completion.js +1 -0
  359. package/dist/src/screen-recording-live-handle.js +1 -0
  360. package/dist/src/screen-recording-options.js +1 -0
  361. package/dist/src/screen-recording-resource-recovery.js +1 -0
  362. package/dist/src/screen-recording-runtime.js +1 -0
  363. package/dist/src/screenshot-density.js +1 -1
  364. package/dist/src/screenshot-result.js +1 -6
  365. package/dist/src/screenshot-runtime.js +1 -0
  366. package/dist/src/screenshot.js +1 -1
  367. package/dist/src/screenshot2.js +1 -0
  368. package/dist/src/screenshot3.js +5 -0
  369. package/dist/src/script.js +1 -0
  370. package/dist/src/scroll-command.js +1 -0
  371. package/dist/src/scroll-gesture.js +1 -0
  372. package/dist/src/scroll-indicator.js +1 -0
  373. package/dist/src/sdk-batch-runner.d.ts +23 -6
  374. package/dist/src/sdk-batch-runner.js +2 -3
  375. package/dist/src/sdk-batch.js +2 -0
  376. package/dist/src/sdk-contracts.d.ts +170 -41
  377. package/dist/src/sdk-contracts.js +2 -2
  378. package/dist/src/sdk-device.js +1 -1
  379. package/dist/src/sdk-finders.d.ts +1 -1
  380. package/dist/src/sdk-finders.js +1 -1
  381. package/dist/src/sdk-io.js +1 -1
  382. package/dist/src/sdk-remote-config.d.ts +1 -1
  383. package/dist/src/sdk-remote-config.js +1 -1
  384. package/dist/src/sdk-selectors.d.ts +524 -140
  385. package/dist/src/sdk-selectors.js +1 -1
  386. package/dist/src/selection.js +1 -0
  387. package/dist/src/selector-runtime.js +1 -1
  388. package/dist/src/selectors.js +1 -1
  389. package/dist/src/semantic-index.js +1 -0
  390. package/dist/src/server.js +4 -4
  391. package/dist/src/session-allocation.js +1 -0
  392. package/dist/src/session-artifact-paths.js +1 -0
  393. package/dist/src/session-observation.js +1 -0
  394. package/dist/src/session-paths.js +1 -0
  395. package/dist/src/session-repair-tombstone.js +1 -0
  396. package/dist/src/session-routing.js +1 -0
  397. package/dist/src/session-runtime-admission.js +1 -0
  398. package/dist/src/session-snapshot.js +1 -0
  399. package/dist/src/session-store.js +4 -0
  400. package/dist/src/session-target-evidence.js +1 -1
  401. package/dist/src/session2.js +5 -27
  402. package/dist/src/settings.js +1 -0
  403. package/dist/src/shared.js +2 -2
  404. package/dist/src/simctl-facade.js +1 -0
  405. package/dist/src/simctl.js +1 -1
  406. package/dist/src/simulator-facade.js +1 -0
  407. package/dist/src/simulator.js +1 -1
  408. package/dist/src/snapshot-capture-annotations.js +1 -0
  409. package/dist/src/snapshot-desktop-projection.js +1 -0
  410. package/dist/src/snapshot-diagnostics.js +1 -0
  411. package/dist/src/snapshot-process.js +1 -0
  412. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  413. package/dist/src/snapshot-quality-verdict.js +1 -0
  414. package/dist/src/snapshot-runtime-binding.js +1 -0
  415. package/dist/src/snapshot-runtime.js +1 -1
  416. package/dist/src/snapshot-scope.js +1 -1
  417. package/dist/src/snapshot-state.js +1 -0
  418. package/dist/src/snapshot.js +1 -8
  419. package/dist/src/snapshot2.js +1 -1
  420. package/dist/src/snapshot3.js +1 -1
  421. package/dist/src/snapshot4.js +1 -0
  422. package/dist/src/src.js +1 -1
  423. package/dist/src/src2.js +1 -1
  424. package/dist/src/src3.js +1 -2
  425. package/dist/src/src4.js +1 -1
  426. package/dist/src/src5.js +1 -0
  427. package/dist/src/src6.js +1 -0
  428. package/dist/src/src7.js +2 -0
  429. package/dist/src/src8.js +115 -0
  430. package/dist/src/startup-recovery-fence.js +1 -0
  431. package/dist/src/status-markers.js +1 -0
  432. package/dist/src/string-enum.js +1 -1
  433. package/dist/src/success-text.js +1 -0
  434. package/dist/src/surface-snapshot.js +1 -0
  435. package/dist/src/surface-snapshot2.js +1 -0
  436. package/dist/src/takeover.js +5 -0
  437. package/dist/src/tool-provider-facade.js +1 -0
  438. package/dist/src/tool-provider.js +4 -3
  439. package/dist/src/tool-provider2.js +1 -1
  440. package/dist/src/tool-provider3.js +1 -1
  441. package/dist/src/toolchain-probe.js +2 -0
  442. package/dist/src/touch-reference-frame.js +1 -0
  443. package/dist/src/touch-runtime.js +1 -0
  444. package/dist/src/transport.js +3 -0
  445. package/dist/src/tree.js +1 -0
  446. package/dist/src/ttl-memo.js +1 -0
  447. package/dist/src/tv-remote.js +1 -0
  448. package/dist/src/type-text-runtime.js +1 -0
  449. package/dist/src/undici.js +99 -0
  450. package/dist/src/update-check.js +1 -1
  451. package/dist/src/verified-file.js +1 -1
  452. package/dist/src/version.js +1 -1
  453. package/dist/src/video.js +2 -2
  454. package/dist/src/web.js +2 -1
  455. package/dist/src/web2.js +1 -0
  456. package/dist/src/webdriver-ios-snapshot.js +1 -0
  457. package/dist/src/webdriver-source.js +1 -0
  458. package/dist/src/window-state.js +1 -0
  459. package/linux/atspi-dump.py +54 -9
  460. package/package.json +58 -35
  461. package/server.json +9 -3
  462. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
  463. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
  464. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
  465. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  466. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
  467. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  468. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  469. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  470. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
  471. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  472. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  473. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  474. package/dist/src/appearance.js +0 -1
  475. package/dist/src/apps.js +0 -5
  476. package/dist/src/audio-probe.js +0 -1
  477. package/dist/src/cli-grammar.js +0 -1
  478. package/dist/src/command-catalog.js +0 -1
  479. package/dist/src/debug-symbols.js +0 -5
  480. package/dist/src/device-input-state.js +0 -2
  481. package/dist/src/device-ready.js +0 -1
  482. package/dist/src/dispatch.js +0 -1
  483. package/dist/src/handler-utils.js +0 -1
  484. package/dist/src/helper-package-install.js +0 -1
  485. package/dist/src/host-process.js +0 -3
  486. package/dist/src/ime-lifecycle.js +0 -2
  487. package/dist/src/ime-recovery-marker.js +0 -1
  488. package/dist/src/input-actions3.js +0 -1
  489. package/dist/src/install-artifact.js +0 -1
  490. package/dist/src/install-artifact2.js +0 -1
  491. package/dist/src/interaction-common.js +0 -1
  492. package/dist/src/interaction-runtime.js +0 -1
  493. package/dist/src/interaction-snapshot.js +0 -1
  494. package/dist/src/manifest.js +0 -1
  495. package/dist/src/method-scope.js +0 -1
  496. package/dist/src/png-resize.js +0 -1
  497. package/dist/src/process-lock.js +0 -1
  498. package/dist/src/runner-lease.js +0 -1
  499. package/dist/src/runner-sequence.js +0 -1
  500. package/dist/src/script-source-bundle.js +0 -16
  501. package/dist/src/sdk-android-adb.d.ts +0 -245
  502. package/dist/src/sdk-android-adb.js +0 -4
  503. package/dist/src/sdk.js +0 -1
  504. package/dist/src/setting-state.js +0 -1
  505. package/dist/src/shell-quote.js +0 -1
  506. package/dist/src/snapshot-session.js +0 -1
  507. package/dist/src/timing-safe-equal.js +0 -1
  508. package/dist/src/unsupported-interactor.js +0 -1
  509. package/dist/src/verdict.js +0 -1
  510. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
@@ -1,3 +1,3 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t,d as n,g as r,l as i,p as a,u as o,v as s}from"./sdk-contracts.js";import{g as c,k as l,m as u}from"./location-coordinates.js";import{$n as d,En as f,Fn as p,Jn as m,Nr as ee,On as te,Tn as ne,Vt as re,er as ie,gn as h,pn as g,tn as ae,tr as oe,vn as se,xn as ce,xr as le}from"./sdk-batch-runner.js";import{A as ue,B as de,C as fe,D as pe,E as me,F as he,G as ge,H as _e,J as ve,K as ye,L as be,M as xe,N as Se,P as Ce,Q as we,R as _,S as Te,T as Ee,U as De,V as Oe,W as ke,X as v,Y as Ae,_ as je,b as Me,ct as y,dt as b,ft as x,g as Ne,gt as S,j as Pe,lt as C,nt as Fe,q as Ie,tt as Le,ut as Re,v as ze,w as Be,x as Ve,y as He,yn as w,z as Ue}from"./script-source-bundle.js";import{r as We}from"./recording-export-quality.js";import{_ as Ge,i as Ke,t as T}from"./interaction.js";import{M as qe}from"./screenshot-result.js";import{t as Je}from"./mobile-snapshot-semantics.js";import{t as Ye}from"./verdict.js";import{f as Xe,p as Ze}from"./device.js";import{a as Qe}from"./png-worker-contract.js";import{a as $e,i as et,n as tt,o as nt}from"./png-resize.js";import rt from"node:path";import{promises as E}from"node:fs";const it=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,at=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],ot=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],st=[`open debugger to view warnings`,`getsnapshot should be cached to avoid an infinite loop`,`unique "key" prop`,`unique 'key' prop`,`virtualizedlists should never be nested`,`failed prop type`],ct=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function lt(e){if(ut(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 ut(e){let t=pt(e),n=t.detected?mt(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function dt(e){return xt(e.label?.trim())&&At(e.rect)}function ft(e,t){let n=e.label?.trim();return!n||!dt(e)?!1:t.some(e=>e.label?.trim()===n&&jt(e))}function pt(e){let t=e.map(ht).join(`
3
- `).toLowerCase(),n=O(e,Ct),r=O(e,Et),i=O(e,xt,Ot),a=O(e,St),o=_t(t),s=vt(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:bt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:yt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function mt(e){let t=Mt(e.dismissNodes);if(t)return Ft(t,It(t));let n=Lt(e.collapsedNodes.filter(kt));return n?.rect?{action:`close-collapsed-banner`,point:Ht(n),rect:n.rect,ref:n.ref,label:k(n)}:null}function ht(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function gt(e){return it.test(e)}function _t(e){return at.some(t=>t.test(e))}function vt(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function yt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function bt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(gt(e.text)||e.hasReactNativeStackFrame)}function xt(e){let t=e?.trim().toLowerCase();return t?st.some(e=>t.includes(e))||ot.some(e=>e.test(t)):!1}function St(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Ct(e){return D(e)||wt(e)||Tt(e)}function D(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function wt(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function Tt(e){return ct.has(e)}function Et(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function Dt(e){return/^!,\s+/.test(e)}function Ot(e){return!e.rect||e.rect.height<=180}function kt(e){let t=k(e)?.trim().toLowerCase()??``;return(St(t)||Dt(t))&&jt(e)}function At(e){return e?e.x<=1&&e.y<=1&&e.width>=300&&e.height>=600:!1}function jt(e){return e.rect?e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180:!1}function O(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?ee(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:k(e)}}function It(e){let t=k(e)?.trim().toLowerCase();return t&&D(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 k(e){return e.label??e.value??e.identifier}function Wt(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}const A=[0,187,255,255];function Gt(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Kt(e,n.rect)}function Kt(e,t){let n=qt(t);if(n==null)return;let r=M(n.x,0,e.width-1),i=M(n.y,0,e.height-1),a=M(n.right,0,e.width-1),o=M(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)j(e,n,i+t,A),j(e,n,o-t,A);for(let n=i;n<=o;n+=1)j(e,r+t,n,A),j(e,a-t,n,A)}}function qt(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 j(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 M(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const Jt=[{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 Yt(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(!Qt(t,a,e))continue;let c=0,l=Zt(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Xt({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Xt(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 Jt){let o=s+e.x,u=c+e.y;if(!$t(o,u,i,a))continue;let d=u*i+o;Qt(t,n,d)&&(l=Zt(r,n,l,d))}return l}function Zt(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Qt(e,t,n){return e[n]===1&&t[n]!==1}function $t(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function en(e,t){return e.flatMap(e=>tn(e,t.baseline.width,t.baseline.height)?nn(e,t,ln(t.baseline.height)):[e])}function tn(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=cn(n)&&r>=t*.35}function nn(e,t,n){let r=sn(e,on(an(rn(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])=>un(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function rn(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 an(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 on(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 sn(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 cn(e){return Math.max(48,Math.round(e*.07))}function ln(e){return Math.max(24,Math.round(e*.03))}function un(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??=dn(t,a),fn(i,e,t,a,r.baseline,r.current))}return i}function dn(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 fn(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 pn=2.5;function mn(e){let t=hn(e);return en(t.length<=2e3?vn(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)=>xn(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function hn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Yt({mask:t,width:i,height:a,hooks:{create:e=>gn(e,i),visit:(e,t)=>_n(e,t,i,n,r)}})}function gn(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 _n(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 vn(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=>yn(e,r,t));if(!e){n.push({...r});continue}bn(e,r)}return n}function yn(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 bn(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 xn(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=Sn(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Sn(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Fe({x:F(r.x/n.width),y:F(r.y/n.height),width:F(r.width/n.width),height:F(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:F(e.differentPixels/n.differentPixels),densityPercentage:F(e.differentPixels/s),shape:Tn(r,n.width,n.height),size:En(s,n.totalPixels),location:Cn(i,n.width,n.height),averageBaselineColorHex:Dn(a),averageCurrentColorHex:Dn(o),baselineLuminance:Math.round(N(a)),currentLuminance:Math.round(N(o)),dominantChange:wn(a,o)}}function Sn(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Cn(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 wn(e,t){let n=N(t)-N(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 Tn(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*pn?`horizontal-band`:e.height>=e.width*pn?`vertical-band`:`compact`}function En(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function N(e){return e.r*.2126+e.g*.7152+e.b*.0722}function Dn(e){return`#${P(e.r)}${P(e.g)}${P(e.b)}`}function P(e){return e.toString(16).padStart(2,`0`)}function F(e){return Math.round(e*100*100)/100}const On=255*Math.sqrt(3);async function kn(e,t,n={}){await An(e,`Baseline image not found`),await An(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([E.readFile(e),E.readFile(t)]),[o,s]=await Promise.all([$e(i,`baseline screenshot`),$e(a,`current screenshot`)]);jn(o.width,o.height,`baseline screenshot`,n.maxPixels),jn(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 Mn(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*On,{diffData:d,diffMask:f,differentPixels:p}=await et({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?mn({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new Qe.PNG({width:o.width,height:o.height});e.data=d,Gt(e,m),await E.mkdir(rt.dirname(r),{recursive:!0}),await E.writeFile(r,await nt(e))}else await Mn(n.outputPath);let ee=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:ee,match:p===0}}async function An(e,n){try{await E.access(e)}catch{throw new t(`INVALID_ARGS`,`${n}: ${e}`)}}function jn(e,n,r,i){if(i==null||i<=0)return;let a=e*n;if(!(a<=i))throw new t(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Mn(e){if(e)try{await E.unlink(e)}catch(e){if(!Nn(e,`ENOENT`))throw e}}function Nn(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Pn(e,t){return e.map(e=>{let n=Fn(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Fn(e,t){let n=In(e.rect);return t.map(t=>{let r=t.overlayRect,i=Le(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ln(i/In(r)),regionCoveragePercentage:Ln(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 In(e){return e.width*e.height}function Ln(e){return Math.round(e*100*100)/100}async function I(e,n,r){if(n.kind===`path`&&!e.policy.allowLocalInputPaths)throw new t(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(n,r)}catch(e){throw s(e)}}async function L(e,n,r){if(n?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new t(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(n,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw s(e)}}async function Rn(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw s(e)}}const zn=async(e,n)=>{if(!n.baseline)throw new t(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Bn(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!qn(i))throw new t(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await I(e,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let t;qn(i)?(s=await Vn(e,n),t=s.path):(o=await I(e,i,{usage:`diff screenshot current`,field:`current`}),t=o.path),c=n.out?await L(e,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await kn(a.path,t,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});qn(i)&&(u=await Hn(e,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Bn(e){if(e==null||e===``)return .1;let n=Number(e);if(Number.isNaN(n)||n<0||n>1)throw new t(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Vn(e,t){let n=await Rn(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Un(e,t,n.path,Wn(t))}catch(e){throw await n.cleanup(),e}return n}async function Hn(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Kn(n),r;let a=await L(e,Gn(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Un(e,t,a.path,{overlayRefs:!0,...Wn(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:Pn(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Un(e,n,r,i={}){if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??e.signal,metadata:n.metadata},r,i)??{}}function Wn(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Gn(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:R(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:R(e.out.clientPath)}:{},...e.out.fileName?{fileName:R(e.out.fileName)}:{}}}function R(e){let t=rt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Kn(e){try{await E.unlink(R(e))}catch(e){if(!Jn(e,`ENOENT`))throw e}}function qn(e){return e.kind===`live`}function Jn(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Yn=async(e,n)=>{if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);l(n);let r=await L(e,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await tt(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function Xn(e,t){return[...$n(e),...Zn(e),...tr(e),...nr(e,t)]}function Zn(e){let t=e.customActions;if(!t)return[];let n=[];return t.blocked?n.push(`Custom actions were not read: an earlier accessibility read is still hung, so this capture skipped the read pass instead of queueing behind it. No element’s actions list is authoritative here. Reads resume once that call returns.`):t.read<t.candidates&&n.push(`Custom actions were read for ${t.read} of ${t.candidates} merged elements, on-screen ones first; the remaining ${t.candidates-t.read} were not read, so an absent actions list on those is not evidence that they have none. Scroll them into view and re-run to read them.`),t.truncated>0&&n.push(`${t.truncated} element(s) published more custom actions than are shown; those lists are clipped to the first 8 names, and long names are shortened.`),n}function Qn(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function $n(e){return e.state===`recovered`?e.reasonCode===`deferred`||e.reasonCode===`requested-backend`?[]:[Qn(e.backend)]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Its refs and selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`,...er(e)]:[]}function er(e){return e.reasonCode===`sparse-tree`?[`This screen publishes no accessibility content at all; assistive technologies see the same empty tree, so it is worth flagging as an app accessibility bug rather than only an automation limitation.`]:[]}function tr(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; this tree is capped at depth ${e.effectiveDepth}. Re-run with --depth ${e.effectiveDepth} --scope <container> only if you need deeper content.`]}function nr(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many 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.`)}return n}function rr(e){let{nodes:t,backend:n,snapshotRaw:i}=e;if(i||!r(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Je(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const ir=`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 ar(e){return e?.systemSurfaceOnly===!0?ir:void 0}function or(e,t){return e.presentationKey?e:{...e,presentationKey:i(t)}}function sr(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||!cr(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!lr(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 cr(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function lr(e,t){return e.truncated===t.truncated?JSON.stringify(ur(e.nodes))===JSON.stringify(ur(t.nodes)):!1}function ur(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints,actions:e.actions}))}const dr=async(e,t)=>{let n=await pr(e,t),r=sr({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});return await e.sessions.set(hr(t.session,n)),{nodes:n.snapshot.nodes,truncated:n.snapshot.truncated??!1,visibility:rr({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}:{},...gr(n)}},fr=async(e,t)=>{let n=await pr(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=hr(t.session,n);if(!i){let t=Pe(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=ue(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 pr(e,n){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=or(mr(a,e),n),s=c(a),l=Re(e);return{snapshot:o,result:a,session:i,annotations:s,warnings:_r({result:a,annotations:s,snapshot:o,options:n,session:i,capturedAt:o.createdAt??l,runtimeNow:l})}}function mr(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:Re(t)}}function hr(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 gr(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 _r(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Xn(e.annotations.quality,e.snapshot.nodes)),t.push(...xr(e)),e.annotations.quality||(t.push(...yr(e)),t.push(...br(e.snapshot.nodes)));let n=lt(e.snapshot.nodes);n&&t.push(n);let r=vr(e.annotations);r&&t.push(r);let i=Sr(e);return i&&t.push(i),t.push(...Er(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function vr(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return ir}function yr(e){return e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1||e.snapshot.nodes[0]?.type!==`Application`?[]:[`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 br(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 xr(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 Sr(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Cr(t,e.snapshot)&&wr(t,e.capturedAt,e.runtimeNow)&&Dr(t.nodes.length,e.snapshot.nodes.length))return Tr}function Cr(e,t){return e.presentationKey===void 0||t.presentationKey===void 0?!0:e.presentationKey===t.presentationKey}function wr(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Tr=`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 Er(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`?[Tr]:[]}function Dr(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Or={screenshot:Yn,diffScreenshot:zn,snapshot:dr,diffSnapshot:fr},kr=new WeakMap;function Ar(e,t){Mr(e)&&kr.set(e,t)}function jr(e){return Mr(e)?kr.get(e):void 0}function Mr(e){return typeof e==`object`&&!!e||typeof e==`function`}const Nr=async(e,t)=>await Lr(e,t,`press`),Pr=async(e,t)=>await Lr(e,t,`click`),Fr=async(e,n)=>{if(!n.text)throw new t(`INVALID_ARGS`,`fill requires text`);let r=fe(n),i=r.needsPreActionBaseline?null:await Br(e,n);if(i)return i;let a=await he(e,n,{action:`fill`,requireInteractive:!0,pipeline:S.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.fill)throw new t(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Rr(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&le(s,e.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=C(await e.backend.fill(b(e,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Hr(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await Te(e,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)},Ir=async(e,n)=>{let r=n.text;if(!r)throw new t(`INVALID_ARGS`,`type requires text`);let i=Ur(r);if(i)throw new t(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});if(!e.backend.typeText)throw new t(`UNSUPPORTED_OPERATION`,`type is not supported by this backend`);let a=x(n.delayMs??0,`delay-ms`,0,1e4),o=C(await e.backend.typeText(b(e,n),r,{delayMs:a}));return{kind:`text`,text:r,delayMs:a,...o?{backendResult:o}:{},...w(`Typed ${Array.from(r).length} chars`)}};async function Lr(e,n,r){let i=fe(n),a=i.needsPreActionBaseline?null:await zr(e,n,r);if(a)return a;let o=await he(e,n,{action:r,requireInteractive:!0,pipeline:S.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.tap)throw new t(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Rr(o),c;try{c=await e.backend.tap(b(e,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw Ar(e,o),e}let l=C(c);return await Te(e,n,o,{...o,...l?{backendResult:l}:{}},i)}function Rr(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function zr(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Vr(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Ce(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Br(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Ce(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Vr(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 Hr(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function Ur(e){return Wt(e)}function z(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Wr=S.wait.poll.defaultTimeoutMs;function B(e,t,n,r){let i=we(r),a=n??i.defaultTimeoutMs,o=V(e),s=Yr(),c=()=>Math.max(0,a-(V(e)-o));return{capture:async n=>{let r=!1,i=await pe(e,t,c(),async e=>await s.attempt(async()=>{let t=await n(e);return r=!0,t}));return i.timedOut?{timedOut:!0,deadline:s.readableCaptures()===0?`capture-stalled`:`capture-truncated`}:(r&&s.recordReadableCapture(),i)},hasTimeRemaining:()=>c()>0,failureEvidence:()=>({timeoutMs:a,readableCaptures:s.readableCaptures(),waitedMs:V(e)-o}),rethrowIfNeverReadable:s.rethrowIfNeverReadable,sleepUntilNextPoll:async()=>await Xr(e,t,Math.min(i.intervalMs,c())),timeoutMs:a,waitedMs:()=>V(e)-o}}function Gr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.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 Kr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.deadlineExceeded,captureTruncated:!0,...n})}function qr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.targetAbsent,...n})}function Jr(e,t,n){let r=t.failureEvidence();return n===`capture-stalled`?Gr(e,r):n===`capture-truncated`?Kr(e,r):(t.rethrowIfNeverReadable(),r.readableCaptures===0?Gr(e,r):qr(e,r))}function Yr(){let e=0,t;return{attempt:async e=>{try{return await e()}catch(e){if(!re(e))throw e;t=e;return}},recordReadableCapture:()=>{e+=1},readableCaptures:()=>e,rethrowIfNeverReadable:()=>{if(e===0&&t!==void 0)throw t}}}function V(e){return e.clock?.now()??Date.now()}async function Xr(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}function Zr(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Qr(e){let r=async(r,i)=>{if(i.target.kind===`sleep`)return await Xr(r,i,i.target.durationMs),{kind:`sleep`,waitedMs:i.target.durationMs};if(i.target.kind===`ref`){let o=await e.requireSnapshot(r,i.session),s=a(i.target.ref);if(!s)throw new t(`INVALID_ARGS`,`Invalid ref: ${i.target.ref}`);let c=n(o.snapshot.nodes,s),l=c?ke(c,o.snapshot.nodes):void 0;if(!l)throw new t(`COMMAND_FAILED`,`Ref ${i.target.ref} not found or has no label`);return await ti(e,r,i,l,i.target.timeoutMs)}if(i.target.kind===`selector`)return await $r(e,r,i,i.target.selector,i.target.timeoutMs,i.target.recordedLandmark);if(i.target.kind===`stable`)return await ri(e,r,i,i.target.quietMs,i.target.timeoutMs);let o=d(i.target.text);if(!o.ok)throw new t(o.code,o.message);return await ti(e,r,i,i.target.text,i.target.timeoutMs)};return{waitCommand:r,waitForTextCommand:async(e,n)=>{let i=await r(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(i.kind!==`text`)throw new t(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function $r(e,n,r,i,a,o){let s=B(n,r,a,S.wait),c=z(),l,u;for(;s.hasTimeRemaining();){let t=await s.capture(async t=>await e.captureSnapshot(n,{...r,signal:t},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(t.timedOut){u=t.deadline;break}let a=t.value;if(a){let e=a.snapshot.nodes,t=Zr(await v(S.wait,e,i,{platform:n.backend.platform}));if(t){let n=ei(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new t(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:be,...l}):Jr(`wait timed out for selector: ${i}`,s,u)}function ei(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=Ie(e),a=ve(t.matchedNodes,i,te(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:p(r),observedAncestry:ye(r,i,Math.max(n.ancestry.length,1)).chain}}}async function ti(e,t,n,r,i){let a=B(t,n,i,S.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>t.backend.findText?(await t.backend.findText(ii(t,{...n,signal:i}),r)).found:await ni(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 Jr(`wait timed out for text: ${r}`,a,o)}async function ni(e,t,n,r){return!!ge((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}async function ri(e,n,r,i,a){let o=a??Wr,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new t(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:T.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}function ii(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const ai=Qr({captureSnapshot:_,requireSnapshot:de,stable:{defaultQuietMs:500,tinyTreeHint:Ee,tinyTreeNodeCount:5,capture:me}}),oi=ai.waitCommand,si=ai.waitForTextCommand,ci=async(e,n)=>{let r=n.locator??`any`;if(!n.query)throw new t(`INVALID_ARGS`,se);if(n.action===`wait`)return await mi(e,n,r);if(n.action===`list`)return await hi(e,n,r);let{capture:i,match:a}=await gi(e,n,r);if(!a)throw new t(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await Ue(e,i,a),node:a}},H=async(e,t)=>{if(t.target.kind===`ref`){let n=await de(e,t.session),r=Oe(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`});xe(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=f(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 Ue(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await _i(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?S.readText:S.readUnique,hooks:{onResolved:(e,n)=>xe(e,n,t.expectedResolvedTarget,`get`)}}),r=f(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 Ue(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}},li=async(e,n)=>{let r=await H(e,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new t(`COMMAND_FAILED`,`getText returned non-text result`);return r},ui=async(e,n)=>{let r=await H(e,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new t(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r},di=async(e,n)=>{let r=ie(n.predicate);if(!r.ok)throw new t(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`text`&&!n.expectedText)throw new t(`INVALID_ARGS`,m);let a=n.selector,o=await _(e,n,{updateSession:!0,...z(i)});if(i===`exists`){let n=await v(S.readAny,o.snapshot.nodes,a,{platform:e.backend.platform});if(n.kind!==`target`)throw new t(`COMMAND_FAILED`,g(a,[],{unique:!1}),{hint:h([])});return{predicate:i,pass:!0,selector:n.selector,matches:n.matches,selectorChain:ae(a)}}let s=await v(S.readUnique,o.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,t)=>xe(e,t,n.expectedResolvedTarget,`is`)});if(s.kind!==`target`)throw new t(`COMMAND_FAILED`,g(a,[],{unique:!0}),{command:`is`,reason:`selector_not_found`,predicate:i,selector:a,hint:h([])});let c=s,l=oe({predicate:i,node:c.node,nodes:o.snapshot.nodes,expectedText:n.expectedText,platform:e.backend.platform});if(!l.pass)throw new t(`COMMAND_FAILED`,`is ${i} failed for selector ${c.selector}: ${l.details}`,{command:`is`,reason:`predicate_failed`,predicate:i,selector:c.selector,predicateDetails:l.details});return{predicate:i,pass:!0,selector:c.selector,...i===`text`?{text:l.actualText}:{},selectorChain:ae(a),node:c.node,preActionNodes:o.snapshot.nodes}},fi=async(e,t)=>await di(e,{...t,predicate:`visible`,selector:t.target.selector}),pi=async(e,t)=>await di(e,{...t,predicate:`hidden`,selector:t.target.selector});async function mi(e,t,n){let r=B(e,t,t.timeoutMs,S.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await gi(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 Jr(`find wait timed out`,r,i)}async function hi(e,t,n){let r=ne(n,t.query),i=await _(e,t,{updateSession:!0,...z()});if(Ye(i.snapshot.snapshotQuality))throw De(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Ae(S.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ce(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function gi(e,t,n,r){let i=ne(n,t.query),a=await _(e,t,{updateSession:!0,scope:_e(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...z()});if(Ye(a.snapshot.snapshotQuality))throw De(a.snapshot.snapshotQuality);if(i){let t=await v(S.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ce(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function _i(e,n,r,i){let a=await _(e,{...n,session:r},{updateSession:!0,...z()}),o=await v(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,g(i.selector,[],{unique:!0}),{hint:h([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const vi=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Se(e,n,n.gesture.intent);let r=await Me(e,n),i=Ge(n.gesture,r,e.backend.platform),a=C(await e.backend.performGesture(b(e,n),i)),o=bi(i.pointers,0),s=bi(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(xi(n.gesture,o,s))}},yi=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Ne(e,{...t,gesture:n}):await vi(e,{...t,gesture:n})};function bi(e,n){let r=e.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new t(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function xi(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 U={find:ci,get:H,getText:li,getAttrs:ui,is:di,isVisible:fi,isHidden:pi,wait:oi,waitForText:si},W={click:Pr,press:Nr,fill:Fr,typeText:Ir,focus:je,longPress:He,hover:ze,scroll:Ve,gesture:yi,settleObservation:Be};function Si(e){return{find:t=>U.find(e,t),get:t=>U.get(e,t),getText:(t,n={})=>U.getText(e,{...n,target:t}),getAttrs:(t,n={})=>U.getAttrs(e,{...n,target:t}),is:t=>U.is(e,t),isVisible:(t,n={})=>U.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>U.isHidden(e,{...n,target:t}),wait:t=>U.wait(e,t),waitForText:(t,n={})=>U.waitForText(e,{...n,text:t})}}function Ci(e){return{click:(t,n={})=>W.click(e,{...n,target:t}),press:(t,n={})=>W.press(e,{...n,target:t}),fill:(t,n,r={})=>W.fill(e,{...r,target:t,text:n}),typeText:(t,n={})=>W.typeText(e,{...n,text:t}),focus:(t,n={})=>W.focus(e,{...n,target:t}),longPress:(t,n={})=>W.longPress(e,{...n,target:t}),hover:(t,n={})=>W.hover(e,{...n,target:t}),scroll:t=>W.scroll(e,t),gesture:t=>W.gesture(e,t),settleObservation:t=>W.settleObservation(e,t)}}function G(e,t){if(e!==void 0)return K(e,t)}function K(e,n){let r=e?.trim();if(!r)throw new t(`INVALID_ARGS`,`${n} must be a non-empty string`);return r}const wi=async(e,n={})=>{if(!e.backend.listDevices)throw new t(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(b(e,n),n.filter)}},Ti=async(e,n={})=>{if(!e.backend.bootDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let r=Pi(n.target),i=C(await e.backend.bootDevice(b(e,n),r));return{kind:`deviceBooted`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(`Booted device`)}},Ei=async(e,n={})=>{if(!e.backend.shutdownDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let r=Pi(n.target),i=C(await e.backend.shutdownDevice(b(e,n),r));return{kind:`deviceShutdown`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(`Shutdown device`)}},Di=async(e,t)=>await q(e,t,`install`),Oi=async(e,t)=>await q(e,t,`reinstall`),ki=async(e,t)=>await q(e,t,`installFromSource`);async function q(e,n,r){let i=r===`reinstall`?`reinstallApp`:`installApp`,a=e.backend[i];if(!a)throw new t(`UNSUPPORTED_OPERATION`,`admin.${r} is not supported by this backend`);let o=`app`in n&&n.app!==void 0?K(n.app,`app`):void 0;if(r!==`installFromSource`&&!o)throw new t(`INVALID_ARGS`,`admin.${r} requires app`);let s=b(e,n),c=await Ai(e,s,n.source);try{let t=await a.call(e.backend,s,{...o?{app:o}:{},source:c.source});return Fi(r,o,c.source,t)}finally{await c.cleanup?.()}}async function Ai(e,t,n){let r=await ji(e,Mi(n));try{return{source:Mi(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 ji(e,t){if(t.kind===`url`)return{source:t};let n=await I(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function Mi(e){if(!e||typeof e!=`object`)throw new t(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:K(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:K(e.id,`source.id`)};if(e.kind===`url`){let t=K(e.url,`source.url`);return Ni(t),{kind:`url`,url:t}}throw new t(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function Ni(e){let n;try{n=new URL(e)}catch{throw new t(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new t(`INVALID_ARGS`,`Install source URL must use http or https`)}function Pi(e){if(!e)return;let t=G(e.id,`target.id`),n=G(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 Fi(e,t,n,r){let i=C(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=J(r,`appName`),s=J(r,`appId`),c=J(r,`bundleId`),l=J(r,`packageName`),u=J(r,`launchTarget`),d=J(r,`installablePath`),f=J(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...w(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??Ii(n)}`)}}function J(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function Ii(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const Li=/^[A-Za-z0-9_.:-]{1,64}$/,Ri=async(e,n)=>{if(!e.backend.openApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let r=Wi(n),i=C(await e.backend.openApp(Y(e,n),r,{launchArgs:n.launchArgs,relaunch:n.relaunch}));return{kind:`appOpened`,target:r,relaunch:n.relaunch===!0,...i?{backendResult:i}:{},...w(`Opened: ${Ki(r)}`)}},zi=async(e,n={})=>{if(!e.backend.closeApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let r=G(n.app,`app`),i=C(await e.backend.closeApp(Y(e,n),r));return{kind:`appClosed`,...r?{app:r}:{},...i?{backendResult:i}:{},...w(r?`Closed: ${r}`:`Closed app`)}},Bi=async(e,n={})=>{if(!e.backend.listApps)throw new t(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Y(e,n),Xe(n.filter))}},Vi=async(e,n)=>{if(!e.backend.getAppState)throw new t(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let r=K(n.app,`app`);return{kind:`appState`,app:r,state:await e.backend.getAppState(Y(e,n),r)}},Hi=async(e,n)=>{if(!e.backend.pushFile)throw new t(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let r=K(n.app,`app`),i=await qi(e,n.input);try{let t=C(await e.backend.pushFile(Y(e,n),i.backendInput,r));return{kind:`appPushed`,app:r,inputKind:i.inputKind,...t?{backendResult:t}:{},...w(`Pushed to ${r}`)}}finally{await i.cleanup?.()}},Ui=async(e,n)=>{if(!e.backend.triggerAppEvent)throw new t(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let r=Ji(n.name);Yi(n.payload,`apps.triggerEvent payload for "${r}"`);let i=C(await e.backend.triggerAppEvent(Y(e,n),{name:r,...n.payload?{payload:n.payload}:{}}));return{kind:`appEventTriggered`,name:r,...n.payload?{payload:n.payload}:{},...i?{backendResult:i}:{},...w(`Triggered app event: ${r}`)}};function Wi(e){let n=G(e.app,`app`),r=G(e.appId,`appId`),i=G(e.bundleId,`bundleId`),a=G(e.packageName,`packageName`),o=G(e.url,`url`),s=G(e.activity,`activity`),c={...n?{app:n}:{},...r?{appId:r}:{},...i?{bundleId:i}:{},...a?{packageName:a}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!Gi(c))throw new t(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function Gi(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function Ki(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function qi(e,n){if(!n||typeof n!=`object`)throw new t(`INVALID_ARGS`,`apps.push requires an input`);if(n.kind===`json`)return Xi(n.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:n.payload},inputKind:`json`};let r=await I(e,n,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:r.path},inputKind:`file`,...r.cleanup?{cleanup:r.cleanup}:{}}}function Ji(e){let n=K(e,`name`);if(!Li.test(n))throw new t(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return n}function Yi(e,t){e!==void 0&&Xi(e,t,8192)}function Xi(e,n,r){if(Zi(e,n),Buffer.byteLength(Qi(e,n),`utf8`)>r)throw new t(`INVALID_ARGS`,`${n} exceeds ${r} bytes`)}function Zi(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a JSON object`)}function Qi(e,n){try{let r=JSON.stringify(e);if(typeof r!=`string`)throw new t(`INVALID_ARGS`,`${n} must be JSON-serializable`);return r}catch{throw new t(`INVALID_ARGS`,`${n} must be JSON-serializable`)}}function Y(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const $i={open:Ri,close:zi,list:Bi,state:Vi,push:Hi,triggerEvent:Ui},ea={devices:wi,boot:Ti,shutdown:Ei,install:Di,reinstall:Oi,installFromSource:ki};function ta(e){return{...y($i,e),list:(t={})=>$i.list(e,{...t,filter:Ze(t.filter)})}}const na=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,ra=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function ia(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(ra,()=>(t=!0,`[REDACTED]`)),n=oa(n,()=>{t=!0}),{value:n,redacted:t}}function aa(e){try{let t=new URL(e),n=sa(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function oa(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=aa(e);return n?(n.redacted&&t(),n.value):e}):e}function sa(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))na.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const X=2048,ca=4096,la=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function ua(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=Q(e.message,ca),r=_a(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 da(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?ma(e.url):void 0,i=t===`headers`||t===`all`?pa(e.requestHeaders):void 0,a=t===`headers`||t===`all`?pa(e.responseHeaders):void 0,o=t===`body`||t===`all`?ha(e.requestBody):void 0,s=t===`body`||t===`all`?ha(e.responseBody):void 0,c=_a(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 fa(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=Q(e.message,ca),r=_a(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 pa(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(la.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=Q(i,X);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function ma(e){return aa(e)??Q(e,X)}function ha(e){return e===void 0?{redacted:!1}:ga(e)??Q(e,X)}function ga(e){try{let t=Z(JSON.parse(e),ia);return va(JSON.stringify(t.value),X,t.redacted)}catch{return}}function _a(e){return Z(e,e=>Q(e,X))}function Z(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=Z(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(la.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Z(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function Q(e,t){if(e===void 0)return{redacted:!1};let n=ia(e);return va(n.value,t,n.redacted)}function va(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 ya=async(e,n={})=>{if(!e.backend.readLogs)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return ua(await e.backend.readLogs(await Sa(e,n),Ca(n)))},ba=async(e,n={})=>{if(!e.backend.dumpNetwork)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let r=wa(n);return da(await e.backend.dumpNetwork(await Sa(e,n),r),r.include??`summary`)},xa=async(e,n={})=>{if(!e.backend.measurePerf)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return fa(await e.backend.measurePerf(await Sa(e,n),Ta(n)))};async function Sa(e,t){let n=b(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 Ca(e){return{...Ea(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:ka(e.levels,`levels`)},...e.search===void 0?{}:{search:K(e.search,`search`)},...e.source===void 0?{}:{source:K(e.source,`source`)}}}function wa(e){return{...Ea(e,25,200,`network limit`),include:Oa(e.include)}}function Ta(e){return{...Da(e),...e.sampleMs===void 0?{}:{sampleMs:x(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:ka(e.metrics,`metrics`,20)}}}function Ea(e,t,n,r){return{...Da(e),...e.cursor===void 0?{}:{cursor:K(e.cursor,`cursor`)},limit:e.limit===void 0?t:x(e.limit,r,1,n)}}function Da(e){return{...e.since===void 0?{}:{since:K(e.since,`since`)},...e.until===void 0?{}:{until:K(e.until,`until`)}}}function Oa(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new t(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function ka(e,n,r=50){if(!Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be an array of strings`);if(e.length>r)throw new t(`INVALID_ARGS`,`${n} must contain at most ${r} entries`);return e.map((e,t)=>K(e,`${n}[${t}]`))}const Aa={logs:ya,network:ba,perf:xa},ja=async(e,n)=>{let r=Ia(n.action,`record`),i=r===`start`?e.backend.startRecording:e.backend.stopRecording;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`record ${r} is not supported by this backend`);let a=n.out?await L(e,n.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let t=Na(n,a?.path);return La(r,await i.call(e.backend,b(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}},Ma=async(e,n)=>{let r=Ia(n.action,`trace`),i=r===`start`?e.backend.startTrace:e.backend.stopTrace;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`trace ${r} is not supported by this backend`);let a=n.out?await L(e,n.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let t={...a?.path?{outPath:a.path}:{}};return Ra(r,await i.call(e.backend,b(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}};function Na(e,t){let n={};t&&(n.outPath=t);let r=Pa(e.fps);r!==void 0&&(n.fps=r);let i=Fa(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function Pa(e){return e===void 0?void 0:x(e,`fps`,1,60)}function Fa(e){if(e===void 0)return;let n=We(e);if(n===void 0)throw new t(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return n}function Ia(e,n){if(e===`start`||e===`stop`)return e;throw new t(`INVALID_ARGS`,`${n} action must be start or stop`)}function La(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}:{},...za(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function Ra(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...za(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function za(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...w(e===`start`?r.startMessage:r.stopMessage)}}const Ba={record:ja,trace:Ma},Va=async(e,n={})=>{if(!e.backend.pressBack)throw new t(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let r=n.mode??`in-app`;if(r!==`in-app`&&r!==`system`)throw new t(`INVALID_ARGS`,`system.back mode must be in-app or system`);let i=C(await e.backend.pressBack(b(e,n),{mode:r}));return{kind:`systemBack`,mode:r,...i?{backendResult:i}:{},...w(`Back`)}},Ha=async(e,n={})=>{if(!e.backend.pressHome)throw new t(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let r=C(await e.backend.pressHome(b(e,n)));return{kind:`systemHome`,...r?{backendResult:r}:{},...w(`Home`)}},Ua=async(e,n)=>{if(!e.backend.pressTvRemote)throw new t(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let r=Ke(n.button),i=n.durationMs===void 0?void 0:x(n.durationMs,`durationMs`,0,1e4),a=C(await e.backend.pressTvRemote(b(e,n),{button:r,...i===void 0?{}:{durationMs:i}}));return{kind:`tvRemotePressed`,button:r,...i===void 0?{}:{durationMs:i},...a?{backendResult:a}:{},...w(`Pressed TV remote ${r}`)}},Wa=async(e,n)=>{if(!e.backend.setOrientation)throw new t(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let r=Xa(n.orientation),i=C(await e.backend.setOrientation(b(e,n),r));return{kind:`systemOrientationSet`,orientation:r,...i?{backendResult:i}:{},...w(`Rotated to ${r}`)}},Ga=async(e,n={})=>{if(!e.backend.setKeyboard)throw new t(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let r=n.action??`status`;if(!qe(r))throw new t(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let i=await e.backend.setKeyboard(b(e,n),{action:r}),a=C(i),o=ao(i)?i:{};return r===`enter`||r===`return`?Qa(o,a):r===`dismiss`?$a(r,o,a):to(r,o,a)},Ka=async(e,n)=>{if(n.action===`read`){if(!e.backend.getClipboard)throw new t(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let r=await e.backend.getClipboard(b(e,n));return{kind:`clipboardText`,action:`read`,text:typeof r==`string`?r:r.text}}if(n.action!==`write`)throw new t(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new t(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof n.text!=`string`)throw new t(`INVALID_ARGS`,`system.clipboard write requires text`);let r=C(await e.backend.setClipboard(b(e,n),n.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(n.text).length,...r?{backendResult:r}:{},...w(`Clipboard updated`)}},qa=async(e,n={})=>{if(!e.backend.openSettings)throw new t(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let r=G(n.target,`target`),i=C(await e.backend.openSettings(b(e,n),r));return{kind:`settingsOpened`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(r?`Opened settings: ${r}`:`Opened settings`)}},Ja=async(e,n={})=>{if(!e.backend.handleAlert)throw new t(`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 t(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let i=n.timeoutMs===void 0?void 0:x(n.timeoutMs,`timeoutMs`,0,12e4);return Za(r,await e.backend.handleAlert(b(e,n),r,{timeoutMs:i}))},Ya=async(e,n={})=>{if(!e.backend.openAppSwitcher)throw new t(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let r=C(await e.backend.openAppSwitcher(b(e,n)));return{kind:`appSwitcherOpened`,...r?{backendResult:r}:{},...w(`Opened app switcher`)}};function Xa(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new t(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function Za(e,t){return e===`get`?no(t):e===`wait`?ro(t):io(e,t)}function Qa(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...w(`Keyboard enter pressed`)}}function $a(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...w(eo(t))}}function eo(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function to(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function no(e){if(e.kind!==`alertStatus`)throw new t(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function ro(e){if(e.kind!==`alertWait`)throw new t(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...w(e.alert?`Alert visible`:`Alert wait timed out`)}}function io(e,n){if(n.kind!==`alertHandled`)throw new t(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:n.handled,...n.alert?{alert:n.alert}:{},...n.button?{button:n.button}:{},...w(n.handled?`Alert ${e}ed`:`No alert handled`)}}function ao(e){return!!(e&&typeof e==`object`)}const oo={back:Va,home:Ha,orientation:Wa,keyboard:Ga,clipboard:Ka,settings:qa,alert:Ja,appSwitcher:Ya,tvRemote:Ua};function so(e){return{capture:y(Or,e),selectors:Si(e),interactions:Ci(e),system:y(oo,e),apps:ta(e),admin:y(ea,e),recording:y(Ba,e),observability:y(Aa,e)}}var co=e({createAgentDevice:()=>lo,createMemorySessionStore:()=>uo,localCommandPolicy:()=>po,restrictedCommandPolicy:()=>mo});function lo(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??uo(),policy:e.policy??mo(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...so(t)}}function uo(e=[]){let t=new Map(e.map(e=>[e.name,$(e)]));return{get:e=>$(t.get(e)),set:e=>{t.set(e.name,$(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>$(e))}}function $(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:fo(e.metadata)}:{}}}function fo(e){try{return structuredClone(e)}catch{return{...e}}}function po(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function mo(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{ar as a,ut as c,D as d,Et as f,jr as i,dt as l,po as n,Qn as o,co as r,Wt as s,lo as t,ft as u};
1
+ import{r as e}from"./rolldown-runtime.js";import{A as t,C as n,S as r,f as i,g as a,m as o,p as s,w as c}from"./sdk-contracts.js";import{p as l}from"./capture.js";import{r as u,t as d}from"./snapshot-capture-annotations.js";import{f,l as p,n as m}from"./android-input-ownership.js";import{Bn as h,Cn as g,Dr as _,Er as ee,Fn as v,Gn as te,Hn as y,In as ne,Lr as re,Mn as ie,Nn as ae,Nr as oe,On as se,Or as ce,Pn as le,Pr as ue,Sn as de,Tn as fe,Tr as pe,Un as me,Vn as he,Vr as ge,_n as _e,an as ve,bn as ye,cr as be,gn as xe,gr as Se,hn as b,jr as x,kr as Ce,lr as we,rr as Te,ur as Ee,xr as S,yn as De,zn as Oe}from"./sdk-batch.js";import{n as ke}from"./snapshot-scope.js";import{r as Ae}from"./recording-export-quality.js";import{n as C}from"./success-text.js";import{a as je,d as Me,f as Ne,i as Pe,l as Fe,n as Ie,o as Le,p as Re,r as ze,t as Be,u as Ve}from"./app-inventory-contract.js";import{n as He,t as Ue}from"./mobile-snapshot-semantics.js";import{n as We,r as Ge}from"./app-inventory.js";import{a as Ke,n as qe,o as Je,t as Ye}from"./react-native-overlay.js";import{r as Xe}from"./tv-remote.js";import{i as w,n as T,t as Ze}from"./rect-center.js";import{a as Qe,n as $e,t as et}from"./gesture-plan.js";import{n as tt,o as nt,r as rt}from"./android-system-chrome.js";import{t as it}from"./keyboard-actions.js";import{a as at}from"./png-worker-contract.js";import{a as ot,c as st,l as ct,n as lt,s as ut,t as dt}from"./snapshot-quality-verdict.js";import{n as ft}from"./ios-snapshot-acquisition.js";import{r as pt}from"./ios-system-surface.js";import mt from"node:path";import{promises as E}from"node:fs";import{createHash as ht}from"node:crypto";function gt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function _t(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=y(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function vt(e,t,n,r){return e.filter(e=>{if(!he(y(e),n))return!1;let i=_t(e,t,Math.max(r.length,1));return!i.broken&&h(i.chain,r)})}const yt=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,bt=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],xt=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function St(e){if(Ct(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 Ct(e){let t=wt(e),n=t.detected?Tt(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function wt(e){let t=e.map(Et).join(`
3
+ `).toLowerCase(),n=zt(e,Nt),r=zt(e,Je),i=zt(e,qe,Lt),a=zt(e,Mt),o=Ot(t),s=kt(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:jt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:At(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function Tt(e){let t=Bt(e.dismissNodes);if(t)return Ut(t,Wt(t));let n=Gt(e.collapsedNodes.filter(Rt));return n?.rect?{action:`close-collapsed-banner`,point:Xt(n),rect:n.rect,ref:n.ref,label:Qt(n)}:null}function Et(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function Dt(e){return yt.test(e)}function Ot(e){return bt.some(t=>t.test(e))}function kt(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function At(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function jt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(Dt(e.text)||e.hasReactNativeStackFrame)}function Mt(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Nt(e){return Ke(e)||Pt(e)||Ft(e)}function Pt(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function Ft(e){return xt.has(e)}function It(e){return/^!,\s+/.test(e)}function Lt(e){return!e.rect||e.rect.height<=180}function Rt(e){let t=Qt(e)?.trim().toLowerCase()??``;return(Mt(t)||It(t))&&Ye(e)}function zt(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 Bt(e){return Kt(e,Ht)}function Vt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Ht(e){return[Jt(Vt(e)),Jt(e.hittable),-(e.rect?ge(e.rect):1/0)]}function Ut(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:s(e.rect),rect:e.rect,ref:e.ref,label:Qt(e)}}function Wt(e){let t=Qt(e)?.trim().toLowerCase();return t&&Ke(t)?`dismiss`:`close`}function Gt(e){return Kt(e,qt)}function Kt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Yt(t(n),t(e)))[0]??null}function qt(e){return[Jt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Jt(e){return+(e===!0)}function Yt(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 Xt(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(Zt(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 Zt(e,t,n){return Math.min(n,Math.max(t,e))}function Qt(e){return e.label??e.value??e.identifier}const $t=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),en={strippedIndexes:new Set,refs:new Set};function tn(e){let t=new Set(e.filter(e=>x(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return en;let n=new Map(e.map(e=>[e.index,e])),r=sn(e,n,t),i=new Set(r),a=hn(e,n,r);for(let t of sn(e,n,a))i.add(t);for(let o of nn(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 nn(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=an(t,n,r);if(o.size===0)return a;let s=on(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&rn(n,t,o)&&a.add(n.index);return a}function rn(e,t,n){if(!e.rect)return!1;let r=gn(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 an(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=gn(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 on(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 sn(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)_n(i,t,n)&&r.add(i.index);return r}function cn(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(tt(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(rt(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function ln(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(m).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:un(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?en:{strippedIndexes:o,refs:s}}function un(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&cn(e,t)).map(e=>e.index))}function dn(e,t){let n=tn(e),r=ln(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 fn(e,t){let{strippedIndexes:n}=dn(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function pn(e,t){return dn(e,t).refs}function mn(e){return tn(e).refs}function hn(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=gn(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>$t.has(x(e.type??``))&&!n.has(e.index)&&_n(e,t,a))&&r.delete(i)}return r}function gn(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 _n(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 D(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function vn(e,t,r){let i=Number(e[0]),a=Number(e[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new n(`INVALID_ARGS`,t,r);return{x:i,y:a}}function O(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function k(e){return e&&typeof e==`object`?e:void 0}const yn=[0,187,255,255];function bn(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||xn(e,n.rect)}function xn(e,t){let n=Sn(t);if(n==null)return;let r=wn(n.x,0,e.width-1),i=wn(n.y,0,e.height-1),a=wn(n.right,0,e.width-1),o=wn(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Cn(e,n,i+t,yn),Cn(e,n,o-t,yn);for(let n=i;n<=o;n+=1)Cn(e,r+t,n,yn),Cn(e,a-t,n,yn)}}function Sn(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 Cn(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 wn(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}function Tn(e){return e}function En(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 Dn=[{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 On(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(!jn(t,a,e))continue;let c=0,l=An(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=kn({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function kn(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 Dn){let o=s+e.x,u=c+e.y;if(!Mn(o,u,i,a))continue;let d=u*i+o;jn(t,n,d)&&(l=An(r,n,l,d))}return l}function An(e,t,n,r){return t[r]=1,e[n]=r,n+1}function jn(e,t,n){return e[n]===1&&t[n]!==1}function Mn(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function Nn(e,t){return e.flatMap(e=>Pn(e,t.baseline.width,t.baseline.height)?Fn(e,t,Vn(t.baseline.height)):[e])}function Pn(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Bn(n)&&r>=t*.35}function Fn(e,t,n){let r=zn(e,Rn(Ln(In(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])=>Hn(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function In(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 Ln(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 Rn(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 zn(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 Bn(e){return Math.max(48,Math.round(e*.07))}function Vn(e){return Math.max(24,Math.round(e*.03))}function Hn(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??=Un(t,a),Wn(i,e,t,a,r.baseline,r.current))}return i}function Un(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 Wn(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 Gn=2.5;function Kn(e){let t=qn(e);return Nn(t.length<=2e3?Xn(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)=>$n(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function qn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return On({mask:t,width:i,height:a,hooks:{create:e=>Jn(e,i),visit:(e,t)=>Yn(e,t,i,n,r)}})}function Jn(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 Yn(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 Xn(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=>Zn(e,r,t));if(!e){n.push({...r});continue}Qn(e,r)}return n}function Zn(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 Qn(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 $n(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=er(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=er(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Tn({x:A(r.x/n.width),y:A(r.y/n.height),width:A(r.width/n.width),height:A(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:A(e.differentPixels/n.differentPixels),densityPercentage:A(e.differentPixels/s),shape:rr(r,n.width,n.height),size:ir(s,n.totalPixels),location:tr(i,n.width,n.height),averageBaselineColorHex:or(a),averageCurrentColorHex:or(o),baselineLuminance:Math.round(ar(a)),currentLuminance:Math.round(ar(o)),dominantChange:nr(a,o)}}function er(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function tr(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 nr(e,t){let n=ar(t)-ar(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 rr(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*Gn?`horizontal-band`:e.height>=e.width*Gn?`vertical-band`:`compact`}function ir(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function ar(e){return e.r*.2126+e.g*.7152+e.b*.0722}function or(e){return`#${sr(e.r)}${sr(e.g)}${sr(e.b)}`}function sr(e){return e.toString(16).padStart(2,`0`)}function A(e){return Math.round(e*100*100)/100}const cr=255*Math.sqrt(3);async function lr(e,t,n={}){await ur(e,`Baseline image not found`),await ur(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([E.readFile(e),E.readFile(t)]),[o,s]=await Promise.all([st(i,`baseline screenshot`),st(a,`current screenshot`)]);dr(o.width,o.height,`baseline screenshot`,n.maxPixels),dr(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 fr(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*cr,{diffData:d,diffMask:f,differentPixels:p}=await ut({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Kn({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new at.PNG({width:o.width,height:o.height});e.data=d,bn(e,m),await E.mkdir(mt.dirname(r),{recursive:!0}),await E.writeFile(r,await ct(e))}else await fr(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 ur(e,t){try{await E.access(e)}catch{throw new n(`INVALID_ARGS`,`${t}: ${e}`)}}function dr(e,t,r,i){if(i==null||i<=0)return;let a=e*t;if(!(a<=i))throw new n(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function fr(e){if(e)try{await E.unlink(e)}catch(e){if(!pr(e,`ENOENT`))throw e}}function pr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function mr(e,t){return e.map(e=>{let n=hr(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function hr(e,t){let n=ge(e.rect);return t.map(t=>{let r=t.overlayRect,i=En(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:gr(i/ge(r)),regionCoveragePercentage:gr(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 gr(e){return Math.round(e*100*100)/100}async function _r(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new n(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw c(e)}}async function j(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new n(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw c(e)}}async function vr(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw c(e)}}const yr=async(e,t)=>{if(!t.baseline)throw new n(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=br(t.threshold),i=t.current??{kind:`live`};if(t.overlayRefs&&!Or(i))throw new n(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await _r(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let n;Or(i)?(s=await xr(e,t),n=s.path):(o=await _r(e,i,{usage:`diff screenshot current`,field:`current`}),n=o.path),c=t.out?await j(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await lr(a.path,n,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});Or(i)&&(u=await Sr(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function br(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new n(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function xr(e,t){let n=await vr(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Cr(e,t,n.path,wr(t))}catch(e){throw await n.cleanup(),e}return n}async function Sr(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Dr(n),r;let a=await j(e,Tr(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Cr(e,t,a.path,{overlayRefs:!0,...wr(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:mr(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Cr(e,t,r,i={}){if(!e.backend.captureScreenshot)throw new n(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},r,i)??{}}function wr(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Tr(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:Er(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:Er(e.out.clientPath)}:{},...e.out.fileName?{fileName:Er(e.out.fileName)}:{}}}function Er(e){let t=mt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Dr(e){try{await E.unlink(Er(e))}catch(e){if(!kr(e,`ENOENT`))throw e}}function Or(e){return e.kind===`live`}function kr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Ar=async(e,t)=>{if(!e.backend.captureScreenshot)throw new n(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);l(t);let r=await j(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},r.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),t.scale!==void 0&&await ot(r.path,t.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...C(`Saved screenshot: ${r.path}`)}};function jr(e,t){let n=Me(e.type??`Element`),r=Ve(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 Mr(e,t,n={}){let r=Fr(Pr(e,n),Pr(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 Nr(e,t={}){return Pr(e,t).length}function Pr(e,t){return t.flatten?e.map(e=>({text:Ne(e,0,!1),comparable:jr(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Fe(e).map(e=>({text:e.text,comparable:jr(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Fr(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=Lr(a,i,s)?M(a,i+1):M(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 Ir(o,e,t,n,r)}}return[]}function Ir(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=Lr(i,c,r)?c+1:c-1,u=M(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 Lr(e,t,n){return t===-n||t!==n&&M(e,t-1)<M(e,t+1)}function M(e,t){return e.get(t)??0}function Rr(e,t){return[...Vr(e),...zr(e),...Ur(e),...Wr(e,t)]}function zr(e){let t=e.customActions;if(!t)return[];let n=[];return t.blocked?n.push(`Custom actions were not read: an earlier accessibility read is still hung, so this capture skipped the read pass instead of queueing behind it. No element’s actions list is authoritative here. Reads resume once that call returns.`):t.read<t.candidates&&n.push(`Custom actions were read for ${t.read} of ${t.candidates} merged elements, on-screen ones first; the remaining ${t.candidates-t.read} were not read, so an absent actions list on those is not evidence that they have none. Scroll them into view and re-run to read them.`),t.truncated>0&&n.push(`${t.truncated} element(s) published more custom actions than are shown; those lists are clipped to the first 8 names, and long names are shortened.`),n}function Br(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function Vr(e){return e.state===`recovered`?e.reasonCode===`deferred`||e.reasonCode===`requested-backend`?[]:e.reasonCode===`presentation-failed`?[`Agent Device could not safely present the captured accessibility tree and fell back to the ${e.backend} snapshot backend. This is an Agent Device runner bug, not an app accessibility-tree issue. Use screenshot as visual truth and report snapshotQuality.reason with the screenshot.`]:[Br(e.backend)]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Its refs and selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`,...Hr(e)]:[]}function Hr(e){return e.reasonCode===`sparse-tree`?[`This screen publishes no accessibility content at all; assistive technologies see the same empty tree, so it is worth flagging as an app accessibility bug rather than only an automation limitation.`]:[]}function Ur(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; this tree is capped at depth ${e.effectiveDepth}. Re-run with --depth ${e.effectiveDepth} --scope <container> only if you need deeper content.`]}function Wr(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many 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.`)}return n}function Gr(e){let{nodes:t,backend:n,snapshotRaw:i}=e;if(i||!r(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Ue(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const Kr=`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 qr(e){return e?.systemSurfaceOnly===!0?Kr:void 0}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 Jr(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Yr(e,t){return e.presentationKey?e:{...e,presentationKey:i(t)}}function Xr(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||!Zr(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Qr(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 Zr(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Qr(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>ei(e,t.nodes[n]))}const $r=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 ei(e,t){return $r.every(n=>e[n]===t[n])&&ti(e.rect,t.rect)&&ni(e.presentationHints,t.presentationHints)&&ni(e.actions,t.actions)}function ti(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function ni(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const ri=async(e,t)=>{let n=await ai(e,t),r=Xr({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(si(t.session,n));let i=li(n.snapshot);return f(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:Gr({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...d({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...ci(n)})},ii=async(e,t)=>{let n=await ai(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=si(t.session,n);if(!i){let t=Nr(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=Mr(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 ai(e,t){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:t.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),o=oi(a,e),s=f(o,Yr(o,t)),c=u(a),l=P(e);return{snapshot:s,result:a,session:i,annotations:c,warnings:ui({result:a,annotations:c,snapshot:s,options:t,session:i,capturedAt:s.createdAt??l,runtimeNow:l})}}function oi(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t)}}function si(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 ci(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 li(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ft(e.producer)===`unavailable`&&void 0:e.truncated}function ui(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Rr(e.annotations.quality,e.snapshot.nodes)),t.push(...hi(e)),e.annotations.quality||(t.push(...fi(e)),t.push(...mi(e.snapshot.nodes)));let n=St(e.snapshot.nodes);n&&t.push(n);let r=di(e.annotations);r&&t.push(r);let i=gi(e);return i&&t.push(i),t.push(...bi(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function di(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Kr}function fi(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return pi(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 pi(e){return e?x(e.type??``)===`application`:!1}function mi(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 hi(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 gi(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&_i(t,e.snapshot)&&vi(t,e.capturedAt,e.runtimeNow)&&xi(t.nodes.length,e.snapshot.nodes.length))return yi}function _i(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function vi(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const yi=`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 bi(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`?[yi]:[]}function xi(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Si={screenshot:Ar,diffScreenshot:yr,snapshot:ri,diffSnapshot:ii},Ci={defaultTimeoutMs:1e4,intervalMs:300},F={promotedTarget:{resolution:b.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:b.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:b.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:b.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:b.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:b.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:b.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Ci},wait:{resolution:b.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Ci},readList:{resolution:b.readList,occlusion:`ignore`},findAct:{resolution:b.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:b.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},wi=new WeakMap;function Ti(e,t){Di(e)&&wi.set(e,t)}function Ei(e){return Di(e)?wi.get(e):void 0}function Di(e){return typeof e==`object`&&!!e||typeof e==`function`}function Oi(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ye(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?Ai(a):a.matchedNodes.length>1?ki(a):Ai(a)}let a=de(e,t,{...r,...xe({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:ki(a.firstMatch):{kind:`none`}}function ki(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Ai(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 ji(e,t,n){let r=ye(e,Se(t),n);return r?{...r,selector:r.selector.raw}:null}function Mi(e,t,n,r){let i=Oi(e,Se(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}const Ni=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function I(e){return[e.type,e.role,e.subrole].map(e=>x(e??``)).some(e=>e===`tab`||Ni.some(t=>e.includes(t)))}function Pi(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Xi(e);if(!Fi(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Hi(e,n,r).node;for(let n of t.slice(1))if(Hi(e,n,r).node.index!==i.index){let e=Li(t);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Fi(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(!Ii(i,a,t)&&!Ii(a,i,t))return!1}return!0}function Ii(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 Li(e){if(e.length<2||e.some(e=>e.hittable!==void 0))return null;let t=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!I(t)||!e.every(e=>e===t||!I(e)))return null;let n=T(t.rect);return n&&e.every(e=>Ri(T(e.rect),n))?t:null}function Ri(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 zi(e,t){if(!t?.rect||!e.rect||!pe(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 Bi(e,t){return Hi(e,t)}function Vi(e){let t=Xi(e);return n=>Hi(e,n,t)}function Hi(e,t,n){return p(t)?{node:t,reason:`covered`}:Ui(e,t,n)??Wi(t)??Gi(e,t,n)??{node:t,reason:`original`}}function Ui(e,t,n){let r=qi(e,t,n);return r?.rect&&w(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Wi(e){return I(e)&&e.rect&&w(e.rect)?{node:e,reason:`semantic-target`}:null}function Gi(e,t,n){let r=Ki(e,t,n);return!r?.rect||p(r)||!w(r.rect)?null:Ji(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Ki(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?ue(e,t,n.nodesByIndex,e=>r(e)?e:null):oe(e,t,r)}function qi(e,t,n){let r=T(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||p(e))return!1;let t=T(e.rect);return t?Ze(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function Ji(e,t,n,r){let i=T(e.rect),a=T(t.rect);if(!i||!a)return!1;if(Yi(t)&&!Ze(i,a))return!0;let o=ee(n,i,r?.viewportRootRects);return!o||!Zi(a,o)?!1:!Ze(i,a)}function Yi(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 Xi(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(pe(i)){let e=T(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function Zi(e,t){let n=En(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 L(e,t,n,r,i={}){let a=Mi(ea(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`ambiguous`)return{kind:`ambiguous`,selector:a.selector,selectorIndex:a.selectorIndex,matchedNodes:a.matchedNodes};let o=a.resolution,s=await $i(e,t,o.node,i);return s.kind===`occluded`?{kind:`occluded`,node:s.node,selector:o.selector}:{kind:`target`,node:s.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:o.matches,matchedNodes:a.matchedNodes}}function Qi(e,t,n,r){let i=ea(e,t);return{candidates:i,list:ji(i,n,{...r,requireRect:e.resolution.requireRect})}}async function $i(e,t,n,r={}){r.onResolved?.(n,t);let i=ta(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||p(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await na(e,t,i.node,r)}}function ea(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!p(e)):t}function ta(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=Bi(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&zi(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function na(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 ra(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function ia(e){return e.hittable===!0||I(e)}function aa(e,t){let n=ne(y(e),t);return n.id!==void 0||n.label!==void 0?!1:le(e.value)===null}function oa(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 sa(e,t){let n=gt(t);return t.filter(t=>t.index!==e.index&&oa(t,e,n)).sort((e,t)=>e.index-t.index)}function ca(e,t){let n=w(e.rect);return!n||!t.rect?!1:re(t.rect,n.x,n.y)}function la(e,t){if(!aa(e,t))return e;let n=sa(e,t);if(n.some(ia))return e;let r=n.find(e=>y(e).label!==void 0);return!r||!ca(r,e)?e:r}function ua(e,t){return e.find(e=>ke(e,t))??null}function R(e,t){let n=_(e);return n&&Ce(n)?n:da(e,t)}function da(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);if(!t||!Ce(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function fa(e){return e===`text`||e===`label`||e===`any`}function pa(e,t,n,r){if(!(r||e===`web`))return fa(t)?n:void 0}function ma(e){return new n(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function ha(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function z(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=ga(await i(N(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!dt(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:a,session:o,snapshot:s}}function ga(e,t){return e.snapshot?_a(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function _a(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 va(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 Re(n)}function ya(e,t,r){let i=a(t);if(!i)throw new n(`INVALID_ARGS`,r.invalidRefMessage);let s=o(e,i)??(r.fallbackLabel.length>0?ua(e,r.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,r.notFoundMessage);return{ref:i,node:s}}function ba(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 xa(e){let t=Buffer.alloc(16);for(let n of e)Ca(t,Sa(n));return{digest:`ax1:${ht(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Sa(e){return ht(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Ca(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function wa(e){let{digest:t,nodeCount:n}=xa(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Ta(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Ta(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function B(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function Ea(e,t){if(!(!e||e.surfaceBundleId===t.surfaceBundleId))return{from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`,disclosure:pt(t.surfaceBundleId)}}function Da(e,t){let n=wa(e.nodes),r=Ea(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==wa(t.nodes).digest;return{...n,changedFromBefore:i}}function Oa(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 ka(e,t,n={}){let r=T(t.rect),i=w(r??void 0);if(!r||!i)return{kind:`invalid`};let a=Aa(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?Ma(e,t):null,r),s=o?Na(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function Aa(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>ja(e,t,r)).filter(I).flatMap(e=>{let t=T(e.rect);if(!t||Ze(t,n))return[];let r=Ma(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 ja(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 Ma(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 Na(e,t,n,r){let i=Ra(e),a=Ia(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=Ia(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(!re(t,s.x,s.y))return[];let c=Pa(s,e,n,r,i);return c?[c]:[]})).sort(Fa)[0]?.point??null}function Pa(e,t,n,r,i){let a=La(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 Fa(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function Ia(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 La(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 Ra(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const V={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`},za=`replay_target_guard_mismatch`,Ba=V.landmarkIdentityMismatch;function Va(e,t,r,i){let{candidates:a,list:o}=Qi(i,e,t,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=Pi(a,s);if(l.kind===`ambiguous`)throw new n(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Ne(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)}}}function Ha(e,t,r,i,a){if(!r)return;let o=y(e),s=me(e,t);if(!(Oe(o,r.identity)&&te(s,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:za,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function H(e,t,n){return await uo(e,t,n.action),t.target.kind===`point`?await Wa(e,t,t.target,n):t.target.kind===`ref`?await Ja(e,t,t.target,n):await Ya(e,t,t.target,n)}async function Ua(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=S(i.snapshot.nodes).resolveViewport(a);if(!o)return;let s={x:n.x,y:n.y};if(!re(o,s.x,s.y))return`Coordinates (${s.x}, ${s.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.`}async function Wa(e,t,n,r){let i=await Ua(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Ga(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function Ga(e,t){try{return B((await U(e,t,!0)).snapshot)}catch{return}}function Ka(e,t){let r=a(e.ref);if(!r)throw new n(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=a(t.ref),o=t.node.ref?a(t.node.ref):null;if(i!==r||o!==r||!t.nodes.includes(t.node))throw new n(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:t.nodes,...t.iosSystemSurfaceBundleId?{surfaceBundleId:t.iosSystemSurfaceBundleId}:{}},resolved:eo(r,t.node,`exact`)}}async function qa(e,t,n){let r=await po(e,t,n);return{tree:B(r.snapshot),resolved:r.resolved}}async function Ja(e,t,n,r){let{tree:i,resolved:o}=r.preresolvedTarget?Ka(n,r.preresolvedTarget):await qa(e,t,n),s=i.nodes,c=await so({policy:r.pipeline,nodes:s,node:o.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Za(e,t,r),offscreen:async(i,a)=>await yo(e,t,i,a,n.ref,r)}});return{kind:`ref`,point:go(c,s,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${a(n.ref)??c.ref}`}}),target:{kind:`ref`,ref:`@${o.ref}`},...io(e,c,i,r.action,o.resolution)}}async function Ya(e,t,n,r){let i=n.selector,a=await U(e,t,r.requireInteractive),o=Va(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await U(e,t,!1),o=Va(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Xa({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,c=await so({policy:r.pipeline,nodes:a.snapshot.nodes,node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Za(e,t,r),offscreen:async(n,i)=>await vo(e,t,n,i,s.selector,r)}});return{kind:`selector`,point:go(c,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}}),target:{kind:`selector`,selector:o.selector},...io(e,c,B(a.snapshot),r.action,no(o,a.snapshot.nodes))}}async function Xa(e){let{runtime:t,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await L(F.coveredDiagnosis,r,i,{platform:t.backend.platform});if(s.kind===`occluded`)return co({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new n(`COMMAND_FAILED`,De(i,c,{unique:!0}),{reason:Pe.selectorNotFound,hint:g(c)})}function Za(e,t,n){Ha(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const Qa={source:`ref`,phase:`pre-action`,kind:`exact`},$a={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function eo(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Qa:$a}}const to={source:`runtime`,phase:`pre-action`,kind:`unique`};function no(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:ro(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>ro(e,t))}:to}function ro(e,t){let n=x(e.type??``),r=R(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:ba(n,256)}:{},...r===void 0?{}:{label:ba(r,256)}}}function io(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:ae(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:R(t,a),...oo(t,r),preAction:n,resolution:i,...ao(e,t,a,r)}}function ao(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=la(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:ae(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:R(i,n)}}}function oo(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 so(e){let t=await $i(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw co({label:e.label,node:t.node,action:e.action});return t.node}function co(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${lo(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function lo(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`}}async function U(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(N(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function uo(e,t,r){if(e.backend.platform!==`macos`)return;let i=await fo(e,t);if((i===`desktop`||i===`menubar`)&&(i!==`menubar`||r!==`click`&&r!==`press`))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function fo(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function po(e,t,r){let{session:i,snapshot:a}=await ha(e,t.session),o=r.fallbackLabel??``,s=ho(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:_e});return mo({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function mo(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=ho(o.nodes,r.ref,{fallbackLabel:i});return s&&Oe(y(a.node),y(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function ho(e,t,r){let i=a(t);if(!i)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=o(e,i);if(_o(s))return eo(i,s,`exact`);let c=r.fallbackLabel.length>0?ua(e,r.fallbackLabel):null;return _o(c)?eo(i,c,`label-fallback`):null}function go(e,t,r){let i=S(t),a=ka(t,e,{bounds:[i.resolveEffectiveViewport(e),e.rect?i.resolveViewport(e.rect):null].filter(e=>e!==null)});if(a.kind===`resolved`)return a.point;throw a.kind===`invalid`?new n(`COMMAND_FAILED`,r.invalidMessage):new n(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.blockedTargetDetails,competitorRefs:a.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:a.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function _o(e){return e?w(e.rect)!==null:!1}async function vo(e,t,n,r,i,{action:a}){return await Co(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=>`${bo(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 yo(e,t,n,r,i,{action:o}){return await Co(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:a(i)},hint:e=>`${bo(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 bo(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function xo(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=ho(o,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!s)return{};let c=F.resolvedTarget,l=await so({policy:c,nodes:o,node:s.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await yo(e,t,i,a,n.ref,{action:r,pipeline:c})}});return{...oo(l,r),node:l,preAction:B(i)}}async function So(e,t,n,r,i){let a=await xo(e,t,n,r),o=k(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:Qa,...a,...o?{backendResult:o}:{}}}async function Co(e,t,r,i,a){let o=S(i),s=r.rect?o.resolveEffectiveViewport(r):null;if(!r.rect||!s||o.isVisibleOnScreen(r))return r;let c=o.resolveViewport(r.rect),l=await e.backend.confirmOffscreenTargetVisible?.(N(e,t),r,c);if(l)return{...r,rect:l};let u=He(r,o);throw new n(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:s,...u?{scrollDirection:u}:{},hint:a.hint(u)})}async function wo(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 To(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Eo(e.nodes):e.nodes).map(ko);return n.sort((e,t)=>jo(e).localeCompare(jo(t))),{captureBackend:t,nodes:n}}function Eo(e){let t=S(e);return e.filter(e=>pe(e)||t.isVisibleOnScreen(e))}function Do(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 Oo(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 ko(e){return{identity:`${e.type??``}#${Ao(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Ao(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function jo(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Mo=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function No(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=lt(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 Bo(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??=Po(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let ee=To(c.snapshot);_=Io({baseline:l,signal:ee,requestedQuietMs:r,currentQuietMs:_}),u??=lt(c.snapshot.snapshotQuality);let v=P(e),te=Ro({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:v,timeoutMs:i,deadlineMs:o});if(te!==void 0){s=!0,o=te,g=v,p=ee,m=c.snapshot.nodes.length;let t=zo({nowMs:v,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Jr(e,t);continue}if(!Do(p,ee))p=ee,m=c.snapshot.nodes.length,g=v;else if(f>=2&&v-g>=_)return{settled:!0,stalled:!1,waitedMs:v-a,captures:f,nodeCount:m,lastCapture:h};let y=zo({nowMs:v,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(y<=0)break;await Jr(e,y)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Po(e,t,n){if(!e||!t||!Fo(t.backend,n))return;let r=t.nodes.some(pe),i=e.length<=5;if(!(!r&&!i))return To({...t,nodes:e})}function Fo(e,t){return e===`xctest`||e===void 0&&t===`ios`}function Io(e){return e.requestedQuietMs<500||!Oo(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Lo(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Ro(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Lo(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function zo(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 Bo(e,t,n,r){let i=await wo(e,t,n,async n=>await z(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Vo=`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.`,Ho=`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 Uo(e,t,n){return await Go(e,t,{...n,baseline:await Jo(e,t,n.resolved),actionPoint:n.resolved.point})}const Wo=async(e,t)=>(await Go(e,t,t)).observation;async function Go(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 Ko(e,t,n,a,await No(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 Ko(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?Ho:Vo}};let{stored:o,session:s}=await ss(e,t,i.lastCapture),c=B(i.lastCapture.snapshot),l=c.nodes,u=Ea(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?$o(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...as(i,o,l.length,u)},settledCapture:c}}function qo(e,t){if(e)return Da(e,t)}async function Jo(e,t,n){let r=await e.sessions.get(t.session??`default`);return Yo(n,r)??Zo(n.preAction)??Xo(r)}function Yo(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?Zo(B(n)):void 0}function Xo(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?B(t):{nodes:[]}}function Zo(e){return e?.nodes.length?e:void 0}function Qo(e,t,n){let r=Mr(fn(e,n),fn(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=is(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 $o(e,t,n,r){let i=Qo(e,t,r);return{diff:i,...es(i,t,n,r)}}function es(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=pn(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)&&!ts(o.get(e),n))?{}:rs(t,i,r)}function ts(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 ns=new Set([`application`,`window`]);function rs(e,t,n){let r=pn(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!ns.has(Me(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=Me(e.type??`Element`),n=Ve(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function is(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 as(e,t,n,r){let i=os(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=Oa(r);return{hint:i===void 0?a:`${a} ${i}`}}function os(e,t,n){return e.stalled?{hint:Ho}:e.settled?t?n<5?{hint:Mo}:{}:{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:Vo}}async function ss(e,t,n){if(dt(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 cs(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function ls(e,t,n,r,i){let a=await us(e,t,n,i);return fs({...r,...a})}async function us(e,t,n,r){if(r.settle!==void 0){let i=await Uo(e,t,{...r.settle,resolved:n}),a=r.verify?qo(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ds(e,t,n);return i?{evidence:i}:{}}async function ds(e,t,n){try{return Da(B((await U(e,t,!0)).snapshot),n.preAction)}catch{return}}function fs(e){let t=e;if(t.targetHittable!==!1||!ps(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function ps(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 ms(e,t){let r=S(e),i=e.filter(r.isVisibleInEffectiveViewport).map(e=>e.rect).filter(hs),a=i.length>0?i:e.map(e=>e.rect).filter(hs);if(a.length===0)throw new n(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...a.map(e=>e.x)),s=Math.min(...a.map(e=>e.y)),c=Math.max(...a.map(e=>e.x+e.width)),l=Math.max(...a.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function hs(e){return!!(e&&e.width>0&&e.height>0)}async function gs(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||ms((await U(e,t,!1)).snapshot.nodes,`gesture`)}const _s=async(e,t)=>{let r=await H(e,t,{action:`focus`,requireInteractive:!0,pipeline:F.resolvedTarget});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=Ds(r),a=k(await e.backend.focus(N(e,t),i));return{...r,...a?{backendResult:a}:{},...C(`Focused (${i.x}, ${i.y})`)}},vs=async(e,t)=>{let r=cs(t),i=await H(e,t,{action:`longPress`,requireInteractive:!0,pipeline:F.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:D(t.durationMs,`durationMs`,0,12e4),o=Ds(i),s=k(await e.backend.longPress(N(e,t),o,{durationMs:a}));return await ls(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...C(`Long pressed (${o.x}, ${o.y})`)},r)},ys=async(e,t)=>{let r=cs(t),i=r.needsPreActionBaseline?null:await bs(e,t);if(i)return i;let a=await H(e,t,{action:`hover`,requireInteractive:!1,pipeline:F.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new n(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=Ds(a),s=k(await e.backend.hover(N(e,t),o));return await ls(e,t,a,{...a,...s?{backendResult:s}:{},...C(`Hovered (${o.x}, ${o.y})`)},r)};async function bs(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await So(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const xs=async(e,t)=>{if(!e.backend.performGesture)throw new n(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await uo(e,t,`drag`);let r=await gs(e,t),i=await Ss(e,t,`source`),a=await Ss(e,t,`destination`),o=et({from:Ds(i),to:Ds(a),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},r),s=k(await e.backend.performGesture(N(e,t),o)),{start:c,end:l}=Qe(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Cs(i),destination:Cs(a)},recording:ws(i,a),...s?{backendResult:s}:{},...C(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function Ss(e,t,n){let r=t.gesture[n];return await H(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:F.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Cs(e){if(e.kind===`point`||!e.resolution)throw new n(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function ws(e,t){let n=Ts(e),r=Ts(t),i=Es(e),a=Es(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Ts(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Es(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function Ds(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const Os=async(e,t)=>await js(e,t,`press`),ks=async(e,t)=>await js(e,t,`click`),As=async(e,t)=>{if(typeof t.text!=`string`)throw new n(`INVALID_ARGS`,`fill requires text`);let r=cs(t),i=r.needsPreActionBaseline?null:await Ps(e,t);if(i)return i;let a=await H(e,t,{action:`fill`,requireInteractive:!0,pipeline:F.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new n(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Ms(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&ce(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=k(await e.backend.fill(N(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Is(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await ls(e,t,a,{...a,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)};async function js(e,t,r){let i=cs(t),a=i.needsPreActionBaseline?null:await Ns(e,t,r);if(a)return a;let o=await H(e,t,{action:r,requireInteractive:!0,pipeline:F.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.tap)throw new n(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Ms(o),c;try{c=await e.backend.tap(N(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw Ti(e,o),e}let l=k(c);return await ls(e,t,o,{...o,...l?{backendResult:l}:{}},i)}function Ms(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ns(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Fs(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await So(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Ps(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await So(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Fs(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 Is(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function W(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ls=F.wait.poll.defaultTimeoutMs;function Rs(e,t,n,r,i={}){let a=ra(r),o=n??a.defaultTimeoutMs,s=K(e),c=Zs(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(K(e)-s));return{capture:async n=>{let r=!1,i=K(e)-s,a=t=>l.push({startedMs:i,durationMs:K(e)-s-i,outcome:t}),o=await wo(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(zs(r,c.lastUnobservedCause())),o;let f=Ys(o.error);return a(f?`runner-restart`:`deadline`),u=f??{},{timedOut:!0,deadline:Bs(f!==void 0,c.readableCaptures())}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:Vs(l),waitedMs:K(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await Qs(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>K(e)-s}}function zs(e,t){return e?`readable`:t?.outcome??`unreadable`}function Bs(e,t){return e?`runner-restart-exhausted`:t===0?`capture-stalled`:`capture-truncated`}function Vs(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function Hs(e,t){return new n(`COMMAND_FAILED`,e,{reason:V.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Us(e,t){return new n(`COMMAND_FAILED`,e,{reason:V.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Ws(e,t){return new n(`COMMAND_FAILED`,e,{reason:V.deadlineExceeded,captureTruncated:!0,...t})}function Gs(e,t){return new n(`COMMAND_FAILED`,e,{reason:V.targetAbsent,...t})}function Ks(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw qs(r.error,t);if(n)throw r.error}}function qs(e,t){let r=c(e);return new n(r.code,r.message,{reason:V.captureStalled,...r.details,...t},r)}function Js(e,t,n){let r=t.failureEvidence();return n===`runner-restart-exhausted`?Us(e,r):n===`capture-stalled`?(Ks(t,r,t.preserveUnreadableOnStall===!0),Hs(e,r)):n===`capture-truncated`?Ws(e,r):(Ks(t,r,!0),r.readableCaptures===0?Hs(e,r):Gs(e,r))}function Ys(e){if(!(e instanceof n))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...G(t,`runnerRestartReason`),...G(t,`runnerRestartCommand`),...G(t,`runnerRestartCommandId`),...G(t,`runnerInvalidatedSessionId`),...G(t,`runnerRestartSessionId`),...G(t,`logPath`),...G(t,`diagnosticId`)}}function G(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function Xs(e){return e instanceof n&&e.details?.retriable===!0}function Zs(e=nt){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(Xs(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function K(e){return e.clock?.now()??Date.now()}async function Qs(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 $s(e,t,n){let r=await L(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:Le(e,i)}}async function ec(e,t,n){let r=await $s(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Ie(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function tc(e,t,n,r,i){let a=je(n);if(a)throw Be(a,`wait`);let o=Rs(t,n,i,F.wait,{isUnreadableError:rc,preserveUnreadableOnStall:!0}),s=W(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await $s((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 Ie(r,a,`wait`);return a}catch(e){throw nt(e)?ze(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`?Js(`wait absent timed out for selector: ${r}`,o,l):c?nc(r,c,o.failureEvidence()):Js(`wait absent timed out for selector: ${r}`,o,l)}function nc(e,t,r){let i=t.matches!==1;return new n(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${i?`es`:``} remain`,{reason:V.targetPresent,selector:e,...r,matches:t.matches,firstMatch:t.firstMatch})}function rc(e){if(!(e instanceof n))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(t.observation===`sparse`||t.observation===`truncated`||t.observation===`unreadable`)}function ic(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function ac(e,t,r,i,a,o){let s=Rs(t,r,a,F.wait),c=W(),l,u;for(;s.hasTimeRemaining();){let n=await s.capture(async n=>await e.captureSnapshot(t,{...r,signal:n},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(n.timedOut){u=n.deadline;break}let a=n.value;if(a){let e=a.snapshot.nodes,n=ic(await L(F.wait,e,i,{platform:t.backend.platform}));if(n){let t=oc(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new n(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:Ba,...s.failureEvidence(),...l}):Js(`wait timed out for selector: ${i}`,s,u)}function oc(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=gt(e),a=vt(t.matchedNodes,i,v(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:y(r),observedAncestry:_t(r,i,Math.max(n.ancestry.length,1)).chain}}}async function sc(e,t,r,i,a){let o=a??Ls,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(t,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new n(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:V.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function cc(e,t,n,r,i){let a=Rs(t,n,i,F.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await lc(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 Js(`wait timed out for text: ${r}`,a,o)}async function lc(e,t,n,r){return t.backend.findText&&(await t.backend.findText(dc(t,n),r)).found?!0:await uc(e,t,n,r)}async function uc(e,t,n,r){return!!ua((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function dc(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function fc(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await Qs(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await pc(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await ac(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await tc(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await sc(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await mc(e,t,n,n.target.text,n.target.timeoutMs);default:return hc(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,r)=>{let i=await t(e,{...r,target:{kind:`text`,text:r.text,timeoutMs:r.timeoutMs}});if(i.kind!==`text`)throw new n(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function pc(e,t,r,i,s){let c=await e.requireSnapshot(t,r.session),l=a(i);if(!l)throw new n(`INVALID_ARGS`,`Invalid ref: ${i}`);let u=o(c.snapshot.nodes,l),d=u?R(u,c.snapshot.nodes):void 0;if(!d)throw new n(`COMMAND_FAILED`,`Ref ${i} not found or has no label`);return await cc(e,t,r,d,s)}async function mc(e,t,r,i,a){let o=be(i);if(!o.ok)throw new n(o.code,o.message);return await cc(e,t,r,o.text,a)}function hc(e){throw Error(`Unsupported wait target: ${String(e)}`)}const gc=fc({captureSnapshot:z,requireSnapshot:ha,stable:{defaultQuietMs:500,tinyTreeHint:Mo,tinyTreeNodeCount:5,capture:No}}),_c=gc.waitCommand,vc=gc.waitForTextCommand,yc=async(e,t)=>{let r=t.locator??`any`;if(!t.query)throw new n(`INVALID_ARGS`,fe);if(t.action===`wait`)return await Cc(e,t,r);if(t.action===`list`)return await wc(e,t,r);let{capture:i,match:a}=await Tc(e,t,r);if(!a)throw new n(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await va(e,i,a),node:a}},bc=async(e,t)=>{if(t.target.kind===`ref`){let n=await ha(e,t.session),r=ya(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`});Ha(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=ae(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 va(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Ec(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?F.readText:F.readUnique,hooks:{onResolved:(e,n)=>Ha(e,n,t.expectedResolvedTarget,`get`)}}),r=ae(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 va(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}},xc=async(e,t)=>{let r=await bc(e,{...t,property:`text`,target:t.target});if(r.kind!==`text`)throw new n(`COMMAND_FAILED`,`getText returned non-text result`);return r},Sc=async(e,t)=>{let r=await bc(e,{...t,property:`attrs`,target:t.target});if(r.kind!==`attrs`)throw new n(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r};async function Cc(e,t,n){let r=Rs(e,t,t.timeoutMs,F.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Tc(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 Js(`find wait timed out`,r,i)}async function wc(e,t,n){let r=ie(n,t.query),i=await z(e,t,{updateSession:!0,...W()});if(dt(i.snapshot.snapshotQuality))throw ma(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Qi(F.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:se(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Tc(e,t,n,r){let i=ie(n,t.query),a=await z(e,t,{updateSession:!0,scope:pa(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...W()});if(dt(a.snapshot.snapshotQuality))throw ma(a.snapshot.snapshotQuality);if(i){let t=await L(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:se(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Ec(e,t,r,i){let a=await z(e,{...t,session:r},{updateSession:!0,...W()}),o=await L(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new n(`COMMAND_FAILED`,De(i.selector,[],{unique:!0}),{hint:g([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const Dc=async(e,t)=>{let r=we(t.predicate);if(!r.ok)throw new n(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`absent`){let e=je(t);if(e)throw Be(e)}if(i===`text`&&!t.expectedText)throw new n(`INVALID_ARGS`,Te);let a=t.selector,o=await Oc(e,t,i,a);return i===`exists`?await kc(e,o,a):i===`absent`?await ec(o.snapshot,a,e.backend.platform):await Ac(e,t,o,i,a)};async function Oc(e,n,r,i){try{return await z(e,n,{updateSession:!0,...W(r)})}catch(e){throw r!==`absent`||t(e)?e:ze(i,e)}}async function kc(e,t,r){let i=await L(F.readAny,t.snapshot.nodes,r,{platform:e.backend.platform});if(i.kind!==`target`)throw new n(`COMMAND_FAILED`,De(r,[],{unique:!1}),{hint:g([])});return{predicate:`exists`,pass:!0,selector:i.selector,matches:i.matches,selectorChain:ve(r)}}async function Ac(e,t,r,i,a){let o=await L(F.readUnique,r.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,n)=>Ha(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw new n(`COMMAND_FAILED`,De(a,[],{unique:!0}),{command:`is`,reason:Pe.selectorNotFound,predicate:i,selector:a,hint:g([])});let s=Ee({predicate:i,node:o.node,nodes:r.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new n(`COMMAND_FAILED`,`is ${i} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:Pe.predicateFailed,predicate:i,selector:o.selector,predicateDetails:s.details});return{predicate:i,pass:!0,selector:o.selector,...i===`text`?{text:s.actualText}:{},selectorChain:ve(a),node:o.node,preActionNodes:r.snapshot.nodes}}const jc=async(e,t)=>await Dc(e,{...t,predicate:`visible`,selector:t.target.selector}),Mc=async(e,t)=>await Dc(e,{...t,predicate:`hidden`,selector:t.target.selector}),Nc=async(e,t)=>{if(!e.backend.performGesture)throw new n(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await uo(e,t,t.gesture.intent);let r=await gs(e,t),i=$e(t.gesture,r,e.backend.platform),a=k(await e.backend.performGesture(N(e,t),i)),o=Fc(i.pointers,0),s=Fc(i.pointers,-1);return{kind:t.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...C(Ic(t.gesture,o,s))}},Pc=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await xs(e,{...t,gesture:n}):await Nc(e,{...t,gesture:n})};function Fc(e,t){let r=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new n(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function Ic(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 q={find:yc,get:bc,getText:xc,getAttrs:Sc,is:Dc,isVisible:jc,isHidden:Mc,wait:_c,waitForText:vc},J={click:ks,press:Os,fill:As,focus:_s,longPress:vs,hover:ys,gesture:Pc,settleObservation:Wo};function Lc(e){return{find:t=>q.find(e,t),get:t=>q.get(e,t),getText:(t,n={})=>q.getText(e,{...n,target:t}),getAttrs:(t,n={})=>q.getAttrs(e,{...n,target:t}),is:t=>q.is(e,t),isVisible:(t,n={})=>q.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>q.isHidden(e,{...n,target:t}),wait:t=>q.wait(e,t),waitForText:(t,n={})=>q.waitForText(e,{...n,text:t})}}function Rc(e){return{click:(t,n={})=>J.click(e,{...n,target:t}),press:(t,n={})=>J.press(e,{...n,target:t}),fill:(t,n,r={})=>J.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>J.focus(e,{...n,target:t}),longPress:(t,n={})=>J.longPress(e,{...n,target:t}),hover:(t,n={})=>J.hover(e,{...n,target:t}),gesture:t=>J.gesture(e,t),settleObservation:t=>J.settleObservation(e,t)}}function Y(e,t){if(e!==void 0)return X(e,t)}function X(e,t){let r=e?.trim();if(!r)throw new n(`INVALID_ARGS`,`${t} must be a non-empty string`);return r}const zc=async(e,t={})=>{if(!e.backend.listDevices)throw new n(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(N(e,t),t.filter)}},Bc=async(e,t={})=>{if(!e.backend.bootDevice)throw new n(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let r=Xc(t.target),i=k(await e.backend.bootDevice(N(e,t),r));return{kind:`deviceBooted`,...r?{target:r}:{},...i?{backendResult:i}:{},...C(`Booted device`)}},Vc=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new n(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let r=Xc(t.target),i=k(await e.backend.shutdownDevice(N(e,t),r));return{kind:`deviceShutdown`,...r?{target:r}:{},...i?{backendResult:i}:{},...C(`Shutdown device`)}},Hc=async(e,t)=>await Gc(e,t,`install`),Uc=async(e,t)=>await Gc(e,t,`reinstall`),Wc=async(e,t)=>await Gc(e,t,`installFromSource`);async function Gc(e,t,r){let i=r===`reinstall`?`reinstallApp`:`installApp`,a=e.backend[i];if(!a)throw new n(`UNSUPPORTED_OPERATION`,`admin.${r} is not supported by this backend`);let o=`app`in t&&t.app!==void 0?X(t.app,`app`):void 0;if(r!==`installFromSource`&&!o)throw new n(`INVALID_ARGS`,`admin.${r} requires app`);let s=N(e,t),c=await Kc(e,s,t.source);try{let t=await a.call(e.backend,s,{...o?{app:o}:{},source:c.source});return Zc(r,o,c.source,t)}finally{await c.cleanup?.()}}async function Kc(e,t,n){let r=await qc(e,Jc(n));try{return{source:Jc(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 qc(e,t){if(t.kind===`url`)return{source:t};let n=await _r(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function Jc(e){if(!e||typeof e!=`object`)throw new n(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:X(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:X(e.id,`source.id`)};if(e.kind===`url`){let t=X(e.url,`source.url`);return Yc(t),{kind:`url`,url:t}}throw new n(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function Yc(e){let t;try{t=new URL(e)}catch{throw new n(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new n(`INVALID_ARGS`,`Install source URL must use http or https`)}function Xc(e){if(!e)return;let t=Y(e.id,`target.id`),n=Y(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 Zc(e,t,n,r){let i=k(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=Z(r,`appName`),s=Z(r,`appId`),c=Z(r,`bundleId`),l=Z(r,`packageName`),u=Z(r,`launchTarget`),d=Z(r,`installablePath`),f=Z(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...C(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??Qc(n)}`)}}function Z(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function Qc(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const $c=/^[A-Za-z0-9_.:-]{1,64}$/,el=async(e,t)=>{if(!e.backend.openApp)throw new n(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let r=ol(t),i=k(await e.backend.openApp(Q(e,t),r,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:`appOpened`,target:r,relaunch:t.relaunch===!0,...i?{backendResult:i}:{},...C(`Opened: ${cl(r)}`)}},tl=async(e,t={})=>{if(!e.backend.closeApp)throw new n(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let r=Y(t.app,`app`),i=k(await e.backend.closeApp(Q(e,t),r));return{kind:`appClosed`,...r?{app:r}:{},...i?{backendResult:i}:{},...C(r?`Closed: ${r}`:`Closed app`)}},nl=async(e,t={})=>{if(!e.backend.listApps)throw new n(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Q(e,t),We(t.filter))}},rl=async(e,t)=>{if(!e.backend.getAppState)throw new n(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let r=X(t.app,`app`);return{kind:`appState`,app:r,state:await e.backend.getAppState(Q(e,t),r)}},il=async(e,t)=>{if(!e.backend.pushFile)throw new n(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let r=X(t.app,`app`),i=await ll(e,t.input);try{let n=k(await e.backend.pushFile(Q(e,t),i.backendInput,r));return{kind:`appPushed`,app:r,inputKind:i.inputKind,...n?{backendResult:n}:{},...C(`Pushed to ${r}`)}}finally{await i.cleanup?.()}},al=async(e,t)=>{if(!e.backend.triggerAppEvent)throw new n(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let r=ul(t.name);dl(t.payload,`apps.triggerEvent payload for "${r}"`);let i=k(await e.backend.triggerAppEvent(Q(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:`appEventTriggered`,name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...C(`Triggered app event: ${r}`)}};function ol(e){let t=Y(e.app,`app`),r=Y(e.appId,`appId`),i=Y(e.bundleId,`bundleId`),a=Y(e.packageName,`packageName`),o=Y(e.url,`url`),s=Y(e.activity,`activity`),c={...t?{app:t}:{},...r?{appId:r}:{},...i?{bundleId:i}:{},...a?{packageName:a}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!sl(c))throw new n(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function sl(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function cl(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function ll(e,t){if(!t||typeof t!=`object`)throw new n(`INVALID_ARGS`,`apps.push requires an input`);if(t.kind===`json`)return fl(t.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:t.payload},inputKind:`json`};let r=await _r(e,t,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:r.path},inputKind:`file`,...r.cleanup?{cleanup:r.cleanup}:{}}}function ul(e){let t=X(e,`name`);if(!$c.test(t))throw new n(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return t}function dl(e,t){e!==void 0&&fl(e,t,8192)}function fl(e,t,r){if(pl(e,t),Buffer.byteLength(ml(e,t),`utf8`)>r)throw new n(`INVALID_ARGS`,`${t} exceeds ${r} bytes`)}function pl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`${t} must be a JSON object`)}function ml(e,t){try{let r=JSON.stringify(e);if(typeof r!=`string`)throw new n(`INVALID_ARGS`,`${t} must be JSON-serializable`);return r}catch{throw new n(`INVALID_ARGS`,`${t} must be JSON-serializable`)}}function Q(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const hl={open:el,close:tl,list:nl,state:rl,push:il,triggerEvent:al},gl={devices:zc,boot:Bc,shutdown:Vc,install:Hc,reinstall:Uc,installFromSource:Wc};function _l(e){return{...O(hl,e),list:(t={})=>hl.list(e,{...t,filter:Ge(t.filter)})}}const vl=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,yl=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function bl(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(yl,()=>(t=!0,`[REDACTED]`)),n=Sl(n,()=>{t=!0}),{value:n,redacted:t}}function xl(e){try{let t=new URL(e),n=Cl(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function Sl(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=xl(e);return n?(n.redacted&&t(),n.value):e}):e}function Cl(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))vl.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const wl=2048,Tl=4096,El=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function Dl(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=$(e.message,Tl),r=Pl(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 Ol(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?jl(e.url):void 0,i=t===`headers`||t===`all`?Al(e.requestHeaders):void 0,a=t===`headers`||t===`all`?Al(e.responseHeaders):void 0,o=t===`body`||t===`all`?Ml(e.requestBody):void 0,s=t===`body`||t===`all`?Ml(e.responseBody):void 0,c=Pl(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 kl(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=$(e.message,Tl),r=Pl(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 Al(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(El.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=$(i,wl);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function jl(e){return xl(e)??$(e,wl)}function Ml(e){return e===void 0?{redacted:!1}:Nl(e)??$(e,wl)}function Nl(e){try{let t=Fl(JSON.parse(e),bl);return Il(JSON.stringify(t.value),wl,t.redacted)}catch{return}}function Pl(e){return Fl(e,e=>$(e,wl))}function Fl(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=Fl(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(El.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Fl(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function $(e,t){if(e===void 0)return{redacted:!1};let n=bl(e);return Il(n.value,t,n.redacted)}function Il(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 Ll=async(e,t={})=>{if(!e.backend.readLogs)throw new n(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return Dl(await e.backend.readLogs(await Bl(e,t),Vl(t)))},Rl=async(e,t={})=>{if(!e.backend.dumpNetwork)throw new n(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let r=Hl(t);return Ol(await e.backend.dumpNetwork(await Bl(e,t),r),r.include??`summary`)},zl=async(e,t={})=>{if(!e.backend.measurePerf)throw new n(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return kl(await e.backend.measurePerf(await Bl(e,t),Ul(t)))};async function Bl(e,t){let n=N(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 Vl(e){return{...Wl(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:ql(e.levels,`levels`)},...e.search===void 0?{}:{search:X(e.search,`search`)},...e.source===void 0?{}:{source:X(e.source,`source`)}}}function Hl(e){return{...Wl(e,25,200,`network limit`),include:Kl(e.include)}}function Ul(e){return{...Gl(e),...e.sampleMs===void 0?{}:{sampleMs:D(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:ql(e.metrics,`metrics`,20)}}}function Wl(e,t,n,r){return{...Gl(e),...e.cursor===void 0?{}:{cursor:X(e.cursor,`cursor`)},limit:e.limit===void 0?t:D(e.limit,r,1,n)}}function Gl(e){return{...e.since===void 0?{}:{since:X(e.since,`since`)},...e.until===void 0?{}:{until:X(e.until,`until`)}}}function Kl(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new n(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function ql(e,t,r=50){if(!Array.isArray(e))throw new n(`INVALID_ARGS`,`${t} must be an array of strings`);if(e.length>r)throw new n(`INVALID_ARGS`,`${t} must contain at most ${r} entries`);return e.map((e,n)=>X(e,`${t}[${n}]`))}const Jl={logs:Ll,network:Rl,perf:zl},Yl=async(e,t)=>{let r=eu(t.action,`record`),i=r===`start`?e.backend.startRecording:e.backend.stopRecording;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`record ${r} is not supported by this backend`);let a=t.out?await j(e,t.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let n=Zl(t,a?.path);return tu(r,await i.call(e.backend,N(e,t),n),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}},Xl=async(e,t)=>{let r=eu(t.action,`trace`),i=r===`start`?e.backend.startTrace:e.backend.stopTrace;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`trace ${r} is not supported by this backend`);let a=t.out?await j(e,t.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let n=a?.path?{outPath:a.path}:{};return nu(r,await i.call(e.backend,N(e,t),n),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}};function Zl(e,t){let n={};t&&(n.outPath=t);let r=Ql(e.fps);r!==void 0&&(n.fps=r);let i=$l(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function Ql(e){return e===void 0?void 0:D(e,`fps`,1,60)}function $l(e){if(e===void 0)return;let t=Ae(e);if(t===void 0)throw new n(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return t}function eu(e,t){if(e===`start`||e===`stop`)return e;throw new n(`INVALID_ARGS`,`${t} action must be start or stop`)}function tu(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}:{},...ru(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function nu(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...ru(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function ru(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...C(e===`start`?r.startMessage:r.stopMessage)}}const iu={record:Yl,trace:Xl},au=async(e,t={})=>{if(!e.backend.pressBack)throw new n(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let r=t.mode??`in-app`;if(r!==`in-app`&&r!==`system`)throw new n(`INVALID_ARGS`,`system.back mode must be in-app or system`);let i=k(await e.backend.pressBack(N(e,t),{mode:r}));return{kind:`systemBack`,mode:r,...i?{backendResult:i}:{},...C(`Back`)}},ou=async(e,t={})=>{if(!e.backend.pressHome)throw new n(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let r=k(await e.backend.pressHome(N(e,t)));return{kind:`systemHome`,...r?{backendResult:r}:{},...C(`Home`)}},su=async(e,t)=>{if(!e.backend.pressTvRemote)throw new n(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let r=Xe(t.button),i=t.durationMs===void 0?void 0:D(t.durationMs,`durationMs`,0,1e4),a=k(await e.backend.pressTvRemote(N(e,t),{button:r,...i===void 0?{}:{durationMs:i}}));return{kind:`tvRemotePressed`,button:r,...i===void 0?{}:{durationMs:i},...a?{backendResult:a}:{},...C(`Pressed TV remote ${r}`)}},cu=async(e,t)=>{if(!e.backend.setOrientation)throw new n(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let r=mu(t.orientation),i=k(await e.backend.setOrientation(N(e,t),r));return{kind:`systemOrientationSet`,orientation:r,...i?{backendResult:i}:{},...C(`Rotated to ${r}`)}},lu=async(e,t={})=>{if(!e.backend.setKeyboard)throw new n(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let r=t.action??`status`;if(!it(r))throw new n(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let i=await e.backend.setKeyboard(N(e,t),{action:r}),a=k(i),o=Cu(i)?i:{};return r===`enter`||r===`return`?gu(o,a):r===`dismiss`?_u(r,o,a):yu(r,o,a)},uu=async(e,t)=>{if(t.action===`read`){if(!e.backend.getClipboard)throw new n(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let r=await e.backend.getClipboard(N(e,t));return{kind:`clipboardText`,action:`read`,text:typeof r==`string`?r:r.text}}if(t.action!==`write`)throw new n(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new n(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof t.text!=`string`)throw new n(`INVALID_ARGS`,`system.clipboard write requires text`);let r=k(await e.backend.setClipboard(N(e,t),t.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(t.text).length,...r?{backendResult:r}:{},...C(`Clipboard updated`)}},du=async(e,t={})=>{if(!e.backend.openSettings)throw new n(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let r=Y(t.target,`target`),i=k(await e.backend.openSettings(N(e,t),r));return{kind:`settingsOpened`,...r?{target:r}:{},...i?{backendResult:i}:{},...C(r?`Opened settings: ${r}`:`Opened settings`)}},fu=async(e,t={})=>{if(!e.backend.handleAlert)throw new n(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let r=t.action??`get`;if(r!==`get`&&r!==`accept`&&r!==`dismiss`&&r!==`wait`)throw new n(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let i=t.timeoutMs===void 0?void 0:D(t.timeoutMs,`timeoutMs`,0,12e4);return hu(r,await e.backend.handleAlert(N(e,t),r,{timeoutMs:i}))},pu=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new n(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let r=k(await e.backend.openAppSwitcher(N(e,t)));return{kind:`appSwitcherOpened`,...r?{backendResult:r}:{},...C(`Opened app switcher`)}};function mu(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new n(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function hu(e,t){return e===`get`?bu(t):e===`wait`?xu(t):Su(e,t)}function gu(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...C(`Keyboard enter pressed`)}}function _u(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...C(vu(t))}}function vu(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function yu(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function bu(e){if(e.kind!==`alertStatus`)throw new n(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function xu(e){if(e.kind!==`alertWait`)throw new n(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...C(e.alert?`Alert visible`:`Alert wait timed out`)}}function Su(e,t){if(t.kind!==`alertHandled`)throw new n(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...C(t.handled?`Alert ${e}ed`:`No alert handled`)}}function Cu(e){return!!(e&&typeof e==`object`)}const wu={back:au,home:ou,orientation:cu,keyboard:lu,clipboard:uu,settings:du,alert:fu,appSwitcher:pu,tvRemote:su};function Tu(e){return{capture:O(Si,e),selectors:Lc(e),interactions:Rc(e),system:O(wu,e),apps:_l(e),admin:O(gl,e),recording:O(iu,e),observability:O(Jl,e)}}var Eu=e({createAgentDevice:()=>Du,createMemorySessionStore:()=>Ou,localCommandPolicy:()=>ju,restrictedCommandPolicy:()=>Mu});function Du(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Ou(),policy:e.policy??Mu(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...Tu(t)}}function Ou(e=[]){let t=new Map(e.map(e=>[e.name,ku(e)]));return{get:e=>ku(t.get(e)),set:e=>{t.set(e.name,ku(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ku(e))}}function ku(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Au(e.metadata)}:{}}}function Au(e){try{return structuredClone(e)}catch{return{...e}}}function ju(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Mu(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{Ct as C,vt as E,pn as S,gt as T,qr as _,Ba as a,D as b,R as c,L as d,$i as f,F as g,Ei as h,za as i,ua as l,zi as m,ju as n,V as o,Vi as p,Eu as r,wa as s,Du as t,Qi as u,Br as v,_t as w,mn as x,vn as y};